为何无法将类中已初始化的私有成员赋值给公有成员?
问题原因分析
你的代码核心问题是类成员变量的初始化顺序不符合预期,具体细节如下:
- C++中,类的非静态成员变量初始化顺序严格遵循它们在类定义中的声明顺序,和初始化列表、类内初始化的书写顺序无关。
- 你的代码里,
x在var之前声明,所以初始化流程是:- 先执行
int x = var;,此时var还未完成初始化(它的类内初始化int var = 0;还没执行),x会被赋予一个未定义的随机值。 - 随后执行
var的类内初始化,将其设为0。 - 最后执行构造函数的初始化列表,把
var覆盖为5,但此时x已经完成初始化,不会再被更新。
- 先执行
注:类内部成员可以跨访问权限互相访问(public成员可访问private成员),这部分语法本身没有问题。
修复方案
有两种常见的修复方式:
- 调整成员声明顺序:将
var的声明放在x之前,确保var先完成初始化,x就能拿到正确的值:
class A { private: int var = 0; // 先声明var public: A () : var (5) {} int x = var; // 此时var已完成初始化 void display () { cout << x; } };
- 在构造函数中初始化x:放弃类内初始化
x,改为在构造函数的初始化列表或函数体内赋值,确保使用已初始化完成的var:
class A { public: A () : var (5), x(var) // 初始化列表先初始化var,再初始化x {} void display () { cout << x; } private: int var = 0; int x; // 不在类内初始化 };
内容的提问来源于stack exchange,提问作者Ali Afshair
相关产品推荐
相关产品推荐

