# Kotlin 运算符重载

> 原文： [https://www.programiz.com/kotlin-programming/operator-overloading](https://www.programiz.com/kotlin-programming/operator-overloading)

#### 在本文中，您将通过示例学习有关运算符重载（定义运算符如何处理用户定义的类型（如对象）的方法）。

在 Kotlin 中使用运算符时，将调用其相应的成员函数。 例如，表达式`a+b`在后台转换为`a.plus(b)`。

```kt
fun main(args: Array<String>) {
    val a = 5
    val b = 10

    print(a.plus(b)) // print(a+b)
}
```

运行该程序时，输出为：

```kt
15
```

实际上，`plus()`函数已重载以与各种 Kotlin 原始类型和`String`一起使用。

```kt
// + operator for basic types
operator fun plus(other: Byte): Int
operator fun plus(other: Short): Int
operator fun plus(other: Int): Int
operator fun plus(other: Long): Long
operator fun plus(other: Float): Float
operator fun plus(other: Double): Double

// for string concatenation
operator fun String?.plus(other: Any?): String

```

* * *

您还可以通过重载对象的相应函数来定义操作符对对象的工作方式。 例如，您需要通过重载`plus()`函数来定义`+`运算符对对象的工作方式。

### 示例：重载`+`运算符

```kt
fun main(args: Array<String>) {
    val p1 = Point(3, -8)
    val p2 = Point(2, 9)

    var sum = Point()
    sum = p1 + p2

    println("sum = (${sum.x}, ${sum.y})")
}

class Point(val x: Int = 0, val y: Int = 10) {

    // overloading plus function
    operator fun plus(p: Point) : Point {
        return Point(x + p.x, y + p.y)
    }
}
```

运行该程序时，输出为：

```kt
sum = (5, 1)
```

这里，`plus()`函数用`operator`关键字标记，以告知编译器`+`运算符正在重载。

表达式`p1 + p2`在后台被转换为`p1.plus(p2)`。

* * *

### 示例：重载`-`运算符

在此示例中，您将学习重载`--`运算符。 表达式`--a`在引擎盖下转换为`a.dec()`。

`dec()`成员函数不带任何参数。

```kt
fun main(args: Array<String>) {
    var point = Point(3, -8)
    --point

    println("point = (${point.x}, ${point.y})")
}

class Point(var x: Int = 0, var y: Int = 10) {
    operator fun dec() = Point(--x, --y)
}
```

运行该程序时，输出将是：

```kt
point = (2, -9)

```

* * *

请记住，

```kt
operator fun dec() = Point(--x, --y)
```

相当于

```kt
operator fun dec(): Point {
    return Point(--x, --y)
}
```

* * *

### 几个要点

1.重载运算符时，应尝试保持运算符的原始精神。 例如，

```kt
fun main(args: Array<String>) {
    val p1 = Point(3, -8)
    val p2 = Point(2, 9)

    var sum = Point()
    sum = p1 + p2

    println("sum = (${sum.x}, ${sum.y})")
}

class Point(val x: Int = 0, val y: Int = 10) {

    // overloading plus function
    operator fun plus(p: Point) = Point(x - p.x, y - p.y)
}
```

尽管上面的程序在技术上是正确的，但我们使用`+`运算符减去了两个对象的相应属性，这使程序变得混乱。

2.与 Scala 之类的语言不同，Kotlin 中只能重载特定的[运算符集](https://kotlinlang.org/docs/reference/operator-overloading.html)。 访问页面以了解可在 Kotlin 中重载的运算符及其相应的成员函数。