我对C ++中的引用初始化感到困惑。 通常引用应该在声明时初始化,但是我发现当它是一个类成员引用时,声明没有被初始化。
这是一个特例吗?
正确的规则是什么?
答案 0 :(得分:6)
此规则仍然适用,作为成员变量引用,您必须在构造函数的初始化列表中初始化。例如:
class X {
public:
X(int& ri) : mri(ri) {}
// X() {} // ERROR! no explicit initialization of mri
int& mri;
};
int main() {
int i;
X x(i);
}
如果不启动它,您将收到编译器错误。
(我决定从评论中总结其他很好的说明,以使这个答案更有用)
根据标准8.5.3 / 3(强调我的):
初始化程序只能在声明中的参数声明(8.3.5)中作为参考而省略 函数返回类型, 在类定义(9.2) 中的类成员的声明中,以及 明确使用extern说明符。
因此,以下代码仅定义struct X
,其中mri
变量仅被声明。
struct X {
int &mri; // declaration of mri (ERROR if you define variable of this struct)
};
如果您创建(定义)X类型的对象,编译器将不会显示任何错误。当你写:
int main() {
X x; // error, `x.r` is not bound to any object
}
编译器会抱怨,这是因为你已经定义了x
,这也是你必须将x.r绑定到某个对象的地方。唯一可以执行此操作的地方是构造函数初始化列表。
您可能还会注意到,当您将引用添加为非静态数据成员时,编译器会将默认构造函数标记为已删除。