天天看点

C++——操作符重载

操作符重载

双目操作符

计算类的双目操作符('+'和'-')

代码示例

赋值类的双目操作符(+=、-=)

单目操作符

计算类单目操作符(-(取负)、~(取反))

自增减单目操作符(++、--)

插入(输出)和提取(输入)操作符('<<' 和 '>>')

下标操作符('[]')

函数操作符('()')

new/delete 操作数

操作符重载的限制

表达式的结果是右值。

左右操作数既可以是左值也可以是右值。

两种实现方式:

成员函数形式(左调右参)

L#R的表达式可以被编译器处理成 L.operator#®的成员函数调用形式,该函数的返回值就是表达式的结果。

全局函数形式(左右操作数都作为参数)

L#R的表达式也可以被成立成::operator#(L,R)的全局函数调用形式,该函数的返回值就是表达式的结果。

注:使用friend关键字,可以把一个全局函数声明为某个类的友元,友元函数可以访问类中的任何成员。

complex.cpp

执行结果

C++——操作符重载

表达式结果是左值,就是左操作数的自身。

左操作数一定是左值,右操作数可以是左值也可以是右值。

成员函数形式

L#R ⇒ L.operator#®

全局函数形式

L#R ⇒ ::operator#(L,R)

C++——操作符重载

表达式结果是右值,不能对表达式进行赋值操作

操作数只有一个,可以左值也可以右值

两种实现形式

#O ⇒ O.operator#();

#O ⇒ ::operator#(O);

integer.cpp

C++——操作符重载

前++、–

表达式的结果是左值,就是操作数自身

操作数一定是左值

后++、–

表达式的结果是右值,是操作数自增减前的副本

操作数也一定是左值

O# ⇒ O.operator#(int);

O# ⇒ ::operator#(O,int);

注:后缀自增减操作符函数中增加了一个int哑元参数,用于和前缀自增减进行区分。

C++——操作符重载

功能:实现自定义类型直接的输入和输出

注:只能使用全局函数形式(friend)

io_operator.cpp

C++——操作符重载

功能:让一个对象可以像数组一样去使用。

注:非常对象返回左值,常对象返回右值。

array_operator.cpp

C++——操作符重载

功能:让对象像函数一样去使用

注:对参数个数、类型和返回值类型没有限制。

func_operator.cpp

C++——操作符重载

new.cpp

C++——操作符重载

不是所有的操作符都能重载,以下操作符不能重载:

作用域限定操作符(::)

直接成员访问操作符(.)

直接成员指针解引用操作符(.*)

条件操作符(?:)

字节长度操作符(sizeof)

类型信息操作符(typeid)

如果一个操作符所有操作数都是基本类型,则该操作符无法重载。

操作符重载不会改变编译器预定义的优先级

操作符重载无法改变操作数的个数

无法通过操作符重载发明新的符号

只能使用成员形式不能使用全局形式的操作符(= 、()、->)