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

C++ 可以使用对象指针重载赋值运算符吗?,c++,overloading,variable-assignment,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*); };

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

#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*);
};
#包括
使用名称空间std;
类复数{
公众:
双实数;
双imag;
复合物();
复合(双r,双i)
:real(_r),imag(_i){}
常量复数*运算符=(常量复数*);
};
通常为了重载赋值运算符,我们会传递一个常量引用作为参数,但为什么我们不能像这样传递一个指针呢

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;
}
const Complex*Complex::operator=(const Complex*cp){
real=cp->real;
imag=cp->imag;
归还这个;
}
int main(){
配合物c1(1,2),c2(3,4),c3(5,6);
复杂*pc=&c3;
c1=c2=pc;

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

通常,您会想象一个赋值接受相同类型的对象:

/*typeA*/ A = /*typeA*/ B;
更真实的问题是指针是int。您可以假设代码:

  Complex c = 5;

设置一个复杂的
{5,0}
,相反,它将segfault(一些编译器会警告您int->complex*转换可能不是有意的,但迟早会发生,不管是强制转换还是其他转换)

您的
复杂类不需要任何赋值运算符,编译器生成的赋值运算符执行它应该执行的操作。
*此
不是
复杂类*
“为什么我们不能”你有什么建议?为什么你会这样?你的老师推荐引用,因为它们被添加到C++中,原因很多,包括实现拷贝/赋值构造函数、运算符重载等等。你认为你知道得更好吗?我没有任何反对指针并经常使用它们的意思,但是我不喜欢当它们在IAPP中使用时。像这样的情况下,你的代码工作,但它是差的风格。任何C++程序员阅读你的代码会想知道Heck的进展,然后当他们最终弄明白你做了什么,他们会有几个选择的词。如果你想在C++项目上合作,你就不会有这样的代码接受。