在 C++ 中,指针 (T*
) 和引用 (T&
) 都用于间接访问对象,但它们的使用场景有显著区别。以下是详细的选择指南:
一、核心区别对比
特性 | 引用 (T& ) |
指针 (T* ) |
---|---|---|
是否可为空 | ❌ 必须绑定到有效对象 | ✅ 可以赋值为 nullptr |
是否可重绑定 | ❌ 初始化后不可更改绑定对象 | ✅ 可以指向不同对象 |
内存管理 | 无所有权语义(通常不负责生命周期) | 可能表示所有权(需谨慎管理) |
语法简洁性 | ✅ 更简洁(无需解引用操作符) | ❌ 需要 -> 或 * 操作符 |
安全性 | ✅ 更高(无空引用风险) | ❌ 需手动检查空指针 |
多级间接访问 | ❌ 不支持 | ✅ 支持多级指针(如 T** ) |
二、何时使用引用 (T&
)?
1. 函数参数传递(优先选择)
当函数需要修改传入对象且不允许空值时:
void transformString(std::string& str) {
str += " modified";
}
std::string s = "hello";
transformString(s); // s 变为 "hello modified"
2. 避免拷贝大对象
传递大型对象时,用 const T&
避免拷贝:
void printLargeObject(const VeryLargeType& obj) {
// 只读访问,不会拷贝
}
3. 实现操作符重载
操作符重载必须使用引用:
Vector3D operator+(const Vector3D& a, const Vector3D& b) {
return Vector3D