引用是C++里面的一种新的类型,C语言里没有。C++提出引用这种类型是为了使得函数传递参数时减少参数的复制(像指针那样)又能使函数需要改变参数值时,调用的写法更为简洁、直观(如果是C语言,要改变参数的值,就需要传它的指针,多么麻烦,要是直接能传递变量多好!)同时更为安全的去实现那些用指针修改值的做法。
那么:
1.为什么传递引用参数就可以改变参数的值?
引用在很多书上都会被描述为别名,一个对象的别名,这种说法很形象,传递到函数里的引用是该实参的别名,那对别名进行修改就等价于对实参的修改,通过引用来修改实参的值就是可以实现的。
但是,别名只是很形象,但并不确切。
就我的理解来说:引用是对实参内存地址的抽象化封装,封装成一个类型,程序员对引用的任何操作都会被编译器转化到对引用所绑定对象的地址进行操作,很像指针,但又有所不同,可以说引用是相当于一种方便简洁的“功能有限制的指针”。
怎么理解这句话呢? 就是说 :
(1)引用写起来比指针好写,看代码时更能直观的体现出来
(2)使用更为方便,在特别复杂的情况下,过多的使用指针会影响程序员的逻辑思维,造成一些程序问题,而引用一般不会。
(3)引用不如指针灵活,有许多限制,因为指针对地址操作的灵活性会使得程序具有风险性,而引用让对地址操作的灵活性和风险性做了合理的折衷处理,使得引用相当于一种“功能受限的指针”。
2.引用类型究竟是什么(实质)?
前面说道,引用是对地址的抽象封装,那么引用究竟是什么?
代码举例:
#include<iostream>
using namespace std;
int main()
{
int a = 10;
int *b = &a;
int & c = a;
return 0;
}
a是int型变量 值为10
b是指向a的指针
c是a的引用
要知道引用究竟是什么,怎么实现改变参数值,就需要查看引用的汇编代码:
int a = 10;
008B5BD8 mov dword ptr [a],0Ah
int *b = &a;
008B5BDF lea eax,[a]
008B5BE2 mov dword ptr [b],eax
int & c = a;
008B5BE5 lea eax,[a]
008B5BE8 mov dword ptr [c],eax
return 0;
008B5BEB xor eax,eax
如果会一点汇编的话,我们会可以发现,定义指针和定义引用的汇编一模一样,所进行的操作也是同样的用方括号取a的地址,所以我们可以得出引用的实质就是对地址进行操作来达到修改值的目的,编译器会使得对引用的转化全部转移到对绑定对象的地址上的值进行操作。
也就是说,引用并不是什么高深的东西,只是编译器的包装而已,它到头来还是地址操作,只不过做了灵活和风险折衷的指针而已
引用可以称之为“简洁的弱化版”指针,但它不是指针,只是实现方式相同而已,它是一种抽象的类型,对所绑定的对象进行类似指针操作。