操作符重载
双目操作符
计算类的双目操作符('+'和'-')
代码示例
赋值类的双目操作符(+=、-=)
单目操作符
计算类单目操作符(-(取负)、~(取反))
自增减单目操作符(++、--)
插入(输出)和提取(输入)操作符('<<' 和 '>>')
下标操作符('[]')
函数操作符('()')
new/delete 操作数
操作符重载的限制
表达式的结果是右值。
左右操作数既可以是左值也可以是右值。
两种实现方式:
成员函数形式(左调右参)
L#R的表达式可以被编译器处理成 L.operator#®的成员函数调用形式,该函数的返回值就是表达式的结果。
全局函数形式(左右操作数都作为参数)
L#R的表达式也可以被成立成::operator#(L,R)的全局函数调用形式,该函数的返回值就是表达式的结果。
注:使用friend关键字,可以把一个全局函数声明为某个类的友元,友元函数可以访问类中的任何成员。
complex.cpp
执行结果

表达式结果是左值,就是左操作数的自身。
左操作数一定是左值,右操作数可以是左值也可以是右值。
成员函数形式
L#R ⇒ L.operator#®
全局函数形式
L#R ⇒ ::operator#(L,R)
表达式结果是右值,不能对表达式进行赋值操作
操作数只有一个,可以左值也可以右值
两种实现形式
#O ⇒ O.operator#();
#O ⇒ ::operator#(O);
integer.cpp
前++、–
表达式的结果是左值,就是操作数自身
操作数一定是左值
后++、–
表达式的结果是右值,是操作数自增减前的副本
操作数也一定是左值
O# ⇒ O.operator#(int);
O# ⇒ ::operator#(O,int);
注:后缀自增减操作符函数中增加了一个int哑元参数,用于和前缀自增减进行区分。
功能:实现自定义类型直接的输入和输出
注:只能使用全局函数形式(friend)
io_operator.cpp
功能:让一个对象可以像数组一样去使用。
注:非常对象返回左值,常对象返回右值。
array_operator.cpp
功能:让对象像函数一样去使用
注:对参数个数、类型和返回值类型没有限制。
func_operator.cpp
new.cpp
不是所有的操作符都能重载,以下操作符不能重载:
作用域限定操作符(::)
直接成员访问操作符(.)
直接成员指针解引用操作符(.*)
条件操作符(?:)
字节长度操作符(sizeof)
类型信息操作符(typeid)
如果一个操作符所有操作数都是基本类型,则该操作符无法重载。
操作符重载不会改变编译器预定义的优先级
操作符重载无法改变操作数的个数
无法通过操作符重载发明新的符号
只能使用成员形式不能使用全局形式的操作符(= 、()、->)