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

来源:8-5 拷贝构造及临时对象的优化

慕粉张张张

2021-05-08

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);
}
这一段代码返回的对象应该是属于一个右值吗,是不是通过右值来定义对象就可以不用调用构造函数了?,麻烦老师解答一下我的疑惑,晕了–||

写回答

1回答

quickzhao

2021-05-09

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

0
7
weixin_慕勒8023578
回复
quickzhao
Complex c(a+b) 不是调用拷贝构造函数而是调用有参构造函数么?
2022-02-28
共7条回复

重学C++ ,重构你的C++知识体系

一部大片,一段历史,构建C++知识框架的同时重塑你的编程思维

3884 学习 · 1103 问题

查看课程