2011-03-03 68 views
0

我寫了下面的代碼,我期待得到 6,但我得到了5 6 5 0。看起來,「val」在開始時正確地獲取了引用,但隨後它會丟失。有人知道我的錯誤在哪裏嗎?初始化引用

class Count { 

    public: 
    void add() { 
    val++; 
    } 
    void print() { 
    cout << val << endl; 
    } 
    Count(int c): val(c) { 
    } 
    private: 
    int &val; 
}; 

int main() { 

    int c = 5; 
    Count teste(c); 
    teste.print(); 
    teste.add(); 
    teste.print(); 
    cout << c << endl; 
    teste.print(); 
    return 0; 
} 

回答

5

你的構造函數應該通過引用而不是按值來引用參數。

1

這裏的問題是你綁定了一個參數傳遞的參數值。這應該是非法的,但也許不是。 (通過值傳遞的參數是否具有與臨時狀態相同的狀態,是否也適用於基元類型?)

這是什麼編譯器?

由於SpaceCowboy指出如果你的構造函數接受一個引用參數,它將起作用。它應該這樣做,這是包裝引用的正常方式。當然,一旦c超出範圍,val將會失效。

+0

在構造函數中,該參數是一個左值,因此您可以將其綁定到引用。一個很好的編譯器可能會警告所產生的引用在很短的時間內有效。 – 2011-03-03 16:47:04

+0

我用g ++編譯它(我不知道它是否有任何區別,但是我在cygwin環境中運行它)。 – Carlos 2011-03-06 07:17:47

0

您將您的私人成員val設置爲您的構造函數中的本地變量c的引用。一旦你退出構造函數,它就會引用棧上的一些隨機值。

0

是的。將'int & val'更改爲'int val'或將'Count(int c)'更改爲'Count(int & c)',即可完成這項工作。現在你在c'tor中收到一個副本,並且因爲你將該副本分配給引用,你將會得到未定義的行爲,因爲當流程離開構造函數的作用域時,副本將被終止,因此對象將會保留對堆棧中的隨機地點的引用!