类通过一个特殊的构造函数来控制默认初始化过程,这个函数就是默认构造函数,默认构造函数无需任何实参。我们可以显示的定义默认构造函数也可以让编译器为我们生成默认构造函数。默认构造函数以如下规则初始化累的数据成员:
- 如果存在类内初始值,用它来初始化成员。
- 否则,默认初始化该成员。
class Sales_data { public: std::string bookNo; unsigned units_sold = 0; double revenue = 0.0; };
如上所示,因为Sales_data为units_sold和revenue提供了初始值,所以合成默认构造函数将使用这些值来初始化对应的成员,而bookNo被默认初始化为一个空字符串。
合成默认构造函数只适用于非常简单的类,通常来说,我们需要为自定义类提供默认构造函数,因为:
- 编译器只有在发现类不包含任何构造函数的情况下才会替我们生成默认构造函数。一旦我们定义了一些其它的构造函数,除非我们再定义一个默认构造函数,否则这个类将没有默认构造函数。因为一个类在某种情况下需要控制对象初始化,那么该类可能需要在所有情况下都控制初始化。
- 合成的默认构造函数可能执行错误的操作,比如对复合类型(数组和指针),默认初始化的结果是未定义的。
- 有的编译器不能为某些类合成默认构造函数,比如类中包含一个其它类类型的成员,且这个成员的类型没有默认构造函数。
default关键字:
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在类的内部,则默认构造函数是内联的,如果它在类的外部,则该成员函数默认情况下不是内联的。
版权声明:本文为博主原创文章,未经博主允许不得转载。
时间: 2024-11-05 12:21:03