kotlin 重载运算符

在 Kotlin 中,尽管可以重载许多运算符,但并不是所有运算符都可以重载,而且某些运算符重载的适用性依赖于上下文。以下是一个类的代码示例,展示了 Kotlin 中可重载的运算符。

data class CustomNumber(val value: Int) : Comparable<CustomNumber> {

  // 重载加法运算符 (+)
  operator fun plus(other: CustomNumber): CustomNumber {
    return CustomNumber(this.value + other.value)
  }

  // 重载减法运算符 (-)
  operator fun minus(other: CustomNumber): CustomNumber {
    return CustomNumber(this.value - other.value)
  }

  // 重载乘法运算符 (*)
  operator fun times(other: CustomNumber): CustomNumber {
    return CustomNumber(this.value * other.value)
  }

  // 重载除法运算符 (/)
  operator fun div(other: CustomNumber): CustomNumber {
    return CustomNumber(this.value / other.value)
  }

  // 重载取余运算符 (%)
  operator fun rem(other: CustomNumber): CustomNumber {
    return CustomNumber(this.value % other.value)
  }

  // 重载取反运算符 (-)
  operator fun unaryMinus(): CustomNumber {
    return CustomNumber(-this.value)
  }

  // 重载递增运算符 (++)
  operator fun inc(): CustomNumber {
    return CustomNumber(this.value + 1)
  }

  // 重载递减运算符 (--)
  operator fun dec(): CustomNumber {
    return CustomNumber(this.value - 1)
  }

  // 重载相等运算符 (==)
  override fun equals(other: Any?): Boolean {
    if (this === other) return true
    if (other !is CustomNumber) return false
    return value == other.value
  }

  // 重载比较运算符 (<, >, <=, >=)
  override fun compareTo(other: CustomNumber): Int {
    return this.value.compareTo(other.value)
  }

  // 重载 in 运算符
  operator fun contains(other: CustomNumber): Boolean {
    return this.value == other.value
  }

  // 重载 [] 运算符 (模拟数组访问)
  operator fun get(index: Int): Int {
    return value + index
  }

  // 重载 invoke 运算符 (让对象像函数一样调用)
  operator fun invoke(): Int {
    return value * 2
  }

  // 重载位运算符 (shl 左移, shr 右移, and 与, or 或, xor 异或)
  operator fun shl(bits: Int): CustomNumber {
    return CustomNumber(this.value shl bits)
  }

  operator fun shr(bits: Int): CustomNumber {
    return CustomNumber(this.value shr bits)
  }

  operator fun and(other: CustomNumber): CustomNumber {
    return CustomNumber(this.value and other.value)
  }

  operator fun or(other: CustomNumber): CustomNumber {
    return CustomNumber(this.value or other.value)
  }

  operator fun xor(other: CustomNumber): CustomNumber {
    return CustomNumber(this.value xor other.value)
  }

  // 重载取反运算符 (~)
  operator fun not(): CustomNumber {
    return CustomNumber(this.value.inv())
  }
}

fun main() {
  val num1 = CustomNumber(10)
  val num2 = CustomNumber(5)

 // 测试重载的运算符
  println("num1 + num2 = {num1 + num2}")
  println("num1 - num2 = {num1 - num2}")
  println("num1 * num2 = {num1 * num2}")
  println("num1 / num2 = {num1 / num2}")
  println("num1 % num2 = {num1 % num2}")
  println("Unary -num1 = {-num1}")
  println("num1++ = {num1++}")
  println("num2-- = {num2--}")
  println("num1 == num2 = {num1 == num2}")
  println("num1 < num2 = {num1 < num2}")
  println("num1 > num2 = {num1 > num2}")
  println("num1 contains num2 = {num1 in num2}")
  println("num1[2] = {num1[2]}")
  println("num1() = {num1()}")
  println("num1 shl 2 = {num1 shl 2}")
  println("num1 shr 2 = {num1 shr 2}")
  println("num1 and num2 = {num1 and num2}")
  println("num1 or num2 = {num1 or num2}")
  println("num1 xor num2 = {num1 xor num2}")
  println("not num1 = {!num1}")
}

说明

  1. 加法、减法、乘法、除法、取余:通过 plus、minus、times、div、rem 方法重载。
  2. 取反:通过 unaryMinus 方法重载。
  3. 递增、递减:通过 inc 和 dec 方法重载。
  4. 相等比较:通过 equals 方法重载。
  5. 大小比较:通过 compareTo 方法重载。
  6. in 运算符:通过 contains 方法重载。
  7. 下标运算符:通过 get 方法重载。
  8. 函数调用:通过 invoke 方法重载。
  9. 位运算符:通过 shl(左移)、shr(右移)、and(与)、or(或)、xor(异或)重载。
  10. 取反(按位):通过 not 方法重载。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值