2016-07-30 104 views
1

我試圖通過引用存儲int作爲類的數據成員。 我期望這是對象通過引用得到int比如果我增加引用從外部增加對象內的值。數據成員int參考

class A 
{ 
private : 
    int& x; 

public: 
    A(int y) : x(y) 
    { 
     cout << "A's ctor x = " << x << endl; 
    } 

    void print() 
    { 
     cout << "x = " << x << endl; 
    } 


}; 

int main() 
{ 
    int i = 8; 
    A a(i); 
    a.print(); 
    ++i; 
    a.print(); 
} 

輸出是:

A's ctor x = 8 
x = 8 
x = 8 

爲什麼X心不是9?

+0

你覺得呢'x' *爲*(注意時態)引用?提示:它不是'我'。擾流板:'A(int&y)'。調高警戒級別。你應該收到「綁定參考成員'x'堆棧分配參數'y'的效果的警告」 – WhozCraig

回答

4

問題是您要將臨時(構造函數參數y)綁定到引用。臨時的生命週期僅限於構造函數,但您的參考仍在繼續,成爲「懸而未決」的參考。這是一個合理的編譯器必須說關於此事:

crap13.cpp:10:18:警告:綁定參考構件「x」至堆棧分配的參數的「y」 [-Wdangling場]

A(int y)對:X(Y)

您可以通過構造函數參數的引用 「修正」 這樣的:

A(int& y) : x(y) 

,但你必須確保無論是作爲一個傳遞構造函數的參數超出構造的對象。

+0

是gcc的警告嗎?鐺給出了相同的信息,但沒有注意到排放的警告標誌。只是好奇。 (如文件名,btw = P) – WhozCraig

+0

@WhozCraig這是clang的一些合理的新版本,與xcode捆綁在一起。 – juanchopanza

+0

這就是我使用的那個。最新的更新(我認爲):*蘋果LLVM版本7.0.2(鐺-700.1.81)*。奇。謝謝。 – WhozCraig

0

的問題是,你的價值由您的構造函數傳遞整型,你應該通過引用傳遞它:

A(int& y) : x(y) 
{ 
    cout << "A's ctor x = " << x << endl; 
}