编译器何时会自动产生一个default constructor?编译器自动合成的default constructor将会初始化nonstatic member data?程序设计者什么时候需要显式地提供default constructor?程序设计者显式地提供了default constructor,编译器就不再做什么了吗?那么,到底Default Constructor的构造操作是如何运转的呢,请带着上面的问题走进这篇博文。
一、Default Constructor在“需要的时候”由编译器产生
标题强调“在需要的时候”default constructor由编译器产生。那么,为什么强调“在需要的时候”?是谁需要?先看下面一段代码:
#include <iostream>
class Foo
{
public:
int val;
Foo *pnext;
};
void main()
{
Foo bar;
if (bar.val || bar.pnext)
{
std::cout << "hello world" << std::endl;
}
std::cin.get();
}
在这个例子中,我们常认为,编译器将生成default constructor,val和pnext将会被初始化为0。但运行这段代码,13行代码出现了异常:
Run-Time Check Failure #3 - The variable ‘bar’ is being used without being initialized.
正如所料,虽然我们的程序的语意是要求Foo有一个default constructor,可以将它的两个members初始化为0,但编译器并没有自动生成一个default constructor,更别说初始化它们。上述代码程序设计者没有提供任何constructor,而且编译器也没有合成,但我们程序的语意是需要default constructor的。那么,问题来了:
到底是“谁需要的时候?”
答案是:编译器需要的时候,编译器才会自动合成;而不是程序需要的时候,程序需要的时候是由程序设计者手动编写代码