1.引用的概念及用法
引用:引用不是定义一个新的变量,而是给一个已经定义的变量重新起一个别名
表示方式:类型 &引用变量名 = 已定义过的变量名
引用的底层也是指针,引用是变量的别名,那么对引用的操作就是对该变量的操作
引用的特点:
(1)一个变量可取多个别名
(2)引用必须初始化
(3)引用只能在初始化的时候引用一次,不能改变为再引用其他的变量(从一而终)
2.引用做参数
(1)一般的函数传参,形参为临时变量是实参的一份临时拷贝,形参的改变并不会影响实参
(2)指针传参,形参的改变会使得实参发生改变,形参指向实参传递的地址,对形参进行改变就是对指针进行解引用找到实参的地址对实参进行操作
(3)引用传参,形参是实参的别名。引用的底层就是指针,形参和实参是一块地址,形参改变实参也会发生改变。
如若传参不希望改变实参的值,可以给形参添加const限定修饰符。
(4)引用传参比指针传参的效率高,指针传参比一般的值传递效率高(多用引用传参,因为指针传参还得判空,相对来说引用比指针安全)
引用是实参的别名,那么传参的时候不再创建对象;传指针的话传了四个字节;值传递会将实参的全部字节拷贝过去,代价大
3.引用做返回值
临时对象最好不要用引用;非临时对象,对象较大时最好用引用
如图
传值返回时,是将ret的值放到eax寄存器中
传引用返回时,是将ret的地址放到eax寄存器中的
左图为传引用返回,加引用会直接用ret返回,返回的是ret的别名 c是ret的别名,出了add函数,ret已经销毁了,打印它时已经越界了,两次打印c,结果不一样
右图为传值返回,不是直接返回而是把ret给临时对象,临时对象做返回值 c接收临时对象(本例中,由于int较小,会用eax寄存器充当临时对象),两次打印c,结果一样
4.引用和指针的区别
引用只能在定义时初始化一次,之后不能改变指向其它变量;指针变量的指向可变
引用必须指向有效的变量,指针可以为空
sizeof指针对象和引用对象的意义不一样,sizeof引用得到的是所指向的变量的大小,而sizeof指针是对象地址的大小
指针和引用自增(++)自减(–)意义不一样
相对而言,引用比指针更安全