这两个构造函数声明有什么区别:
class Fruit {
private:
int price;
public:
Fruit(int x): price(x)
{
}
};
对比
class Fruit {
private:
int price;
public:
Fruit(int x)
{
price = x;
}
};
在继承的情况下我看到的第一个。
据我所知,这不是一个重复的问题。如果您找到一个,请随时关闭此问题。
第一个用x
初始化price
,第二个用默认值初始化price
(默认构造它;如果是int
变量,用未定义的值初始化)然后将 x
复制到 price
中。
换句话说,第一个几乎等同于
int price = x;
其中第二个几乎等同于
int price;
price = x;
在 int
变量的情况下(也考虑编译器的优化)我想没有有效的区别。
但是当price
是一个复杂的对象,加上高昂的 build 成本,就会有很大的不同。
正如 Peter 更好地解释的那样,“对于复杂对象而言,造成两者之间差异的不是构造成本。问题是在默认初始化后重新分配是否比一步初始化成本更高。实际上,两阶段过程是通常(通过各种措施)比直接初始化更昂贵,因为可能有必要清理默认设置以更改值。还有异常安全性问题 - 如果重新分配或构造抛出异常怎么办。“
因此,通常强烈建议使用第一种解决方案(使用正确的值初始化对象)。
另请参阅 Zereges 的回答,该回答指出第一个方法是唯一可用于将值分配给常量成员的事实。
确实你不会写
int const price;
price = x; // error: price is const