返回对局部静态变量的引用

Returning reference to a local static variable

本文关键字:引用 变量 静态 局部 返回      更新时间:2024-09-26

刚开始学习c++,遇到这个例子,函数返回对局部静态变量的引用。

int& fun() {
static int x = 10;
return x;
}
int main() {
int &z = fun();
cout << fun() << " ";
z = 30;
cout << fun();
return 0;
}

线路int &z = fun();的作用是什么我们是否将一个引用存储在另一个引用中?我是这门语言的新手,我只知道引用变量引用一个变量就像别名一样。有人能解释一下这是怎么回事吗?

我们是否将一个引用存储在另一个引用中?

不,引用甚至不需要有";存储";。引用是用来简化编程的东西。2,然后使用CCD_ 3使代码更易于编写和调试。当您查看最终的汇编代码时,thing甚至不必作为一个单独的实体存在。

int orig;
int& a = orig;
int& b = a;

b现在是对orig的引用,而不是其他内容。不能引用引用。

我们是否将一个引用存储在另一个引用中?

不,至少在C\C++中没有引用。

对我来说,引用只是另一个变量的不同名称,最后,它们都引用了同一个对象。更详细地说,抽象地说,每当你写int& a = b时,你所拥有的仍然是b,根本不存在所谓的a。(a只是b的别名(

正因为如此,我们不能有一个不同的名字,这听起来有点奇怪,因为它实际上并没有指代任何存在的东西。

在上面的例子中,int& fun()所做的是返回实际的static int x = 10;。而int &z = fun();又一次直接引用了实际的static int x = 10;。不管是z还是其他什么,毕竟它只是static int x = 10,有不同的名字。

如果将amphersand-&删除为int fun(),则情况会有所不同,CCD_19返回auto& thing = foo.get_value_reference();0的复制版本,这意味着现在存在两种不同的东西:int x = 10int x = 10的副本。

这就是为什么C\C++是内存高效的,不是吗?你知道什么时候东西被复制,什么时候没有,这对优化有很大帮助!

希望这能有所帮助!

首先,函数内部声明为static的变量在程序开始时分配,在程序结束时取消分配。与正常局部变量不同,从声明静态变量的函数返回后,保留对静态变量的引用是安全的。它继续存在并将保持其价值。

让我们考虑一下这个函数:

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

返回对静态变量x的引用就像返回变量本身一样。我们可以通过该引用来增加变量,例如:

cout << fun()++ << endl;
cout << fun()++ << endl;  // output: 11
cout << fun() << endl;    // output: 12

如果fun()返回x(整数10(,而不是对变量x本身的引用(我们可以更新其值(,则这是不可能的。

int &z = fun()允许我们以相同的方式通过名称z引用相同的静态变量:

int &z = fun();
cout << z++ << endl;
cout << z++ << endl;       // output: 11
cout << z++ << endl;       // output: 12
cout << fun() << endl;     // output: 13

函数返回类型和z都必须是以上操作的引用。

如果z不是引用,而是int z变量,我们将对原始值进行复制,并将其递增以代替静态变量x本身。

如果函数返回类型是一个值(而不是引用(,它将返回x的值,而不是对x本身的引用。在这种情况下,int f(); int &z = f();将尝试引用函数的临时返回值。事实上,这段代码甚至没有编译。

返回静态变量(通过引用或其他方式(的函数有其用途。其中之一是函数内部的静态变量在运行时初始化,这是我们第一次运行它的声明。

在下面的代码中,初始化静态变量x时调用init_x()。这种情况发生在第一次调用fun()以检索x的值时。

int& fun() {
static int x = init_x();
return x;
}
int main() {
do_other_stuff();
fun()++;  // init_x() is called here
fun()++;
fun()++;
}