#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()
返回静态变量的引用x
,在第一个表达式中main()
:
fun() = 10;
^ ^
| x assigned 10
returned x
因为静态变量的值在不同的函数调用之间保持不变,所以在下一个表达式中:
cout << fun();
^
return x with value 10
注意:因为您正在返回静态变量的引用,所以它不是未定义的行为。
您在函数 fun() 中有一个静态 int 变量。
该函数返回对该变量的引用。
您将 10 分配给变量。
您打印变量。
因为该函数返回一个引用,所以可以修改底层静态变量。
在第一次调用时,static int
会创建变量,然后返回对它的引用。然后将 的值设置x
为 10。
该cout
语句再次获取引用并使用它来写入x
标准输出。
值得注意的是,如果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
or 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;
}
该函数正在返回对静态变量的引用。函数退出后静态变量继续存在。
由于该函数返回一个引用,因此您可以设置该值,然后将其输出到屏幕。它基本上是“隐藏”一个全局变量。我不确定在哪里使用这种技术很有意义,但是......
对 f 中的静态变量 x 的引用被用于将值 10 分配给 x;然后它(参考)被传递给 cout
静态变量本质上是一个只能从单个函数直接访问的全局变量。当你的函数返回对该变量的引用时,它实际上返回了它的地址。由于变量是全局的,它总是相同的地址,因此您的函数实际上是让每个人都可以访问这个变量。