作用:引用可以作为函数的返回值存在
注意:不要返回局部变量的引用
用法:函数调用作为左值
//返回局部变量引用
int& test01() {
int a = 10; //局部变量
return a;
}
//返回静态变量引用
int& test02() {
static int a = 20;
return a;
}
int main() {
//不能返回局部变量的引用
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;
}
在这个 C++ 程序中,我们可以看到两个函数:test01
和 test02
,这两个函数都返回一个整型引用(int&
)。然而,这两个函数的行为和风险是截然不同的,由于它们分别返回的是局部变量的引用和静态变量的引用。
int& test01() {
int a = 10; // 局部变量
return a;
}
这个函数试图返回一个局部变量 a
的引用。局部变量在函数的执行结束时会被销毁,它的内存空间被释放。因此,返回局部变量的引用是非常危险的,因为返回的引用指向一个已经不存在的变量。这会导致未定义行为,程序可能输出不可预测的结果或者导致程序崩溃。
在 main
函数中,当我们尝试通过引用 ref
访问 test01
返回的值时,我们实际上是在访问一个已经被销毁的变量的内存位置。这种情况下,输出可能是任意值,或者可能触发运行时错误。
int& test02() {
static int a = 20;
return a;
}
这个函数返回一个静态局部变量 a
的引用。静态局部变量的特点是它们在第一次声明时被初始化,并在程序的整个运行期间持续存在,直到程序终止。因此,返回静态局部变量的引用是安全的。
在 main
函数中,引用 ref2
能安全地访问并持续使用 test02
返回的静态变量 a
。因为 a
在程序的整个生命周期内都有效,所以 ref2
始终指向一个有效的、可访问的 int
值。甚至可以通过这个引用来修改静态变量的值,如 test02() = 1000;
所做的那样,这改变了 a
的值,并通过所有指向 a
的引用反映出来。
总结
- 永远不要返回局部非静态变量的引用。 这是因为它们在函数执行完毕后就会被销毁。栈区
- 返回静态局部变量的引用是安全的, 因为它们在整个程序运行期间都保持存在。全局区
- 这个例子很好地说明了在 C++ 中使用返回引用时需要注意的内存管理和作用域规则。