· 这两个b为什么输出不一样呢 第一个输出1.2 第二个2.3 要怎么理解
6条回答 默认 最新
- 专家-皆知 2024-05-01 16:01关注
参考免费微信小程序:皆我百晓生 作答,经由专家-皆知整理回复,如问题解决,望采纳;如仍有疑问,请评论回复。
在C++中,后置运算符
++
(例如在a++
中)的工作方式是先返回当前对象的值,然后才对对象执行自增操作。这解释了为什么两个代码片段中的b.print()
输出结果不同。图1的逻辑
在图1的代码中,
Complex::operator++(int)
定义为先创建当前对象的一个副本a
,然后增加原对象的real
和imag
属性的值,并返回这个副本。因此,当执行Complex b = a++;
时,它首先调用此运算符,得到的是原始状态的a
(即1,2
)的副本赋给b
,之后a
的值变为2,3
。所以,b.print()
输出的是1,2
。#include <iostream> struct Complex { int real, imag; Complex(int r, int i): real(r), imag(i) {} void print() { std::cout << real << "," << imag << std::endl; } Complex operator++(int) { Complex a(*this); ++real;++imag; return a; } }; int main() { Complex a(1, 2); Complex b = a++; b.print(); // 输出: 1,2 return 0; }
图2的逻辑
而在图2的代码中,
Complex::operator++(int)
的实现有所不同,它直接增加了当前对象的real
和imag
属性的值,然后返回对当前对象的引用(return *this
)。这意味着在执行Complex b = a++;
时,先增加了a
的值到2,3
,然后将增加后的a
赋给了b
。因此,b.print()
输出的是2,3
。#include <iostream> struct Complex { int real, imag; Complex(int r, int i): real(r), imag(i) {} void print() { std::cout << real << "," << imag << std::endl; } Complex operator++(int) { ++real;++imag; return *this; } }; int main() { Complex a(1, 2); Complex b = a++; b.print(); // 输出: 2,3 return 0; }
总结来说,这两个版本的差异在于是否创建了原对象的副本以及何时进行自增操作,这直接影响了
b
所持有的值。图1中,b
持有的是自增前的a
的副本,而图2中,b
直接持有自增后的a
的引用。本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 1无用
悬赏问题
- ¥66 换电脑后应用程序报错
- ¥50 array数据同步问题
- ¥15 pic16F877a单片机的外部触发中断程序仿真失效
- ¥15 Matlab插值拟合差分微分规划图论
- ¥15 keil5 target not created
- ¥15 C/C++数据与算法请教
- ¥15 怎么找志同道合的伙伴
- ¥20 如何让程序ab.eXe自已删除干净硬盘里的本文件自己的ab.eXe文件
- ¥50 爬虫预算充足,跪巨佬
- ¥15 滑块验证码拖动问题悬赏