函数引用

  • Post author:
  • Post category:其他




一、引用回顾



引用

为对象起了另外一个名字(引用即别名)

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会使函数的含义更加模糊,建议避免在设计函数中存在模糊的情况,因为模糊会增加犯错误的机会,应尽量避免犯错。


左值和右值



三、使用引用参数小结

在这里插入图片描述



版权声明:本文为X_King_Q原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。