1.引用的用法
创建一个对象的引用只用把声明写成&val的形式就可以了,例如
int a = 10;
int &val = a;
创建了一个变量a 初始化为10,又给a起了一个“别名val,通过“别名”操作对象时,就相当于直接对a 进行操作。
2.引用的特点
- 一个变量可以有多个引用。
- 使用引用必须初始化。
- 引用在初始化时就唯一确定了,不能再变成其他变量的“别名”。(一个变量可以有多个别名,但别名一旦确定就不能变成其他变量的别名了)
3.const引用的用法
变量本身就是const 修饰的常变量,使用引用时也需要加上const
const int a = 10;
const int &b= a;
- 引用不同类型的变量时因为在中间会生成临时变量,临时变量具有常性故必须加const修饰
int d = 1;
float e = d;
//float &f = d;错误
const float &f = d;
- const改变了变量的修改权限,相应的const引用时修改的权限也只能缩小不能放大。
int a = 10;
const a2 = 20;
int &b = a;//没有放大也没有缩小
const &b2 = a;//权限缩小
const &b3 = a2;//没有放大也没有缩小
4.引用做参数和引用做返回值
- 引用传参可以提高效率,节省空间。(不希望被改变时使用const 引用传参就不能被改变,不但节省空间而且更加安全)
- 引用做返回值时要特别注意:不要返回一个临时变量的引用,临时变量出了作用域就被销毁了,再使用这个临时变量的引用就是未定义行为。
int &Add(int a,int b)
{
int c = a+b;
return c;
}
int main()
{
int &ret = Add(1,2);//错误!!!返回了临时变量的引用!!!
}
当出了函数作用域,这个变量还依然存在多使用(特别是变量很大时)引用返回可减少空间的开辟。
5.引用和指针的区别
- 引用不能为空,一旦创建必须被初始化;指针可以为空,可以在任何时候被初始化。
- 一个引用只能是一个变量的“别名”,不能改变为另一个对象的引用;指针可以任意指向另一个对象。
- sizeof(引用)得到的是被引用的变量的大小;sizeof(指针)得到的是指针本身的大小。
- 引用在使用时不需要解引用,指针则需要。引用和指针的自增
6.从汇编看传值返回和传引用返回
传值返回最后是将ret内的值放入eax寄存器中,传引用返回时将ret的地址放入eax寄存器中。