一、运算符重载的四项基本原则:
▍不可臆造运算符。
▍运算符原有操作数的个数、优先级和结合性不能改变。
▍操作数中至少一个是自定义类型。
▍保持运算符的自然含义。
==============================
二、运算符重载的两种形式:
▍成员函数形式(隐含一个参数 this 指针):
1)双目运算符:参数一个
2)单目运算符:不能显示的声明参数
▍友元函数形式(不存在隐含的参数 this 指针)
1)双目运算符:两个参数
2)单目运算符:一个参数
==============================
三、成员函数和友元函数形式的另一差异:
1)友元函数形式:能够接受左参数和右参数的隐式转换
2)成员函数形式:只允许右参数的隐式转换
例如:
class CString{
public :
CString(char* str);
...
private :
char* m_pStr;
};
=.=CString的构造函数参数为一个char:
友元函数形式的 operator+(const CString&,const CString&),char+CString和CString+char都能正常工作;
成员函数形式的 CString::operator(const CString& rhs),只能执行 CString+char。
--------------------------------
隐式转换由于临时变量的增加,效率不高,建议定义多个运算符的友元重载版本:
CString& operator+(const CString&, const CString&);
CString& operator+(const char&, const CString&);
CString& operator+(const CString&, const char&);
==============================
四、一般而言,双目运算符,最好重载为友元函数;对于单目运算符,最好重载为成员函数。特例:
1)只能重载为成员函数:“=”、“()”、“[ ]”、“->”等,与 this(自身)关联太多。
2)只能重载为友元函数:只能重载为友元函数:输出运算符 << ,第一个操作符一定是 ostream 。
friend ostream& operator<<(ostream& out, const Complex& c);