编译器什么情况下,合成构造函数
c++
我们知道,当我们要生成对象时,如果我们没有显式的定义构造函数,但是对象还是生成成功了。因为编译器会自动的为我们合成构造函数,然后调用构造函数生成对象。
第一种情况:
A类有构造函数,B类中没有构造函数,B类中有A类对象作为私有成员。如果这时候,我们需要生成一个B类对象时,编译器会为B类合成构造函数,并在初始化成员时,在初始化列表调用A类的构造函数。
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 
 | class A {
 public:
 A()
 {}
 private:
 int _a;
 };
 class B
 {
 public:
 private:
 int _b;
 A a;
 };
 
 int main()
 {
 B b;
 return 0;
 }
 
 | 
第二种情况:
A类为基类,B类是A类的子类,A类中有缺省的构造函数,则在生成B类的对象的时候,编译器会为B类合成构造函数,且调用。并在初始化列表里调用A类的构造函数。在调用析构函数时,先调用B类的析构函数,再调用A类的析构函数。
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 
 | class A {
 public:
 A()
 {}
 private:
 int  _a;
 };
 class B :public A
 {
 public:
 private:
 int _b;
 };
 int main()
 {
 B b;
 return 0;
 }
 
 | 
第三种情况:
虚拟继承,A类,B类中都没有显式定义构造函数。但在生成B类对象时,编译器会自动合成构造函数。目的:要把基类的偏移量表格地址放到对象地址的前4个字节中。
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 
 | class A {
 public:
 private:
 int  _a;
 };
 class B :virtual public A
 {
 public:
 private:
 int _b;
 };
 int main()
 {
 B b;
 return 0;
 }
 
 | 
第四中情况:
A类中带有虚函数,但是该类没有显式定义构造函数。编译器会自动合成构造函数。构造函数的操作:会把虚表的地址放到对象的前四个字节中。
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 
 | class A {
 public:
 virtual void FunTest()
 {
 cout << "FunTest()" << endl;
 };
 private:
 int  _a;
 };
 
 int main()
 {
 A a;
 return 0;
 }
 
 | 
原文地址:https://www.cnblogs.com/bigbigtree/p/3540984.html