原文: https://www.programiz.com/kotlin-programming/operator-overloading
在本文中,您将通过示例学习有关运算符重载(定义运算符如何处理用户定义的类型(如对象)的方法)。
在 Kotlin 中使用运算符时,将调用其相应的成员函数。 例如,表达式a+b在后台转换为a.plus(b)。
fun main(args: Array<String>) {val a = 5val b = 10print(a.plus(b)) // print(a+b)}
运行该程序时,输出为:
15
实际上,plus()函数已重载以与各种 Kotlin 原始类型和String一起使用。
// + operator for basic typesoperator fun plus(other: Byte): Intoperator fun plus(other: Short): Intoperator fun plus(other: Int): Intoperator fun plus(other: Long): Longoperator fun plus(other: Float): Floatoperator fun plus(other: Double): Double// for string concatenationoperator fun String?.plus(other: Any?): String
您还可以通过重载对象的相应函数来定义操作符对对象的工作方式。 例如,您需要通过重载plus()函数来定义+运算符对对象的工作方式。
示例:重载+运算符
fun main(args: Array<String>) {val p1 = Point(3, -8)val p2 = Point(2, 9)var sum = Point()sum = p1 + p2println("sum = (${sum.x}, ${sum.y})")}class Point(val x: Int = 0, val y: Int = 10) {// overloading plus functionoperator fun plus(p: Point) : Point {return Point(x + p.x, y + p.y)}}
运行该程序时,输出为:
sum = (5, 1)
这里,plus()函数用operator关键字标记,以告知编译器+运算符正在重载。
表达式p1 + p2在后台被转换为p1.plus(p2)。
示例:重载-运算符
在此示例中,您将学习重载--运算符。 表达式--a在引擎盖下转换为a.dec()。
dec()成员函数不带任何参数。
fun main(args: Array<String>) {var point = Point(3, -8)--pointprintln("point = (${point.x}, ${point.y})")}class Point(var x: Int = 0, var y: Int = 10) {operator fun dec() = Point(--x, --y)}
运行该程序时,输出将是:
point = (2, -9)
请记住,
operator fun dec() = Point(--x, --y)
相当于
operator fun dec(): Point {return Point(--x, --y)}
几个要点
1.重载运算符时,应尝试保持运算符的原始精神。 例如,
fun main(args: Array<String>) {val p1 = Point(3, -8)val p2 = Point(2, 9)var sum = Point()sum = p1 + p2println("sum = (${sum.x}, ${sum.y})")}class Point(val x: Int = 0, val y: Int = 10) {// overloading plus functionoperator fun plus(p: Point) = Point(x - p.x, y - p.y)}
尽管上面的程序在技术上是正确的,但我们使用+运算符减去了两个对象的相应属性,这使程序变得混乱。
2.与 Scala 之类的语言不同,Kotlin 中只能重载特定的运算符集。 访问页面以了解可在 Kotlin 中重载的运算符及其相应的成员函数。
