引用概述
就是对变量起了一个别名,然后通过别名可以来操作变量,注意的点有定义的时候必须要初始化,后面也不能更改指向
!!!引用占内存,虽然sizeof引用会是得到的操作的内存,但是是占内存的,底层实现还是通过了指针,通过操作地址来达到的别名,但是在语言层次进行了一些修饰和隐藏,sizeof引用的时候编译器会
自动处理成计算原来的那个变量,相当于是做了一个替换
引用的使用格式
//和指针一样,但是是要&,通过&来操作 int x=1; int &y=x; //y就是x的引用,操作y就是操作x const int & y=x //const引用
引用的应用场景
1,作为别名:这个就不说了,就是多了名字好操作
2,函数参数:因为值传递的话,会进行一个拷贝,但是引用传递的话不会进行内存的拷贝,那么就会节省很多时间,有些时候如果为了不改值用值传递得话可以修改成常引用来加快速度
速度快的原因,因为引用和指针都是4个字节,但是值传递传4字节以下的时候是一样的,但是如果传字符串或者double的时候引用和指针速率会高很多
void max(int x,int y){ //普通值传递 return x>y?x:y; } void max(const int &x,const int &y){//引用形式达到值传递的目的 return x>y?x:y; }
3,函数返回值:作为函数返回值主要也是为了节省内存空间的消耗
int mx; int max(int x,int y){ mx=x>y?x:y; return mx; } int x=max(1,2); int &y=max(1,2); //底层内存实现的话,会先创建一个临时内存空间,然后把mx的值给临时内存然后返回 //第二个引用的赋值的话会有大问题,因为是临时内存,函数结束就会消亡,然后就可能造成 引用是一个随机值 int mx; int & max(int x,int y){ mx=x>y?x:y; return mx; } int x=max(1,2); int &y=max(1,2); //用的直接是mx的内存进行的赋值操作,y相当于是mx的新引用
作为返回值要注意的点:
不要返回局部变量,和那个例子一样,因为局部变量会消亡
不要返回堆空间,因为如果是无名空间的话,后面没有变量可以delete它,容易造成内存泄漏
指针和引用的区别
指针不一定要初始化,引用需要
指针后面可以改变指向,引用不可以
指针是真实的变量,引用只是个别名
指针可以有多级指针,引用没有
指针++动的是地址,引用动的是变量的值