请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

关于Complex c = a + b这一步还有疑惑

Complex c = a + b; 相当于 Complex c (a + b) 因此这边不调用重载的=运算符函数,但是我疑惑的点在于 对Complex c的定义为什么没有调用拷贝构造函数Complex::Complex(const Complex &x),我的理解是a+b调用重载的+运算符函数返回的这个Complex对象来定义c不应该还要调用一次拷贝构造函数吗,就像后面的Complex d(c) 一样。我打断点看了一下,发现对c的定义没有调用任何的构造函数就让我非常疑惑

Complex Complex::operator+(const Complex &x) {
return Complex(m_real+x.m_real,m_image+x.m_image);
}
这一段代码返回的对象应该是属于一个右值吗,是不是通过右值来定义对象就可以不用调用构造函数了?,麻烦老师解答一下我的疑惑,晕了–||

正在回答 回答被采纳积分+3

1回答

quickzhao 2021-05-09 10:09:21

首先,对象的创造肯定要调构造函数。你注意看下,这里对operator+的实现实际上是用了一个优化的版本。你可以试着使用下原始的临时对象生成方式,你会发现很好理解。但是,这里的优化导致了实际在创建 Complex c 时直接使用了有参构造函数,你再调试下试试。

0 回复 有任何疑惑可以回复我~
  • 提问者 慕粉张张张 #1
    我对operator+使用了未优化的版本打断点尝试了一下,我首先发现编译器似乎做了优化并没有生成临时对象,Complex c = a + b,我监视了&c跟&temp的值,之后我发现这里对象c的地址就是  operator+里面的temp的地址(在栈上过了函数作用域本该被系统回收的内存地址)。我现在的理解是,这个c就等价于未优化的temp或者优化后的 Complex(m_real+x.m_real,m_image+x.m_image);所以这里就没有调用拷贝构造函数构造c,其实是通过无参构造函数(未优化版本)  有参构造函数构造的(优化版本),老师我现在的理解不知道对不对呢?
    回复 有任何疑惑可以回复我~ 2021-05-09 16:23:37
  • quickzhao 回复 提问者 慕粉张张张 #2
    优化后不会产生临时对象,但是c的产生是通过有参构造产生的。
    回复 有任何疑惑可以回复我~ 2021-05-11 14:57:11
  • 老师的意思是:
    
    Complex c = a + b
    
    a + b 实际上返回的是 Complex(m_real+x.m_real,m_image+x.m_image) 这个对象
    
    在 c = 的时候,又创建了一个对象???
    回复 有任何疑惑可以回复我~ 2021-07-10 22:27:22
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信