关于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 时直接使用了有参构造函数,你再调试下试试。
072022-02-28
相似问题