6.7 默认构造函数
默认构造函数(default constructor)就是不带任何参数的构造函数。默认的构造函数用来创建一个“原型(vanilla)对象”,当编译器需要创建一个对象而又不知任何细节时,默认的构造函数就显得非常重要。比如,有一个前面定义的struct Y,并用它来定义对象:
编译器就会报告找不到默认的构造函数。数组中的第二个对象想不带参数来创建,在这里编译器就去找默认的构造函数。实际上,如果只是简单地定义了一个Y对象的数组:
这样编译的时候,就会出现错误,因为它必须有一个默认的构造函数来初始化数组中的每一个对象。
如果像下面一样单独创建一个对象时,也会出现同样的错误:
记住,一旦有了一个构造函数,编译器就会确保不管在什么情况下它总会被调用。
默认的构造函数非常重要,所以当(且仅当)在一个结构(struct或class)中没有构造函数时,编译器会自动为它创建一个。因此下面例子将会正常运行:
然而,一旦有构造函数而没有默认构造函数,上面的对象定义就会产生一个编译错误。
读者可能会想,由编译器合成的构造函数应该可以做一些智能化的初始化工作,比如把对象的所有内存置零。但事实并非如此。因为这样会增加额外的负担,而且使程序员无法控制。如果想把内存初始化为零,那就得显式地编写默认的构造函数。
尽管编译器会创建一个默认的构造函数,但是编译器合成的构造函数的行为很少是我们期望的。我们应该把这个特征看成是一个安全网,但尽量少用它。一般说来,应该明确地定义自己的构造函数,而不让编译器来完成。