对于一类的构造函数,就是通过括号转让或等号之间的区别? [重复](For a class con

2019-10-17 12:44发布

可能重复:
在构造函数初始化场-初始化列表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; }

他提到的第一实施例(使用括号内)是写构造方法的优选方式。

我的问题是:有什么区别?它为什么重要? 以何种方式是第一优于第二?

Answer 1:

原因在于,首先是分配,这是一个初始化,而第二代码实际上是相同的:

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,它仍然是可取的初始化它们在初始化列表,而不是通过构造函数赋值:如果不出意外,它的效率更高(因为否则会进行多余的操作,这些操作可能在某些情况下,昂贵的)。



Answer 2:

第一个副本,正在构建之前输入的构造函数体中的成员。 注:这是所谓在C的构造函数初始化列表 ++更大主题的一部分。 它是强制性的,以在初始化列表来表示特定部件的变量类型,其中基准部件,具有非默认构造(即,需要用于它们的构造参数),和const成员的成员。 在提出问题的情况下使用是调用拷贝产品建筑,而不是默认的建设,随后在身的分配,这给我们带来...

第二默认构造被输入之前的构造体的成员,那么在身体内分配它们的值。 这仅仅是支持的默认成员建设可行。

在这两个,第一通常优选,特别是对于具有昂贵缺省初始化复杂数据类型。 说初始化可能会因为随后的任务就是将要发生的部分或完全浪费。 你通常最好是前述使用拷贝构造来代替。 注: 所有内部数据类型( intfloat ,指针等)支持复制建构。



Answer 3:

第二种方式进行默认构造,然后分配。

如果默认的构造函数不存在,它不会工作,无论哪种方式,它可能不会便宜。

另外,虽然第二个没有第一种方法可以调用一个明确的构造函数。



文章来源: For a class constructor, what is the difference between the assignment via parentheses or the equal sign? [duplicate]