C++类引用成员变量构造报uninitialized reference错误如何解决
错误原因
C++语法明确规定:引用类型的成员变量必须在构造函数的初始化列表中完成初始化。
你写的构造函数里var = tmp;是构造函数体内的赋值操作,不是初始化。引用本身必须在创建时就绑定到合法对象,不存在“先创建引用、后续再给它绑定对象”的逻辑,进入构造函数体执行代码前,所有成员都要完成初始化,你的引用成员var没在初始化阶段绑定对象,所以编译器抛出未初始化引用成员的错误。
修复方案
把引用成员的初始化逻辑移到构造函数的初始化列表中,修正后可正常编译的代码如下:
#include<iostream> using namespace std; class Vec{ private: int& var; public: // 初始化列表在构造函数体执行前完成成员初始化,这里直接把var绑定到传入的tmp引用上 Vec(int& tmp): var(tmp) {} }; int main(){ int x = 10; Vec v1(x); }
额外注意
- 构造函数体内对引用变量的赋值,本质是修改引用绑定的目标对象的值,不是让引用重新绑定到新对象,也无法替代引用要求的初始化操作。
- 除了引用成员,类中的const修饰成员、没有默认构造函数的自定义类型成员,同样必须在构造函数初始化列表中完成初始化,放在构造函数体内赋值会报同类编译错误。
内容的提问来源于stack exchange,提问作者user17098578
相关产品推荐
相关产品推荐

