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
複製代碼
相關文章
相關標籤/搜索