C++_操作符重载_1
1
C++为什么要有操作符重载?
C++为内置的数据类型都定义了一些内置操作符。
这些操作符定义了内置数据类型支持的各种操作。
并且
C++允许用户定义自己的用户类型(user-define type),
以及这个用户类型所支持的各种操作函数。
我们有时候希望
我们自己定义的用户类型也支持内置类型所支持的操作,
我们可以通过定义用户类成员函数来间接实现这个目的,
但是用户类成员函数在使用时,其语法必须符合函数调用格式,
这种格式看起来和内置类型操作符相比,不够简洁,
多个函数调用的组合不能够象内置操作符组合那样直接,干净,自然 !
幸运的是:C++允许用户自己定义用户类支持的内置操作符,
并且支持象内置类型使用内置操作符时的语法描述格式。
使多个用户类型的函数调用组合在形式上转化为内置操作符组合形式
自然,直接!
这看起来用户类和内置类之间没有了实质性区别,
仿佛用户类和其支持的操作本身就属于语言的一部分,
也可以对用户类型的数据和操作符的进行自由组合 !
比如:
操作符形式:
std::string result = "nihao" + " ma" - "a" + "\n" ;
函数调用形式:
std::string result = "nihao".operator+(" ma").operator-("a").operator+("\n");
C++ Ruminations 中的名言:用户类设计就是语言设计 !
结论:
1) 操作符重载允许我们通过用户类设计进行语言设计,
2 编译器如何查找语句(a operator@ b)中操作符@的定义呢?
Operator Look-up规则定义了一个操作符名字和操作符定义之间的映射规则。
根据这个规则编译器找到操作符名字的定义。
C++LS中是这样描述的:
a是X类型,b是Y类型;
查找过程在这四步中一直进行,每执行一步结束时检查是否找到合适的定义,如果找到则停止。
(可能这一步找到多个定义):
1) 如果X是一个类,则在X的成员函数中查找 operator@ 的定义,或者在X的基类中查找
2) 在包含 a operator@ b 语句的上下文(contex)中查找
3) 如果X定义在名字空间N中,则在N中的自由函数中查找
4) 如果Y定义在名字空间M中,则在M中的自由函数中查找
另1:如果在一个步骤中找到多个合适的定义,则应用函数重载推理规则来选择最佳匹配,
此选择可能发现二义性定义
另2:这个规则只适用于操作符参数中至少含有一个非内置类型(user-defined type)
(typedef type is not user-defined type !)