kotlin之操作符重载
一元操作符
| 表达式 | 对应的函数 |
| +a | a.unaryPlus() |
| -a | a.unaryMinus() |
| !a | a.not() |
| a++ | a.inc() |
| a-- | a.dec() |
fun main(arg: Array<String>) {
var a = "a"
println(a++)
println(a)
println(++a)
}
operator fun String.inc():String{//重载String的++
return this +this
}
二元操作符
| 表达式 | 对应的函数 |
| a+b | a.plus(b) |
| a-b | a.minus(b) |
| a*b | a.tims(b) |
| a/b | a.div(b) |
| a%b | a.mod(b) |
| a.b | a.rangeTo(b) |
| a in b | b.contains(a) |
| a !in b | !b.contains(a) |
fun main(arg: Array<String>) {
var s= "hello"
print(s*10)
}
//重载乘法操作符
operator fun String.times(other:Any?):String{
var result = ""
if (other!= null){
if (other is Int)
for (i in 1..other){
result+=this
}
}
return result
}
方括号操作符重载
| 表达式 | 对应的函数 |
| a[i] | a.get(i) |
| a[i,j] | a.get(i,j) |
| a[i_1,...,i_n] | a.get(i_1,..,i_n) |
| a[i]=b | a.set[i,b] |
| a[i,j]=b | a.set(i,j,b) |
| a..b | a.rangeTo(b) |
| a[i_1,...,i_n]=b | a.set(i_1,..i_n,b) |
fun main(arg: Array<String>) {
val arr1 :Array<Any> = arrayOf("3", "2")
val arr2 :Array<Any> = arrayOf("9", "8")
println("arr1[1] = ${arr1[1]}")
println("arr2[1] = ${arr2[1]}")
val arr3 = arrayOf(arr1, arr2)
println("arr3[0][0] = ${arr3[0][0]}")
}
//重载一维数组[i]操作符
operator fun Array<Any>.get(i:Int):Int{
if (this[i] is Int){
return this[i] as Int
}else if (this[i] is String){
try {
return this[i].toString().toInt()
}catch (e:Exception){
}
}
return 0
}
//重载二维数组[i][j]操作符
operator fun Array<Array<Any>>.get(i:Int,j:Int):Int{
if (this[i][j] is Int){
return this[i][j] as Int
}else if (this[i][j] is String){
try {
return this[i][j].toString().toInt()
}catch (e:Exception){
}
}
return 0
}
赋值操作符重载
| 表达式 | 对应的函数 |
| a+=b | a.pulsAssign(b) |
| a-=b | a.minusAssign(b) |
| a*=b | a.timesAssign(b) |
| a/=b | a.divAssign(b) |
| a%=b | a.modAssign(b) |
fun main(arg: Array<String>) {
val myString = myString()
myString.value="sss"
myString*=3
print(myString)
}
class myString{
var value :String = "hello"
override fun toString(): String {
return "myString(value='$value')"
}
}
operator fun myString.timesAssign(n:Int):Unit{
val v =this.value
for (i in 1..n-1)
this.value+=v
}
逻辑操作符重载
| 表达式 | 对应的函数 |
| a>b | a.compaerTo(b)>0 |
| a<b | a.compaerTo(b)<0 |
| a>=b | a.compaerTo(b)>=0 |
| a<=b | a.compaerTo(b)<=0 |
| a==b | a?.equals(b)?(b==null) |
| a!=b | !a?.equals(b)?(b==null) |
fun main(arg: Array<String>) {
val myClass1 = myClass(1, 2)
val myClass2 = myClass(1, 2)
val myClass3 = myClass(3, 4)
println(myClass1 == myClass2)
println(myClass3 == myClass2)
}
class myClass(a: Int, b: Int) {
private var a: Int = a
private var b: Int = b
operator fun compareTo(c: myClass): Int {
var m = this.a + this.b
var n = c.a + c.b
return m - n
}
override fun equals(other: Any?): Boolean {
if (this === other) return true
if (javaClass != other?.javaClass) return false
other as myClass
if (a != other.a) return false
if (b != other.b) return false
return true
}
override fun hashCode(): Int {
var result = a
result = 31 * result + b
return result
}
}
kotlin之操作符重载的更多相关文章
- Kotlin 之操作符重载
Kotlin 之操作符重载 参考: kotlin in action kotlin 官方参考文档 运算符重载 Kotlin允许我们为自己的类型提供预定义的一组操作符实现(这些操作符都对应的成员函数 ...
- Kotlin操作符重载:把标准操作加入到任何类中(KAD 17)
作者:Antonio Leiva 时间:Mar 21, 2017 原文链接:https://antonioleiva.com/operator-overload-kotlin/ 就像其他每种语言一样, ...
- Kotlin——最详细的操作符与操作符重载详解(上)
本篇文章为大家详细的介绍Koltin特有的操作符重载.或许对于有编程经验的朋友来说,操作符这个词绝对不陌生,就算没有任何编辑基础的朋友,数学中的算数运算符也绝不陌生.例如(+.-.*./.>.& ...
- c++ 操作符重载和友元
操作符重载(operator overloading)是C++中的一种多态,C++允许用户自定义函数名称相同但参数列表不同的函数,这被称为函数重载或函数多态.操作符重载函数的格式一般为: operat ...
- paip.操作符重载的缺失 Java 的一个大缺点
paip.操作符重载的缺失 Java 的一个大缺点 #----操作符重载的作用 1.提升用户体验 操作符重载..可以让代码更加自然.... 2.轻松实现代码代码移植 例如 java代码会直接移植到 ...
- C#中如何利用操作符重载和转换操作符
操作符重载 有的编程语言允许一个类型定义操作符应该如何操作类型的实例,比如string类型和int类型都重载了(==)和(+)等操作符,当编译器发现两个int类型的实例使用+操作符的时候,编译器会生成 ...
- 操作符重载.xml
pre{ line-height:1; color:#1e1e1e; background-color:#d2d2d2; font-size:16px;}.sysFunc{color:#627cf6; ...
- [置顶] operator overloading(操作符重载,运算符重载)运算符重载,浅拷贝(logical copy) ,vs, 深拷贝(physical copy)
operator overloading(操作符重载,运算符重载) 所谓重载就是重新赋予新的意义,之前我们已经学过函数重载,函数重载的要求是函数名相同,函数的参数列表不同(个数或者参数类型).操作符重 ...
- C++一些注意点之操作符重载
重载操作符需要注意 (1)重载操作符必须具有一个类类型操作数.不能重载内建类型的操作符. operator +(int,int);//这个是错误的,都为内建类型 operator +(int,clas ...
随机推荐
- IntelliJ IDEA控制台启动Tomcat输出中文乱码问题
IntelliJ IDEA控制台输出中文乱码问题 1. 先解决Tomcat中文乱码问题 参考 Tomcat 输出日志出现中文乱码 2. 解决Idea配置问题 打开IntelliJ IDEA本地安装目 ...
- Win10建立标准账户并设置标准账户权限
Win10建立标准账户,并使用组策略对标准帐户的权限进行管理. 注意:本文内容均在管理员帐户下操作,可以只看图片按图示步骤操作即可. 一.建立一个标准账户用于公用登录 (1)按”win健+R”运行“c ...
- Linux的awk 中的while do-while for循环
linux awk的 while.do-while和for语句中允许使用break,continue语句来控制流程走向,也允许使用exit这样的语句来退出.break中断当前正在执行的循环并跳到循环外 ...
- Java基础 String 裸暴力算法- 五个小练习
之间的博客,承上启下: Java基础 String/StringBuff 常用操作方法复习/内存分析 Java数组直接选择排序.sort()排序 Java基础 String 算法 - 五个练 ...
- Java基础 TreeSet()来实现数组的【定制排序】 : Comparable接口(自然排序) 或者 Comparator接口 (定制排序)
笔记: //排序真麻烦!没有C++里的好用又方便!ORZ!ORZ!数组排序还还自己写个TreeSet()和( Comparable接口(自然排序) 或者 Comparator接口 (定制排序))imp ...
- jquery动态背景切换全屏登录插件supersized.js
下载地址:https://download.csdn.net/download/t101lian/10434198预览: http://www.daimabiji.com/codedemo/1530 ...
- sql语句中的占位符?有什么作用
String sql = "SELECT userid,name FROM tuser WHERE userid=? AND password=?" ; pstmt = conn. ...
- c语言1博客作业09
一.本周作业头 这个作业属于那个课程 C语言程序设计II 这个作业要求在哪里 https://edu.cnblogs.com/campus/zswxy/SE2019-3/homework/10033 ...
- 2020 WPF开发革命性时代,DevExpress为你护航
下载DevExpress v19.2完整版 通过DevExpress WPF Controls,您能创建有着强大互动功能的XAML基础应用程序,这些应用程序专注于当代客户的需求和构建未来新一代支持触摸 ...
- 009_linuxC++之_友元函数
(一)定义:友元函数是指某些虽然不是类成员却能够访问类的所有成员的函数.类授予它的友元特别的访问权.通常同一个开发者会出于技术和非技术的原因,控制类的友元和成员函数(否则当你想更新你的类时,还要征得其 ...