标签:复合 声明 而不是 函数 四种 自己 内容 this指针 派生
默认构造函数是可以不用实参数来进行的构造函数它包括了两种
1.没有带明显形参的构造函数
2.提供了默认形参的构造函数
类设计者可以自己写一个默认构造函数,编译器帮我们写的默认构造函数称为合成的默认构造函数,编译器总会给我们的构造函数增加一个隐含的this指针,所以本质上,是没有不带形参的构造函数的。
如果定义一个对象时没有提供初始化数值,就会调用默认构造函数
如果自己没有写默认构造函数,但只有默认构造函数被需要的时候,编译器才会产生成一个默认构造函数
以下四种情况编译器就会为该类合成一个默认构造函数
1.含有类对象数据成员,而且该类有默认构造函数
但是这个被合成的默认构造函数只含有必要的代码,他只会完成对类内的类进行初始化,而不会初始化内置的类型或者复合类型,因为这是程序的责任而不是构造函数的责任
如果类内有多个类对象成员,则编译器按照这些类对象声明的顺序,在构造函数按顺序插入调用各个类构造函数的代码
2.基类带有默认构造函数的派生类
当一个类派生自一个含有默认构造函数的基类时,该类也符合编译器需要合成默认构造函数的条件。编译器合成的默认构造函数将根据基类声明顺序调用上层的基类默认构造函数。同样的道理,如果设计者定义了多个构造函数,编译器将不会重新定义一个合成默认构造函数,而是把合成默认构造函数的内容插入到每一个构造函数中去。
3.带有虚函数的类
1.类本身定义了虚函数
2.类从继承体系中继承了虚函数(成员函数一旦被声明为虚函数继承不会改变虚函数性质)
这两种情况都使一个类成为带有虚函数的类。这样的类也满足编译器需要合成默认构造函数的类,原因是含有虚函数的类对象都含有一个虚表指针vptr,编译器需要对vptr设置初值以满足虚函数机制的正确运行,编译器会把这个设置初值的操作放在默认构造函数中。如果设计者没有定义任何一个构造函数,则编译器会合成一个默认构造函数完成上述操作,否则,编译器将在每一个构造函数中插入代码来完成相同的事情。
4.带有虚基类的类
为了解决菱形继承问题,编译器将产生一个指向虚基类的指针,使得程序得以在运行期确定经由pa而存取的X::i的实际存储位置。这个指针的安插,编译器将会在合成默认构造函数中完成,同样的,如果设计者已经写了多个构造函数,那么编译器不会重新写默认构造函数,而是把虚基类指针的安插代码插入已有的构造函数中
标签:复合 声明 而不是 函数 四种 自己 内容 this指针 派生
原文地址:https://www.cnblogs.com/mots/p/14708152.html