C++如何在成员函数中初始化引用成员变量并在其他成员函数访问
问题原因分析
C++中的引用属于别名类型,必须在定义的同时完成和目标对象的绑定,后续仅能修改绑定目标的值,无法重新绑定到其他对象。
你提供的代码编译阶段就会报错,典型报错信息为error: uninitialized reference member ‘abc::var’,核心问题在于类的默认构造函数abc() {}没有给引用成员var做初始化,相当于引用定义后没有绑定对象。同时你在fun1中写的var=temp属于赋值操作,不是引用绑定,即使绕过编译也属于未定义行为。
正确实现方案
根据你的使用需求,可选择两种实现方式:
方案1:构造对象时绑定引用(符合引用语义的推荐方案)
给类添加带参构造函数,在构造函数的初始化列表中完成引用成员的绑定,引用的绑定关系在对象生命周期内固定,示例代码如下:
#include <iostream> using namespace std; class abc { public: int& var; // 带参构造函数,初始化列表完成引用绑定 abc(int& temp): var(temp) {} void fun1 (int val) {var = val;} // 修改引用指向的目标的值,不是重新绑定 void fun2 () {cout << var << endl;} }; int main() { int y=9; abc f(y); // 构造对象时直接绑定y的引用 f.fun2(); // 输出 9 f.fun1(10); // 修改y的值为10 f.fun2(); // 输出 10 cout << y << endl; // 外部的y同步变为10,符合引用特性 return 0; }
方案2:需要后期绑定目标时,改用指针实现
如果你确实需要先创建类对象,之后再绑定到外部变量,引用本身不支持重新绑定的特性无法满足需求,可替换为指针成员:
#include <iostream> using namespace std; class abc { public: int* var = nullptr; // 初始化为空指针避免野指针 void fun1 (int& temp) {var = &temp;} // 存储变量地址,实现后期绑定 void fun2 () { if(var) cout << *var << endl; // 访问前判空,避免空指针异常 } abc() = default; // 支持默认构造 }; int main() { abc f; int y=9; f.fun1(y); f.fun2(); // 输出 9 return 0; }
注意事项
- 引用成员绑定的外部变量的生命周期,必须长于类对象的生命周期,否则类对象访问引用时会出现悬空引用,触发未定义行为
- 禁止在构造函数体内部给引用成员做赋值初始化,该操作不属于引用绑定,会触发未定义行为
内容的提问来源于stack exchange,提问作者PhiloRobotist
相关产品推荐
相关产品推荐

