【发布时间】:2016-04-15 09:51:22
【问题描述】:
假设我们要实现一个复数类:
#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。
我知道这种方法相当不正统,但它似乎也很有效。我想知道为什么我们的老师强烈建议我们在作业中使用参考?非常感谢各位!
【问题讨论】:
-
你的
Complex类不需要任何赋值运算符,编译器生成的会做它应该做的。 -
*this不是Complex*。 -
“我们为什么不能” - 我有一个更重要的问题。为什么会你?你的老师推荐引用,因为它们被添加到 C++ 中的原因有很多,包括实现复制/赋值构造函数、运算符重载等。你认为你知道得更多吗?我不反对指针并经常使用它们,但我确实不喜欢在不适当的情况下使用它们,比如这里。
-
您的代码有效,但风格不佳。任何阅读您的代码的 C++ 程序员都会想知道到底发生了什么,然后当他们最终弄清楚您做了什么时,他们会有几个选择词。如果您想在 C++ 项目上进行协作,您将不会接受这样的代码。
标签: c++ overloading variable-assignment