一元操作符

表达式 对应的函数
+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之操作符重载的更多相关文章

  1. Kotlin 之操作符重载

    Kotlin 之操作符重载   参考: kotlin in action kotlin 官方参考文档 运算符重载 Kotlin允许我们为自己的类型提供预定义的一组操作符实现(这些操作符都对应的成员函数 ...

  2. Kotlin操作符重载:把标准操作加入到任何类中(KAD 17)

    作者:Antonio Leiva 时间:Mar 21, 2017 原文链接:https://antonioleiva.com/operator-overload-kotlin/ 就像其他每种语言一样, ...

  3. Kotlin——最详细的操作符与操作符重载详解(上)

    本篇文章为大家详细的介绍Koltin特有的操作符重载.或许对于有编程经验的朋友来说,操作符这个词绝对不陌生,就算没有任何编辑基础的朋友,数学中的算数运算符也绝不陌生.例如(+.-.*./.>.& ...

  4. c++ 操作符重载和友元

    操作符重载(operator overloading)是C++中的一种多态,C++允许用户自定义函数名称相同但参数列表不同的函数,这被称为函数重载或函数多态.操作符重载函数的格式一般为: operat ...

  5. paip.操作符重载的缺失 Java 的一个大缺点

    paip.操作符重载的缺失 Java 的一个大缺点 #----操作符重载的作用 1.提升用户体验 操作符重载..可以让代码更加自然.... 2.轻松实现代码代码移植 例如   java代码会直接移植到 ...

  6. C#中如何利用操作符重载和转换操作符

    操作符重载 有的编程语言允许一个类型定义操作符应该如何操作类型的实例,比如string类型和int类型都重载了(==)和(+)等操作符,当编译器发现两个int类型的实例使用+操作符的时候,编译器会生成 ...

  7. 操作符重载.xml

    pre{ line-height:1; color:#1e1e1e; background-color:#d2d2d2; font-size:16px;}.sysFunc{color:#627cf6; ...

  8. [置顶] operator overloading(操作符重载,运算符重载)运算符重载,浅拷贝(logical copy) ,vs, 深拷贝(physical copy)

    operator overloading(操作符重载,运算符重载) 所谓重载就是重新赋予新的意义,之前我们已经学过函数重载,函数重载的要求是函数名相同,函数的参数列表不同(个数或者参数类型).操作符重 ...

  9. C++一些注意点之操作符重载

    重载操作符需要注意 (1)重载操作符必须具有一个类类型操作数.不能重载内建类型的操作符. operator +(int,int);//这个是错误的,都为内建类型 operator +(int,clas ...

随机推荐

  1. Java中程序、进程、线程的区别。

    程序.进程.线程的区别. 程序(program):是一个指令的集合.程序不能独立执行,只有被加载到内存中,系统为他分配资源后才能执行. 进程(process):一个执行中的程序称为进程. 进程是系统分 ...

  2. 新人数据库连接不上或数据库配置管理器里面sql服务打不开问题

    新人在链接数据库时可能会出现链接不上数据库,这个问题解决方法是大家找到配置管理器里面,把那些停用的功能开启一下应该就可以.但是我们有的电脑还会遇到里面配置里面什么也没有的情况,这个时候我们就得到控制面 ...

  3. Ubuntu系统---开机总会显示错误报告处理

    Ubuntu系统---开机总会显示错误报告处理 使用ubuntu16.04,开机总会显示错误报告,略烦人,查找方法关闭.一.临时关闭sudo service apport stop(重启后失效) 二. ...

  4. 深度解析Word2vec

    Word2vec 本质上是一种降维操作--把词语从 one-hot encoder 形式的表示降维到 Word2vec 形式的表示,即Distributed Representation.也就是,通过 ...

  5. curl、fopen和file_get_contents区别

    curl多用于互联网网页之间的抓取,fopen多用于读取文件,而file_get_contents多用于获取静态页面的内容. 1. fopen /file_get_contents 每次请求都会重新做 ...

  6. python+Appium自动化:日志logging模块

    日志级别 debug.info.warn.error.critical五个级别 logging模块构成(四部分) logger(记录器,用于日志采集) Handler(处理器,将日志记录发送到合适的路 ...

  7. 从项目开始的Java开发学习

    积累了一些项目中见到的代码,希望见一次之后自己也能写出来. 一.通过cxf JaxWsDynamicClientFactory进行WebService 客户端调用 代码:在项目中从非项目内的接口获取数 ...

  8. Spring Bean装配(下)——注解

    @Repository,@Service,@Controller这三个注解是基于component定义的注解 component-scan:组件扫描 base-package:扫描这个下的所有类 &l ...

  9. Luogu SP839 OPTM - Optimal Marks(按位最小割)

    这道题和 BZOJ 2400 是一道题,不多讲了 CODE #include <cstdio> #include <cstring> #include <vector&g ...

  10. git 在eclipse中忽略上传文件

    在我们的工程项目中,有些文件是不需要上传到服务器上的,比如那些 */target/ */bin/*.settings/*.classpath*.gitignore*.project 我们将这些文件添加 ...