假设我们想要实现一个复数类:
#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
。
我知道这种做法相当不正统,但似乎也有效。我想知道为什么我们的老师强烈建议我们使用参考作业?非常感谢你们!
答案 0 :(得分:1)
通常你会想象一个赋值采用相同类型的对象:
/*typeA*/ A = /*typeA*/ B;
更实际的问题是指针是整数。你会假设代码:
Complex c = 5;
设置一个复杂的{5, 0}
,而不是它会发生段错误(一些编译器会警告你int-&gt; complex *转换可能不是故意的,但迟早它,一个cast&lt;&gt;或者另一个,它会发生)