一个类,在未定义任何构造函数的情况下,创建该类对应的对象实体时,编译器会隐式的定义一个默认的构造函数--合成的默认构造函数,其按照如下规则初始化类的数据成员:
- 如果存在类内的初始化值,用它来初始化成员。
- 否则,默认初始化该成员。
然而,合成的默认构造函数只适合简单的类。对于一个普通的类来说,必须定义它自己的默认构造函数,原因有三:
第一个原因是编译器只有在发现类不包含任何构造函数的情况下才会替我们生成一个合成的默认构造函数。一旦我们定义了一些其他的构造函数,那么除非我们再定义一个默认构造函数,否则类将没有默认构造函数。这天规则的依据是,如果一个类在某种情况下需要控制对象初始化,那么该类可能在所有情况下都需要控制。
即:只有当类没有声明任何构造函数时,编译器才会自动的生成默认的构造函数。
第二个原因是对于某些类来说,合成的默认构造函数可能执行错误的操作。如:定义在快内的内置类型或者复合类型(比如指针和数组)的对象被默认初始化,则他们的值是未定义的。该准则同样适用于默认初始化的内置类型成员。
第三个原因是有的时候编译器不能为某些类合成默认的构造函数。例如,如果类中包含一个其他类类型的成员这个成员的类型没有默认构造函数,那么编译器将无法初始化该成员。对于这样的类来说,我们必须自定义默认构造函数,否则该类将没有可用的默认构造函数。
在C++11标准中,如果我们需要默认的行为,那么可以通过在参数列表后面写上=default来要求编译器生成构造函数。
--《C++ Primer 5th》