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>成员函数不能满足要求 ...
 
随机推荐
- 奇怪的 Markdown / LaTeX 笔记
			
记一下日常见到的一些奇怪的 Markdown / LaTeX 用法... Markdown LaTeX LaTeX 数学 1. 运算符 1.1 造运算符: a \operatorname{sin} c ...
 - 【bzoj4562】[Haoi2016]食物链
			
*题目描述: 如图所示为某生态系统的食物网示意图,据图回答第1小题 现在给你n个物种和m条能量流动关系,求其中的食物链条数. 物种的名称为从1到n编号 M条能量流动关系形如 a1 b1 a2 b2 a ...
 - sh_12_转义字符
			
sh_12_转义字符 # \t 在控制台输出一个 制表符,协助在输出文本时 垂直方向 保持对齐 print("1\t2\t3") print("10\t20\t30&qu ...
 - C# 前台和后台POST提交信息的实现方法
			
一.系统A(官网)与系统B(第三方支付平台)数据交换的方式 1.1 页面浏览器方式:系统A以构造Form表单的方式,通过系统A客户的浏览器重定向到系统B(向系统B发送请求),B系统完成交易后,将交易 ...
 - AI-人工智能/机器学习 seetafaceJNI
			
基于中科院seetaface2进行封装的JAVA人脸识别库,支持人脸识别.1:1比对.1:N比对. 项目介绍 基于中科院seetaface2进行封装的JAVA人脸识别算法库,支持人脸识别.1:1比对. ...
 - leetcode-mid-backtracking -78 Subsets
			
mycode 86.06% class Solution(object): def subsets(self, nums): """ :type nums: List ...
 - pip安装报错:Fatal error in launcher: Unable to create process using '"'
			
pip安装包报错 解决方案: pip需要升级,可使用以下脚本: python -m pip install -U pip
 - PLSQL导出还原数据库
			
1 导出存储过程,触发器,序列等所有用户对象.(备份) 导出所有的表,存储过程,触发器,序列等所有的创建语句(.sql文件) 在PL/SQL Developer的菜单Tools(工具) => ...
 - C#接口的实现和继承实践
			
1.基本概念 接口是一种契约规范,类似于抽象基类.包括方法,属性,索引器和事件作为成员,这些成员只是作为定义,并不在接口中具体实现. 接口创建时注意以下事项: 继承接口的任何非抽象类都必须实现接口的所 ...
 - Delphi XE2 之 FireMonkey 入门(38) - 控件基础: TPopupMenu、TMenuItem、TMenuBar、TMainMenu
			
Delphi XE2 之 FireMonkey 入门(38) - 控件基础: TPopupMenu.TMenuItem.TMenuBar.TMainMenu 相关控件: TMenuBar.TPopup ...