我正在学习C ++,在学习运算符重载时遇到了这个问题:
我定义了一个复杂的类:
class Complex {
private:
double real, imag;
public:
Complex() = default;
Complex(double real,double imag): real(real), imag(imag) {
std::cout << "Double constructor" << std::endl;
}
// Complex(Complex &other) {
// this->real = other.real;
// this->imag = other.imag;
// std::cout << "Copy constructor" << std::endl;
// }
Complex operator+(Complex &other) {
return Complex(real+other.real, imag+other.imag);
}
~Complex() {
std::cout << "Desctuctor called: " << real << std::endl;
}
};
在复制构造函数被注释掉的情况下,此代码将起作用,但否则将无效。它给出的错误是,在operator +函数中构造Complex对象时,没有适当的构造函数可调用。
我想知道为什么编译器会给出这样的错误?另外,当我注释掉复制构造函数时,我猜想当我执行
之类的操作时会调用默认的复制构造函数C3 = C1 + C2;
对吗?
我在SO上找不到任何有用的方法(或者我太笨了,无法看穿它),我们将不胜感激!
答案 0 :(得分:1)
您的operator+
函数按值返回Complex
,因此必须调用复制构造函数。
在没有自定义构造函数的情况下,编译器会生成一个默认的复制构造函数,该函数可以正常工作(它执行成员复制)。
使用您的自定义构造函数,编译器将不会生成默认的副本构造函数。但是,您的自定义副本构造函数具有一个异常的类型:
Complex(Complex &other)
需要一个左值作为输入。不能用来复制临时文件。
由编译器生成的副本构造函数使用const Complex &other
代替,它可以绑定到临时值。