更改函数中对静态变量的引用的值
Changing the value of a reference to a static variable in a function
考虑以下 C++ 代码片段:
#include <iostream>
using namespace std;
int &fun()
{
static int a = 10;
return a;
}
int main(int argc, char const *argv[])
{
int &y = fun();
y += 30;
cout << fun();
return 0;
}
输出:40
上面给出的代码片段的输出是否合理?
您没有使用函数指针,只是将调用 fun
的结果存储在引用中。
a
是 static 变量,您正在初始化对该变量的引用。在这种情况下,引用只是 a
的另一个名称,所以这就是为什么修改引用 y
的值时,您也修改了值 a
,它是静态的,这意味着它的值在调用中保留。
fun
不是函数指针,它是 returns 和 int&
的空函数。具体来说,它 returns 对名为 a
的 static int
的引用。
那么您的程序所做的是:
int &y = fun(); // this is the first call to fun, so we initialize a.
// it now has a value of 10, and we return a reference to it
// so y is a reference to the static variable local to fun()
y += 30; // y == 40
// since y is a reference to "fun::a", a is now 40 too
cout << fun(); // a is static, so it will only get initialized once.
// that first line is effectively a NOOP, so fun() just
// returns a reference to it. which has a value of 40.
考虑以下 C++ 代码片段:
#include <iostream>
using namespace std;
int &fun()
{
static int a = 10;
return a;
}
int main(int argc, char const *argv[])
{
int &y = fun();
y += 30;
cout << fun();
return 0;
}
输出:40
上面给出的代码片段的输出是否合理?
您没有使用函数指针,只是将调用 fun
的结果存储在引用中。
a
是 static 变量,您正在初始化对该变量的引用。在这种情况下,引用只是 a
的另一个名称,所以这就是为什么修改引用 y
的值时,您也修改了值 a
,它是静态的,这意味着它的值在调用中保留。
fun
不是函数指针,它是 returns 和 int&
的空函数。具体来说,它 returns 对名为 a
的 static int
的引用。
那么您的程序所做的是:
int &y = fun(); // this is the first call to fun, so we initialize a.
// it now has a value of 10, and we return a reference to it
// so y is a reference to the static variable local to fun()
y += 30; // y == 40
// since y is a reference to "fun::a", a is now 40 too
cout << fun(); // a is static, so it will only get initialized once.
// that first line is effectively a NOOP, so fun() just
// returns a reference to it. which has a value of 40.