前菜
在讨论拷贝构造函数之前,先普及一下C++的几个常识:
常识一:
- int a = 10;
- int a; a = 10;
这两个有什么区别?
前者叫初始化, 后者叫赋值
初始化会直接调用拷贝构造函数; 赋值会先调用普通的构造函数,然后进行对象层级的复制。
常识二:
现在有一个类 A, 并且有一个全局变量num,记录A调用构造函数的次数。
请问这两个有什么区别?
- A a(10);
- A a = 10;
没有区别。
正题
拷贝构造函数的定义:
- 用同类型对象初始化一个对象时,调用的初始化函数就是拷贝构造函数。
那么以下代码的结果是什么?
答案:
为什么b、c在初始化的时候没有调用构造函数但调用了析构函数呢?
- 如果不自定义拷贝构造函数, 会选择默认的拷贝构造函数----只进行对象层级的复制(不会对num进行操作)
应该怎么改? 才能使 num 最后为0?
- 拷贝构造函数也需要有初始化列表
最后
拷贝构造函数写成这样会有什么问题?
-
函数在调用的时候,会初始化和参数同类型的局部变量:( y是局部变量,a是实参 )
-
A y = a; 这会调用 x 的拷贝构造函数, x的拷贝构造函数的局部变量会再次调用拷贝构造函数。。。。会无限递归下去,
-
而 const A& y = a; 就不会触发拷贝构造函数
什么是对象层级的复制?
- 如果对象中还有对象, 那么内部对象的成员变量也会进行复制。