前言
博主开始细学c++和linux了
这次就带来浅学了的引用。
引用
定义
引用不是在内存中开辟一个新空间的新变量
类似于给变量取别名,和取别名的对象在空间中公用一个对象
例:
int a=0; int &b=a
这里创建了一个变量a
同时创建了一个a的引用b
此时a和b都指向的同一块空间,就是说a和b的改变都会改变对方
使用注意事项:
1.同时一个变量可以有多个引用,就像一个人可以有多个别名
2.创建别名后必须要进行初始化,指明是谁的别名
作用
做输出型参数
这个讲的可能有点抽象,说具体点的作用呢就是:
可以通过传形参,来改变实参(类似于指针)
例:
Void swap(int& a,int& b)//形参是实参的别名
//所以可以改变实参
{
int tmp=a;
a=b;
b=tmp;
}
这里将形参中传了引用,代表形参传入的是实参的一个引用。
传入的是和实参代表同一块内存空间的引用
所以这里a和b的改变可以改变实参。
引用作返回值
一般来说我们使用函数返回时
是直接使用 return 函数来进行的
例:
int count()
{
int n=0;
return n;
}
int main()
{
int tmp=count();
}
这个tmp在接受return n时,不是直接传参的,因为临时变量所在的栈帧要进行销毁
在进行销毁时,会将需要return的值存入一个临时变量中
然后赋值给tmp
但是当我们使用引用返回时,就可以跳过这个步骤
int& count()
{
int n=0;
n++;
return n;
}
这里的int& 代表了返回的值时一个引用值。
但是这样真的对吗?
仔细看看,我们这里return n就是指返回了n的引用值
当函数栈帧被销毁时,内存使用权返回给系统
返回的引用值指向的是n这个内存空间,但是此时n这个空间已经被销毁了
所以可能会产生随机值的情况
这里我们应该怎么解决呢?
既然n会被函数销毁,那我们让n不被销毁不就行了
int& count()
{
Static Int n=0;
n++;
return n;
}
这样加了个const。
就让n存储在了静态区中,不会被销毁
总结
1:任何场景都能用引用传参
2:引用做返回值谨慎使用,当返回的引用指向对象的值存在时可以用引用,不存在则不用
关于引用的权限
引用过程中权限不能放大,只能缩小和平移
例:
Const int a=0;
Int& b=a;
这里权限放大,a自己都不能改变自己
而将a的引用赋值给b后,b就可以改变a
这显然是不合理的,所以不可用
Int a=0;
Contest int& b=a;
这里权限缩小,本来a可以被改变,而引用b权限缩小
选择不进行对a改变
所以合理
Int a=0;
Int &b=a
这里权限平移,完全ok
结尾
这里只是浅浅讲了一个c++的引用功能
因为c++刚开始学,这种对c的小优化太多了
如果不进行记录就容易忘记。