C++ 重载 += 运算符

c++ overloading += operator

本文关键字:运算符 重载 C++      更新时间:2023-10-16

我有一个类:

class MyClass{
    double a;
    double b;
    double c;
    double d;
    public:
    MyClass(double _a, double _b, double _c, double _d){
        a = _a;
        b = _b;
        c = _c;
        d = _d;
    }
   MyClass operator+=(const MyClass & rhs){
    a += rhs.a;
    b += rhs.b;
    c += rhs.c;
    d += rhs.d;
    return this;
    }
    MyClass operator+(MyClass & rhs){
      MyClass newOne(a+rhs.a,b+rhs.b,c+rhs.c,d+rhs.d);
    return newOne;
}
}

我像这样使用它:

MyClass my1(1., 2., 3., 4.);
MyClass my2(2., 3., 4., 5.);
MyClass my3(2., 4., 6., 8.);
my2 += my3;
my1 += my2;

这个正在工作,但是当我像这样使用它时

my1 += my2 += my3;

我得到不同的答案。我怎样才能将括号中的表达式算作第一个?例如:

(my1 + my2) + my3 == my1 + (my2 + my3)

目前尚不清楚您期望在此语句中得到什么结果

my1 += my2 += my3;

该语句等效于

my1 += ( my2 += my3 );

根据C++标准(5.17赋值和复合赋值运算符(

1 赋值运算符 (=( 和复合赋值运算符 所有组从右到左

有效的运算符定义如下所示

MyClass & operator +=( const MyClass & rhs )
{
    a += rhs.a;
    b += rhs.b;
    c += rhs.c;
    d += rhs.d;
    return *this;
}

考虑到代码中有几个拼写错误。例如,在运算符中,您必须返回 *this 而不是这个,否则类定义应在右大括号后以分号结尾。

至于这个表达

(my1 + my2) + my3 == my1 + (my2 + my3)

那么完全不清楚你想实现什么。您的类没有定义的比较运算符。

您的代码存在几个问题:

  • 首先,operator+=应返回对值的引用它修改,而不是副本;返回类型应为 MyClass& .

  • operator+应该参考 const,而不是非常常量;不能将临时绑定到一个非常常量。

经典地,operator+将是一个自由函数,沿着行:

MyClass operator+( MyClass const& lhs, MyClass const& rhs )
{
    MyClass results( lhs );
    results += rhs;
    return results;
}

这样做是为了确保应用相同的转换到+两侧的操作数;自从你的班级不支持任何转换,没关系,但养成一个好习惯。