类内数据成员初始化异常:深入研究 C 标准
与可以使用 () 直接初始化的本地数据成员不同语法,类内数据成员违背了这种方便的方法。这种特性让许多程序员感到困惑,引发了对其基本原理的疑问。
根据 C 标准,禁止使用 () 直接初始化类数据成员,以防止解析歧义。考虑以下场景:
class S { public: int i(x); // data member with initializer };
如果没有限制,编译器在尝试确定声明是引用带有初始值设定项的数据成员还是成员函数声明时可能会感到困惑。
例如:
struct S { int i(j); // member function declaration int j; // data member without an initializer };
在不明确的情况下应用现有的解析规则(将成员函数优先于数据成员)可能会导致错误的解释。为了避免这种混乱,C 标准选择禁止直接初始化类数据成员。
尽管如此,仍然可以使用替代初始化方法,例如使用 = 初始化子句语法:
int s = 3;
或者用花括号括起来的初始化列表:
int s{3};
通过遵循这些方法,程序员可以有效地初始化类数据成员,尽管其语法与本地同行不同。
以上是为什么我们不能使用括号来初始化 C 中的类内数据成员?的详细内容。更多信息请关注PHP中文网其他相关文章!