Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/158.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++重载+=算符_C++_Operator Overloading - Fatal编程技术网

C++重载+=算符

C++重载+=算符,c++,operator-overloading,C++,Operator Overloading,我有一门课: 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 M

我有一门课:

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赋值和复合赋值算子< /P> 1赋值运算符=和复合赋值运算符 从右向左分组

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

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

    return *this;
}
考虑到你的代码中有几个打字错误。例如,在运算符(而不是this)中,必须返回*this或类定义应在右大括号后以分号结束

至于这个表达

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

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

您的代码有几个问题:

首先,运算符+=应返回对该值的引用 它修改,而不是复制;返回类型应为 我的班级&

运算符+应该引用const,而不是 非常量;不能将临时文件绑定到对的引用 非常量

传统上,运算符+将是一个自由函数,沿 行:

MyClass operator+( MyClass const& lhs, MyClass const& rhs )
{
    MyClass results( lhs );
    results += rhs;
    return results;
}
这样做是为了确保应用相同的转换 到+两侧的操作数;自从你上课以来 不支持任何转换,这没关系,但是
养成一个好习惯。

MyClass操作符+=constMyClass&rhs{应该是MyClass&operator+=constMyClass&rhs{.return this;should是return*this;return this;will not compile.我得到了错误的答案你得到了什么结果?Op+=应该是RL-associative.根据你的建议进行更改很有帮助,非常感谢。但是我如何解决第二个问题?我应该过载吗?返回类型不应该是const!@NeilKirk Oops.你是对的,我输入错误。修复了。