函数引用
一、引用回顾
引用
为对象起了另外一个名字(引用即别名)
1、不可以直接引用常量(字面量)
double & d = 12.3; //错误
原因:d = 111;即改变了 d 原本引用的值。违背了常量的基本概念
如果想引用:
//指向常量的引用 – 合法的
const double & d = 12.3;
int int_value = 1024;
//refValue指向int_value,是int_value的另一个名字
int & refValue = int_value;
//错误 :引用必须被初始化
int & refValue2;
使用引用
不需要测试其有效性
,所以使用引用比指针的效率高
注意:
1、引用并非对象,只是为一个已经存在的对象起的别名
2、引用更接近const指针,一旦与某个变量关联起来,就将一直效忠于它。
3、将引用变量用作参数时,函数将使用原始数据,而非副本。
4、当数据所占内存比较大时,建议使用引用参数。
代码示例
使用引用的理由:
1、可以更加简便的书写代码
2、可以直接传递某个对象,而不是把对象复制一份
注意
1、引用参数中使用
const
可以避免参数被无意修改
2、引用参数建议尽可能哋使用
const
二、返回引用
1、函数返回引用类型
注意
1、不要返回局部变量的引用
2、函数可以
不
返回值,当不返回值时默认返回传入的引用对象本身
3、返回引用时,要求函数参数中包含被返回的引用对象
讲解:
1、不要返回局部变量的引用
#include <iostream>
using namespace std;
int & sum(){
int num = 10;
int & rNum = num;
return rNum;//f返回了一个局部变量的引用类型变量
}
/**
注意:rNum是在sum()中定义的,所以叫局部变量
rNum的生存期只在sum()中!!
函数中的局部变量会被内存回收,
所谓的内存回收,并不是把内存保存的设置清零,
而是指内存中你的程序申请的这块内存已经不是你的了!
*/
void test(){
int x = 1;
int y = 2;
}
int main()
{
//result在这里引用了一个局部变量
int & result = sum();
test();
cout << "result = " << result << endl;
return 0;
}
输出结果:
result = 2
分析
sum中的局部变量内存被回收重新利用,导致被
其他对象
重新赋值
2、函数不可以返回值,默认返回传入的引用对象本身
#include <iostream>
using namespace std;
int & sum1(int & num1,int &num2){
num1++;
num2++;
}
int & sum2(int & num1,int &num2){
num1++;
num2++;
return num1;
}
int & sum3(int & num1,int &num2){
num1++;
num2++;
return num1 + num2; //此句报错,相当于返回第三个未定义的引用变量
//未返回函数中包含的引用对象
}
int main()
{ int x = 10;
int y = 20;
int & result1 = sum1(x,y);
cout << "result1 = " << result1 << endl; //21
int & result2 = sum2(x,y);
cout << "result2 = " << result2 << endl; //12
return 0;
}
结果:
result1 = 21
result2 = 12
讲解:当引用时没有返回值时,默认返回最后一个引用本身
3、返回引用时,要求函数参数中包含被返回的引用对象
讲解
2
中的sum3()
2、返回引用中的左值和右值
int & sum4(int & num){
return num;
}
int main()
{
int n = 10;
int numX = 15;
int & result4 = sum4(numX);
sum4(numX) = 55;
cout << "result4 = " << result4 << endl; //55
结果:
result = 55
sum4(numX) = 55 可以看作sum4(numX) 是对55的引用
建议解决方法:
1、将返回值类型修改为const int &
const int &sum(int & num){
//......
}
2、const类型为不可修改的左值。
sum(num) = 55;将不合法
3、省略const会使函数的含义更加模糊,建议避免在设计函数中存在模糊的情况,因为模糊会增加犯错误的机会,应尽量避免犯错。
三、使用引用参数小结