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] 代码地址 https://github.com/thefistlei/cplusStudy.git