870920 Menu

SwingCoder之C++备忘录·26

运算符重载

下表列举了常规的运算符重载的方式、时机与原型声明示例:

类别 重载方式 原型声明示例
二元算术 均可,优先全局 friend const T operator+ (const T&, const T&);
一元正负号 均可,优先成员 const T operator- () const;
前自增(减) 均可,优先成员 T& operator++();
后自增(减) 均可,优先成员 T& operator++ (int);
赋值= 必须是成员函数 T& operator= (const T& rhs);
复合赋值 均可,优先成员 T& operator+= (const T& rhs);
二元比较 均可,优先全局 friend bool operator< (const T&, const T&);
流插入<< 均可,优先全局 friend ostream& operator<< (ostream&, const T&);
流提取>> 均可,优先全局 friend istream& operator>> (istream&, const T&);
常量下标[] 必须是成员函数 const E& operator[] (int) const;
非常量[] 必须是成员函数 E& operator[] (int);
函数() 必须是成员函数 void operator()(E&);  // 返回类型和参数可多种多样
类型转换 必须是成员函数 operator int() const; // int可替换为要转换的类型
     

表 1 11 运算符重载参照表

 不能重载语言内置类型的运算符。不能重载:“.(成员访问)”、“::(作用域解析)”、“sizeof()(获取对象或类型的字节数)”、“? :(三元运算符)”、“.*和->*(获取成员)”。

 可以重载但不要重载:“&(取地址)”、“&&(与)”、“||(或)”、“,(逗号)”。

 重载后,无论是类的成员函数,还是全局函数,至少有一个参数须是类类型的对象。

 “[]”、“new”、“delete”等运算符可重载。

 尽量将一元运算符声明为类的成员函数,这可以防止由隐式转换带来的一些问题。

 =、[]、()、->,这四种运算符必须声明为类的成员函数。

 除+=、-=、*=、/=、%=等运算符外,所有其他二元运算符建议为全局函数,类中声明为友元。

 “=”赋值运算符重载函数中,首先要判断是否自身赋值这种情况。

 重载后,不能改变该运算符的优先级、结合律和操作数,不能添加新的运算符。