什么概念在这里工作,在哪里可以应用?

时间:2013-07-25 14:18:19

标签: c++

#include<iostream>

using namespace std;

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

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

上述程序输出10.但我对此程序的实际运作方式感到困惑。

7 个答案:

答案 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::vectorstd::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)

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