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++项目上合作,你就不会有这样的代码接受。