posts - 134,comments - 22,trackbacks - 0
一 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,实际上并不会被合成出来。
   s
ynthesized default constructor 中,只有base class object和member class object会被初始化,其它所有nonstatic build-in类型的成员均不会被初始化,因为编译器不认为这是必须的工作。
http://blog.chinaunix.net/u2/72955/showart_2059086.html
posted on 2009-12-10 15:32 何克勤 阅读(160) 评论(0)  编辑  收藏 所属分类: C/C++

只有注册用户登录后才能发表评论。


网站导航: