这里有什么概念在起作用,可以在哪里应用

What concept is at work here and where can it be applied?

本文关键字:在哪里 应用 起作用 什么 这里      更新时间:2023-10-16
#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写入 stdout。

值得注意的是,如果不static x,它将在函数作用域结束时被销毁,返回的引用将是对临时的引用,这是非法的。


最常见的实际应用是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

fun将返回对静态变量x的引用,然后可以用来修改x的值。C 等效项可能是这样的:

int *fun()
{
    static int x;
    return &x;
}
int main()
{
    int *ptr = fun();
    *ptr = 10;
    printf("%dn", *fun());
    return 0;
}

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

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

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

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