C++引用参数
把参数声明成引用,实际上改变了缺省的按值传递参数的传递机制。在按值传递时,函数操作的是实参的本地拷贝。当参数是引用时,函数接受的是实参的左值而不是值的拷贝,这就意味着函数知道实参在内存中的位置因而能够改变它的值或取它的地址。
引用,它可以用作对象的另一个名字,通过引用,我们可以间接的操作对象,使用方式类似于指针,但是不需要指针的语法。在实际的程序中,引用主要被用作函数的形式参数,通常将类对象传递给一个函数。
引用类型由类型标示符和一个取地址符来定义,引用必须被初始化。 如:char b='c';char& a=b; a是b的引用。
一旦引用已经定义,它就不能再指向其他的对象,这是它为什么被初始化的原因。
引用的所有操作实际上都被应用在它所指的对象身上,包括取地址符。
将引用作为形参,形参的初始化不在类型说明时进行,而是在执行主调函数中的调用表达式时,才为形参分配内存空间,同时实参来初始化形参,这样引用类型的形参就通过行实结合,
成为了实参的一个别名,对形参的任何操作一会直接作用于实参。引用作为形参的函数调用成为引用调用。
使用引用的情况:
第一种:
像swap()函数,它必须将一个参数改变成指针来允许改变实参的值。就像上上面所说的,参数是引用时,所有的操作都是针对实参的。若参数不是引用,那么,操作的只是一个局部变量,对实参是没有影响的。
第二种:使用形参返回额外的信息。
就像UC中有些函数可以通过参数带回一些数据似的。
引用也可以带回一些数据。比如:有一个数组,进行排序,排序完了之后,要求带回数组中相同大小元素的个数,这个时候就可以使用引用来带回这个相同元素个数的数据。
第三种:
通过const引用来避免复制。虽然复制实参对于内置数据类型的对象或者规模较小的类的类型对象来说没什么问题,但是对于大部分的类类型或者大型数组,它的效率通常是很低的。使用引用形参,函数可以直接访问实参对象,而无需复制它。
基于以上分析,使用引用参数的原因主要有三个:
1.程序员能够修改调用函数中的数据对象(对以形参传递进来的函数外部变量或对象进行修改。)
2.通过传递引用,而不是整个对象,可以提高程序的运行效率。(如果形参是一个类的对象,那么实参传进的就是实参的拷贝。)
3.引用比指针更容易让人理解代码的逻辑。
而引用参数实际上就是基于指针的另一个接口。下面就是一些指针,引用,值传递的原则:
一.对于只需要使用传递进来的值而不需要对其进行修改的函数:
1.如果数据对象很小,如c++内置数据类型,或小型结构,可以使用值传递。
2.如果数据对象是数组,则使用指针,因为这是唯一的选择,并将指针声明为指向const的指针。
3.如果数据对象是较大的结构,则使用const指针或者const引用,以提高程序效率。这样可以节省复制结构所需要的时间和内存空间。
4.如果数据对象是类对象,则使用const引用,类对象在数据结构和语义上非常合适使用引用,这也是c++新增引用这项特性的主要原因。因此传递类对象参数的标准方式是按引用传递。
二.对于需要在函数中修改传递进来的外部参数的函数:
1.如果数据的对象是内置数据类型,则使用指针。
2.如果数据对象是数组,则只使用指针。
3.如果数据对象是结构,则使用引用或者指针。
4.如果数据对象是类对象,则使用引用。
转载于:https://blog.51cto.com/dclys/1337869