📜  Kotlin 运算符重载

📅  最后修改于: 2022-05-13 01:54:18.554000             🧑  作者: Mango

Kotlin 运算符重载

由于 Kotlin 提供了用户定义的类型,它还提供了额外的功能来重载标准运算符,因此使用用户定义的类型更加容易。所有一元、二元、关系运算符都可以重载。运算符通过成员函数或扩展函数重载。这些函数前面有运算符修饰符。每种类型的运算符都有标准函数,可以根据使用情况进行重载。

一元运算符 –

下表显示了可以为一元运算运算符定义的各种函数。这些函数修改调用实例。

Operator expressionCorresponding function
+xx.unaryPlus()
-xx.unaryMinus()
!xx.not()

这里, x对应于定义运算符的类型。重载的功能在各自的功能中定义。

演示一元运算运算符重载的 Kotlin 程序 -

class UnaryOverload(var str:String) {
    // overloading the function
    operator fun unaryMinus() {
        str = str.reversed()
    }
}
// main function
fun main(args : Array) {
    val obj = UnaryOverload("HELLO")
    println("Initial string is ${obj.str}")y
    //calling the overloaded function unaryMinus()
    -obj
    println("String after applying unary operator ${obj.str}")
}

输出:

Initial string is HELLO
String after applying unary operator OLLEH

递增和递减运算符 –

可以通过以下函数为类型定义递增和递减运算符。这些函数返回一个带有表达式结果的新实例。

Operator expressionCorresponding function
++xx.inc()
– – xx.dec()

无论是在后缀或前缀表示法中使用,这些函数在这两种情况下都能很好地工作,具有相同的预期输出,正如人们在使用前缀后缀表示法时所期望的那样。

演示运算符重载的 Kotlin 程序 -

class IncDecOverload(var str:String) {
    // overloading increment function
    operator fun inc(): IncDecOverload {
        val obj = IncDecOverload(this.str)
        obj.str = obj.str + 'a'
        return obj
    }
    // overloading decrement function
    operator fun dec(): IncDecOverload {
        val obj = IncDecOverload(this.str)
        obj.str = obj.str.substring(0,obj.str.length-1)
        return obj
    }
   
    override fun toString(): String {
        return str
    }
}
// main function
fun main(args: Array) {
    var obj = IncDecOverload("Hello")
    println(obj++)
    println(obj--)
    println(++obj)
    println(--obj)
}

输出:

Hello
Helloa
Helloa
Hello

二元运算符 –

下表显示了要定义的二元运算符及其等效函数。所有这些函数都会修改调用实例。

Operator expressionCorresponding function
x1 + x2x1.plus(x2)
x1 – x2x1.minus(x2)
x1 * x2x1.times(x2)
x1/ x2x1.div(x2)
x1 % x2x1.rem(x2)
x1..x2x1.rangeTo(x2)

Kotlin 程序重载加号函数——

class Object(var objName: String) {
    // Overloading the function
    operator fun plus(b: Int) {
        objName = "Name is $objName and data is $b"
    }
    override fun toString(): String {
        return objName
    }
}
// main function
fun main() {
    val obj = Object("Chair")
    // Calling the overloaded function
    obj+9
    println(obj)
}

输出:

Name is Chair and data is 9

注意 -关系运算符没有要定义的任何特定功能,要在用户定义类型的实例上使用关系运算符,该类型必须实现Comparable接口。

其他运算符——

Kotlin 支持广泛的运算符,因此为类型定义每个运算符并不是一个好的编程习惯。下表显示了一些其他可以重载的有用运算符是 Kotlin。

Operator expressionCorresponding function
x1 in x2x2.contains(x1)
x1 !in x2!x2.contains(x1)
x[i]x.get(i)
x[i, j]x.get(i, j)
x[i] = bx.set(i, b)
x[i, j] = bx.set(i, j, b)
x()x.invoke()
x(i)x.invoke(i)
x(i, j)x.invoke(i, j)
x1 += x2x1.plusAssign(x2)
x1 -= x2x1.minusAssign(x2)
x1 *= x2x1.timesAssign(x2)
x1 /= x2x1.divAssign(x2)
x1 %= x2x1.remAssign(x2)