隐式赋值运算符

implicit assignment operators

如果我的 class 上有运算符重载,是否也隐式创建了运算符的赋值版本?

class square{
   square operator+(const square& B);
   void operator=(const square& B);
};

比如,我可以打电话给

square A, B;
A += B;

编译器隐式决定调用 operator+ 然后 operator=?

否,+= 必须明确定义。


作为旁注,operator+ should usually create a new object:

square operator+(const square& B);

operator= should return a reference to *this:

square& operator=(const square& B);

还值得注意的是 operator+ 通常根据 operator+= 来实现,即 operator+ 在新副本上调用 operator+=

operator+= 是它自己的运算符,必​​须明确定义。

请注意 operator+ 应该 return 一个新对象而不是对原始对象的引用。原始对象应保持不变。

operator+= 应该 return 添加了所需值的原始对象。 operator+= 通常更可取,因为它消除了临时对象。

不,运算符不是隐式定义的。但是,boost/operators.hpp 定义了有用的辅助模板以避免样板代码。他们文档中的示例:

If, for example, you declare a class like this:

class MyInt
    : boost::operators<MyInt> {
    bool operator<(const MyInt& x) const;
    bool operator==(const MyInt& x) const;
    MyInt& operator+=(const MyInt& x);
    MyInt& operator-=(const MyInt& x);
    MyInt& operator*=(const MyInt& x);
    MyInt& operator/=(const MyInt& x);
    MyInt& operator%=(const MyInt& x);
    MyInt& operator|=(const MyInt& x);
    MyInt& operator&=(const MyInt& x);
    MyInt& operator^=(const MyInt& x);
    MyInt& operator++();
    MyInt& operator--(); };

then the operators<> template adds more than a dozen additional operators, such as operator>, <=, >=, and (binary) +. Two-argument forms of the templates are also provided to allow interaction with other types.

此外,还支持隐式 "deducing" 使用 arithmetic operator templates 的一组特定运算符。