C\C++引用

C/C++中的引用

一、什么是引用

引用(reference)是给对象起了另一个名字,引用类型引用(refers to)了另外一种类型。声明引用的格式为数据类型 & 变量名。

这里的**‘&’**一定要与取地址操作符区分开,当‘&’放置在一个已定义的变量前面时,它才是对这个变量进行取地址操作,这时’&'号前面并没有数据类型

//'&'是取地址操作符
int main(){
	int i = 10;//定义一个int变量
    int *p  = &i;//这个'&'是取地址符,取出来的地址存放在指针p中
    int &ref = i;//这个'&'是引用标识符
    return 0;
}

那什么是引用呢,引用相当于是给一个已经存在的对象取别名

一般在对变量初始化的时候,初始值会被拷贝到新创建的变量中。但是在定义引用的时候,程序会把引用和它的初始值绑定(bind)在一起,而不是将初始值拷贝给引用。并且当引用的初始化完成时,引用将和它的初始值对象一直绑定在一起,引用和指针不同,指针可以在自己的生命周期中多次更改所指向的对象(因为它内部存储的是对象的地址,只要改变指针存储的地址值,就可以改变指针所指向的对象),但是引用从始至终只能和一个对象绑定,也正因如此,引用必须进行初始化

二、引用的定义

引用并非是一个对象,它只是为一个已经存在的对象所起的另外一个名字(别名)。因此在定义引用后,对引用所做的一切操作其实都是在它所绑定的对象身上所进行的。

允许在一条语句中定义多个引用,其中每个引用标识符都必须以符号’&'开头

int main(){
	int i1 = 10, i2 = 20;//i1和i2都是int类型的对象
    int &r1 = i1, &r2 = i2;//在同一个语句中定义两个引用,r1是i1的引用,r2是i2的引用
    int i3 = 30, &r3 = i3;//必须要先创建对象再定义它的引用,因为引用只会和一个对象进行绑定,所以引用必须要进行初始化
    
    int &test1 = 10//错误,引用类型的初始值必须是一个对象
    
    double d = 3.14;
    int &test2 = d;//错误,引用的必须是自己对应类型的对象,这里只能引用int对象
    return 0;
}

三、通过引用进行修改

当定义引用之后,该引用与原对象形成绑定,成为了原对象的别名,就像是给对象取了个小名,不论用哪个”名称“进行操作,都是在这一个对象身上进行的操作。

int main(){
	int i = 10;
    int &ref = i;
    ref = 20;//ref是i的别名,这里等价于i = 20;
    cout<<i<<endl;//输出结果是20
    return 0;
}

上面的代码表示,将int类型的引用与int类型的对象i进行了绑定,对引用进行修改,其实就是对对象i进行了修改。

四、引用的作用

那么引用到底有什么作用呢?引用最重要的作用就是在函数处作为形参,进行引用传参。因为对于引用的操作实际上作用在引用所引的对象身上的,那我们就可以利用这个性质在设计函数时将形参设置为引用形参。

先设想一下这样的情景,假如我们需要对一个存放着随机数字的数组进行升序排序,如果使用传值传参的方式将整个数组传递给排序函数,系统首先会在排序函数的栈帧中创建一个临时的数组,将原数组中的数据存放在临时数组中,在这个临时数组中完成排序操作之后,再将这个数组中的顺序拷贝回原来的数组中。除去排序所需要的时间,这两次额外的拷贝操作都是没有意义的。如果我们在这里使用引用传参,将形参认为是原数组的一个别名,这样我们对形参的一系列操作实际上就都是在原来的数组上进行的操作了!那我们只需要对它进行排序就可以完成任务。

因此我们在设计函数的时候应该尽量考虑使用引用传参,这样可以避免传值传参方式临时变量的拷贝带来的额外消耗。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值