More Effective C++ 条款 1:仔细区别 pointer 和 reference
文章目录
- 条款 1:仔细区别 pointer 和 reference
- 区别与适用场景
- 示例:`reference` 始终绑定对象
- 示例:`pointer` 灵活性
- `reference` 的限制与用途
- 总结
条款 1:仔细区别 pointer 和 reference
区别与适用场景
-
reference
不存在 null 状态reference
必须始终代表某个对象。- 如果需要一个变量可能为空(即指向“无对象”),应选择使用
pointer
。
-
pointer
的灵活性pointer
可以被重新赋值,指向不同的对象。reference
一旦绑定到一个对象,就无法更改。
-
使用场景
- 使用
pointer
:当变量可能不指向任何对象,或者需要在多个对象之间动态切换时。 - 使用
reference
:当变量始终必须表示某个对象,并且不允许为空时。
- 使用
示例:reference
始终绑定对象
以下代码展示了 reference
的特性,确保始终绑定对象:
int a = 10; int& ref = a; // ref 必须绑定到 a,且不能更改绑定 int b = 20; ref = b; // 修改的是 a 的值,而非改变 ref 的绑定
示例:pointer
灵活性
pointer
的灵活性允许指向不同对象,甚至表示“无对象”:
int a = 10, b = 20; int* ptr = &a; // 指向 a ptr = &b; // 重新指向 b ptr = nullptr; // 表示“无对象”
reference
的限制与用途
reference
不可重新绑定,始终指向初始化时的对象。- 当实现某些操作符(如
operator[]
)时,必须使用reference
,因为语法需求无法通过pointer
达成:
class Array { private: int data[10]; public: int& operator[](size_t index) { return data[index]; } }; Array arr; arr[0] = 42; // 使用 reference,返回 data[index] 的直接引用
总结
- 使用
reference
确保变量始终指向一个有效对象,避免 null 状态。 - 使用
pointer
实现灵活性,允许变量表示“无对象”或动态更改指向对象。 - 根据变量的使用需求,选择合适的工具。