c++ - 构造函数定义 C++ 语法

标签 c++ oop c++11 ctor-initializer

<分区>

这两个构造函数声明有什么区别:

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

关于c++ - 构造函数定义 C++ 语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53244041/

相关文章:

c++ - 我正在尝试将过程的结果写入文本文件,我遇到的问题是列的对齐方式

C++:辛>> *字符

java - 设计面向对象的系统/GUI

java - 类和函数结构(Java)

c++ - 在范围内保持 shared_ptr

c++11 - C++:std::function 常量的语义是什么?

c++ - 为什么在使用递归 lambda 时出现编译错误?

c++ - glDeleteBuffers 在析构函数调用期间崩溃

C++:成员和非成员函数之间的区别

c++ - 为什么 std::is_function 对简单函数和 lambda 返回 false?