Kotlin基础教程-运算符重载
来源:互联网 发布:程序员群头像 编辑:程序博客网 时间:2024/06/06 16:51
Operator overloading
Kotlin
中的运算符重载:在我们自己定义的类中,可以为一组预定义的运算操作提供自己的实现。这些运算符有固定的符号表示(*或+),以及固定的函数名称。为了实现这一个运算符,我们以固定名称的方式提供了成员函数或者扩展函数。比如如下类型:二目运算中靠左元素的数据类型以及一目运算的参数类型。重载符号函数必须使用关键字operator
标识。
未来,我们会更加规划运算符重载。
一元运算符
一元前缀运算符
以+a
为例,解释下编译器的处理过程
- 确定
a
的类型,以T
举例 - 查找
T
类中是否含有unaryPlus
函数,该方法用operator
,扩展函数或者成员函数都可以 - 如果该函数缺失或者有歧义,则编译失败
- 如果该函数存在,并返回类型
R
,则该表达式类型为R
注意:基本类型的这些运算符都进行了优化,不会增加调用的开销
举个栗子
data class Point(val x: Int, val y: Int)operator fun Point.unaryMinus() = Point(-x, -y)fun main(args: Array<String>) { val point = Point(10, 20) println(-point) // prints "(-10, -20)"}
Point
数据类有一个扩展函数unaryMinus()
,所以当我们执行-point
实际调用point.unaryMinus()
,所以输出结果:
Point(x=-10, y=-20)
递增和递减
以
a++
为例
- 确定a的类型,以
T
表示 - 在T对象实例的成员函数和扩展函数中查找是否含有
inc()
函数。 - 检查函数返回类型是否是
T
的子类。
计算过程
- 将
a
的值存储到临时变量a0
- 将
a.inc()
的计算结果赋值给a
- 将
a0
的值作为结果返回
二目运算
算术运算
举个栗子a+b
fun main(args: Array<String>) { val counter = Counter(1) println(counter + 3)}data class Counter(var dayIndex: Int) { operator fun plus(increment: Int): Counter { return Counter(dayIndex + increment) }}
执行结果:
Counter(dayIndex=4)
in
操作
索引操作
调用操作符
增强作业
举个栗子 a+=b
- 首先判断
plusAssign
是否存在- 如果存在
- 如果
plus()
和plusAssign()
,有歧义,报错 - 确保
plusAssign()
返回Unit
,否则报错
- 如果
- 如果不存在,变换为a=a+b
- 如果存在
相等和不等操作
比较操作
阅读全文
0 0
- Kotlin基础教程-运算符重载
- Kotlin - 运算符重载
- Kotlin运算符重载总结
- Kotlin学习(十七): 运算符重载
- Kotlin-31.操作符/运算符重载(operator overload)
- Kotlin-操作符重载
- Kotlin基础教程-访问修饰符
- Kotlin操作符重载(十)
- 运算符重载 [++,--,+,<<; &&,||(不可重载)]
- 重载之运算符重载
- Kotlin语法基础,运算符
- Kotlin语法基础,运算符
- Kotlin开发Android笔记9:Kotlin操作符重载
- Java基础教程(6)运算符
- Kotlin基础教程-HelloWorld
- Kotlin基础教程-基础语法
- Kotlin基础教程-风格
- Kotlin基础教程-基本数据类型
- Ubuntu系统安装QT
- 一种基于C++的扑克牌实现
- 新闻客户端
- 二叉搜索树与双向链表
- 汇编语言(第三版)检测点笔记
- Kotlin基础教程-运算符重载
- 电子信息工程专业大一学生的软件之路
- 检查nginx反向代理节点状态
- leetcode Longest Substring Without Repeating Character(Java)
- thrift
- 5-9 互评成绩 (25分)
- 欢迎使用CSDN-markdown编辑器
- ARKit从入门到精通(1)-ARKit初体验
- node