【问题标题】:c++ overloading += operator [closed]c ++重载+ =运算符[关闭]
【发布时间】:2015-01-07 23:06:36
【问题描述】:

我有一堂课:

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)

【问题讨论】:

  • MyClass operator+=(const MyClass & rhs){ 应该是 MyClass & operator+=(const MyClass & rhs){return this; 应该是 return *this;
  • return this; 不会编译。
  • i get wrong answer
  • 你得到什么结果? Op += 应该是 RL 关联的。
  • 根据您的建议进行更改有帮助,非常感谢。但是我该如何解决第二个问题?我应该重载 () 吗?

标签: c++ operator-overloading


【解决方案1】:

不清楚您希望在此声明中得到什么结果

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 而不是 this,否则类定义应在右大括号后以分号结束。

至于这个表达

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

那么完全不清楚您要达到的目标。您的类没有定义的比较运算符。

【讨论】:

    【解决方案2】:

    你的代码有几个问题:

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

    • operator+ 应该引用 const,而不是 非常量;您不能将临时对象绑定到对 一个非常量。

    传统上,operator+ 将是一个免费函数,沿着 行:

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

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

    【讨论】:

    • 返回类型不应该是const!
    • @NeilKirk 哎呀。你是对的,我打错了。固定。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多