文章目录
- 前言
- 一、拷贝构造函数特征
- 二、默认拷贝构造函数(编译器生成)
前言
C++规定:
1.内置类型传参直接拷贝。
2.自定义类型传参要进行拷贝构造完成拷贝
拷贝构造函数:只有单个形参,该形参是对本类类型对象的引用(一般常用const修饰),在用已存在的类类型对象创建新对象时由编译器自动调用。
一、拷贝构造函数特征
拷贝构造函数也是特殊的成员函数,其特征如下:
- 拷贝构造函数是构造函数的一个重载形式。
- 拷贝构造函数的参数只有一个且必须是类类型对象的引用,使用传值方式编译器直接报错,因为会引发无穷递归调用。
我们接下来看看为什么用传值调用不报错的话就会形成无限递归:
要解决这个问题我们必须要传引用
二、默认拷贝构造函数(编译器生成)
若未显式定义,编译器会生成默认的拷贝构造函数。 默认的拷贝构造函数对象按内存存储按字节序完成拷贝,这种拷贝叫做浅拷贝,或者值拷贝
编译器生成的默认拷贝构造函数已经可以完成字节序的值拷贝了,还需要自己显式实现吗?
我们先来看一个反例:
这里编译器直接报错了:
我们来分析一下问题:
因为默认拷贝函数实行的是浅拷贝,所以s1与s2里面的地址指向的都是同一块空间。
然后程序结束的时候我们同一块空间会被释放两次。
默认拷贝函数(编译器自己生成的作用):
1.内置类型成员完成值拷贝/浅拷贝
2.自定义类型成员会去调用他的拷贝构造函数
3. 当我们遇到地址的拷贝的时候一定要去自己写拷贝函数实现深拷贝