为什么在C ++中成员初始化需要新的语法?

时间:2014-09-20 16:43:26

标签: c++ oop

假设我有一个班级C,其中包含两个私人成员:ab,每个成员都有一个参数。为什么初始化我的两个成员需要以下语法?

C() : a(x), b(y) {}

如果我在其他任何地方初始化两个对象,语法就是:

A a = A(x);
B b = B(y);

其中AB分别是ab的类型(和构造函数),xy代表AB构造函数所期望的相同类型的任意参数。

那么,为什么这种语法不起作用,需要使用成员初始化列表,如上例所示?

C() {
    A a = A(x);
    B b = B(y);
}

成员初始化语法更简洁,但我不明白为什么需要它。上面给出的g ++错误类似于:

note: candidate expects one argument, zero provided

用于AB的构造函数。

例如,在Python中不需要使用成员初始化列表(或者我认为可能)。在C ++中需要这种语法的动机是什么?

2 个答案:

答案 0 :(得分:2)

你的一些困惑是这种语法似乎“独特”,因为你不在其他地方使用它。这并不意味着它在其他地方无效。这是本地变量的正确直接初始化

A a(x);
B b(y);

你一直在做复制初始化

ctor-initializer列表需要直接初始化,不允许复制初始化。但它不是新语法。这也是你通常应该用于局部变量的东西。

答案 1 :(得分:1)

当执行构造函数的主体时,必须已经初始化了类的所有成员对象;如果未提供初始化列表,则为每个成员对象调用默认构造函数。

如果没有默认构造函数,则触发该错误。因此,您可以选择为AB提供默认构造函数,也可以使用初始化列表。

如果您将引用作为成员对象,也可以触发此错误。