Canonical运算符重载?

Ecl*_*pse 7 c++ operator-overloading

是否有规范或推荐的模式用于在类似C++的类中实现算术运算符重载?

从C++ FAQ中,我们有一个异常安全的赋值运算符,可以避免大多数问题:

class NumberImpl;

class Number {
   NumberImpl *Impl;

   ...
};

Number& Number::operator=(const Number &rhs)
{
   NumberImpl* tmp = new NumberImpl(*rhs.Impl);
   delete Impl;
   Impl = tmp;
   return *this;
}
Run Code Online (Sandbox Code Playgroud)

但对于其他运算符(+,+ =等等),除了使它们的行为类似于内置类型的运算符之外,给出的建议很少.

有没有一种标准的方法来定义这些?这就是我想出来的 - 我有没有看到陷阱?

// Member operator
Number& Number::operator+= (const Number &rhs)
{
    Impl->Value += rhs.Impl->Value; // Obviously this is more complicated
    return *this;
}

// Non-member non-friend addition operator
Number operator+(Number lhs, const Number &rhs)
{
     return lhs += rhs;
}
Run Code Online (Sandbox Code Playgroud)

Joh*_*der 4

在 Bjarne Stroustrup 的《C++ 编程语言》一书中,第 11 章(专门讨论运算符重载的章节)中,他介绍了复数类型的类(第 11.3 节)。

我从该部分注意到的一件事是他实现了混合类型操作......这可能是任何数字类所期望的。

一般来说,你所拥有的看起来不错。