C++法则10:引用本身是一个“别名”(alias),一旦绑定到一个对象后,就不能再重新绑定到其他对象。
C++法则10:引用本身是一个“别名”(alias),一旦绑定到一个对象后,就不能再重新绑定到其他对象。
在C++中,引用(reference)是一个已存在对象的别名。一旦引用被初始化绑定到一个对象,它就不能再被重新绑定到其他对象。这一特性是引用与指针(pointer)的主要区别之一。
关键点:
-
别名特性:引用是某个对象的另一个名字,对引用的所有操作都会直接作用于它绑定的对象。
-
必须初始化:引用在定义时必须初始化,且不能为
null
(必须绑定到有效对象)。 -
不可重新绑定:引用一旦绑定到一个对象,其绑定关系无法更改。
-
与指针的区别:
-
指针可以重新指向其他对象(或
nullptr
)。 -
引用更安全,但灵活性较低。
-
int x = 10;
int y = 20;
int& ref = x; // ref是x的别名,绑定到xref = 30; // 修改ref等价于修改x,此时x=30
std::cout << x; // 输出30// 试图将ref重新绑定到y(错误!)
int& ref = y; // 编译错误:ref已存在,不能重新声明// 指针可以重新指向
int* ptr = &x;
ptr = &y; // 合法:指针ptr现在指向y
为什么设计为不可重新绑定?
-
安全性:避免引用在程序中被意外修改指向其他对象。
-
语义清晰:引用作为别名,其生命周期内始终代表同一个对象。
注意事项:
-
函数参数传递时,常用
const T&
避免拷贝且防止修改。 -
如果需要“重新绑定”的能力,应使用指针(如
T*
)或智能指针(如std::unique_ptr
)。