转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/120496977
本文出自【赵彦军的博客】

文章目录

  • 定义
  • 重载 plus
  • 重载 get
  • 重载 compareTo
  • 常见运算符

定义

运算符重载就是对已有的运算符赋予他们新的含义。重载的修饰符是operator

比如我们的+号,它的含义是两个数值相加:1+1=2+号对应的函数名是plus

比如我们定义一个类,如何才能使用 + 这个符号呢?其实也很简单,使用 operator 重载 plus 函数就能搞定,我们试试吧

重载 plus

首先我们定义一个类 Point ,然后重载 plus 函数

class Point(val x: Int,val y: Int) {operator fun plus(other: Point): Point {return Point(x + other.x, y + other.y)}
}

请注意,一定要用 operator 关键字修饰,否则我们是不能用 + 号的。

测试代码:

fun mian() {val point = Point(1, 1)val point2 = Point(2, 2)val point3 = point.plus(point2)//等价于val point4 = point + point2}

我们知道原理后,我们甚至可以吧 Int 的 plus 进行改写,让 Int 类型可以和 Point 对象相加

//自定义plus函数
operator fun Int.plus(other: Point): Int {return this + other.x + other.y
}

使用

val point = Point(2, 3)
val a = 1
val b = a + point
Log.d("zhaoyanjun", "$b")

重载 get

class Point(val x: Int, val y: Int) {operator fun get(index: Int): Int {return index + 1}
}

使用

val point = Point(2, 3)val s1 = point.get(9)
//等价于
val s2 = point[9]

重载 compareTo

class User(val name: String, val age: Int) {//根据年龄做比较,年龄越大,返回正值 operator fun compareTo(other: User): Int {return age.compareTo(other.age)}
}

测试代码:


val user1 = User("a", 10)
val user2 = User("b", 20)
val user3 = User("c", 30)val result = user1 > user2
val result2 = user3 > user2Log.d("yy", "$result $result2")

结果如下:

D/yy: false true

常见运算符

表示 重载
a = a + b a = a.plus(b)
a = a - b a = a.minus(b)
a = a * b a = a.tiems(b)
a = a / b a = a.div(b)
a = a % b a = a.rem(b)
a … b a.rangTo(b)
a % b a.rem(b) 或 a.mod(b)
++a, a++ inc
!a not
a > b a.compareTo(b) > 0
a < b a.compareTo(b) < 0
a >= b a.compareTo(b) >= 0
a <= b a.compareTo(b) <= 0
a in b b.contains(a)
a !in b !b.contains(a)

Kotlin中的 && 、 || 、 ?: 、 === 、 !== 是不能被重载的

Kotlin重载运算符operator相关推荐

  1. C++ 重载运算符 operator

    operator  是什么 operator 是C++的一个关键字,它和运算符(+,-,*,/,=,等等)一起使用,表示一个运算符重载函数 operator 没有返回语句 operator 的作用 : ...

  2. 重载运算符operator

    运算符重载注意点: 1.算术和关系操作符返回的是一个左值或右值,而不是一个引用 2.赋值操作符一定要定义为成员函数如"=" 3.一般而言,赋值操作符和复合赋值操作符应返回左操作数的 ...

  3. OpenCV中Mat类的重载运算符operator()的用法

    图像处理开发需求.图像处理接私活挣零花钱,请加微信/QQ 2487872782 图像处理开发资料.图像处理技术交流请加QQ群,群号 271891601 定义如下: inline Mat Mat::op ...

  4. kotlin之重载运算符(十一)

    目录 1. 运算符重载概念 2. 重载运算符类型 3. 重载复合赋值运算符 4. 重载一元运算符 5. 重载比较运算符 1. 运算符重载概念 简单来说,就是Kotlin通过调用自己代码中定义特定的函数 ...

  5. C++ operator重载运算符详解

    [toc] Chapter XIV C++ operator 重载运算符的作用: 主要是代替成员函数的方式为自建类型完成基本任务 当然, 用成员函数完全可以代替operator的功能, 但是使用起来绝 ...

  6. C++重载相等运算符operator==的两种方式

    最近复习了一下C++的一些基础知识,发现之前理解得不够深刻,或者当时只是简单过了一遍,复习的时候,有了一些新的收获.闲言少叙,书归正文: 问题: C++的重载相等运算符operator==可以写成类成 ...

  7. C++ 赋值重载运算符(overloaded operator)operator关键字

    重载运算符 重载运算符的本质是函数,其名字由operator关键字后接表示要定义的运算符的符号组成. 因此,赋值运算符就是一个名为operator=的函数. 类似于任何其他的函数,重载运算符函数也有一 ...

  8. 关于运算符operator重载出错解决方法

    问题描述: 在类定义的公有函数中,定义友元函数"operator<<",在编译的时候提示"类成员是私有的,无法访问". 编译器:G++ 解决方法: ...

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

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

  10. 【C++】重载运算符(二)

    1.4 下标运算符p501 下标运算符必须是成员函数,表示容器的类通常可以通过容器中的位置访问元素,定义下标运算符operator[] 一个包含下标运算符的类,通常,定义2个版本:一个返回普通引用,另 ...

最新文章

  1. 汽车票销售系统mysql,jsp683客运汽车票网上售票系统mysql
  2. sqlmap完成简单的sql注入
  3. php postgresql多条,PHP操作Postgresql封装类与应用完整实例
  4. BZOJ2837 : 小强的形状
  5. kafka 集群_单机版kafka集群部署
  6. POJ 3617 Best Cow Line(最佳奶牛队伍)
  7. gcc的简单使用教程
  8. python后台框架_我的第一个python web开发框架(14)——后台管理系统登录功能
  9. Unity超基础学习笔记(一)
  10. 第六章 使用ADO.NET查询和操作数据
  11. div水平垂直居中的几种方法(面试问题)
  12. Materials Studio软件常见问题与解决方案(二)
  13. vue中EventBus的实现原理
  14. Spring AOP
  15. android手机华为p10,华为P10的手机系统是什么
  16. 【读书】张萌作品:《人生效率手册:如何卓有成效地过好每一天》
  17. STM32 HAL库 CUBEMX FPU 和 DSP库
  18. linux安装docker并搭建DNS服务器,劫持百度小实验
  19. itext使用模板生成pdf文件
  20. c++求矩阵的秩_常见的矩阵分解

热门文章

  1. 开博尔智能android播放器,高端安卓播放器的选择——开博尔Q10Plus 二代 4K高清播放器...
  2. 联想小新Pro 13新款笔记本电脑获TUV莱茵低蓝光认证
  3. 推荐一款STM32F030K6T6兼容替换灵动MM32F031K6T6
  4. java实现发送国际短信的功能
  5. openCV中step[]和step1()的计算公式
  6. PHP 3D大富翁,大富翁3D版 Monopoly Classic HD
  7. glob patterns
  8. 应聘总经理的答卷,供大家打分!(一)
  9. nuc10fnh寒霜峡谷linux,英特尔(Intel)寒霜峡谷NUC10i5FNH使用体验
  10. Ubuntu由于没有公钥,无法验证下列签名。