运算符重载
2024年1月1日 2024年1月2日
-
函数名
使用关键字operator
, 后跟运算符形如
operator+
-
返回类型
-
形参列表
将运算符重载为成员函数, 其显式参数数量比运算符操作数个数少一个形参个数 非成员函数 运算符操作数个数 成员函数 运算符操作数个数减1
二元运算符 | |
---|---|
非成员函数 | 将左侧运算对象传递给第一个参数, 右侧运算对象传递给第二个参数 |
成员函数 | 左侧运算对象必须是类类型对象: 使用this指针绑定左侧运算对象/第一个运算对象, 将右侧运算对象传递给唯一参数 |
只有函数调用运算符可以拥有默认实参
重载运算符的优先级与结合律不变
运算符重载必须与类类型有关
- 将运算符重载为类的成员函数
- 重载运算符的形参列表至少包含一个类类型参数
1int operator+(int, int); // 错误
使用运算符的重载版本
- 间接调用: 将运算符作用于类型正确的实参
1data1 + data2; 2 3data1 += data2;
- 直接调用: 通过函数名
1operator+(data1, data2); // 非成员函数 2data1.operator+=(data2); // 成员函数
将运算符重载非成员函数, 还是重载成员函数
-
必须作为成员函数
- 赋值运算符 =
下标运算符 []
调用运算符 ()
成员访问运算符 ->
-
建议定义为成员函数
改变对象状态, 或者与给定类型密切相关 复合赋值运算符 递增运算符 ++
递减运算符 --
解引用运算符 *
-
建议定义为非成员函数
具有对称性, 任意一端运算对象可能发生隐式转换 算术运算符 相等运算符 ==
/ 不等运算符!=
小于运算符 <
-
必须定义为非成员函数
如果运算符具有对称性, 但左右两个运算对象类型不一致 -
其他
运算符 输入运算符 >>
必须为非成员函数 输出运算符 <<
必须为非成员函数
string的加运算符不是成员函数
1string s = "world"; 2string t = s + "!"; // 正确 3string u = "hi" + s; // 正确