类定义中成员的直接初始化问题:为何无法使用括号初始化?
为什么类定义里不能用小括号直接初始化成员变量?
先看你贴的代码:
class Myclass { int y(10); // 报错:expected ',' or '...' before numeric constant int z=5; // 完全合法 };
核心问题是编译器的语法解析规则:
- 在类的成员声明区域里,
int y(10);会被误认为是成员函数的声明——它的格式刚好匹配「返回int类型、函数名y、参数列表里写了个10(这不符合函数参数语法)」,编译器本来在等你写参数类型或逗号,结果看到数字,直接报错。哪怕你写int y();,编译器也会当成无参成员函数,而不是变量。 - 而
int z=5;是C++11开始支持的非静态成员就地初始化语法,编译器能明确识别这是给成员变量z设置初始值,不会和函数声明搞混。
要是想用类似直接初始化的方式给成员变量赋值,有两种合法写法:
- 用C++11引入的大括号统一初始化:
class Myclass { int y{10}; // 合法,编译器明确这是变量初始化 int z=5; };
- 在构造函数里用初始化列表初始化(这也是C++98就支持的传统方式):
class Myclass { int y; int z; public: Myclass() : y(10), z(5) {} // 构造函数初始化列表,最稳妥的成员初始化方式 };
补充一句:如果是静态成员变量,static int y(10);在C++17及之后是合法的,但非静态成员始终不能用小括号直接初始化,本质就是为了避免和函数声明的语法冲突。
内容的提问来源于stack exchange,提问作者terto
相关产品推荐
相关产品推荐

