2
#include<iostream>

using namespace std;

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

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

上面的程序输出 10。但我对这个程序的实际工作方式感到困惑。

4

7 回答 7

5

fun()返回静态变量的引用x,在第一个表达式中main()

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

因为静态变量的值在不同的函数调用之间保持不变,所以在下一个表达式中:

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

注意:因为您正在返回静态变量的引用,所以它不是未定义的行为。

于 2013-07-25T14:21:13.350 回答
4

您在函数 fun() 中有一个静态 int 变量。
该函数返回对该变量的引用。
您将 10 分配给变量。
您打印变量。

于 2013-07-25T14:20:54.697 回答
2

因为该函数返回一个引用,所以可以修改底层静态变量。

在第一次调用时,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::vectoror std::map

于 2013-07-25T14:20:04.187 回答
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;
}
于 2013-07-25T14:20:54.040 回答
0

该函数正在返回对静态变量的引用。函数退出后静态变量继续存在。

由于该函数返回一个引用,因此您可以设置该值,然后将其输出到屏幕。它基本上是“隐藏”一个全局变量。我不确定在哪里使用这种技术很有意义,但是......

于 2013-07-25T14:20:22.510 回答
0

对 f 中的静态变量 x 的引用被用于将值 10 分配给 x;然后它(参考)被传递给 cout

于 2013-07-25T14:21:01.543 回答
0

静态变量本质上是一个只能从单个函数直接访问的全局变量。当你的函数返回对该变量的引用时,它实际上返回了它的地址。由于变量是全局的,它总是相同的地址,因此您的函数实际上是让每个人都可以访问这个变量。

于 2013-07-25T14:21:13.963 回答