inside C++笔记之默认构造函数

C++ Annotated Reference Manual告诉我们:“default constructors…在需要的时候别编译器产生出来”。这里的需要是编译器的需要,不是程序的需要,程序的需要是程序员的责任。

编译器合成出一个default constructor只执行编译器所需的行动。也就是说如果一个class没有任何构造函数,编译器不一定会为它合成一个defualt construtor。只有以下4中情况,编译器才会为class在需要的时候合成一个default constructor.

i.                    带有default constructorsmember class object.

例如:

class Foo { public: Foo(), Foo( int ) ... }; 
class Bar { public: Foo foo; char *str; }; 
void foo_bar() { 
   Bar bar; // Bar::foo must be initialized here 
   if ( str ) { } ... 
}
这里的Bar就被合成了一个default constructor。合成的目的就是调用Foodefault constructor。但它不对str做任何处理,这是程序员的责任。如果class中有多个member class objectdefautl constructor,则按照在class中声明次序依次调用它们的default constructor.
 
ii.                  带有default constructorbase class
例如:
Class Base { public: Base()……}
Class Dervce:public Base {…}
Void bd(){
    Dervce de;/Base /must be initialize here
}
这个Dervce在需要的时候编译器为其合成了一个default constructor。合成的目的就是调用基类的defualt constructor。如果有多个,按照声明的次序依次调用。
 
iii.                带有一个virtual functionclass

另外两种情况也需要合成defualt constructor.

1.       class 声明(或继承)一个virtual function.

2.       class 派生自一个继承串链,其中有一个或更多的virtual base classes.

例如:

class Widget {

public:

   virtual void flip() = 0;

};

void flip( const Widget& widget ) { widget.flip(); }

// presuming Bell and Whistle are derived from Widget

void foo() {

   Bell b;  Whistle w;

   flip( b );

   flip( w );

}

下面的两个扩展操作将会发生在编译期间发生:

1.       一个vtbl会被编译器产生出来,内放classvirtual地址。

2.       在每一个class object中,一个额外的vptr会编译器合成出来。

合成的目的就是为vptr设定处置。对于class的每一个construction,编译器都会插入相关代码,如果没有default constructor,编译器会合成一个。

 

 

iv.                 带有一个virtual base calssclass

Virtual base calss 的实现方法在不同的编译器之间有极大的差异,然而,每一种实现法的共通点在于必须使virtual base 在其每一个derived class object中的位置在执行期准备妥当。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值