赋值操作修改的是被引用的原始变量;引用一旦初始化便不可重绑定,= 对引用是间接赋值,目标始终为其绑定的变量,无自身存储空间,不能切换指向。

赋值操作修改的是被引用的原始变量
当你对一个引用变量执行 = 赋值时,实际发生的是:把右边的值写入它所绑定的那个原始变量的内存地址。引用本身不是容器,不存数据,只是个“通道”。
常见错误现象:
-
int a = 10; int& b = a; b = 20;→ 输出a是 20,不是 10;有人误以为b是新变量,改b不影响a -
int x = 100, y = 200; int& ref = x; ref = y;→ 这不是让ref指向y,而是把y的值(200)赋给x,ref依然绑定x
关键点:
- 引用一旦初始化,绑定关系不可更改
-
=对引用是“间接赋值”,目标永远是它背后的变量 - 没有“修改引用本身”这回事——引用没有自己的存储空间,无法被“重新赋值”为另一个变量的别名
为什么 int& ref = x; 后不能再写 ref = y; 来切换绑定?
因为 ref = y; 是赋值表达式,不是重新绑定语法。C++ 中没有任何语法能改变已存在引用的绑定对象。
你看到的 ref = y; 等价于 x = y;,仅此而已。
如果真想让某个名字“指向”不同变量,该用指针:int* ptr = &x; → ptr = &y; 才是切换目标。
const 引用在赋值时表现不同吗?
不不同——const 只限制“通过该引用修改”,不影响它背后是谁。
例如:
int a = 10; const int& cr = a; // cr = 20; // 编译错误:不能通过 const 引用赋值 a = 20; // 合法:直接改原变量,cr 的值也变成 20
注意:const int& cr = 42; 是合法的,但这是绑定到一个编译器生成的临时量,cr 本身仍不可赋值,且这个临时量生命周期被延长至 cr 作用域结束。
函数参数中引用赋值的实际效果
当函数形参是引用,比如 void f(int& r),调用 f(x) 后,在函数体内所有对 r 的 = 操作,都等价于直接操作 x。
典型误用场景:
- 误以为
r = some_value;是“把引用设成别的变量”,其实只是改了x - 返回局部变量的引用(如
int& bad() { int x=0; return x; }),会导致悬垂引用,后续任何对它的赋值都是未定义行为
最易被忽略的一点:引用的“不可重绑定”特性是编译期强制的,没有任何运行时开销,但也意味着它不像指针那样灵活——你必须在声明那一刻就确定它服务谁,之后就再没机会反悔。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











