C++ 中的运算符重载

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 )

0x04 综上,c++运算符重载,在编译原理层次理解会很简单,主要弄清楚opearator关键字对运算符符号的动态绑定即可

发布了17 篇原创文章 · 获赞 1 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/TowerOs/article/details/103945035