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类型没有被初始化两次。