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

Why is a new syntax required for member initalization in C++?

本文关键字:一种 语法 C++ 成员 初始化 为什么      更新时间:2023-10-16

假设我有一个类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

用于CCD_ 12和CCD_ 13的构造函数。

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

您感到困惑的一部分是,这种语法似乎是"唯一的",因为您在其他地方没有使用它。这并不意味着它在其他地方无效。这是正确的直接初始化本地变量

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

您一直在执行复制初始化

ctor初始值设定项列表需要直接初始化,不允许复制初始化。但它并不是一个新语法。它通常也应该用于局部变量。

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

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

在将引用作为成员对象的情况下,也可能触发此错误。

相关文章: