1. Default Constructor只对base class subobjects和member class objects初始化,对data member不做操作
2. 编译器构造Default Constructor 只在下面4种case:
1.包含有带默认构造函数的对象成员的类 .2.继承自带有默认构造函数的基类的类 .3.有虚函数的类(需要初始化每一个class object的vptr) .4.有一个虚基类的类本文主要针对"包含有带默认构造函数的对象成员的类"
class Foo {public:Foo() { cout << "Foo Constructor" << endl; } Foo(int) { }};void test_defaultConstructor(){cout << "begin" << endl;Bar bar;cout << "end" << endl;}
(1). 若无定义构造函数
class Bar { private: Foo foo; };
编译器的对类Bar的Default Constructor为
Bar::Bar(){foo.Foo::Foo();//调用Foo的构造函数来初始化foo对象}
运行测试代码,输出结果为:
begin
Foo Constructor
end
(2). 若有构造函数
Bar::Bar(){cout << "Bar default code" << endl; }
此时编译器扩展已知构造函数:
Bar::Bar(){foo.Foo::Foo();//调用Foo的构造函数来初始化foo对象cout << "Bar default code" << endl; }
运行测试代码,输出结果为:
begin
Foo Constructor
Bar default code
end
(3). 若有多个class member objects都要求constructor初始化,将按照在classs中的声明次序调用
class Dopey {public:Dopey() {cout << "Dopey Constructor" << endl;}};class Sneezy {public:Sneezy() {cout << "Sneezy Constructor" << endl;}};class Bashful {public:Bashful() {cout << "Bashful Constructor" << endl;}};class Snow_White { private:Dopey dopey;Sneezy sneezy;Bashful bashful;int mumble; };void test_defaultConstructor(){cout << "begin" << endl;Snow_White obj;cout << "end" << endl;}
运行测试代码,输出结果为:
begin
Dopey Constructor
Sneezy Constructor
Bashful Constructor
end
(4). 如果基类有默认构造函数,又有一个成员有默认构造函数,那么顺序是谁先呢?
class SnowWhite : public Dopey{ private: Sneezy sneezy; };void test_defaultConstructor_ObjectOrder(){cout << "begin" << endl;SnowWhite obj;cout << "end" << endl;}
运行测试代码,输出结果为:
begin
Dopey Constructor
Sneezy Constructor
end
【引用】
[1]<<深度探索C++ 对象模型 Inside The C++ Object Model >> Stanley B.Lippman 候捷 译
[2] 代码地址 /thefistlei/cplusStudy.git