可以使用对象指针重载赋值运算符吗?

Is it okay to use object pointer to overload assignment operator?

假设我们要实现一个复数class:

#include <iostream>
using namespace std;

class Complex{  
public:
    double real;
    double imag;

    Complex();
    Complex(double _r, double _i)
        :real(_r),imag(_i){}
    const Complex* operator = (const Complex*);
};

通常要重载赋值运算符,我们会传递一个 const 引用作为参数,但为什么我们不能传递一个指针,就像这样?

const Complex* Complex::operator = (const Complex* cp){
    real = cp->real;
    imag = cp->imag;
    return this;
}

int main(){

    Complex c1(1,2), c2(3,4), c3(5,6);
    Complex *pc = &c3;

    c1 = c2 = pc;
    cout<<"c1 = "<<c1.real<<"+"<<c1.imag<<'i'<<endl;
    cout<<"c2 = "<<c2.real<<"+"<<c2.imag<<'i'<<endl;
    cout<<"c3 = "<<c2.real<<"+"<<c2.imag<<'i'<<endl;

    return 0;
}

上面的代码运行并给出了我预期的答案:所有三个复数都产生 5+6i.

我知道这种方法很不正统,但它似乎也很管用。我想知道为什么我们的老师强烈建议我们使用参考资料进行作业?非常感谢你们!

如果你愿意,你可以这样做。但这不是一个好主意。

通常你会想象一个分配接受一个相同类型的对象:

/*typeA*/ A = /*typeA*/ B;

一个更现实的问题是指针是整数。您会假设代码:

  Complex c = 5;

设置一个复杂的 {5, 0},而不是它会出现段错误(一些编译器会警告你 int->complex* 转换可能不是故意的,但迟早会发生,一个 cast<> 或另一个,它将会发生)