函数引用

一、引用回顾

引用

    为对象起了另外一个名字(引用即别名)
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会使函数的含义更加模糊,建议避免在设计函数中存在模糊的情况,因为模糊会增加犯错误的机会,应尽量避免犯错。

左值和右值

三、使用引用参数小结

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/X_King_Q/article/details/104467174