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

时间:2016-04-15 09:51:22

标签: c++ overloading variable-assignment

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

#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

我知道这种做法相当不正统,但似乎也有效。我想知道为什么我们的老师强烈建议我们使用参考作业?非常感谢你们!

1 个答案:

答案 0 :(得分:1)

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

通常你会想象一个赋值采用相同类型的对象:

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

更实际的问题是指针是整数。你会假设代码:

  Complex c = 5;

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