C++ 在C+中定义构造函数的更好方法是什么+;?初始化列表还是主体中的初始化?

C++ 在C+中定义构造函数的更好方法是什么+;?初始化列表还是主体中的初始化?,c++,constructor,copy-constructor,C++,Constructor,Copy Constructor,可能重复: 我有以下两种方法来定义Point类中的构造函数: 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; } 我想知道哪一个更好

可能重复:

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

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,
Softy

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

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


const
成员和引用必须在初始值设定项列表中初始化。同样,这不适用于你的情况

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

例如:

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;
};

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


此外,对于const或reference成员,应该由init list初始化,而不能在ctor中初始化。

“虽然它在双精度情况下可能没有什么区别”-它有什么区别吗?@LuchianGrigore有一个额外的赋值,所以我认为它可以(忽略不计)区别。但在第一种情况下,有一个额外的初始化。参见第6段-它们不能保证相等,但我看不出它们不应该相等的任何原因。毕竟,在汇编程序级别上,没有RAI:对于POD对象,首先分配一组单位化内存,然后开始在其中写入内容,不管这是C++中的初始化还是赋值。POD类型没有被初始化两次。