今天师弟问我,引用的底层也是指针实现的,内置类型指针传递和引用传递的汇编代码是一样的,那C++为什么还需要引入引用呢?
好吧,仔细想了下,这确实是个好问题。
引用传递,只是明面上,没有使用值传递,值传递本身是不可避免的。
编译器,暗地里通过指针(或者其他可以替代指针的数据类型)的值传递,替换了引用传递。
所以引用传递,实质上是地址传递,别名这东西只是概念,是一种抽象,别名是没法传递的。
别名,可不是真实的数据类型。
因为,函数传递参数需要,数据复制,所以明的暗的值传递,不可避免。
引用的高效,在于对大的数据,不用直接的复制数据。
引用能实现的基本上指针都可以实现,那为什么C++还需要引入引用呢?下面看看C++之父Bjarne Stroustrup是怎么说的吧:
真相大白,原来C++引用的引入是为了支持运算符重载。顺便提一句,既然C++引入了引用,那为什么C++不和Java一样抛弃指针呢?答:为了兼容C语言。
补充一点引用带来的好处:
用指针的使用经常犯得错:1,操作空指针,2,操作野指针,3,不知不觉改变了指针的值,而后还以为该指针正常。如果我们要正确的使用指针,我们不得不人为地保证这三个条件。而引用的提出就解决了这个问题。
引用区别于指针的特性是 :1,不存在空引用(保证不操作空指针),2,必须初始化(保证不是野指针),3,一个引用永远指向他初始化的那个对象(保证指针值不变)。人为保证变为了编译器来保证,更加安全。
用户自定义的类型最好用引用传参,这样可以避免不必要的构造函数和析构函数调用,但是对于像int,long,char一类的内置类型,按值传参会比按引用传参更高效。(https://www.tanglei.name/blog/pass-by-value-when-using-c-like-parameter-is-better-than-pass-by-referene.html)
结论:内置类型建议按值传参,用户自定义类型建议按引用参数。
参考资料:《C++语言的设计和演化(Bjarne Stroustrup著)》