假设我有一个班级C
,其中包含两个私人成员:a
和b
,每个成员都有一个参数。为什么初始化我的两个成员需要以下语法?
C() : a(x), b(y) {}
如果我在其他任何地方初始化两个对象,语法就是:
A a = A(x);
B b = B(y);
其中A
和B
分别是a
和b
的类型(和构造函数),x
,y
代表A
和B
构造函数所期望的相同类型的任意参数。
那么,为什么这种语法不起作用,需要使用成员初始化列表,如上例所示?
C() {
A a = A(x);
B b = B(y);
}
成员初始化语法更简洁,但我不明白为什么需要它。上面给出的g ++错误类似于:
note: candidate expects one argument, zero provided
用于A
和B
的构造函数。
例如,在Python中不需要使用成员初始化列表(或者我认为可能)。在C ++中需要这种语法的动机是什么?
答案 0 :(得分:2)
你的一些困惑是这种语法似乎“独特”,因为你不在其他地方使用它。这并不意味着它在其他地方无效。这是本地变量的正确直接初始化:
A a(x);
B b(y);
你一直在做复制初始化。
ctor-initializer列表需要直接初始化,不允许复制初始化。但它不是新语法。这也是你通常应该用于局部变量的东西。
答案 1 :(得分:1)
当执行构造函数的主体时,必须已经初始化了类的所有成员对象;如果未提供初始化列表,则为每个成员对象调用默认构造函数。
如果没有默认构造函数,则触发该错误。因此,您可以选择为A
和B
提供默认构造函数,也可以使用初始化列表。
如果您将引用作为成员对象,也可以触发此错误。