可以使用对象指针重载赋值运算符吗?
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<> 或另一个,它将会发生)
假设我们要实现一个复数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<> 或另一个,它将会发生)