0Pricing
Kotlin Academy · 课时

运算符函数

重载加号、减号等运算符

运算符函数 是 CoddyKit 上的免费 Kotlin Academy 课时。 这是第 1 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Kotlin Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Kotlin Academy 课程共包含 4 节课。

什么是运算符重载?

运算符重载允许您的类型响应 + 或 - 之类的符号。您可以使用 operator 修饰符和特殊名称定义函数。

data class Point(val x: Int, val y: Int) {
    operator fun plus(o: Point) = Point(x + o.x, y + o.y)
}

fun main() {
    println(Point(1, 2) + Point(3, 4))
}

operator 关键字

operator 修饰符会告诉编译器,这个函数为某个运算符提供实现。没有它,调用 a + b 就无法正常工作。

data class Money(val amount: Int) {
    operator fun plus(o: Money) = Money(amount + o.amount)
}

fun main() {
    println(Money(5) + Money(3))
}

约定名称

每个运算符都对应一个固定的函数名称:plus 对应 +,minus 对应 -,times 对应 *,div 对应 /,rem 对应 %。

data class Vec(val n: Int) {
    operator fun times(k: Int) = Vec(n * k)
}

fun main() {
    println(Vec(4) * 3)
}

减法与乘法

您可以在同一个类型上定义多个运算符。

data class Point(val x: Int, val y: Int) {
    operator fun minus(o: Point) = Point(x - o.x, y - o.y)
    operator fun times(k: Int) = Point(x * k, y * k)
}

fun main() {
    println(Point(5, 5) - Point(1, 2))
    println(Point(2, 3) * 2)
}

一元运算符

一元减法使用 unaryMinus;一元加法使用 unaryPlus;not 为 ! 运算符提供实现。

data class Temp(val c: Int) {
    operator fun unaryMinus() = Temp(-c)
}

fun main() {
    println(-Temp(10))
}

递增与递减

inc 为 ++ 提供实现,dec 为 -- 提供实现。它们会返回一个相同类型的新值。

data class Counter(val n: Int) {
    operator fun inc() = Counter(n + 1)
}

fun main() {
    var c = Counter(0)
    c++
    println(c.n)
}

复合赋值

对于可变接收者,plusAssign 为 += 提供实现。如果只有 plus,+= 则会改为重新给变量赋值。

class Bag {
    val items = mutableListOf<String>()
    operator fun plusAssign(item: String) { items.add(item) }
}

fun main() {
    val bag = Bag()
    bag += "apple"
    println(bag.items)
}

不同类型之间的运算符

参数类型不必与接收者类型匹配。例如,可以用整数缩放一个点,并返回一个点。

data class Size(val w: Int, val h: Int) {
    operator fun times(factor: Int) = Size(w * factor, h * factor)
}

fun main() {
    println(Size(2, 3) * 4)
}

作为扩展函数

运算符可以定义为扩展函数,即使这些类型并不由您拥有。

data class Point(val x: Int, val y: Int)

operator fun Point.plus(o: Point) = Point(x + o.x, y + o.y)

fun main() {
    println(Point(1, 1) + Point(2, 2))
}

链接运算符

重载运算符的组合方式与内置运算符相同,并遵循常规优先级。

data class N(val v: Int) {
    operator fun plus(o: N) = N(v + o.v)
    operator fun times(o: N) = N(v * o.v)
}

fun main() {
    val r = N(2) + N(3) * N(4)
    println(r.v)
}

返回类型不受限制

运算符可以返回任何类型,但返回相同类型会让使用方式更直观,也更容易链接调用。

data class Vec(val x: Int, val y: Int) {
    operator fun plus(o: Vec) = Vec(x + o.x, y + o.y)
}

fun main() {
    println(Vec(1, 2) + Vec(3, 4))
}

快速检查

请测试您对运算符函数的理解。

回顾

您了解了运算符函数:

  • 使用 operator 和约定名称(plus、minus、times 等)标记函数。
  • 支持一元运算符、递增运算符和复合赋值运算符。
  • 运算符既可以是成员,也可以是扩展函数。
  • 返回相同类型可以让链接调用更直观。
data class P(val x: Int) {
    operator fun plus(o: P) = P(x + o.x)
}

fun main() {
    println((P(2) + P(3)).x)
}

常见问题解答

「运算符函数」课时是免费的吗?

是的 — 「运算符函数」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Kotlin Academy 课程的其余内容,请升级到 CoddyKit PRO。 Kotlin Academy 课程共包含 4 节课。

「运算符函数」这节课中我会学到什么?

重载加号、减号等运算符 你通过在浏览器中直接运行的动手代码来练习 Kotlin Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 Kotlin Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 Kotlin Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 1 节课,共 4 节。

「运算符函数」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 Kotlin Academy 课中编写并运行代码吗?

能。每节 Kotlin Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. 运算符函数
  2. 比较运算符
  3. 索引与调用
  4. 最佳实践
← 返回 Kotlin Academy