类通过一个特殊的构造函数来控制默认初始化过程。这个函数就是默认构造函数。默认构造函数无需不论什么实參。
我们能够显示的定义默认构造函数也能够让编译器为我们生成默认构造函数。
默认构造函数以例如以下规则初始化累的数据成员:
- 假设存在类内初始值,用它来初始化成员。
- 否则。默认初始化该成员。
class Sales_data {
public:
std::string bookNo;
unsigned units_sold = 0;
double revenue = 0.0;
};
如上所看到的。由于Sales_data为units_sold和revenue提供了初始值,所以合成默认构造函数将使用这些值来初始化相应的成员,而bookNo被默认初始化为一个空字符串。
合成默认构造函数仅仅适用于很easy的类,通常来说。我们须要为自己定义类提供默认构造函数,由于:
- 编译器仅仅有在发现类不包括不论什么构造函数的情况下才会替我们生成默认构造函数。
一旦我们定义了一些其他的构造函数,除非我们再定义一个默认构造函数。否则这个类将没有默认构造函数。
由于一个类在某种情况下须要控制对象初始化,那么该类可能须要在全部情况下都控制初始化。
- 合成的默认构造函数可能运行错误的操作,比方对复合类型(数组和指针),默认初始化的结果是没有定义的。
- 有的编译器不能为某些类合成默认构造函数。比方类中包括一个其他类类型的成员,且这个成员的类型没有默认构造函数。
defaultkeyword:
class Sales_data {
public:
Sales_data() = default;
Sales_data(const std::string &s) bookNo(s) {}
Sales_data(const std::string &s, unsigned n, double p) :
bookNo(s), units_sold(n), revenu(p*n) {}
Sales_data(std::istream &); std::string isbn() const { return bookNo; }
Sales_data& combine(const Sales_data&);
double avg_price() const;
private:
std::string bookNo;
unsigned units_sold = 0;
double revenue = 0.0;
};
在C++11标准中,假设我们须要默认的行为,能够通过在參数列表后来要求编译器生成默认构造函数。
default既能够和声明一起出如今类的内部,也能够作为定义出如今类的外部。假设=default在类的内部,则默认构造函数是内联的,假设它在类的外部,则该成员函数默认情况下不是内联的。