引用和指针的一些细节
引用和指针是C++中易于混淆的概念。
这里从基础概念说起:指针p是对象,和普通变量一样有地址(&p)和值(p),而值p存储的数据类型是数据的地址,以此达到指向其他变量的目的。(访问指向的值用解引用操作符“ * ”)。
而指针有常量指针和指向常量的指针之分,常量指针既是不可改变值的指针(也就是不改变指向的变量),指向常量的指针(也叫指针常量)不能改变(指针指向的)对象的值。
而引用(reference)可以理解为变量的别名,比方说小明,他的小名(别名)叫明明,那么“明明”就是引用。
引用相较于指针,有一些特性:
[1]指针可以为空(null),而引用不行,引用一定义就必须要初始化(绑定对象)。
[2]引用类似于常量指针,不可改变值,一旦绑定就不可再重新和其他对象绑定(而不是拷贝)在一起了。(就好像“明明”只能是小明的小名,不能是其他人的小名)。
而[1]的特性也就决定了:拿到一个引用的时候,不用判断非空;而拿到指针的时候,为了稳健和安全,通常需要判断指针空与否。
那么为什么要引入引用呢?
这里贴一个Stroustrup的FAQ:
Why does C++ have both pointers and references?
C++ inherited pointers from C, so I couldn't remove them without causing serious compatibility problems. References are useful for several things, but the direct reason I introduced them in C++ was to support operator overloading
很明显了,指针是从c继承下来的,防止出现兼容性问题,而引用有很多用处,但主要用处是为了操作符重载。
原来人类的悲欢并不相通, 我只觉得他们吵闹。