C/C++中的引用
一、什么是引用
引用(reference)是给对象起了另一个名字,引用类型引用(refers to)了另外一种类型。声明引用的格式为数据类型 & 变量名。
这里的**‘&’**一定要与取地址操作符区分开,当‘&’放置在一个已定义的变量前面时,它才是对这个变量进行取地址操作,这时’&'号前面并没有数据类型。
int main(){
int i = 10;
int *p = &i;
int &ref = i;
return 0;
}
那什么是引用呢,引用相当于是给一个已经存在的对象取别名 。
一般在对变量初始化的时候,初始值会被拷贝到新创建的变量中。但是在定义引用的时候,程序会把引用和它的初始值绑定(bind)在一起,而不是将初始值拷贝给引用。并且当引用的初始化完成时,引用将和它的初始值对象一直绑定在一起,引用和指针不同,指针可以在自己的生命周期中多次更改所指向的对象(因为它内部存储的是对象的地址,只要改变指针存储的地址值,就可以改变指针所指向的对象),但是引用从始至终只能和一个对象绑定,也正因如此,引用必须进行初始化。
二、引用的定义
引用并非是一个对象,它只是为一个已经存在的对象所起的另外一个名字(别名)。因此在定义引用后,对引用所做的一切操作其实都是在它所绑定的对象身上所进行的。
允许在一条语句中定义多个引用,其中每个引用标识符都必须以符号’&'开头
int main(){
int i1 = 10, i2 = 20;
int &r1 = i1, &r2 = i2;
int i3 = 30, &r3 = i3;
int &test1 = 10
double d = 3.14;
int &test2 = d;
return 0;
}
三、通过引用进行修改
当定义引用之后,该引用与原对象形成绑定,成为了原对象的别名,就像是给对象取了个小名,不论用哪个”名称“进行操作,都是在这一个对象身上进行的操作。
int main(){
int i = 10;
int &ref = i;
ref = 20;
cout<<i<<endl;
return 0;
}
上面的代码表示,将int类型的引用与int类型的对象i进行了绑定,对引用进行修改,其实就是对对象i进行了修改。
四、引用的作用
那么引用到底有什么作用呢?引用最重要的作用就是在函数处作为形参,进行引用传参。因为对于引用的操作实际上作用在引用所引的对象身上的,那我们就可以利用这个性质在设计函数时将形参设置为引用形参。
先设想一下这样的情景,假如我们需要对一个存放着随机数字的数组进行升序排序,如果使用传值传参的方式将整个数组传递给排序函数,系统首先会在排序函数的栈帧中创建一个临时的数组,将原数组中的数据存放在临时数组中,在这个临时数组中完成排序操作之后,再将这个数组中的顺序拷贝回原来的数组中。除去排序所需要的时间,这两次额外的拷贝操作都是没有意义的。如果我们在这里使用引用传参,将形参认为是原数组的一个别名,这样我们对形参的一系列操作实际上就都是在原来的数组上进行的操作了!那我们只需要对它进行排序就可以完成任务。
因此我们在设计函数的时候应该尽量考虑使用引用传参,这样可以避免传值传参方式临时变量的拷贝带来的额外消耗。
|