Kotlin重载算数运算符
1.重载二元运算符
我们先尝试将两个坐标相加和相减
1.1定义plus运算符
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 minus(other:Point):Point{
return Point(x-other.x,y-other.y)
}
}
测试
val p1=Point(3,5)
val p2=Point(5,6)
val p3=p1+p2//p3(8.11)
val p4=p2-p1//p4(2,1)
operator关键字来声明plus函数。在实现了plus函数之后就可以用+号来求和,之所以要使用operator关键在来声明函数是因为要区分同名函数的定义。实际上在我们用+号来求和的时候调用的就是我们实现的plus函数。
1.2把运算符定义为拓展函数
operator fun Point.plus(other:Point):Point{
return Point(x+other.x,y+other.y)
}
可重载二元运算符
表达式 | 函数名 |
---|---|
a*b | times |
a/b | div |
a%b | mod |
a+b | plus |
a-b | minus |
自定义类型运算符和标准数字类型运算符具有相同的优先级,如*、/的优先级大于+、-。
1.3定义一个运算数据类型不同的运算符
operator fun Point.times(s:Double):Point{
return Point((x*s).toInt(),(y*s).toInt())
}
测试
val p5=p1*2.0//p5(6,10)
kotlin运算符不支持交换性,如p1*2.0可行2.0*p1就不可行,如果要支持2.0*p1需要重新定义新的运算符
operator fun Double.times(p:Point):Point
1.4定义一个返回结果不同的运算符
operator fun Char.times(count:Int):String{
return toString().repeat(count)
}
测试
val s='k'*6//kkkkkk
接收一个Char作为左值,Int作为右值,返回一个String类型。
2.重载一元运算符
2.1定义一个一元运算符
operator fun Point.unaryMinus():Point{
return Point(-x,-y)
}
测试
-p1//(-3,-5)
可重载的一元运算符
表达式 | 函数名 |
---|---|
+a | unaryPlus |
-a | unaryMinus |
!a | not |
++a,a++ | inc |
--a,a-- | dec |