一 Default Constructor 的建构操作
When is a default constructor
synthesized? 当编译器需要它的时候,也就是 synthesized constructor 只执行编译器所需的行动,并不执行程序员某些的设想。
看来以前看C++ Primer 4th时在类的那章相关部分没有弄懂,P459书上说:
The compiler generates a default constructor automatically only if a class
defines
no constructors.只有当一个类没有定义构造函数时,编译器才会自动生成一个默认构造函数,但这个不是所说的
synthesized default constructor。
常见的两个
误解:
(1)任何class如果没有定义default constructor ,就会被编译器合成一个来。
(2)编译器合成的 default constructor 会明确地为每一个 data member 赋初值。
四种
nontrivial default constructor:
(1)带default constructor的member class object
如果一个class没有任何的constructor,但它内含一个member object,后者有default constructor,则该class的 implicit default constructor 就是 nontrival,编译器需要为此classsynthesize 出一个 default constructor,不过只有在真正需要被调用时才发生。
合成的构造,考构,赋值运算符都是以inline方式完成的。
如果含有多个对象成员,则编译器按照它们的声明顺序在合成的构造函数中调用它们的default构造函数。
(2)带default constructor 的base class
一个带有default constructor 的基类派生出一个没有任何constructor的派生类,则次派生类的default constructor 被视为 nontrival,会被编译器synthesize出来,其中调用基类的default constructor
class b{
public:
b():i(1024){};
int i;
};
class d:public b{
};
|
如果我们创建d类的对象,则在其default constructor 中会调用b的。
(3)带有一个 virtual function的class
其中有两种情况 1. class声明或继承一个 virtual function。 2. class派生自一个继承串,其中有至少一个 virtual base class。
这2种情况中,如果程序员没有定义自己的constructor,编译器会
synthesize a default constructor.期间会发生如下事件:1.一个vtbl被产生,内放有class中 virtual function地址。
2.每一个class object中,一个额外的pointer member(就是vptr)被产生,内含 class vtbl的地址。它们被正确初始化是编译器的责任。
(4)带有一个virtual base class的class
virtual base class的实现因编译器不同而不同,共通目标是定位(locate)virtual base class在其派生类中的位置。
以上四种情况,编译器会为未声明constructor的class 合成一个default constructor,这在C++标准中称为 implicit nontrivial default constructor,只是为了满足编译器需要。
这四种情况外的而又没有声明default constructor的classes,它们拥有的是 implicit trivial default constructor,实际上并不会被合成出来。
synthesized default constructor 中,只有base class object和member class object会被初始化,其它所有nonstatic build-in类型的成员均不会被初始化,因为编译器不认为这是必须的工作。
阅读(734) | 评论(0) | 转发(0) |