kotlin学习(6)运算符重载和其他约定
约定
在Kotlin中,可以调用自己代码中定义的函数,来实现语言结构。这戏功能与特定的函数命名相关,例如,在你的类中定义了一个名为plus的特殊方法,那么按照约定,就可以在该类的实例上使用 + 运算符,因此,我们把这种技术称为“约定”。
重载运算符
/*
*这里给一个类添加了plus方法来重载 + 运算符
*/
data point(val X:Int,val Y:Int){
//operator修饰符是声明这个方法是用来重载的
operator fun plus(other:point): point {
return point(this.X+other.X,this.Y+other.Y)
}
}
//重载之后,point对象就可以直接使用+运算符来操作两个对象了
fun main(args: Array<String>) {
val a= point(,)
val b= point(,)
println(a+b)
}
可重载的二元运算符
| 表达式 | 函数名 |
| a * b | times |
| a / b | div |
| a % b | mod |
| a + b | plus |
| a - b | minus |
如果重载 + 或 * 计算的两边类型不同的话,那么不支持交换性,需要额外定义一个函数。
可重载的一元运算符
| 表达式 | 函数名 |
| +a | unaryPlus |
| -a | unaryMinus |
| !a | not |
| ++a,a++ | inc |
| --a,a-- | dec |
可重载的比较运算符
equals和compareTo
集合与区间的约定
通过下标来访问元素:“get“和”set“
//这里使用了扩展函数实现get约定
operator fun point.get(index : int): Int{
return when(index){
0 -> x
1 -> y
else ->
throw IndexOutOfBoundsException("Invalid coordinate $ index")
}
} //重载set
operator fun point.set(index : int,value : Int): Int{
return when(index){
0 -> x = value //根据对应的index来修改值
1 -> y = value
else ->
throw IndexOutOfBoundsException("Invalid coordinate $ index")
}
} >>>val p=point(10,20)
>>>println(p[1])
20
in的约定,相对应的函数叫做contains
//使用in来检查点是否在矩形区域内
data class Rectangle(val upperLeft:point, val lowerRight:point) operator fun Rectangle.contains(p:point):Boolean{
//until构建了一个开区间
return p.x in upperLeft.x until lowerRight.x &&
p.y in upperLeft.y until lowerRight.y
}
//rangeTo的约定 1..10
operator fun <T: Comparable<T>> T.rangeTo(that: T): ClosedRange<T> //在for循环中使用iterator的约定,这让迭代字符串成为可能
operator fun CharSequence.iterator(): CharIterator >>>for (c in "abc")
解构声明和组件函数
解构声明允许展开单个复合值,并使用它来初始化多个单独的变量
>>>val p = point(10, 20)
>>>val (x,y) = p
>>>println(x)
10
>>>printlb(y)
20
对于数据类,编译器为每个在主构造方法中声明的属性生成一个componentN函数,下面展示如何手动为非数据类声明这些功能:、
//结构声明,可以在调用函数后轻松的展开一个对象,使用它的值
class point(val x: Int, val y: Int){
operator fun component1() = x
operator fun component2() = y
}
此外,还可以用解构声明来遍历map for((key, value) in map){ println("$key -> $value") }
委托属性(不全)
//使用委托来实现懒汉式初始化(不调用不赋值,调用时才初始化)
fun loadEmails():Int{
println("Load emails")
return 1
} class Person(val name:String){
val emails by lazy{ loadEmails() }
} >>>println(Person().emails)
Load emails
1
kotlin学习(6)运算符重载和其他约定的更多相关文章
- C++学习之运算符重载的总结
C++学习之运算符重载的总结 运算符重载是对已有的运算符赋予多重含义,使同一个运算符作用域不同类型的数据导致不同行为的发生,C++为运算符重载提供了一种方法,即运算符重载函数 ...
- 我的c++学习(8)运算符重载和友元
运算符的重载,实际是一种特殊的函数重载,必须定义一个函数,并告诉C++编译器,当遇到该运算符时就调用此函数来行使运算符功能.这个函数叫做运算符重载函数(常为类的成员函数). 方法与解释 ◆ 1.定义运 ...
- C++学习26 运算符重载的概念和语法
所谓重载,就是赋予新的含义.函数重载(Function Overloading)可以让一个函数名有多种功能,在不同情况下进行不同的操作.运算符重载(Operator Overloading)也是一个道 ...
- C++学习笔记-运算符重载
运算符重载使得用户自定义的数据以一种更简洁的方式工作 运算符重载规则 重载运算符的限制 可以重载的运算符 + - * / % ^ & | ~ ! = < > += -= *= /= ...
- STL学习之运算符(<<)重载问题和仿函数的实现
/* 运算符<<的重载一直报错, 友原函数中可以访问到类的私有成员*/#include<iostream>using namespace std; class MyIn ...
- 运算符重载+日期类Date
Hello,一只爱学习的鱼 大学学习C++运算符重载的时候,老师出了一道"运算符重载+类"的综合练习题,让我们来一起看看吧! 题目: 设计一个日期类Date,包括年.月.日等私有成 ...
- C++学习笔记之运算符重载
一.运算符重载基本知识 在前面的一篇博文 C++学习笔记之模板(1)——从函数重载到函数模板 中,介绍了函数重载的概念,定义及用法,函数重载(也被称之为函数多态)就是使用户能够定义多个名称相同但特征标 ...
- 初步C++运算符重载学习笔记<3> 增量递减运算符重载
初步C++运算符重载学习笔记<1> 初探C++运算符重载学习笔记<2> 重载为友元函数 增量.减量运算符++(--)分别有两种形式:前自增++i(自减--i).后自增i ...
- 初探C++运算符重载学习笔记<2> 重载为友元函数
初探C++运算符重载学习笔记 在上面那篇博客中,写了将运算符重载为普通函数或类的成员函数这两种情况. 以下的两种情况发生.则我们须要将运算符重载为类的友元函数 <1>成员函数不能满足要求 ...
随机推荐
- 6402. 【NOIP2019模拟11.01】Cover(启发式合并)
题目描述 Description 小 A 现在想用
- layui 源码解读(部分)
<!DOCTYPE html> <head> </head> <body> <input type="button" id=& ...
- XML 浏览器支持
几乎所有的主流浏览器均支持 XML 和 XSLT. Mozilla Firefox 从 1.0.2 版本开始,Firefox 就已开始支持 XML 和 XSLT(包括 CSS). Mozilla Mo ...
- MongoDB操作:flush()
flush() 是把缓冲区的数据强行输出,(注意不要和frush()刷新混淆了). 主要用在IO中,即清空缓冲区数据,一般在读写流(stream)的时候,数据是先被读到了内存中,再把数据写到文件中,当 ...
- SpringBoot2.2版本配置绑定
具体可以查看这篇:https://www.cnblogs.com/dalianpai/p/11772382.html 原始的 /** * @author WGR * @create 2019/12/ ...
- Vue(核心思想)
1.Es6语法普及 let和var的区别: var:定义变量时,在全局范围内都有效;所以在变量没有声明之前就能使用,值为undefined, 称为变量提升; let:声明的变量一定要在声明后使用,而且 ...
- Codeforces Round #403---C题(DFS,树)
C. Andryusha and Colored Balloons time limit per test 2 seconds memory limit per test 256 megabytes ...
- mysql 5.7 安装配置及无法启动的问题解决
(用这篇配置就能正常配置成功) mysql 免安装版配置方法: https://www.jb51.net/article/134452.htm 参考:https://blog.csdn.net/qq_ ...
- 测开之路一百四十六:WTForms之表单应用
WTForms主要是两个功能:1.生成HTML标签 2.对数据格式进行验证 官网:https://wtforms.readthedocs.io/en/stable/ 这篇介绍用wtform生成htm ...
- 用例a失败,跳过测试用例b和c并标记失败xfail
前言 当用例a失败的时候,如果用例b和用例c都是依赖于第一个用例的结果,那可以直接跳过用例b和c的测试,直接给他标记失败xfail用到的场景,登录是第一个用例,登录之后的操作b是第二个用例,登录之后操 ...