概述
在 class 中,若程序员没有为该 class object 定义 default constructors,则编译器会根据需要产生一个 implicit default constructor,该 implicit default constructor 被认为是 trivial(无用的)。那编译器怎样才能产生一个 nontrivial implicit default constructor?以下四个方面会产生nontrivial implicit default constructor:
- class 中存在带有 default constructor 的 member class object(成员对象);
- class 继承自带有 default constructor 的 base class(基类);
- 带有一个 virtual function 的 class;
- 带有一个 virtual base class 的 class;
带有 default constructor 的 member class object
若一个 class 中没有定义任何 constructor,但是 class 中存在带有 default constructor 的 member class object,则编译器会在需要的时候合成一个 nontrivial implicit default constructor;例如:
#include <iostream>
using namespace std;
class Foo {
public:
Foo() { cout << "The constructor of Foo was exist." << endl; }
};
class Bar {
public:
Foo foo;
int x;
};
int main()
{
Bar bar;
if(bar.x)
{
cout<<"The value of x is: "<<bar.x<<endl;
}
return 0;
}
使用 gdb 调试结果如下所示:
(gdb) r
Starting program: /ObjectModel/chap02/test
Breakpoint 1, main () at test.cpp:18
18 Bar bar;
(gdb) s
Bar::Bar (this=0xbffff038) at test.cpp:10
10 class Bar {
(gdb) s
Foo::Foo (this=0xbffff038) at test.cpp:7
7 Foo() { cout << "The constructor of Foo was exist." << endl; }
(gdb) s
The constructor of Foo was exit.
main () at test.cpp:19
19 if(bar.x)
(gdb) s
21 cout<<"The value of x is: "<<bar.x<<endl;
(gdb) s
The value of x is: -1209307148
23 return 0;
从调试结果可以知道,执行Bar bar
语句时,编译器会合成一个 Bar
nontrivial implicit default constructor,合成的 Bar
nontrivial implicit default constructor 内含必要的代码,能够调用 class Foo
的 default constructor 来处理 member class objectBar::foo
,但是并不会产生代码来初始化 Bar::x
,将Bar::foo
初始化是编译器所做的事,而初始化Bar::x
则是程序编写者的事情;编译器会合成一个 Bar
nontrivial implicit default constructor 类似如下代码所示:
inline Bar::Bar()
{