首页 > 代码库 > 深入探索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?同时在什么时候会被调用,社么时候编译器会合成这些函数。
深入探索C++对象模型--C++构造函数