C ++参考初始化

时间:2016-08-15 10:54:55

标签: c++ reference

我对C ++中的引用初始化感到困惑。 通常引用应该在声明时初始化,但是我发现当它是一个类成员引用时,声明没有被初始化。

这是一个特例吗?

正确的规则是什么?

1 个答案:

答案 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绑定到某个对象的地方。唯一可以执行此操作的地方是构造函数初始化列表。

您可能还会注意到,当您将引用添加为非静态数据成员时,编译器会将默认构造函数标记为已删除。