C++ 把引用作为返回值
通过使用引用来替代指针,会使 C++ 程序更容易阅读和维护。C++ 函数可以返回一个引用,方式与返回一个指针类似。
当函数返回一个引用时,则返回一个指向返回值的隐式指针。这样,函数就可以放在赋值语句的左边。例如,请看下面这个简单的程序:
实例
#include <iostream>
using namespace std;
double vals[] = {10.1, 12.6, 33.1, 24.1, 50.0};
double& setValues(int i) {
double& ref = vals[i];
return ref; // 返回第 i 个元素的引用,ref 是一个引用变量,ref 引用 vals[i]
}
// 要调用上面定义函数的主函数
int main ()
{
cout << "改变前的值" << endl;
for ( int i = 0; i < 5; i++ )
{
cout << "vals[" << i << "] = ";
cout << vals[i] << endl;
}
setValues(1) = 20.23; // 改变第 2 个元素
setValues(3) = 70.8; // 改变第 4 个元素
cout << "改变后的值" << endl;
for ( int i = 0; i < 5; i++ )
{
cout << "vals[" << i << "] = ";
cout << vals[i] << endl;
}
return 0;
}
当上面的代码被编译和执行时,它会产生下列结果:
改变前的值 vals[0] = 10.1 vals[1] = 12.6 vals[2] = 33.1 vals[3] = 24.1 vals[4] = 50 改变后的值 vals[0] = 10.1 vals[1] = 20.23 vals[2] = 33.1 vals[3] = 70.8 vals[4] = 50
当返回一个引用时,要注意被引用的对象不能超出作用域。所以返回一个对局部变量的引用是不合法的,但是,可以返回一个对静态变量的引用。
int& func() {
int q;
//! return q; // 在编译时发生错误
static int x;
return x; // 安全,x 在函数作用域外依然是有效的
}
以下是一个实例,演示了返回对静态变量的引用:
实例
#include <iostream>
using namespace std;
// 返回对静态变量的引用
int& getStaticRef() {
static int num = 5; // 静态变量
return num;
}
int main() {
int& ref = getStaticRef(); // 获取对静态变量的引用
cout << "初始值:" << ref << endl;
ref = 10; // 修改静态变量的值
cout << "修改后的值:" << ref << endl;
cout << "再次调用函数后的值:" << getStaticRef() << endl;
return 0;
}
using namespace std;
// 返回对静态变量的引用
int& getStaticRef() {
static int num = 5; // 静态变量
return num;
}
int main() {
int& ref = getStaticRef(); // 获取对静态变量的引用
cout << "初始值:" << ref << endl;
ref = 10; // 修改静态变量的值
cout << "修改后的值:" << ref << endl;
cout << "再次调用函数后的值:" << getStaticRef() << endl;
return 0;
}
getStaticRef() 函数返回了对静态变量 num 的引用。
输出结果为:
初始值:5 修改后的值:10 再次调用函数后的值:10
Daniel
812***[email protected]
参考地址
(1)以引用返回函数值,定义函数时需要在函数名前加 &
(2)用引用返回一个函数值的最大好处是,在内存中不产生被返回值的副本。
引用作为返回值,必须遵守以下规则:
Daniel
812***[email protected]
参考地址
nysdsgl
nys***[email protected]
这一段不是很好理解,贴一个其他人写的作为补充。
When a variable is returned by reference, a reference to the variable is passed back to the caller. The caller can then use this reference to continue modifying the variable, which can be useful at times. Return by reference is also fast, which can be useful when returning structs and classes.
我的理解:一个变量被返回其引用的意思是,给了返回变量的一个别名,如教程的例子显示函数给 val[i] 了一个别名。当调用这个函数 setValues(3) 时,返回了这个 val[3] 的别名, 那么我们就可以修改 val[3],所以可以放到等号的左边。
nysdsgl
nys***[email protected]
高级划水工程师
296***[email protected]
教程里面举的例子可能不太好理解,下面是我写的一个例子:
最终,屏幕上打印的结果是:20
高级划水工程师
296***[email protected]
ilid
160***[email protected]
指针的实现方式:
输出结果为:
ilid
160***[email protected]