Chinaunix首页 | 论坛 | 博客
  • 博客访问: 300128
  • 博文数量: 148
  • 博客积分: 4365
  • 博客等级: 上校
  • 技术积分: 1566
  • 用 户 组: 普通用户
  • 注册时间: 2008-07-05 21:38
文章分类
文章存档

2014年(2)

2013年(45)

2012年(18)

2011年(1)

2009年(54)

2008年(28)

我的朋友

分类: C/C++

2009-09-24 11:11:26

一 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类型的成员均不会被初始化,因为编译器不认为这是必须的工作。
阅读(734) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~