You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 09:34:55