【问题标题】:Is it okay to use object pointer to overload assignment operator?可以使用对象指针来重载赋值运算符吗?
【发布时间】: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


【解决方案1】:

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

通常你会想象一个 assign 接受一个相同类型的对象:

/*typeA*/ A = /*typeA*/ B;

一个更现实的问题是指针是整数。你会假设代码:

  Complex c = 5;

设置一个复杂的{5, 0},而不是段错误(一些编译器会警告你int->complex*转换可能不是预期的,但迟早会发生这种情况,一个演员或另一个,它会发生)

【讨论】:

    猜你喜欢
    • 2020-08-17
    • 2021-10-22
    • 1970-01-01
    • 2020-10-14
    • 1970-01-01
    • 2019-04-16
    相关资源
    最近更新 更多