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

C++引用变量与指针变量:引用赋值效果及初始化语法差异问题

C++引用特性与初始化语法问题解答

待分析示例代码

#include <iostream> 

int main()   {  
   int x{ 10 };
   int &rx{ x };
   rx = 123; 
   std::cout << x << " " << rx << std::endl;  
}

实际运行输出

123 123

问题解答

为什么输出是123 123而非10 123

核心原因是C++引用的本质特性:

  • 引用不是独立占有内存的新变量,它只是已存在变量的别名,和绑定的原变量指向完全相同的内存地址,对引用的所有操作都会直接作用在原变量上。
  • 代码中int &rx{ x };执行后,rx就成了x的另一个名字,不存在“rx存了一份x的拷贝”的情况。后续执行rx = 123;,本质就是直接修改x对应的内存空间里的值,把原来的10改成了123。
  • 最终打印时,不管是写x还是rx,访问的都是同一块内存里存储的123,自然输出两个123。

举个通俗的类比:你大名叫张三,小名叫三儿,不管别人喊你大名还是小名喊你去吃饭,去吃饭的都是你本人。你改名叫张四之后,不管喊张三还是三儿找的都是改名叫张四的你,不存在喊张三找到旧的你、喊三儿找到新的你的情况。


int x {10};与int x = 10;的区别

两种写法在当前基础int类型初始化的场景下,最终运行效果完全一致,都会把x初始化为10,没有性能差异,核心区别在语法规则层面:

  • 语法来源不同:int x = 10;是从C语言继承的传统赋值初始化语法;int x {10};是C++11版本正式引入的统一列表初始化(花括号初始化)语法。
  • 类型检查严格度不同:列表初始化禁止隐式窄化类型转换,一旦初始化值可能丢失精度,编译器会直接报错。比如写int x {3.99};会直接编译失败,而int x = 3.99;只会抛出编译警告,最终把x截断赋值为3。
  • 适用场景范围不同:列表初始化是C++设计的统一初始化语法,基础类型、数组、自定义类、标准库容器都可以用同一套花括号规则初始化,不会出现语法歧义;传统等号初始化在调用类的显式构造函数、初始化部分聚合类型时会有语法限制,无法通用。

内容的提问来源于stack exchange,提问作者tall_call_9129

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 18:45:32