引用必须初始化
引用==取别名
引用我们可以理解为是指针常量(指向不可改)
int main()
{
int a=0;
int& b=a;
int c=2;
//b=c;
//我们的目的是修改b的指向,但是我们现在这样写的意思是将c的值赋值给b(因为b是a的别名,也就是赋值给a)
//所以我们无法修改b的指向
return 0;
}
特别忌讳提醒:引用不能做返回值
这个需要通过栈帧来理解
栈帧中,创建函数会开辟空间,结束会销毁栈帧,但是这片空间有没有被再度初始化就不知道了
但是我们一旦在调用一个函数,就可能会直接覆盖掉这个空间,导致这片空间的值改变
引用的最佳用法是引用做形参,可以提高时间效率,可以降低指针使用带来的难度
返回的是引用,接受的变量也是引用,也就是说———始终指向的都是那片空间,可是当第一次调用之后,这片空间的数字是存在的,但是当调用了Add(3,4)的时候,这片空间里的数就被重置了,所以这个值最后会发生改变

因为使用的是临时变量进行接收,那么就相当于赋值,就是将那片空间中的数字赋值给现在的临时变量,这个临时变量不会改变,那么这个值就不会改变

&的权限
权限缩小
int main()
{
int a = 0;
int& b = a;
const int& c = a;//权限缩小
//本来b是可以修改大小的
//但是加了const就不能修改大小了,这样就形成了权限缩小
return 0;
}
权限不能放大
int main()
{
const int& a = 0;
//权限放大是错的
//int& b = a;//权限放大
//本来是不能改变大小,如果你将他变成了可以改变大小的那就是错的
return 0;
}
特别注意

为什么会报错,因为double类型无法接收int类型
为什么不报错,因为类型转换会有一个临时变量,临时变量有常性,所以需要加上const
int a=0;
size_t b=0;
if(a>b)
{
//int类型和size_t比较的时候,他们的原来的值不会发生改变,是生成的中间变量进行比较
}
底层探究
语法上,引用只是另一个变量的别名,那么他的大小就是原来变量的大小
底层上,引用的实现是一个指针(指针常量)
如果计算的是指针的大小的话应该是4,但是这里是1,证明就是别名