在C ++中定义构造函数的更好方法是什么?初始化列表或Ctor Body中的初始化?

时间:2012-06-03 09:31:00

标签: c++ constructor copy-constructor

  

可能重复:
  Initializing in constructors, best practice?
  Advantages of using initializer list?

我有以下两种方法来定义Point Class中的构造函数:

class Point
{
public : 
    Point(double X,double Y):x(X),y(Y){}

Private : 
double x,y;


}

另一种方式:

class Point
{
public : 
 Point(double X,double Y)
{    
   x= X;
   y = Y;

}

Private : 
double x,y;


}

我想知道哪一个更好,为什么?在第一种情况下是否使用了复制ctor? 哪一个是首选的?有些人可以用这个例子解释一下吗? RGDS, 软质皮

3 个答案:

答案 0 :(得分:3)

尽可能使用初始化列表。虽然在这种特殊情况下它没有任何区别,但你会养成习惯。

对于POD类型,成员不会被初始化两次,因此性能方面也是如此。非POD类型在进入构造函数体之前被初始化,因此如果你不在初始化列表中但在c-tor的主体中这样做,它们将被初始化两次。

const成员和引用必须在初始化列表中初始化。同样,不适用于您的情况。

答案 1 :(得分:0)

第二个版本对数据成员执行赋值,而第一个版本将它们初始化为给定值。这里首选版本。虽然在双打的情况下可能没什么区别,但根本没有理由更喜欢执行额外操作的结构。如果您的数据成员不是双倍的,但是构造成本很高的类型,您将支付默认构造它们的惩罚,然后为它们分配值。

示例:

struct ExpensiveToConstruct { .... };

struct Foo {
  Foo() {
    // here, x has already been default constructed
    x = SomeValue; // this is an assignment to the already constructed x.
  }
  ExpensiveToConstruct x;
};

struct Bar {
  Bar : x(SomeValue) {
    // only the constructor has been called. No assignemt.
  }
  ExpensiveToConstruct x;
};

答案 2 :(得分:-1)

最好在你的ctor中使用初始化列表。它会更有效率。在第二种方式中,ctor将初始化成员数据两次,默认值为1st,然后在ctor中调用语句。

以及更多,对于const或引用成员,应该由init列表初始化,不能在ctor中初始化。