引用是给变量取一个别名,所以引用传递会直接进行变量本身的传递。它的最大好处是可以把别处对变量的改变保留下来,第二好处是它提高了性能:如果函数的返回值是一个引用,那么,如上文所说,它会节约一组构造、赋值和析构过程。但是,函数返回引用往往会带来一些意想不到的错误:比如返回临时变量的引用。 //一个错误的函数 int &Max(int i, int j) { return i>j ? i : j; } 以上函数的错误在于,i和j在函数结束后会被释放。对它们的引和也将失效。如果用这个返回值给别的变量赋值,将会获得一个垃圾。VC++.Net会对以上return语句显示警告。 那么,如果返回一个全局变的引用呢?这当然是可以的,但是,一来程序设计中不建议使用过多的全局变量,二来全局变量即使不返回也可以访问。这样做的唯一用途就是把函数做右值来给其它变量赋值。 int m;//全局变量 int &MaxByGlobal(int i, int j) { return m = i>j ? i : j; } int a, b, c; c = MaxByGlobal(a, b);//用法一、用返回值赋值 MaxByGlobal(a, b); c = m;//用法二、不用返回值赋值 当然,以上这个MaxByGlobal函数也不是一无是处,能用返回值来进行赋值会给程序带来更好的可读性。只是这样的函数设计本身不被建议。 那么,函数返回引用用得最多的就是返回形参了。因为形参可以用引用传递,引用的形参不是函数内部的局部变量,这样做是可取的: int &MaxByRef(int &i, int&j) { return i>j ? i : j; } 上面这个函数和上文中的“int Max(int i, int j)”函数如此相似,但是它省去了三次构造、赋值和析构。 另外一种用法就是在类的成员函数中返回类对象自身了,典型的是“operator +=”函数之类。 MyClass &MyClass::operator +=(const MyClass&other) { //某些语句 return *this; } 以上函数返回的是自身的引用。因为类的成员函数也可以写成全局函数“MyClass &operator+=(MyClass &Left, const MyClass&right)”,而且在类成员函数的调用中实际存在着this指针的传递。所以,以上这个函数依然可以看作返回了形参的引用。 对于返回引用的函数,还有一个好玩的现像。即返回值还可能可以被赋值。如“(a += b) =c;”这样的形式。这种写法明显不伦不类,但是如果函数返回了非const的引用,这个表达式的确是合理的。所以,上面的“operator+=”函数还要修改一下,将返回值由“MyClass&”改为“constMyClass&”。 返回引用并不是处处可用的,正如《引用传递的应用范围》中提到的一样:不能用引用来传递临时值。有时候我们的确要产生一个临时对象并返回它,那就不能返回引用。典型的有“operator+”函数: const MyClass MyClass::operator +(const MyClass&other) const { MyClass Temp; //某些语句 return Temp;//这里只能返回对象,因为Temp必须是局部变量 }
利用引用作为函数的形参可以在调用函数的过程中不是用传递值的方式进行虚实结合,而是通过传址方式使形参成为实参的别名,因此不生成临时变量(实参的副本),减少了时间和空间的开销。此外,如果重载函数的返回值是对象的引用时,返回的不是常量,而是引用所代表的对象,它可以出现在赋值号的左侧而成为左值(leftvalue),可以被赋值或参与其他操作(如保留cout流的当前值以便能连续使用“
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?


微信扫码登录