2014-05-20 29 views
0

任何人都可以告訴我在下面的代碼中發生了什麼。我期待左值錯誤,如果我刪除了函數的引用返回類型,就會發生。但它給了我20個輸出。請解釋。謝謝。C++參考和左值

int &fun() 
{ 
    static int x = 10; 
    return x; 
} 
int main() 
{ 
    fun() = 20; 
    cout << fun(); 
    return 0; 
} 
+0

哪部分你不明白? – juanchopanza

+0

不要忘記'x'是靜態的。 – 101010

+2

可能使'x'靜態來擺脫編譯器警告關於返回對非靜態局部變量的引用... – Jeff

回答

3

輸出如預期。在呼叫fun() = 20;,在fun()實際x分配20,因爲fun()回報參考x。在呼叫cout<<fun();中,分配的值被打印,即20

由於x宣佈爲static,即使在func()返回後,它仍可在內存中使用。在方法中遇到第一個變量時,會創建一個方法範圍爲static的變量,並保留到程序終止。 static變量僅初始化一次,隨後的方法調用將看到上次更新的值。更多關於staticherehere

+2

另外值得注意的是'x'只初始化一次。 – mavam

2

基本C++語義:

  • 除非返回類型是參考不能分配到的函數的返回值。
  • 函數不能返回對局部變量的引用,除非它是一個static變量。
  • 靜態變量的值在訪問之間保持不變。

如果你要分配的東西xfun()外,x有地方住吧?使其成爲static爲其提供了一個永久點,每次都會重新訪問。這就是爲什麼20的價值依然存在。

+0

感謝您的分數.. – sarath