[C++11] 默认构造函数

类通过一个特殊的构造函数来控制默认初始化过程,这个函数就是默认构造函数,默认构造函数无需任何实参。我们可以显示的定义默认构造函数也可以让编译器为我们生成默认构造函数。默认构造函数以如下规则初始化累的数据成员:

  • 如果存在类内初始值,用它来初始化成员。
  • 否则,默认初始化该成员。

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在类的内部,则默认构造函数是内联的,如果它在类的外部,则该成员函数默认情况下不是内联的。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值