如果我的类上有运算符重载,是否也隐式创建了运算符的赋值版本?
class square{
square operator+(const square& B);
void operator=(const square& B);
};
如同,我可以打电话
square A, B;
A += B;
编译器隐式决定调用'operator +'然后'operator ='?
答案 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+=
通常更可取,因为它消除了临时对象。