首先,在函数内声明的变量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(); 会尝试引用临时返回值的功能。事实上,这段代码甚至无法编译。
返回静态变量(通过引用或其他方式)的函数有其用途。其中之一是函数内的静态变量在运行时初始化,这是我们第一次运行它的声明。
在下面的代码中,init_x() 在初始化静态变量时被调用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()++;
}