为何类的const成员可在构造函数中修改?是否有相关标准规则?
为什么类的const成员可以在构造函数初始化列表中设置值?
这其实是C++标准特意规定的行为,核心要区分初始化和赋值的差异,以及const成员的"不可修改"到底指什么:
- const成员的"只读"属性,是针对对象构造完成之后的生命周期而言的——一旦对象完全构造好,你就不能再修改它的const成员了,但在构造过程中,我们是在给这个const成员设置它的初始值,这不属于"修改"操作。
- 你代码里的
const int b = 5;是默认成员初始化,它的作用是当构造函数没有在初始化列表中显式初始化b时,才会用这个值来初始化b。而构造函数的初始化列表优先级更高,会直接覆盖默认的初始化值,这完全符合C++标准的规则。
举个直观的对比,如果你把代码改成这样,就会报错:
struct Bar { const int b = 5; Bar(int c) { b = c; // 这里是赋值,此时b已经是const成员,对象正在构造中,不能修改 } };
这时候编译器才会报错,因为你是在尝试修改一个已经初始化过的const成员,而不是在初始化阶段设置它的初始值。
回到你的代码:Bar(int c):b(c)是在对象的构造初始化阶段,直接给b设置初始值2,取代了默认的5,这个过程是合法的,因为const成员允许在初始化时被赋予特定值,只要之后不再修改就行。
内容的提问来源于stack exchange,提问作者Joseph D.
相关产品推荐
相关产品推荐

