0

可能重复:
在构造函数中初始化,最佳实践?
使用初始化列表的好处?

我有以下两种方法来定义 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;


}

我想知道哪个更好,为什么?在第一种情况下是否使用了copy ctor?每个人都首选哪里?有人可以用例子解释一下吗?Rgds,软软的

4

3 回答 3

3

尽可能使用初始化列表。尽管在这种特殊情况下没有区别,但您会养成习惯。

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

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

于 2012-06-03T09:32:02.950 回答
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;
};
于 2012-06-03T09:35:01.763 回答
-1

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

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

于 2012-06-03T09:36:51.490 回答