2013-07-25 109 views
2
#include<iostream> 

using namespace std; 

int &fun() 
{ 
    static int x; 
    return x; 
} 

int main() 
{ 
    fun() = 10; 
    cout<<fun(); 
    return 0; 
} 

上面的程序輸出結果是10.但是我很困惑這個程序是如何工作的。什麼概念在這裏工作,它在哪裏應用?

+1

因爲'x'是一個靜態變量,所以當函數結束時它不會「停止存在」。因此,可以返回一個指針或引用。之後,它只是基本的參考行爲! – Nbr44

+1

寫這樣的東西有什麼實用價值? – Panzercrisis

+0

@Panzercrisis(這正是我所要求的,目前我發現的唯一有效合理的用例是在一個類上重載'operator []',所以可以寫'obj [idx] = value;'......但現在,這太可怕了。) – 2013-07-25 14:50:40

回答

5

fun()返回參考,在第一表達main()

fun() = 10; 
^ ^
    |  x assigned 10 
    returned x 

因爲靜態變量的值不同的函數調用之間仍然存在,所以在下一表達式:

cout << fun(); 
     ^
      return x with value 10 

注意:因爲您正在返回靜態變量的引用,所以它不是未定義的行爲。

+0

+1,但要精確的最後一行:它不會是UB,如果它沒有返回引用 - 它只會無法編譯。 – 2013-07-25 14:23:19

+5

@ H2CO3我認爲格里耶什的意思是「如果變量不是靜態的,它將是UB」 – Angew

+1

感謝您的詳細解釋@Girijesh。 – amulous

2

因爲該函數返回一個引用,所以可以修改底層的靜態變量。

第一次調用時,將創建static int變量,然後返回對其的引用。然後,您將x的值設置爲10.

cout語句再次獲取該引用並使用它將x寫入stdout。

值得一提的是,如果x不是static,將它的功能範圍結束時被銷燬,並且返回的引用將是一個參考臨時,這是違法的。


最常見的實際應用是operator[]

class ArrayWrapper { 
    int v [100]; 

public: 
    int& operator[] (int index) { 
     return v[index]; 
    } 
}; 

// usage: 
ArrayWrapper aw; 
aw[3] = 3; 
cout << aw[10]; 

當然,這是一示例實現;對於真實世界超載op[]請看std::vectorstd::map

0

該函數正在返回一個對靜態變量的引用。函數退出後,靜態變量仍然存在。

由於該函數返回一個引用,所以可以設置該值,然後將其輸出到屏幕。它基本上是「隱藏」一個全局變量。我不知道它使一個很大的意義使用這種技術,但是......

1

fun將參考返回靜態變量x,然後可以用來修改x值。 C等價物可能類似於:

int *fun() 
{ 
    static int x; 
    return &x; 
} 

int main() 
{ 
    int *ptr = fun(); 
    *ptr = 10; 
    printf("%d\n", *fun()); 
    return 0; 
} 
+0

我也寫了C等價物!謝謝。 – amulous

4

函數fun()中有一個靜態int變量。
該函數返回對該變量的引用。
您將10分配給變量。
您打印該變量。

+0

謝謝!得到它了。 – amulous

0

對f中的靜態變量x的引用被用於將值10賦值給x;它(參考),然後被傳遞到cout的一個靜態變量x

0

靜態變量本質上是一個全局變量,只能從一個函數直接訪問。當你的函數返回一個對這個變量的引用時,它實際上會返回它的地址。由於該變量是全局變量,因此它始終是相同的地址,因此您的函數實際上允許每個人訪問此變量。

相關問題