为什么C++中的成员初始化需要一种新的语法
Why is a new syntax required for member initalization in C++?
假设我有一个类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
用于CCD_ 12和CCD_ 13的构造函数。
例如,在Python中,成员初始化列表的使用不是必需的(或者我认为是可能的)。在C++中要求使用这种语法的动机是什么?
您感到困惑的一部分是,这种语法似乎是"唯一的",因为您在其他地方没有使用它。这并不意味着它在其他地方无效。这是正确的直接初始化本地变量:
A a(x);
B b(y);
您一直在执行复制初始化。
ctor初始值设定项列表需要直接初始化,不允许复制初始化。但它并不是一个新语法。它通常也应该用于局部变量。
当执行构造函数的主体时,该类的所有成员对象都必须已经初始化;如果没有提供初始值设定项列表,则会为每个成员对象调用默认构造函数。
如果没有默认构造函数,则会触发该错误。因此,您可以选择为A
和B
提供默认构造函数,或者使用初始化列表。
在将引用作为成员对象的情况下,也可能触发此错误。
相关文章:
- 有符号的int和int-有没有一种方法可以在C++中区分它们
- 有一个打印语句的函数是一种糟糕的编程实践吗
- 有没有一种方法可以创建一个带有哈希表的数据库,该哈希表具有恒定时间查找功能
- 有没有一种方法可以在编译时获得作用域类名
- 对于C++中使用智能指针的指针算术限制,有没有一种变通方法
- 一种在C++中读取TXT配置文件的简单方法
- 有没有一种方法可以测量c++程序的运行时内存使用情况
- 有没有一种方法可以使用placement new将堆叠对象分配给分配的内存
- 在调用接收数组的方法时,模板化数组大小是不是一种糟糕的做法
- 有没有一种方法可以通过"typedef"为重新定义的基本类型定义特征和强制转换运算符
- 有没有一种"cleaner"的方法可以在指向基的指针向量中找到派生类的第一个实例?
- 有没有一种代码密度较低的方法来使用非默认构造函数初始化数组?
- 将错误返回给调用方而不是立即在 C++ 中抛出错误是否是一种好的做法
- 在 c++ 中,有一种方法可以创建一个包含地图作为值的树状地图?
- 有没有一种优雅而快速的方法来测试整数中的 1 位是否位于连续区域
- C++:有没有一种有效的方法来语法上使用指针等索引
- 为什么C++中的成员初始化需要一种新的语法
- 在正则语法和上下文无关语法中,哪一种更强大.也请告诉我原因
- 尝试为特征矩阵实现一种初始化列表语法
- 一个c++语法问题(一种结构方法)