c++ - 构造函数定义 C++ 语法
问题描述
这两个构造函数声明有什么区别:
class Fruit {
private:
int price;
public:
Fruit(int x): price(x)
{
}
};
VS
class Fruit {
private:
int price;
public:
Fruit(int x)
{
price = x;
}
};
我在继承的情况下看到的第一个。
据我所知,这不是一个重复的问题。如果你发现有人可以关闭这个问题。
解决方案
第一个用默认值初始化price
,x
第二个price
用默认值初始化(默认构造它;如果是int
变量,用未定义的值初始化),然后复制x
.price
换句话说,第一个几乎等同于
int price = x;
第二个几乎等同于
int price;
price = x;
如果是int
变量(也考虑编译器的优化),我想没有有效的区别。
但是,当price
是一个复杂的对象,建设成本很高时,可能会有很大的不同。
正如彼得更好地解释的那样,“对于复杂对象,两者之间的区别并不是构造成本。这是一个问题,即在默认初始化后重新分配是否比一步初始化更昂贵。实际上,两阶段过程通常更昂贵(通过各种措施)而不是直接初始化,因为可能需要清理默认设置才能更改值。还有异常安全问题 - 如果重新分配或构造引发异常怎么办。
因此,通常强烈建议使用第一个解决方案(使用正确的值初始化对象)。
另请参阅 Zereges 的回答,该回答指出了第一个方法是唯一可用于将值分配给常量成员的事实。
确实写不出来
int const price;
price = x; // error: price is const
推荐阅读
- powerbi - 来自 Power BI 高级编辑器的 adls Gen2 的 URL 连接
- python - python socket编程中的帧传输率问题
- css - 代码片段超出边界。如何使其响应移动视图?
- react-native - 如何等待蓝牙配对成功?
- c# - C# 使用 WH_MOUSE
- flutter - vim 与插件 vim-flutter 使用命令 :FlutterRun 和模拟器 Genymotion 产生错误
- angular - PrimeNG confirmPopup 目标问题“预期类型来自属性 'target',它在类型 'Confirmation' 上声明”
- javascript - 如何使用来自 POST 请求的数据通过 script.js 文件操作 DOM
- python - Django将基于函数的视图转换为基于类的视图
- javascript - 实现循环滚动时元素“未定义”