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

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

  • 11
    点赞
  • 57
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

仟各

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值