2016-08-15 106 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