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

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.总结

凡是在类中设计成指针或者设计指向内核态对象,就要写自己的拷贝构造和等号运算符重载。
(指针、文件指针/线程、信号量、互斥量)

猜你喜欢

转载自blog.csdn.net/m0_54355780/article/details/122474441
今日推荐