//返回局部变量引用
int& test01() {
int a = 10; //局部变量
return a;
}
//返回静态变量引用
int& test02() {
static int a = 20;
return a;
}
int main() {
static int a = 20;
//不能返回局部变量的引用
int& ref = test01();
cout << "ref = " << ref << endl;
cout << "ref = " << ref << endl;
//如果函数做左值,那么必须返回引用
int& ref2 = test02();
cout << "ref2 = " << ref2 << endl;
cout << "ref2 = " << ref2 << endl;
test02() = 1000;
cout << "ref2 = " << ref2 << endl;
cout << "ref2 = " << ref2 << endl;
system("pause");
return 0;
}
上述程序在运行过程中没有报错。但main函数中调用了两次test02()函数,test02()函数体中又定义了静态变量a,静态变量都存储在全局区,而全局区只在程序销毁时自动释放,意味着静态变量a只能被定义一次。而两次调用test02()的过程意味着静态变量a被定义了2次,那么为什么在main函数中静态变量a没有重复定义的报错?test02() = 1000是怎样运行的,将1000赋值给一个引用是存在解引用的过程吗?
main中定义的变量不是全局变量,可以理解成和普通的函数一样,定义了两次局部的仅是标志名一样,实际编译完分配的地址不一样。
你调用两次test02函数你会觉得定义了两次静态变量吗
【以下回答由 GPT 生成】
静态变量可以在不同的作用域中重复定义,但只会被初始化一次。这是因为静态变量在内存中的存储位置是全局区,全局区在程序运行期间只有一份拷贝。当第一次调用test02
函数时,静态变量a
被初始化为20并返回了其引用。当第二次调用test02
函数时,由于静态变量a
已经在第一次调用时被初始化过,因此不会再次初始化,而是直接返回其引用。这就是为什么静态变量a
没有重复定义的报错。
在代码中,test02() = 1000
将1000
赋值给了静态变量a
的引用。由于test02
函数返回的是静态变量a
的引用,所以可以通过这个引用修改静态变量的值。test02() = 1000
的运行过程如下:
test02
函数返回静态变量a
的引用。a
的值,将其赋为1000
。因为引用的使用可以看作是对被引用对象的一种别名,所以test02() = 1000
操作实际上就是修改了静态变量a
的值。
注意:在test02
函数外部的代码中调用test02
函数并不会导致静态变量重新初始化,因为静态变量只会在第一次调用函数时被初始化。