#include<iostream>
using namespace std;
int &fun()
{
static int x;
return x;
}
int main()
{
fun() = 10;
cout<<fun();
return 0;
}
上述程序输出10.但我对此程序的实际运作方式感到困惑。
答案 0 :(得分:5)
fun()
在x
的第一个表达式中返回静态变量main()
的引用:
fun() = 10;
^ ^
| x assigned 10
returned x
因为静态变量的值在不同的函数调用之间持续存在,所以在下一个表达式中:
cout << fun();
^
return x with value 10
注意:因为您正在返回静态变量的引用,所以它不是未定义的行为。
答案 1 :(得分:4)
你在函数fun()中有一个静态int变量。
该函数返回对该变量的引用
您为变量赋值10
您打印变量。
答案 2 :(得分: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::vector
或std::map
。
答案 3 :(得分: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;
}
答案 4 :(得分:0)
该函数返回对静态变量的引用。函数退出后,静态变量仍然存在。
由于该函数返回一个引用,您可以设置该值,然后将其输出到屏幕。它基本上是“隐藏”全局变量。我不确定使用这种技术有多大意义,但是......
答案 5 :(得分:0)
对f中的静态变量x的引用用于将值10赋值给x;它(引用)然后被传递给cout
答案 6 :(得分:0)
静态变量本质上是一个只能从单个函数直接访问的全局变量。当您的函数返回对此变量的引用时,它实际上返回其地址。由于变量是全局变量,因此它始终是相同的地址,因此您的函数实际上是让每个人都可以访问此变量。