返回对局部静态变量的引用
Returning reference to a local static variable
刚开始学习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 = 10
和int 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()++;
}
- C++Boost Asio Pool线程,带有lambda函数和传递引用变量
- 多个"常量引用"变量可以共享同一个内存吗?
- 在 gtest 中初始化堆栈上的引用变量的隔离错误
- C++方法中的引用变量
- 作为赋值(增加引用变量)C++的左操作数所需的左值
- 使用更改此变量的函数在同一行中打印引用变量
- 将延迟变量分配给引用变量
- 如何通过引用获取引用变量的地址?
- 将引用变量传递给函数
- C++中引用变量的内存?
- 按名称存储和引用变量列表
- 返回一个C++引用变量 VS 返回一个变量
- c++ 在 if 语句中分配引用变量
- 引用变量何时合适,为什么?你能解释一下实际的语法和位置吗?
- C++ - 将一个变量分配给另一个变量和将变量分配给引用变量有什么区别?
- 在类范围内声明时,应在 C++14 中引用变量模板
- 当引用变量的引用"死亡"时,它会发生什么?
- 将非按引用变量分配给返回按引用的函数,反之亦然
- 引用变量如何存储在mem中
- 引用变量存储在哪里