可能重复:
在构造函数初始化场-初始化列表VS构造体
在讲座中,我参加了,讲师短暂交谈C ++中关于非默认的类的构造函数。 他特别指出,一个版本是最好的其他。 他展示了这两个例子:
Point::Point(double x, double y, double z)
: x_(x), y_(y), z_(z)
{}
Point::Point(double x, double y, double z)
{ x_= x; y_= y; z_= z; }
他提到的第一实施例(使用括号内)是写构造方法的优选方式。
我的问题是:有什么区别?它为什么重要? 以何种方式是第一优于第二?
原因在于,首先是不分配,这是一个初始化,而第二代码实际上是相同的:
Point::Point(double x, double y, double z)
: x_(), y_(), z_()
{ x_= x; y_= y; z_= z; }
也就是说,所有的成员都默认初始化这里被分配之前。 当他们的类型没有默认构造函数不起作用。 例如:
class Foo {
Foo(); // Private, undefined constructor
public:
Foo(int) { }
};
class Bar {
int& i;
Foo f;
public:
Bar() { i = 0; f = Foo(0); }
};
此代码不会起作用,因为Bar
的构造函数依赖于一个默认的构造函数的存在f
和初始化器对于i
,这两者都不存在。
但是,即使所有成员都是默认constructible或initialisable,它仍然是可取的初始化它们在初始化列表,而不是通过构造函数赋值:如果不出意外,它的效率更高(因为否则会进行多余的操作,这些操作可能在某些情况下,昂贵的)。
第一个副本,正在构建之前输入的构造函数体中的成员。 注:这是所谓在C的构造函数初始化列表 ++更大主题的一部分。 它是强制性的,以在初始化列表来表示特定部件的变量类型,其中基准部件,具有非默认构造(即,需要用于它们的构造参数),和const成员的成员。 在提出问题的情况下使用是调用拷贝产品建筑,而不是默认的建设,随后在身的分配,这给我们带来...
第二默认构造被输入之前的构造体的成员,那么在身体内分配它们的值。 这仅仅是支持的默认成员建设可行。
在这两个,第一通常优选,特别是对于具有昂贵缺省初始化复杂数据类型。 说初始化可能会因为随后的任务就是将要发生的部分或完全浪费。 你通常最好是前述使用拷贝构造来代替。 注: 所有内部数据类型( int
, float
,指针等)支持复制建构。
第二种方式进行默认构造,然后分配。
如果默认的构造函数不存在,它不会工作,无论哪种方式,它可能不会便宜。
另外,虽然第二个没有第一种方法可以调用一个明确的构造函数。
文章来源: For a class constructor, what is the difference between the assignment via parentheses or the equal sign? [duplicate]