plus
***运算符// 定义
data class Point(val x: Int, val y: Int) {
// 定义一个名为“plus”的方法
operator fun plus(other: Point): Point {
// 坐标分别相加,而后返回一个新的点
return Point(x + other.x, y + other.y)
}
}
// 测试
>>> val p1 = Point(10, 20)
>>> val p2 = Point(30, 40)
>>> Point(p1 + p2)
Point(x=40, y=60)
复制代码
关键字***operator
***:用于重载运算符的全部函数都须要用该关键字标记,用来表示将该函数做为相对的约定的实现。算法
可重载的二元算术运算符markdown
表达式 | 函数名 |
---|---|
a * b | times |
a / b | div |
a + b | plus |
a - b | minus |
自定义类型的运算符,基本上和与标准数字类型的运算符有着相同的优先级。函数
注意:Kotlin运算符不会自动支持交换性(交换运算符的左右两边)。测试
复合赋值运算符:+=、-=
ui
>>> var point = Point(1, 2)
>>> point += Point(3, 4)
>>> println(point)
Point(x=4, y=6)
复制代码
上述等效于 **point = point + Point(3, 4)
**的写法。this
+=
运算能够修改使用它的变量所引用的对象,但不会从新分配引用**。Kotlin标准库支持集合的这两种方法:“+”和“-”运算符老是返回一个新的集合。“+=”和“-=”运算符用于可变集合时,始终就地修改它们;而它们用于只读集合时,会返回一个修改过的副本(这意味着只有当引用只读集合的变量被声明为**var
**的时候,才能使用“+=”和“-=”)spa
重载一元运算符的过程和以前的方法相同:用预先定义的一个名称来声明函数(成员函数或扩展函数),并用修饰符**operator
**标记。code
// 一元运算符无参数
operator fun Point.unaryMinus(): Point {
// 坐标取反再返回
return Point(-x, -y)
}
>>> val p = Point(10, 20)
>>> println(-p)
Point(x=-10, y=-20)
复制代码
可重载的一元算法的运算符orm
表达式 | 函数名 |
---|---|
+a | unaryPlus |
-a | unaryMinus |
!a | not |
++a, a++ | inc |
--a, a-- | dec |
operator fun BigDecimal.inc() = this + BigDecimal.ONE
// 在第一个println语句执行后增长
>>> var bd = BigDecimal.ZERO
>>> println(bd++)
0
// 在第二个println语句执行前增长
>>> println(++bd)
2
复制代码