前言
指针与引用似乎完全不同,前者是某个对象的地址,后者是某个对象的别名,但是功能却似乎一样,都是间接引用其他对象。那么何时用指针何时用引用呢?
空值
不存在指向空值的引用,但是存在指向空值的指针。
但可能会有人写出这种程序:1
char *pc = nullptr;char & rc = *pc;
其结果未定义,在C++的世界里我们不讨论这种无聊且低级的错误。
引用不存在空值,所以必须要初始化,而指针则不用,虽然这样很危险。
引用不存在空值这一特性说明其有效性比指针高,因为我们在指针的使用中总需要判断其非空,但引用则无需如此。
重新赋值
指针可以被重新赋值以指向另一个不同的对象。但引用则总是指向在初始化时被指定的对象,无法改变。
在何种情况下使用它们
指针
使用指针的情况是:
- 可能会不指向任何对象
- 可能需要改变绑定
引用
使用引用的情况是:
- 一旦绑定后不再更改
- 重载某个操作符
假设需要自定义operator[]
,其功能是返回一个目标对象,其能被赋值:1
2vector<int> v(10);
v[5]=10;
如果operator[]
返回值不是引用而是指针,则最后一句必须写为 *v[5]=10
,这看起来有点像一个数组指针,容易造成不必要的误解。