C++——拷贝构造函数详解

  • Post author:
  • Post category:其他




1.拷贝构造函数的特点:


函数名和类型名一样

Object(const Object& obj)
{
}

上面的形参里面需要加上“&”,目的是为了防止无限的构造,形成死递归。

加上const,目的是常引用,不能改变里面的值



2.通过例子引入拷贝构造:

问:下面的fun函数在调用的过程中创建了几个对象?(答:五个)

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

加了引用,就会减少对象构建次数(四次)

在这里插入图片描述

上图的fun函数中为什么要加const呢?到底加不加const?

不想形参改变实参加const,想让形参改变实参就不加const。取决于我们想不想修改参数。



3构造对象的时候使用引用返回与不使用引用返回的问题:



3.1不使用引用返回:

在这里插入图片描述



3.2引用返回——从已经死亡的地址接收值不牢靠:

以引用返回就是返回这个对象的地址

在这里插入图片描述


所以:对象的生存期不受fun函数的影响,就可以用引用返回



4.缺省的拷贝构造和等号运算符重载

当我们不写拷贝构造函数和等号运算符重载,系统会自动生成浅拷贝。

在这里插入图片描述



5.深拷贝和浅拷贝的问题



5.1浅拷贝导致的重复析构问题:

浅拷贝就是将seqade内容直接赋值给seqb,解析如下图:

在这里插入图片描述

那么seqb.data也只想seqa.data指向的内容时,如果在析构的时候我们析构了seqb,seqb.data所指向的内容就会被释放掉,等到seqa时候的时候,会出现重复析构同一空间而导致出错的问题。



5.2浅拷贝会导致内存泄漏的问题:

代码如下图:

在这里插入图片描述

在这里插入图片描述

内存解析图如下:

在这里插入图片描述



6.重写拷贝构造

当我们重写了拷贝构造之后就会把seqa的值赋值给seqb,然后seqb开辟一片和seqa等大小的堆区空间,再把seqa堆区的内容拷贝到seqb中,

在这里插入图片描述



7.总结

凡是在类中设计成指针或者设计指向内核态对象,就要写自己的拷贝构造和等号运算符重载。

(指针、文件指针/线程、信号量、互斥量)



版权声明:本文为m0_54355780原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。