c++返回值使用引用的注意事项
- 问题
- 原因
- 返回函数的引用形参
- 另外一个问题
- 解决方法
问题
引用变量b接受到的值为无意义的数字。
原因
int& b = returnYingyong();
相当于:
int i2 = 3;
int& b = i2;
销毁 i2;
将局部变量作为返回值,导致引用b数据无意义。(局部变量是生命周期短,函数调用结束就释放内存空间了)
如果返回局部变量的引用,其本质是野指针,后果不可预知。
我们将变量i2的生命周期延长就行:
但这样做意义不大。
返回函数的引用形参
我们在开发中更常用的方法是:返回函数的引用形参
就是:函数的形参是引用,函数的返回值也是引用
//将函数的形参和返回值都用引用
int& demo(int& ra) {
ra++;
cout << "ra的地址为;" << &ra << "\tra的值为:" << ra << endl;
return ra;
}
void testYingYong9() {
int i = 1;
int& c = demo(i);
cout << "i的地址为:" << &i << "\ti的值为:" << i << endl;
cout << "c的地址为:" << &c << "\tc的值为:" << c << endl;
}
这样的话,相当于形参和返回值的参数都是原来参数i的引用,就算函数调用结束,形参ra销毁,返回值参数也不会有影响(返回值参数是i的引用,i没有销毁)
另外一个问题
返回引用的函数是被引用的变量的别名,可以把他当作变量,对其赋值
相当于利用返回的引用达到了修改主函数中变量 i 的目的
解决方法
为了杜绝主函数中的变量被其他用户通过修改函数返回值的方式修改,将const作用于函数的返回值。
这样就不能直接对函数的返回值赋值来修改主函数中变量i了。