构造函数定义C++语法

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)

在继承的情况下我见过的第一个.

据我所知,这不是一个重复的问题.如果你发现一个人可以随意关闭这个问题.

max*_*x66 8

第一个初始化pricex其中第二个初始化price用它的缺省值(默认构造它;在的情况下int的变量,与未定义的值初始化),然后复制xprice.

换句话说,第一个几乎相当于

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)


gsa*_*ras 6

第一个使用初始化列表,而另一个不使用,并分配xprice构造函数体内的数据成员.

我们通常更喜欢使用初始化列表,并使构造函数的主体尽可能简单.