【笔记】Kotlin的运算符重载

前言

Kotlin的运算符重载学习笔记

重载一元运算符

  • a++a--会改变原值
  • 一元运算符重载无需传递参数
1
2
3
4
5
class 类名 {
operator fun unaryPlus(): 类名 {
...
}
}
符号 函数
+a a.unaryPlus()
-a a.unaryMinus()
!a a.not()
a++ a.inc()
a-- a.dec()

重载算数运算符

1
2
3
4
5
class 类名 {
operator fun plus(other: 类名): 类名 {
...
}
}
符号 函数
a + b a.plus(b)
a - b a.minus(b)
a * b a.times(b)
a / b a.dev(b)
a % b a.rem(b)
a .. b a.rangeTo(b)
a ..< b a.rangeUntil(b)
a in b b.contains(a)
a !in b !b.contains(a)

重载自增运算符

  • plus()plusAssign()不能同时定义,其他的运算符也同理
1
2
3
4
5
class 类名 {
operator fun plusAssign(other: 类名): 类名 {
...
}
}
符号 函数
a += b a.plusAssign(b)
a -= b a.minusAssign(b)
a *= b a.timesAssign(b)
a /= b a.devAssign(b)
a %= b a.remAssign(b)

重载比较运算符

  • 所有比较运算符都是重载compareTo()函数,不同返回值表示不同的比较运算符结果
1
2
3
4
5
class 类名 {
operator fun compareTo(other: 类名): Int {
...
}
}
符号 函数
a > b a.compareTo(b) > 0
a < b a.compareTo(b) < 0
a >= b a.compareTo(b) >= 0
a <= b a.compareTo(b) <= 0

重载小括号

  • 小括号内参数在invoke()内定义
1
2
3
4
5
class 类名 {
operator fun invoke(arg: 数据类型): 类名 {
...
}
}
符号 函数
a() a.invoke()
a(arg) a.invoke(arg)
a(arg1, arg2, ...) a.invoke(arg1, arg2, ...)

重载索引访问运算符(方括号)

  • 方括号内参数在get()set()内定义
1
2
3
4
5
class 类名 {
operator fun get(arg: 数据类型): 类名 {
...
}
}
符号 函数
a[i] a.get(i)
a[i, j] a.get(i, j)
a[i, j, ...] a.get(i, j, ...)
a[i] = b a.set(i, b)
a[i, j] = b a.set(i, j, b)
a[i, j, ...] = b a.set(i, j, ..., b)

重载中缀函数

  • 中缀函数只能传递一个参数
1
2
3
4
5
6
7
8
9
10
11
class 类名 {
infix fun 中缀函数名(arg: 数据类型): 类名 {
...
}
}

fun main() {
var 对象名 = 类名()
println(对象名.中缀函数名(变量名))
println(对象名 中缀函数名 变量名)
}

完成

参考文献

哔哩哔哩——青空の霞光