可能重复:
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, 软质皮
答案 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中初始化。