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
相关产品推荐
相关产品推荐

