0x00 c++ 原则:只能重载已有的运算符而且不改变结合性优先级:
运算标识符作为词法分析器的Token,不能动态添加,编译时无法识别其他未被Lexer定义的运算符Token,而重载已有的运算符只是在给Token解析添加语义动作时,指明符号的调用指向而已,所以,绑定运算符的动作是可以动态的,但是,区分token的单位是在词法分析器里写死的,固定的。
同时,结合性和优先级是语法分析层次上固定写死的,静态的,不可改变。
(猜想,未证实)
0x01 c++在逻辑上是如何解析运算表达式的
主要是用 operator 关键字来表达区分
单目运算符
运算式 | 代码调用 | 重载函数编写 |
a++ | a.operator ++(0) | DataType operator ++(int) |
++a | a.operator ++() | DataType operator ++() |
双目运算符
运算式 | 代码调用 | 重载函数编写 |
a << b | a.opearator<<(b) | DataType operator << (const DataType & b) |
三目运算符
尚未知
0x02 c++ 支持两个同类型的复杂数据运算
在类内写成员函数进行运算符重载
0x03 C++ 支持两个不同类型的复杂函数的数据运算
在类外写非成员函数进行运算符重载
与类内区别,以a+b为例,因为在类外,所以没有类域的this可以调用,故重载传参需要传 运算数和操作数
所以 a + b 便可以 用 DataType operator + (const DataTypeA &a , const DataTypeB &b )