#include<iostream>
using namespace std;
int &fun()
{
static int x;
return x;
}
int main()
{
fun() = 10;
cout<<fun();
return 0;
}
上面的程序輸出結果是10.但是我很困惑這個程序是如何工作的。什麼概念在這裏工作,它在哪裏應用?
#include<iostream>
using namespace std;
int &fun()
{
static int x;
return x;
}
int main()
{
fun() = 10;
cout<<fun();
return 0;
}
上面的程序輸出結果是10.但是我很困惑這個程序是如何工作的。什麼概念在這裏工作,它在哪裏應用?
fun()
返回參考,在第一表達main()
:
fun() = 10;
^ ^
| x assigned 10
returned x
因爲靜態變量的值不同的函數調用之間仍然存在,所以在下一表達式:
cout << fun();
^
return x with value 10
注意:因爲您正在返回靜態變量的引用,所以它不是未定義的行爲。
因爲該函數返回一個引用,所以可以修改底層的靜態變量。
第一次調用時,將創建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::vector
或std::map
。
該函數正在返回一個對靜態變量的引用。函數退出後,靜態變量仍然存在。
由於該函數返回一個引用,所以可以設置該值,然後將其輸出到屏幕。它基本上是「隱藏」一個全局變量。我不知道它使一個很大的意義使用這種技術,但是......
fun
將參考返回靜態變量x
,然後可以用來修改x
值。 C等價物可能類似於:
int *fun()
{
static int x;
return &x;
}
int main()
{
int *ptr = fun();
*ptr = 10;
printf("%d\n", *fun());
return 0;
}
我也寫了C等價物!謝謝。 – amulous
對f中的靜態變量x的引用被用於將值10賦值給x;它(參考),然後被傳遞到cout的一個靜態變量x
的
靜態變量本質上是一個全局變量,只能從一個函數直接訪問。當你的函數返回一個對這個變量的引用時,它實際上會返回它的地址。由於該變量是全局變量,因此它始終是相同的地址,因此您的函數實際上允許每個人訪問此變量。
因爲'x'是一個靜態變量,所以當函數結束時它不會「停止存在」。因此,可以返回一個指針或引用。之後,它只是基本的參考行爲! – Nbr44
寫這樣的東西有什麼實用價值? – Panzercrisis
@Panzercrisis(這正是我所要求的,目前我發現的唯一有效合理的用例是在一個類上重載'operator []',所以可以寫'obj [idx] = value;'......但現在,這太可怕了。) – 2013-07-25 14:50:40