2-a-运算符重载

如果需要对运算符重载,使用operator关键字,并重载运算符对应的方法

重载单目运算符

data class Data(val x: Int, val y: Int) {
// 为 Data 类定义 unaryMinus() 方法
operator fun unaryMinus(): Data {
return Data(-x, -y)
}
}

// 以扩展方法的形式为 Data 类定义 not() 方法
operator fun Data.not(): Data {
return Data(-x, -y)
}

fun main(args: Array<String>) {
val d = Data(4, 10)

println(-d) // 输出:Data(x=-4, y=-10)
println(!d) // 输出:Data(x=-4, y=-10)
}

重载自增和自减运算符

data class Data(val x: Int, val y: Int) {

// 为 Data 类定义一个 inc() 方法(用于 ++ 运算符)
operator fun inc(): Data {
return Data(x + 1, y + 1)
}
}

// 以扩展方法的形式为 Data 类定义 dec() 方法(模拟 -- 运算符功能)
fun Data.dec(): Data {
return Data(x - 1, y - 1)
}

fun main(args: Array<String>) {
var d = Data(4, 10)
println(d++) // 先用,再自加:输出 Data(x=4, y=10)
println(d) // 输出自加后的 d:Data(x=5, y=11)

var dd = Data(9, 20)
println(dd.dee()) // 自定义的减法方法:输出 Data(x=8, y=19)
println(dd) // dd 本身没有变,因为 dee() 返回新对象:Data(x=9, y=20)
}

重载双目运算符

data class Point(val x: Int, val y: Int) {
// 为 Point 类定义 minus() 方法,计算两点间的距离
operator fun minus(target: Point): Double {
return Math.hypot(
(this.x - target.x).toDouble(),
(this.y - target.y).toDouble()
)
}
}

// 以扩展方法的形式为 Point 类定义 times() 方法,计算矩形面积
operator fun Point.times(target: Point): Int {
return Math.abs(this.x - target.x) * Math.abs(this.y - target.y)
}

fun main() {
val p1 = Point(4, 10)
val p2 = Point(5, 15)

val distance = p1 - p2
println("p1 与 p2 的距离为:$distance")

val area = p1 * p2
println("p1 与 p2 围成矩形的面积为:$area")
}