Kotlin进阶知识(一)——重载算术运算符

1、重载二元算术运算

  • 定义一个***plus***运算符
// 定义
data class Point(val x: Int, val y: Int) {
    // 定义一个名为“plus”的方法
    operator fun plus(other: Point): Point {
        // 坐标分别相加,而后返回一个新的点
        return Point(x + other.x, y + other.y)
    }
}

// 测试
>>> val p1 = Point(10, 20)
>>> val p2 = Point(30, 40)
>>> Point(p1 + p2)
Point(x=40, y=60)
复制代码

关键字***operator***:用于重载运算符的全部函数都须要用该关键字标记,用来表示将该函数做为相对的约定的实现。算法

  • 运算符能够被定义为扩展函数

可重载的二元算术运算符markdown

表达式 函数名
a * b times
a / b div
a + b plus
a - b minus

自定义类型的运算符,基本上和与标准数字类型的运算符有着相同的优先级。函数

注意:Kotlin运算符不会自动支持交换性(交换运算符的左右两边)。测试

2、重载复合赋值运算符

复合赋值运算符+=、-=ui

>>> var point = Point(1, 2)
>>> point += Point(3, 4)
>>> println(point)
Point(x=4, y=6)
复制代码

上述等效于 **point = point + Point(3, 4)**的写法。this

  • 定义**+=运算能够修改使用它的变量所引用的对象,但不会从新分配引用**。

Kotlin标准库支持集合的这两种方法:“+”和“-”运算符老是返回一个新的集合“+=”和“-=”运算符用于可变集合时,始终就地修改它们;而它们用于只读集合时,会返回一个修改过的副本(这意味着只有当引用只读集合的变量被声明为**var**的时候,才能使用“+=”和“-=”)spa

3、重载一元运算符

重载一元运算符的过程和以前的方法相同:用预先定义的一个名称来声明函数(成员函数或扩展函数),并用修饰符**operator**标记。code

  • 定义一个一元运算符
// 一元运算符无参数
operator fun Point.unaryMinus(): Point {
    // 坐标取反再返回
    return Point(-x, -y)
}

>>> val p = Point(10, 20)
>>> println(-p)
Point(x=-10, y=-20)
复制代码

可重载的一元算法的运算符orm

表达式 函数名
+a unaryPlus
-a unaryMinus
!a not
++a, a++ inc
--a, a-- dec
  • 定义一个自增运算符
operator fun BigDecimal.inc() = this + BigDecimal.ONE

// 在第一个println语句执行后增长
>>> var bd = BigDecimal.ZERO
>>> println(bd++)
0
// 在第二个println语句执行前增长
>>> println(++bd)
2
复制代码
相关文章
相关标签/搜索