隐式赋值运算符[C ++]

时间:2015-03-07 21:34:39

标签: c++ operator-overloading assignment-operator

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

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

如同,我可以打电话

square A, B;
A += B;

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

3 个答案:

答案 0 :(得分:5)

不,+=必须明确定义。


作为旁注,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+=

答案 1 :(得分:4)

不,运营商没有被隐含地定义。但是,boost/operators.hpp定义了有用的辅助模板以避免样板代码。他们的文档示例:

  

例如,如果你声明一个这样的类:

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--(); };
  

然后operators<>模板添加了十几个其他运算符,例如operator><=>=和   (二进制)+。还提供了两个参数形式的模板   允许与其他类型的互动。

此外,还有支持暗示&#34;演绎&#34;只是使用arithmetic operator templates的一组特定运算符。

答案 2 :(得分:3)

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

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

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