跳到主要内容

1.仔细区别 pointers 和 references

pointers(指针) 和 references(引用) 使用起来不一样

  • pointers 使用 *->
  • references 使用 .

但是它们似乎实现类似的功能,无论是 pointers 还是 references 都使你间接参考其他对象,应该如何区分和使用?

首先,我们必须知道,不存在 空引用 null reference ,一个 reference 必须总是代表某个对象

  • 如果有一个变量一定指向(代表)某个对象,那么就要用 reference
  • 如果这个变量可能指向(代表)某个对象,也有可能不指向(代表)任何对象,就要用 pointers

由于 reference 一定要代表某个对象,C++ 要求 reference 必须有初始值

string& rs;         // 错误的初始化 reference 必须有初始值
string s("abc");
string& rs = s; // 正常 rs 指向 s

pointers 没有这样的限制

string *ps;         // 未初始化的指针,虽然有效但风险高

由于 reference 不能为空,意味着使用 reference 可能会比 pointers 更富有效率,因为使用 reference 之前不需要测试它是否有效

void printDouble(const double& rd)
{
cout << rd; // 不需要测试 rd 是否有效,一定代表某个double
}

使用 pointers 时通常需要测试它是否为 null

void printDouble(const double *pd)
{
if (pd) { // 检查是否为 null pointer
cout << *pd;
}
}

pointers 与 reference 之间的另一个差异就是,pointers 可以被重新赋值,指向另一个对象,reference 却总是指向(代表)它最初获得的对象

string s1("张三");
string s2("李四");

string& rs = s1; // rs 代表 s1
string *ps = &s1; // ps 指向 s1
rs = s2; // rs 仍代表 s1 ,但 s1 的值现在变成了 "李四"

ps = &s2; // ps 指向 s2 ,s1 没有变化

总结

pointers

  • 当需要考虑 "不指向任何对象" 的可能性时,应该使用 pointers
  • 当需要考虑 "在不同时间指向不同对象" 的能力时,应该使用 pointers

reference

  • 当确定 "总是会代表某个对象" ,而且 "一旦代表了该对象就不再改变" ,应该使用 reference
结论

当需要指向某个对象,而且绝对不会改变指向其他对象,或者是实现一个操作符而其语法需求无法由 pointers 达成,就应该选择 reference 。任何其他时候,都应该使用 pointers

拓展

有一些其他情况也需要使用 reference ,例如实现某些操作符

最常见的例子是 operator[] ,这个操作符要求必须返回某种 "能够被当作 assignment 赋值对象" 的东西

vector<int> v(10);      // 产生一个 int vector ,大小为 10

v[5] = 10; // assignment 的赋值对象是 operator[] 的返回值

如果 operator[] 返回 pointer ,则应该写为

*v[5] = 10;

参考

  • 《More Effective C++》