kotlin之重载运算符(十一)
目录
- 1. 运算符重载概念
- 2. 重载运算符类型
- 3. 重载复合赋值运算符
- 4. 重载一元运算符
- 5. 重载比较运算符
1. 运算符重载概念
简单来说,就是Kotlin通过调用自己代码中定义特定的函数名的函数(成员函数或者扩展函数),并且用operator修饰符标记,来实现特定的语言结构
比如:
// 一个简单的数据类
data class Foo(val x: Int, val y: Int) {operator fun plus(other: Foo) : Foo = Foo(x + other.x, y + other.y)
}fun main(args: Array<String>) {// 使用的时候val f1 = Foo(10, 20)val f2 = Foo(30, 40)// 直接用+运算符代替plus函数,事实上会调用plus函数println(f1 + f2) // 打印内容为Foo(x=40, y=60)
}
注意,如果Java要调用这一段代码,要像调用函数一样使用。
2. 重载运算符类型
表达式 | 函数名 |
---|---|
a * b | times |
a / b | div |
a % b | rem,mod(弃用) |
a + b | plus |
a - b | minus |
3. 重载复合赋值运算符
表达式 | 函数名 |
---|---|
a += b | timesAssign |
a /= b | divAssign |
a %= b | remAssign |
a += b | plusAssign |
a -= b | minusAssign |
如果在plus和plusAssign两个函数同时被定义且适用,那么编译器就会报错,最好在设计新类的时候保持(可变性)一致,尽量不同时定义plus和plusAssign运算。如Foo类是不可变的,那么只提供plus运算,如果一个类是可变的,如构造器,那么只需提供plusAssign和类似的运算就够了。
4. 重载一元运算符
表达式 | 函数名 |
---|---|
+a | unaryPlus |
-a | unaryMinus |
!a | not |
++a, a++ | inc |
–a, a– | dec |
5. 重载比较运算符念
表达式 | 函数名 |
---|---|
a == b | a?.equals(b) ?: (b === null) |
a != b | !(a?.equals(b) ?: (b === null)) |
a > b | a.compareTo(b) > 0 |
a < b | a.compareTo(b) < 0 |
a >= b | a.compareTo(b) >= 0 |
a <= b | a.compareTo(b) <= 0 |
含有大于小于符号的比较运算符会被转换成compareTo函数,compareTo的返回类型必须为Int。
重载等号运算符
在我们平时使用判断字符串是否与某个字符串相等的时候,会使用equals函数来判断,然而在Kotlin中,我们可以是用==来代替equals函数,!=来代替!equals。
这是重载等号的一般用法:
data class Foo(val x: Int, val y: Int) {override operator fun equals(other: Any?): Boolean = when {// 使用恒等运算符来判断两个参数是否同一个对象的引用other === this -> trueother !is Foo -> falseelse -> other.x == x && other.y == y}
}
kotlin之重载运算符(十一)相关推荐
- C++ 重载运算符简单举例
我们可以重定义或重载大部分 C++ 内置的运算符.这样,就能使用自定义类型的运算符. 重载的运算符是带有特殊名称的函数,函数名是由关键字 operator 和其后要重载的运算符符号构成的.与其他函数一 ...
- 【C++】重载运算符(一)
1.1 重载运算符特点 重载运算符本质上是一次函数调用 除了operator() 运算符调用外,其他重载运算符不能含有默认参数. 当重载的运算符是成员函数时,this绑定到左侧运算对象.成员运算符函数 ...
- 4.0 C++远征:重载运算符
目录 重载运算符 四.重载运算符 1.一元运算符重载 2.二元运算符重载 重载运算符 四.重载运算符 概念 : 给原有运算符赋予新功能. 本质 : 函数重载. 关键字 : operator ...
- 中双目运算符_C++日志(四十)教你如何以非成员函数的形式重载运算符
上一篇日志中讲述了如何通过类的非静态函数成员,进行运算符重载: 机器学习入坑者:C++日志(三十九)教你如何以类的非静态成员函数形式重载运算符zhuanlan.zhihu.com 在C++中,同样可 ...
- C++中自定义比较函数和重载运算符总结
sort 自定义比较函数 //示例 struct node{int x, y; };bool cmp(const node& a, const node& b){return a.x ...
- 【C++ 语言】面向对象 ( 函数重载 | 运算符重载 | 运算符重载两种定义方式 | 拷贝构造方法 | RVO 优化 | NRVO 优化 )
文章目录 函数重载 运算符重载 ( 类内部定义云算符重载 ) 运算符重载 ( 类外部定义运算符重载 ) 可重载的运算符 拷贝构造方法 编译器优化 ( RVO 优化 | NRVO 优化 ) 完整代码示例 ...
- C++——重载运算符和重载函数
重载运算符和重载函数 C++ 中的函数重载 C++ 中的运算符重载 C++ 一元运算符重载 C++ 二元运算符重载 C++ 关系运算符重载 C++ 输入/输出运算符重载 C++ 赋值运算符重载 C++ ...
- [YTU]_2442( C++习题 矩阵求和--重载运算符)
题目描述 有两个矩阵a和b,均为2行3列.求两个矩阵之和.重载运算符"+",使之能用于矩阵相加(如c=a+b). 重载流插入运算符"<<"和流提取运 ...
- [YTU]_2440( C++习题 复数类--重载运算符+,-,*,/)
题目描述 定义一个复数类Complex,重载运算符"+","-","*","/",使之能用于复数的加.减.乘.除.运算符 ...
最新文章
- pycharm如何执行高级撤销操作回到历史
- linux应用系统使用率,Linux性能优化实战:系统CPU使用率高,但为啥找不到高的应用(06)...
- 爱立信与中国联通成功完成国内首个LTE三载波聚合大规模部署测试
- 农用圆形打捆机行业调研报告 - 市场现状分析与发展前景预测
- JDK中ThreadDump诊断Java代码中的线程死锁问题
- HCI实验图常见类型
- 瑞友企业私有云显示连接负载服务器错误,荣誉资质 | 瑞友天翼-应用虚拟化|远程接入|桌面虚拟化|国内虚拟化整体解决方案领导者...
- python github 12306 文贤平_GitHub排名第一!免费最强“抢票神器”在手,程序员抢票再不用跪求加速包...
- 产业分析:工业机器人市场研究
- 笔记本外接显卡坞死机/键盘鼠标卡死问题的解决
- 微型计算机一个汉字多少字节,一个汉字多少字节(Byte)?
- 【直观详解】线性代数的本质
- Amdahl 定律详解
- 读书笔记, Python - python-tricks-buffet-awesome-features
- 硬盘的种类、区别、运行原理
- mix2s刷Android7,小米Mix2s刷机教程
- AI Earth ——开发者模式案例5:鄱阳湖水体区域识别
- shopilex -中文开源网店 视频教程
- 成都拓嘉辰丰:拼多多新店有权重吗
- 直播短视频系统开发,动态切换主题色