C ++重载运算符+,复制构造函数出现问题

时间:2018-10-18 23:48:51

标签: c++ operator-overloading

我正在学习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上找不到任何有用的方法(或者我太笨了,无法看穿它),我们将不胜感激!

1 个答案:

答案 0 :(得分:1)

您的operator+函数按值返回Complex,因此必须调用复制构造函数。

在没有自定义构造函数的情况下,编译器会生成一个默认的复制构造函数,该函数可以正常工作(它执行成员复制)。

使用您的自定义构造函数,编译器将不会生成默认的副本构造函数。但是,您的自定义副本构造函数具有一个异常的类型:

Complex(Complex &other)

需要一个左值作为输入。不能用来复制临时文件。

由编译器生成的副本构造函数使用const Complex &other代替,它可以绑定到临时值。