C++引用使用误区:赋值操作为何会修改原变量?
C++引用的本质与重新绑定的实现方法
你遇到的不是引用的陷阱,而是对C++引用本质的误解——引用一旦完成初始化绑定,就永远是目标变量的别名,无法再改变绑定的对象。它和指针是完全不同的概念:指针是存储地址的独立变量,而引用只是原变量的另一个名字,语法层面不允许重新绑定。
你的代码分析
int a = 1; int a1 = 11; int &b = a; b = a1; // 这里不是重新绑定,是赋值操作! cout << b << endl; // 输出11(等价于输出a的值) cout << a << endl; // 输出11(被b的赋值操作修改了) cout << a1 << endl; // 输出11
当你执行b = a1时,编译器会把它解析为a = a1——因为b是a的别名,所有对b的操作都会直接作用在a上,根本没有“修改引用指向”的逻辑。
实现类似指针修改指向的效果
如果想要让一个变量能随时切换绑定的目标,有两种常用方案:
方案1:直接使用指针
指针的核心功能就是存储地址,天然支持修改指向:
int a = 1; int a1 = 11; int *b = &a; // 指针b指向a的地址 b = &a1; // 修改指针指向,现在b指向a1 cout << *b << endl; // 输出11(解引用指针获取a1的值) cout << a << endl; // 输出1(a的值未被修改) cout << a1 << endl; // 输出11
方案2:使用std::reference_wrapper(C++11+)
如果想要保留类似引用的使用体验(不需要每次解引用*),可以用标准库提供的std::reference_wrapper,它封装了指针并支持重新绑定:
#include <functional> #include <iostream> int main() { int a = 1; int a1 = 11; std::reference_wrapper<int> b = a; // 初始绑定a b = a1; // 重新绑定到a1 std::cout << b << std::endl; // 输出11(直接使用,无需解引用) std::cout << a << std::endl; // 输出1 std::cout << a1 << std::endl; // 输出11 return 0; }
内容的提问来源于stack exchange,提问作者f1msch
相关产品推荐
相关产品推荐

