C++类重载下标运算符operator[]返回值带&与不带的差异是什么?
C++下标运算符返回引用和返回值的输出问题解答
为什么两段代码输出结果完全一致?
- 你调用
std::cout输出double&类型(double的左值引用)和double类型时,std::ostream的<<运算符重载都会读取对应位置存储的浮点数值打印,不会输出内存地址。只有输出指针类型(比如double*)时才会打印内存地址,引用本质是原变量的别名,不是指针,所以不会触发地址打印逻辑。 - 两段代码你都只做了只读访问操作:返回引用时直接读取原数组
elem[2]的数值,返回值时拷贝了elem[2]的数值再打印,二者读取到的数值完全相同,输出自然一致,也不会触发运行报错。
两种写法的核心区别是什么?
只有在写操作场景下差异才会体现,比如你在main函数中加一行赋值代码:
some_class[2] = 10.5; std::cout << some_class[2] << std::endl;
- 第一段返回
double&的代码可以正常编译运行:返回的是elem[2]的引用,赋值操作会直接修改类内部数组对应位置的值,第二行打印结果为10.5。 - 第二段返回
double的代码编译直接报错:返回的是临时右值,C++不允许对临时右值做赋值操作。
内容的提问来源于stack exchange,提问作者cppprogramming
相关产品推荐
相关产品推荐

