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

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

  • 1.拷贝构造函数的特点:
  • 2.通过例子引入拷贝构造:
  • 3构造对象的时候使用引用返回与不使用引用返回的问题:
    • 3.1不使用引用返回:
    • 3.2引用返回——从已经死亡的地址接收值不牢靠:
  • 4.缺省的拷贝构造和等号运算符重载
  • 5.深拷贝和浅拷贝的问题
    • 5.1浅拷贝导致的重复析构问题:
    • 5.2浅拷贝会导致内存泄漏的问题:
  • 6.重写拷贝构造
  • 7.总结

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

函数名和类型名一样

Object(const Object& obj)
{
}

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

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

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

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

C++——拷贝构造函数详解_第1张图片
C++——拷贝构造函数详解_第2张图片
C++——拷贝构造函数详解_第3张图片

加了引用,就会减少对象构建次数(四次)
C++——拷贝构造函数详解_第4张图片
上图的fun函数中为什么要加const呢?到底加不加const?
不想形参改变实参加const,想让形参改变实参就不加const。取决于我们想不想修改参数。

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

3.1不使用引用返回:

C++——拷贝构造函数详解_第5张图片

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

以引用返回就是返回这个对象的地址
C++——拷贝构造函数详解_第6张图片
所以:对象的生存期不受fun函数的影响,就可以用引用返回

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

当我们不写拷贝构造函数和等号运算符重载,系统会自动生成浅拷贝。
C++——拷贝构造函数详解_第7张图片

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

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

浅拷贝就是将seqade内容直接赋值给seqb,解析如下图:
C++——拷贝构造函数详解_第8张图片
那么seqb.data也只想seqa.data指向的内容时,如果在析构的时候我们析构了seqb,seqb.data所指向的内容就会被释放掉,等到seqa时候的时候,会出现重复析构同一空间而导致出错的问题。

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

代码如下图:
C++——拷贝构造函数详解_第9张图片
C++——拷贝构造函数详解_第10张图片
内存解析图如下:
C++——拷贝构造函数详解_第11张图片

6.重写拷贝构造

当我们重写了拷贝构造之后就会把seqa的值赋值给seqb,然后seqb开辟一片和seqa等大小的堆区空间,再把seqa堆区的内容拷贝到seqb中,
C++——拷贝构造函数详解_第12张图片

7.总结

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

你可能感兴趣的:(C/C++,c++,开发语言,后端)