为何无法在成员函数中用列表初始化数据成员?解析三类代码场景
成员函数中列表初始化与赋值的问题解析
问题1:为何无法在成员函数中用列表初始化器初始化数据成员?
初始化是对象构造阶段给变量赋予初始值的操作,只有在变量被创建的时候才能进行初始化。你的代码里,y已经在类定义时通过int y = 6;完成了默认初始化,对象构造完成后调用set_data_variable()时,y是已经存在的成员变量,此时不能再使用初始化语法(比如y {2})——这种语法只适用于变量声明、构造函数初始化列表,或者直接创建新对象的场景。
问题2:为何赋值操作可行,但初始化操作不可行?
核心区别是:
- 初始化:针对尚未存在的变量,在它被创建的同时赋予初始值
- 赋值:针对已经存在的变量,修改它当前存储的值
成员函数调用时,对象已经构造完成,所有数据成员都已经初始化过了,此时只能对成员变量进行赋值修改,不能再执行初始化操作。
代码场景解析
Case 1:y {2} 编译失败
y {2}是C++的直接初始化语法,只能用于声明变量时(比如int num {2};),或者构造对象的场景。此时y是已经存在的成员变量,编译器无法将这个语句解析为合法的表达式,因此会报错。
Case 2:y = 2 正常运行
这是最基础的赋值操作,直接将数值2覆盖y当前的取值(初始是6,执行后变成2),完全符合C++对已存在变量的操作规则,所以可以正常编译运行。
Case 3:y = {2} 正常运行
这是C++11引入的列表赋值语法,对于int这种标量类型,初始化列表{2}会被自动转换为对应的数值,效果等价于普通赋值y = 2。这种写法是合法的赋值操作,而非初始化,因此可以正常执行。
内容的提问来源于stack exchange,提问作者user_xyz
相关产品推荐
相关产品推荐

