一元操作符
表达式 | 转换 |
---|---|
+a | a.unaryPlus() |
-a | a.unaryMinus() |
!a | a.not() |
以上的表格说明了编译器的处理过程,比如,表达式+a,它将按照以下的步骤进行:
- 决定a的类型,比如类型T
- 查找使用operator修饰符的unaryPlus()函数和无参的接收对象T,比如成员函数或扩展函数
- 如果这个函数是不存在的或有歧义的,将会产生编译器错误
- 如果这个函数存在并且返回类型是R,那么表达式+a的类型就是R
需要注意的是这些操作符在基本数据类型中做过优化处理,不会引入调用函数的开销。
表达式 | 转换 |
---|---|
a++ | a.inc() |
a-- | a.dec() |
inc()和dec()函数必须返回一个值,返回值会被指定给++或--操作符的结果。需要注意的是返回值不会改变调用inc和dec方法的对象。
编译器根据以下步骤来解析一个操作符(后缀形式),比如a++:
- 决定a的类型,假如是类型T
- 寻找没有参数的并且使用operator修饰的inc()方法
- 函数的返回类型必须是T的子类型
影响表达式计算的因素是:
- 把a的初始值存储在临时空间a0
- 将a.inc()的值赋值给a
- 返回a0作为表达式的值
对于a--操作步骤是类似的。
对于前缀形式的++a和--a解析过程类似,影响表达式的因素是:
- 将a.inc()的值赋值给a
- 将a的值返回作为表达式的值