4种情况下编译器会构造出nontrivial(有用)的构造函数
带有default construction的member class object
我们有两个class:
class Foo { public: Foo(), Foo(int) … };
class Bar { public: Foo foo; char *str;};
则编译器会在Bar中合成一个默认的构造函数(看起来像这样):
Bar() { foo.Foo::Foo(); }
当我们自己定义了Bar一个或以上的构造函数时,编译器会为我们扩张
每一个构造函数。比如我们自己定义:
Bar() { str = 0;}
则编译器就为我们扩张成:
Bar() { foo.Foo::Foo(); str = 0; }
当有多个需要初始化的成员时,编译器会按照成员的声明次序来初始化成员
带有default construction的base class
声明或继承一个virtual function的class
一个virtual function table 会被编译器产生出来,内放class的virtual function 地址。
在每个class object中,一个额外的pointer member(vptr)会被编译器合成出来,内含
相关的class vtbl的地址。
带有一个virtual base class的class
对于virtual base class中的成员变量,derived class通过存放一个指针,指针中存放
着对应的基类,用这样的方式来访问virtual base class中的成员变量。
所以为了初始化这些指针,编译器会默认构造出或扩张nontrivial构造函数做这些初
始化的工作。
c++新手常见的两个误解
任何class如果没有定义default constructor,就会被合成出来。
编译器合成出来的default constructor会明确设定class内每个
datamember的默认值。
这两个没有一个是真的
posted @
2015-08-29 15:51
boydfd
阅读(
293 )
评论()
编辑
收藏
举报