pse*_*ler 4 c++ oop ctor-initializer c++11
这两个构造函数声明之间有什么区别:
class Fruit {
private:
int price;
public:
Fruit(int x): price(x)
{
}
};
Run Code Online (Sandbox Code Playgroud)
VS
class Fruit {
private:
int price;
public:
Fruit(int x)
{
price = x;
}
};
Run Code Online (Sandbox Code Playgroud)
在继承的情况下我见过的第一个.
据我所知,这不是一个重复的问题.如果你发现一个人可以随意关闭这个问题.
第一个初始化price与x其中第二个初始化price用它的缺省值(默认构造它;在的情况下int的变量,与未定义的值初始化),然后复制x在price.
换句话说,第一个几乎相当于
int price = x;
Run Code Online (Sandbox Code Playgroud)
第二个几乎相当于
int price;
price = x;
Run Code Online (Sandbox Code Playgroud)
在int变量的情况下(同样考虑编译器的优化),我认为没有有效的差异.
但是,当price一个复杂的物体,建筑成本很高时,可能会有很大的不同.
更好的解释彼得,"这不是建筑成本,使两者之间的复杂对象的差异.这是一个问题,默认初始化后重新分配是否比一步初始化更昂贵.实际上,两阶段过程往往更昂贵(通过各种措施),比直接初始化,因为它可能有必要清理默认设置,以改变数值也有例外安全的顾虑 - 如果有什么调动或施工抛出一个异常".
因此,强烈建议使用第一个解决方案(使用正确的值初始化对象).
另请参阅Zereges的答案,指出注意这样一个事实,即第一种方法是唯一可用于为常量成员赋值的事实.
的确,你不能写
int const price;
price = x; // error: price is const
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
118 次 |
| 最近记录: |