一元操作符

表达式 转换
+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的值返回作为表达式的值

results matching ""

    No results matching ""