c++ 引用

来源:互联网 发布:淘宝代销退货如处理 编辑:程序博客网 时间:2024/05/02 03:09

引用的概念
引用只是一个变量的别名,程序用另外一个变量或者对象的名字去初始化他。从那时候起,引用作为那个变量(对象)的别名而使用,对引用的改动实际就是对目标变量(对象)的改动。
声明一个引用的方式:

int num1;int & num2=num1;

引用不是值,不占用存储空间,声明引用时,目标存储状态不会改变。这就意味着引用只有声明,没有定义。而且在引用声明时一定要初始化,否则将引发编译错误,并且初始化后就不会再指向其他不同变量。如果程序寻找引用的地址,它只能找到所引用的目标地址。引用只可以绑定在对象(变量)上,而不能与字面值或某个表达式的计算结果绑定在一起

int & num1=10 //错误,引用类型的初始值必须是一个对象名或者变量名 

引用的应用

(1):用引用传递函数参数
传递引用给函数与传递指针给函数的效果一样,传递的是原来的变量或对象,而不是函数作用域内建立变量或对象的副本。如下示例:

#include<iostream>using namespace std;void swap(int & num1, int & num2){    int temp;    temp = num1;    num1 = num2;    num2 = temp;}int main(){    int num1 = 2;    int num2 = 3;    swap(num1,num2);    cout << "num1="<<num1 << " num2=" << num2 << endl;    return 0;}

结果:
这里写图片描述

传递引用的内存布局:
这里写图片描述

总结:
(1)传递引用给函数和传递指针给函数的效果是一样的。被调用的函数对形参的操作都是对其对应的变量的操作。
(2)使用引用传递函数的参数,在内存中并没有产生实参的副本,它是直接对实参操作;而使用一般变量传递函数的参数,当发生函数调用时,需要给 形参分配存储单元,形参变量是实参变量的副本;如果传递的是对象,还将调用拷贝构造函数。因此,当参数传递的数据较大时,用引用比用一般变量传递参数的效 率和所占空间都好。
(3)使用指针作为函数的参数虽然也能达到与使用引用的效果,但是,在被调函数中同样要给形参分配存储单元,且需要重复使用”*指针变量名”的 形式进行运算,这很容易产生错误且程序的阅读性较差;另一方面,在主调函数的调用点处,必须用变量的地址作为实参。而引用更容易使用,更清晰。

(2)返回多个值
函数只能返回一个值,如果程序需要从函数中返回多个值的时候就可以使用引用给函数传递参数,然后由函数往目标中填入正确的值,就可以实现多个返回值的效果。

(3)函数的返回值为引用

如果是一般的函数返回值时,需要生成值的副本,但是用引用作为函数返回值时,不生成值的副本。下面举个例子进行说明:

#include<iostream>using namespace std;float temp;float fun(float t){    temp = t*t*3.14;    return temp;}float& fun1(float t) //&和float之间不可以有空格.{    temp = t*t*3.14;    return temp;}int main(){    float a = fun(5.0);    //float &b = fun(5.0); //编译器不能通过    float c = fun1(5.0);    float &d = fun1(5.0);    return 0;}

上述的代码中temp是全局变量,存放在全局数据区data中,函数main()、fun()、fun1()驻留在栈区stack中。
第一种情况:见图一
这里写图片描述图一
这种情况是一般的函数的返回值方式。返回全局变量temp的值时,c++创建临时变量并将temp的值78.5复制到该临时变量中,返回到主函数后,复制语句a=fun(5.0),把临时变量复制给a。
第二种情况:见图二
这里写图片描述 图二
这种情况下,函数fun()是以值方式返回的,返回时,复制temp的值给临时变量。返回到主函数后,引用b以该临时变量来初始化,使得b成为临时变量的别名。由于临时变量的作用域短暂,所以b面临无效的危险。
第三种情况:见图三
这里写图片描述 图三
这种情况,函数fun1()的返回值不产生副本,所以直接把变量temp的值返回给主函数。当变量temp是一个用户自定义类型时,这种方式直接带来的程序执行效率和空间利用率的利益。
第四种情况:见图四
这里写图片描述 图四
这种情况因为我们的temp是一个全局变量,所以在主函数用d作为temp的别名是安全的,但是如果temp也是函数内的一个局部变量的话,这种情况也会出现变异错误。错误的原因和第二种情况一样。

(4)常引用
当我们希望传递的参数不被修改时,就可以使用常引用。
语法:const & 名 = 目标变量

int num;const int & num_like=num;num_like=1; //错误num=1;      //正确

引用总结:
(1):在引用的使用中,单纯给某个变量取个别名是毫无意义的,引用的目的主要用于在函数参数传递中,解决大块数据或对象的传递效率和空间不如意的问题。
(2):用引用传递函数的参数,能保证参数传递中不产生副本,提高传递的效率,且通过const的使用,保证了引用传递的安全性。
(3):引用与指针的区别是,指针通过某个指针变量指向一个对象后,对它所指向的变量间接操作。程序中使用指针,程序的可读性差;而引用本身就是目标变量的别名,对引用的操作就是对目标变量的操作。
(4)使用引用的时机。除流操作符<<和>>、赋值操作符=的返回值、拷贝构造函数的参数、赋值操作符=的参数,其它情况都推荐使用引用。

参考文章:http://www.cnblogs.com/Mr-xu/archive/2012/08/07/2626973.html

0 0
原创粉丝点击