2016-08-15 111 views
1

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

这是一个特例吗?

什么是正确的规则?

+8

请显示一些代码。 –

+0

因为它们是由成员初始化列表初始化的。 – songyuanyao

+1

_“但我发现,当它是一个类成员时,引用被声明而不被初始化。这是一个特殊情况?”_证据? –

回答

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变量只声明。如果你创建(定义)X类型的对象,编译器不会显示任何错误。当你写:

int main() { 
    X x; // error, `x.r` is not bound to any object 
} 

编译器会抱怨,这是因为你已经定义x,这是你还必须绑定x.r一些对象。你可以做的唯一的地方是在构造函数初始化列表中。

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

+4

什么是反对???这个答案是正确的! (我正准备发布差不多相同的答案)。 –

+0

让OP先澄清一下,然后再拍摄到黑暗之前。正确的反应是近距离投票(也许可以发表评论)。请不要在这里提出脱离主题的问题。 –

+0

OP-s混淆可能来自'int & mri;'看起来像非初始化参考的事实,但我只是在猜测。 – marcinj