C++ 中的运算符重载

0x00 c++ 原则:只能重载已有的运算符而且不改变结合性优先级:

运算标识符作为词法分析器的Token,不能动态添加,编译时无法识别其他未被Lexer定义的运算符Token,而重载已有的运算符只是在给Token解析添加语义动作时,指明符号的调用指向而已,所以,绑定运算符的动作是可以动态的,但是,区分token的单位是在词法分析器里写死的,固定的。

同时,结合性和优先级是语法分析层次上固定写死的,静态的,不可改变。

(猜想,未证实)

0x01 c++在逻辑上是如何解析运算表达式的

主要是用 operator 关键字来表达区分

单目运算符

运算式代码调用重载函数编写
a++a.operator ++(0)DataType operator ++(int)
++aa.operator ++()DataType operator ++()

 

 

 

 

双目运算符

运算式代码调用重载函数编写
a << ba.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关键字对运算符符号的动态绑定即可

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值