我今天刚刚在 C++ 中学习了 OOP,但是当我尝试执行以下操作时遇到了一个奇怪的问题:
#ifndef LEETCODE_COMPLEX_H
#define LEETCODE_COMPLEX_H
#include <iostream>
class Complex {
private:
double _real;
double _image;
public:
Complex();
Complex(double real, double image);
Complex(const Complex &rhs);
virtual ~Complex();
Complex &operator=(const Complex &rhs);
Complex operator+(const Complex &rhs) const;
};
#endif //LEETCODE_COMPLEX_H
#include "Complex.h"
#include <iostream>
Complex::Complex(double real, double image) {
_real = real;
_image = image;
std::cout << "Complex::Complex(double real, double image)" << std::endl;
}
Complex::Complex() : _real(0), _image(0) {
std::cout << "Complex::Complex()" << std::endl;
}
Complex::~Complex() {
std::cout << "~Complex" << std::endl;
}
Complex &Complex::operator=(const Complex &rhs) {
if (this != &rhs) {
_real = rhs._real;
_image = rhs._image;
}
return *this;
}
Complex::Complex(const Complex &rhs) : _real(rhs._real), _image(rhs._image) {
std::cout << "Complex::Complex(const Complex &rhs)" << std::endl;
}
Complex Complex::operator+(const Complex &rhs) const {
return Complex(_real + rhs._real, _image + rhs._image);
}
#include "Complex.h"
int main() {
Complex a(1, 2);
Complex b;
Complex c = a + b;
return 0;
}
问题:
我试图做的是创建 Complex a
和 Complex b
,并通过添加 Complex c
和 a
来创建 b
。这是我用来确定他们将使用什么构造函数的过程。正如我们所看到的,我在构造函数中放置了一些消息,它们可以帮助我检查使用了什么构造函数。令我惊讶的是输出是:
Complex::Complex(double real, double image)
Complex::Complex()
Complex::Complex(double real, double image)
~Complex
~Complex
~Complex
因为我写了Complex operator+(const Complex &rhs) const;
,所以我认为最后一个Complex::Complex(double real, double image)
是这个函数打印出来的。但我认为 c
也应该有一个构造函数,它应该打印另一条消息,我想知道的是。
我猜 c
可能只是一个指向 (a+b)
的指针,但我也相信 c
应该由复制构造函数创建。