深入探索C++对象模型-C++构造函数

深入探索C++对象模型--C++构造函数

C++构造函数语意

对象构造过程中编译器的干预原则和方法。

Default constructor的构建方法

经常会提到default constructor,那么什么时候才会合成出一个default consgtructor呢?当编译器需要它的时候。别合成出来的constructor值执行编译器所需的行动。

         如果一个class没有任何constructor,但它内含一个成员对象,这个成员对象有default constructor,编译器需要为此class合成出一个defautl constructor,不过这个合成操作只有在constructor正在需要被调用时才会发生。

Class Foo {public: Foo(),Foo(int)};

Class Bar {public:Foo foo; char*str,};  //不是继承,是内含

Void foo_bar()

{

         Barbar;// Bar::foo必须在此处初始化 Bar::foo是一个member object,而其class Foo拥有default constructor,符合条件

}

这么一来就说明,带有default constructor的member class object会造成含有此对象的类合成一个default constructor,也就是说,如果一个类中包含了类,但是被包含的类中有default constructor,那么这个类如果没有default constructor,编译器就会给它构造一个default constructor.

 

带有default constructor的base class

         如果一个没有任何constructors的class派生自一个“带有defaultconstructor”的base class,那么这个derived class的default constructor会被视为有用的(nontrivial),并因此需要被合成出来。它将调用上一层base classes的default constructor

         如果设计者提供了多个constructors,但其中都没有defaultconstructor?编译器不会再合成default constructor

 

同时需要注意,这里所说的default constructor都是那种没有任何参数的构造函数。

 

带有一个virtual function的class

带有一个virtual base class的class

 

上面讲述了四种情况下编译器会合成一个default constructor

所以,任何class如果没有定义default constructor就会被合成出一个来,这是不正确的。

编译器合成出来的default constructor会明确设定class内每一个data的默认值,这也是不正确的。

 

Copy constructor的构建操作:

这个时候这个函数会被调用呢?

Class X {};

X x;

X xx = x;// 直接被赋值

如果是 X xx;

Xx = x; //这个时候调用的是赋值操作

当一个对象作为另一个对象的初值时;当参数是传值调用时;当函数返回是传值调用时,这三种情况下都会用到copy constructor

 

在一般情况下,都是按位拷贝。但是在有些情况下,编译器会自动合成一个copy constructor,这些情况是什么呢?如果一个类包含了另一个类,另一个类中有copy construvtor,如果是virtual机制,如果有virtual base class.继承机制中,父类有了copy constructor

 

下面情况下,必须使用成员初始化列表来初始化对象:

 当初始化一个引用成员时

         当初始化一个constmember时

         当调用一个baseclass的constructor,而它拥有一组参数时。

         当调用一个member class的constructor,而它拥有一组参数时。

在这四种情况下,初始化都必须在成员初始化列表中完成。

Static成员变量一定要在类外定义,为什么呢?因为这个变量不属于任何一个对象,如果在构造函数中被调用,只要有对象被初始化时就会被调用,但是这个变量是不属于任何一个对象的。

 

综述:

这里总结了什么是default constructor 什么是copy constructor?同时在什么时候会被调用,社么时候编译器会合成这些函数。