一、编译器什么情况下合成构造函数
类A没有自定的缺省构造函数
1、该类中包含一个类型B成员变量,类B有一个缺省的构造函数
合成的这个默认构造函数目的是为了调用成员变量的缺省构造函数
2、父类带缺省构造函数
3、类中含有虚函数
(1)编译器会为我们生成一个基于该类的虚函数表
(2)把类的虚函数表地址赋给类对象的虚函数表指针
///////////
如果我们有自己的默认构造函数,编译器会根据需要扩充我们的默认构造函数,附加做的事情
(1)生成虚函数表
(2)调用父类的构造函数
(3)把类的虚函数表地址赋给对象的虚函数表指针
4、带有虚基类
二、编译器什么情况下合成拷贝构造函数
A类中没有自定义的拷贝构造函数,
1、成员变量有拷贝构造函数
如果类A中都是一些简单的数据类型,编译器不需要合成拷贝构造函数,直接内部直接按值拷贝过去
但是如果含有一个类型为B的成员变量,该成员变量的类型有构造函数
那么,当代码中有涉及到类A的拷贝构造函数时候,编译器会为类A合成一个拷贝构造函数。
合成的这个拷贝构造函数值干一些特殊的事情(调用成员变量的拷贝构造函数),
如果只是一些成员变量值的拷贝,编译器不会使用合成的拷贝构造函数
2、父类有拷贝构造函数
3、该类声明了或继承了虚函数
拷贝构造函数中拷贝虚函数表指针的值。
4、该类含有虚基类
原文:https://www.cnblogs.com/zhiminzeng/p/13324803.html