首页 > 其他分享 >kotlin 重载运算符

kotlin 重载运算符

时间:2023-11-05 23:55:48浏览次数:29  
标签:p1 val Point kotlin 运算符 other 重载

一、二元运算符的重载

1、常见的运算符有:加、减、乘、除、求余;我们要重载这些运算符的操作

这里以加法重载运算符为例

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

如上在Point类中增加了operator标记,表示该函数是重载了plus; 重载了plus之后就能执行两个Point的相加: val point3 = point1 + point2

    val p1 = Point(10, 20)
    val p2 = Point(20, 30)
    println(p1 + p2) // Point(x=30, y=50)

 

为何这里重载了plus之后就可以执行两个Point的相加? 其实这个是kotlin的约定

如下是加、减、乘、除、求余各个表达式对应的重载运算符

这里的运算符跟咱们平时使用的运算符加减乘除一样有优先级,如下:

data class Point(val x: Int, val y: Int) {
    operator fun plus(other: Point): Point {
        return Point(x + other.x, y + other.y)
    }
    operator fun times(other: Point): Point {
        return Point(x * other.x, y * other.y)
    }
}

    val p1 = Point(10, 20)
    val p2 = Point(20, 30)
    val p3 = Point(2, 3)
    println(p1 + p2 * p3) // Point(x=50, y=110)

也可以在类外面定义即把它定义为扩展函数

operator fun Point.minus(other: Point): Point {
    return Point(x - other.x, y - other.y)
}
    val p1 = Point(10, 20)
    val p2 = Point(20, 30)
    println(p1 - p2)

 

2、关于上述的运算符对应的 +=、-=。。。。。

这里以加为例子,对应的运算符重载可以是plus 也可以是plusAsign

但是plus对应的方式是返回对象的赋值,plusAsign对应的方式是内部对象的赋值

data class Point(var x: Int, var y: Int) {
    operator fun plus(other: Point): Point { // 这里以返回对象的方式
        return Point(x + other.x, y + other.y)
    }
    operator fun plusAssign(other: Point) { // 这里以改变内部参数值的方式
        this.x += x
        this.y += y
    }
}

如下是调用方式

    var p1 = Point(10, 20)
    val p2 = Point(20, 30)

    p1 += p2 // 这里会报错,因为p1是var的方式,那么上述的两个重载都是能够调用

    // 对应的解决方案是:让p1为val的类型
    val p1 = Point(10, 20)
    val p2 = Point(20, 30)
    p1 += p2 // 这里调用的会是plusAssign,在p1的内部修改x和y;因为p1是val的方式则不允许用结果返回的方式重新给p1赋值

如下是 a+=b 的调用逻辑

 

 

二、重载一元运算符

1、跟二元运算符类似,如下是一元运算符表达式对应的函数名

这里有疑问的应该就前加和后加,其实从上述的前加和后加都调用同一个函数inc

operator fun BigDecimal.inc() = this + BigDecimal.TEN // 一个自加,加10
    var bd = BigDecimal.ZERO
    println(bd++) // 0
    println(++bd) // 20

如上是前自加和后自加,跟咱们平时返回的一致

 

三、重载比较运算符

1、等号运算符:equals

具体的判断方式为

a == b =>  a?.equals(b) ?: (b == null)

如果a为空则判断b是否为空

注意:这里的equals不能被重载为扩展函数,因为这个equals是定义在any中,类中的函数始终优先于扩展函数。所以即使重载为扩展函数也是不会被调用到。

 

2、排序运算符: compareTo

实现接口Comparable对应的函数compareTo

a.compareTo(b)

如果a大于b则返回大于0的数,如果a等于b则返回0,如果a小于b则返回小于0的数

class Person(val firstName: String, val lastName: String): Comparable<Person> {
    override fun compareTo(other: Person): Int {
        return compareValuesBy(this, other, Person::firstName, Person::lastName) // 这里传入的参数是按照顺序,比较的参数也是按照顺序
    }
}

 

标签:p1,val,Point,kotlin,运算符,other,重载
From: https://www.cnblogs.com/czwlinux/p/17811390.html

相关文章

  • C++_21_重载、重写、重定义 - 重写版
    1、重载同一作用域的同名函数,重复定义;参数格式、参数顺序或者参数类型不同;函数重载和函数的返回值没有任何关系;(const类型的重载本质上是参数类型不同) 2、重写(覆盖)有继承关系子类(派生类)重写父类(基类)的虚函数函数的返回值,函数名字,函数参数,必须和基类中的虚函数一致,主要就是覆盖......
  • C++_20_操作符重载和函数重载 - 重写版
    操作符(运算符)重载 操作符重载指的是将C++提供的操作符进行重新定义或者多重定义,使之满足我们所需要的一些功能。在C++中,经常有需要对多个对象进行算术运算,但是对象比不是基本的数据类型,所以这些运算符都无法执行。为了让程序识别这些运算符,就需要对运算符进行重载......
  • 函数剩余参数与 展开运算符
    //剩余参数functionsum(...arr){console.log(arr)}sum(3,4,5,6)//求数组最大值letarr=[1,44,7,88]console.log(Math.max(...arr))......
  • C++_02_命名空间和作用域运算符 - 重写版
    命名空间在C++中命名空间(namespace)的作用:命名空间,就是为了解决同一个源代码中相同命名的变量或者函数之间相互冲突的问题,就是要避免这种冲突,让程序代码中可以多次使用同一个标识符而存在的。对于一名开发者而言,代码量过于庞大,或多或少会忘记之间之前用过的变量名或函......
  • C++_28_重载、重写、重定义
    1、重载同一作用域的同名函数,重复定义;参数格式、参数顺序或者参数类型不同;函数重载和函数的返回值没有任何关系 2、重写  3、重定义......
  • 3 . 运算符
    比如说+、*、/、(都是运算符,而(3+5)/2则是表达式。运算符有很多分类:1、算术运算符*+-*/%(取余符号)2、关系运算符<>=<===!====!==3、逻辑运算符&&||!4、一元运算符++--5、赋值运算符<1>基本赋值运算符=<2>复合赋值运算符+=-=一元运算符如果......
  • Kotlin-嵌套类_内部类_匿名内部类
    Kotlin-嵌套类&内部类&匿名内部类1.嵌套类类可以被嵌套在其它类中:classOuter{privatevalbar:Int=1classNested{funfoo(){println("fooinOuter#Nested#foo()")}funtest(){//println("Ne......
  • Python-运算符
    Python-运算符1.Python运算符的优先级以下表格列出了从最高到最低优先级的所有运算符:如果是同优先级则从左往右依次递减运算符描述**乘方,指数(最高优先级)~+-按位翻转,一元加号和减号(最后两个的方法名为+@和-@)*/%//乘,除,取模和取整除+-......
  • Kotlin语言基础入门到熟悉:Lambda 表达式
    什么是Lambda表达式?Lambda表达式,其实就是匿名函数。而函数其实就是功能(function),匿名函数,就是匿名的功能代码了。在Kotlin当中,函数也是作为类型的一种出现的,尽管在当前的版本中,函数类型的灵活性还不如Python这样的语言,不过它也是可以被赋值和传递的,这主要就体现在Lambda表......
  • C++函数重载
    在实际开发中,有时候我们需要实现几个功能类似的函数,只是有些细节不同。例如希望交换两个变量的值,这两个变量有多种类型,可以是int、float、char、bool等,我们需要通过参数把变量的地址传入函数内部。在C语言中,程序员往往需要分别设计出三个不同名的函数,其函数原型与下面类似:voidsw......