【问题标题】:Compund assignment overload (C++)复合赋值重载 (C++)
【发布时间】:2018-10-28 02:54:41
【问题描述】:

我在两次通过引用传递同一个对象到一个函数时遇到了一个问题,一次作为常量,一次像往常一样(可变)。

我想知道修复此类代码的最佳方法是什么。 (一个方便的例子是重载复合赋值运算符)。

class MyClass
{
    int a, b;
public:
    MyClass(int a, int b) : a(a), b(b) {}
    MyClass& operator+=(const MyClass& ob)
    {
        this->a += ob.b;
        this->b += ob.a;    
        return *this;
    }
};

当然,这段代码没有多大意义,但它突出了问题: 编写如下代码时:

MyClass ob(1, 2);
ob += ob;

我希望 ob.b 的值为 3,但它的值为 5。

我想知道如何正确地实现这样的代码。 我应该小心实施,例如维护临时变量,还是有更好的通用解决方案来解决这些问题? (例如按值传递)

【问题讨论】:

  • 假设该类有一个工作/正常的复制构造函数,按值传递将解决问题,因为该函数接收右手操作数的副本。然而,更一般地说,如果你有一个类的加法是这样的,你的类的用户可能很难掌握。

标签: c++ operator-overloading parameter-passing


【解决方案1】:

使用复制的值(按值传递参数):

MyClass& operator+=(const MyClass ob)

或者更优化的解决方案:比较对象地址,如果对象是同一个对象,则使用临时值:

MyClass& operator+=(const MyClass& ob)
{
    if (this == std::addressof(ob))
        return operator+=(MyClass(ob));
    this->a += ob.b;
    this->b += ob.a;    
    return *this;
}

【讨论】:

  • 这本质上是在模拟按值传递。它还依赖于没有重载 operator&() 的类。
  • @Peter 好的,你的想法很清楚。我更新了使用std::addressof 的答案。
猜你喜欢
  • 2015-11-08
  • 2020-03-23
  • 1970-01-01
  • 2020-04-17
  • 1970-01-01
  • 1970-01-01
  • 2021-04-24
  • 2011-02-21
  • 1970-01-01
相关资源
最近更新 更多