目录

  • 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之重载运算符(十一)相关推荐

  1. C++ 重载运算符简单举例

    我们可以重定义或重载大部分 C++ 内置的运算符.这样,就能使用自定义类型的运算符. 重载的运算符是带有特殊名称的函数,函数名是由关键字 operator 和其后要重载的运算符符号构成的.与其他函数一 ...

  2. 【C++】重载运算符(一)

    1.1 重载运算符特点 重载运算符本质上是一次函数调用 除了operator() 运算符调用外,其他重载运算符不能含有默认参数. 当重载的运算符是成员函数时,this绑定到左侧运算对象.成员运算符函数 ...

  3. 4.0 C++远征:重载运算符

    目录 重载运算符 四.重载运算符 1.一元运算符重载 2.二元运算符重载 重载运算符 四.重载运算符 ​ 概念 : 给原有运算符赋予新功能. ​ 本质 : 函数重载. ​ 关键字 : operator ...

  4. 中双目运算符_C++日志(四十)教你如何以非成员函数的形式重载运算符

    上一篇日志中讲述了如何通过类的非静态函数成员,进行运算符重载: 机器学习入坑者:C++日志(三十九)教你如何以类的非静态成员函数形式重载运算符​zhuanlan.zhihu.com 在C++中,同样可 ...

  5. C++中自定义比较函数和重载运算符总结

    sort 自定义比较函数 //示例 struct node{int x, y; };bool cmp(const node& a, const node& b){return a.x ...

  6. 【C++ 语言】面向对象 ( 函数重载 | 运算符重载 | 运算符重载两种定义方式 | 拷贝构造方法 | RVO 优化 | NRVO 优化 )

    文章目录 函数重载 运算符重载 ( 类内部定义云算符重载 ) 运算符重载 ( 类外部定义运算符重载 ) 可重载的运算符 拷贝构造方法 编译器优化 ( RVO 优化 | NRVO 优化 ) 完整代码示例 ...

  7. C++——重载运算符和重载函数

    重载运算符和重载函数 C++ 中的函数重载 C++ 中的运算符重载 C++ 一元运算符重载 C++ 二元运算符重载 C++ 关系运算符重载 C++ 输入/输出运算符重载 C++ 赋值运算符重载 C++ ...

  8. [YTU]_2442( C++习题 矩阵求和--重载运算符)

    题目描述 有两个矩阵a和b,均为2行3列.求两个矩阵之和.重载运算符"+",使之能用于矩阵相加(如c=a+b). 重载流插入运算符"<<"和流提取运 ...

  9. [YTU]_2440( C++习题 复数类--重载运算符+,-,*,/)

    题目描述 定义一个复数类Complex,重载运算符"+","-","*","/",使之能用于复数的加.减.乘.除.运算符 ...

最新文章

  1. pycharm如何执行高级撤销操作回到历史
  2. linux应用系统使用率,Linux性能优化实战:系统CPU使用率高,但为啥找不到高的应用(06)...
  3. 爱立信与中国联通成功完成国内首个LTE三载波聚合大规模部署测试
  4. 农用圆形打捆机行业调研报告 - 市场现状分析与发展前景预测
  5. JDK中ThreadDump诊断Java代码中的线程死锁问题
  6. HCI实验图常见类型
  7. 瑞友企业私有云显示连接负载服务器错误,荣誉资质 | 瑞友天翼-应用虚拟化|远程接入|桌面虚拟化|国内虚拟化整体解决方案领导者...
  8. python github 12306 文贤平_GitHub排名第一!免费最强“抢票神器”在手,程序员抢票再不用跪求加速包...
  9. 产业分析:工业机器人市场研究
  10. 笔记本外接显卡坞死机/键盘鼠标卡死问题的解决
  11. 微型计算机一个汉字多少字节,一个汉字多少字节(Byte)?
  12. 【直观详解】线性代数的本质
  13. Amdahl 定律详解
  14. 读书笔记, Python - python-tricks-buffet-awesome-features
  15. 硬盘的种类、区别、运行原理
  16. mix2s刷Android7,小米Mix2s刷机教程
  17. AI Earth ——开发者模式案例5:鄱阳湖水体区域识别
  18. shopilex -中文开源网店 视频教程
  19. 成都拓嘉辰丰:拼多多新店有权重吗
  20. 直播短视频系统开发,动态切换主题色

热门文章

  1. python selenium 鼠标移动到指定元素,并点击对应的元素
  2. Socket之UDP服务器【Python】
  3. Redis之数据结构底层实现
  4. 拿下编程界的奥林匹克世界冠军,22岁的她加入了华为
  5. Go 超时引发大量 fin-wait2
  6. 视频大时代下基础架构的演进
  7. 【城市沙龙】LiveVideoStack Meet|杭州:多媒体新黄金时代
  8. 3.注释(代码的整洁之道)
  9. 银行核心海量数据无损迁移:TDSQL数据库多源异构迁移方案
  10. 微信基于时间序的海量存储扩展性与多机容灾能力提升