Koltin简明学习,操作符重载(Operator overloading)

Kotlin小技巧:拼接字符串、参数默认值 拼接字符串 不同于Java,Kotlin支持字符串内嵌套表达式功能,不需要再进行字符串拼接! Kotlin字符串内嵌表达式的语法规则: " hello ${obj.name}, nice to meet you!" Kotlin 允许字符串内嵌套 ${} 这种表达式,并在运行时使用表达式的执行结果替换这一部分内容,当表达式内只有一个变量时,可以将大括号省略。 val list2 = mutableListOf("Apple","orange","StrawBerry") for (fruit 阅读详情

Kotlin有个有趣的功能操作符重载(Operator overloading)。

先看一段程序:

val start = "Talk is cheap. "
val middle = "Show me the code. "
val end = "- android2me"

val result = start + middle + end
println(result)

输出结果:

Talk is cheap. Show me the code. - android2me

上面的例子我们发现这个加号(+)实现了字符串的连接。那么我们想想是这是怎么实现的。

我们点击加号,跳转到koltin的标准库的String文件中,光标停留在plus方法处。

下面是源代码:

package kotlin

/**
 * The `String` class represents character strings. All string literals in Kotlin programs, such as `"abc"`, are
 * implemented as instances of this class.
 */
public class String : Comparable<String>, CharSequence {
    companion object {}

    /**
     * Returns a string obtained by concatenating this string with the string representation of the given [other] object.
     */
    public operator fun plus(other: Any?): String

    public override val length: Int

    public override fun get(index: Int): Char

    public override fun subSequence(startIndex: Int, endIndex: Int): CharSequence

    public override fun compareTo(other: String): Int

}

从上面的分析看,加号(+)对应着plus这个方法。这个就是操作符重载,我们可以通过plus方法来定义“+”这个操作符。

常见的操作符和对应的方法名:

一元操作符(Unary Operators)

操作符方法名
+aa.unaryPlus()
-aa.unaryMinus()
!aa.not()
a++a.inc()

二元操作符(Binary Operators)

操作符方法名
a + ba.plus(b)
a – ba.minus(b)
a * ba.times(b)
a / ba.div(b)
a % ba.mod(b)
a..ba.rangeTo(b)
a in bb.contains(a)
a !in b!b.contains(a)
a += ba.plusAssign(b)
a -= ba.minusAssign(b)
a *= ba.timesAssign(b)
a /= ba.divAssign(b)
a %= ba.modAssign(b)

数值类型操作符(Array type operators)

操作符方法名
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] = ba.set(i, b)
a[i, j] = ba.set(i, j, b)
a[i_1, …, i_n] = ba.set(i_1, …, i_n, b)

等于和不等于操作符(Equals Operation)

操作符方法名
a == ba?.equals(b) ?: (b === null)
a != b!(a?.equals(b) ?: (b === null))

比较操作符(Comparison operators)

操作符方法名
a > ba.compareTo(b) > 0
a < ba.compareTo(b) < 0
a >= ba.compareTo(b) >= 0
a <= ba.compareTo(b) <= 0

调用操作符(Invoke operator)

操作符方法名
a()a.invoke()
a(i)a.invoke(i)
a(i, j)a.invoke(i, j)
a(i_1, …, i_n)a.invoke(i_1, …, i_n)

举例

class Point(var x: Int, var y: Int) {

    operator fun unaryMinus(): Point {
        return Point(-x, -y)
    }

    override fun toString(): String {
        return "[$x, $y]"
    }
}

val point = Point(5, 8)
println(point)
println(-point)

打印输出:

I/System.out: [5, 8]
I/System.out: [-5, -8]

运用操作符重载给我们的开发带来了方便,但是要正确使用,防止产生歧义。

参考文献

https://kotlinlang.org/docs/reference/operator-overloading.html
https://antonioleiva.com/operator-overload-kotlin/
https://www.programiz.com/kotlin-programming/operators

Kotlin简明学习—文章列表

运算符重载(operator overloading) 运算符重载(operator overloading) 运算符重载,就是对已有的运算符重新进行定义,赋予其另一种功能,以适应不同的数据类型。 在C++中,可以定义一个处理类的新运算符。这种定义很像一个普通的函数定义,只是函数的名字由关键字 operator 及其紧跟的运算符组成,差别仅此而已。它像任何其他函数一样也是一个函数,当编译器遇到适当的模式时,就会调用这个函数。 1. 加号运算符重载 如果想让自定义数据类型 进行+运算 需要重载 + 运算符 在成员... 阅读详情

相关推荐

Kotlin扩展函数和扩展属性 使用及优化场景分析

Kotlin扩展使用场景,kotlin扩展原理,kotlin扩展属性及扩展函数,扩展的实用场景。

开发者专栏 696

Kotlin重载运算符operator

Kotlin重载运算符operator

转载和创作优秀的博客 661

以GD32F103C8T6为例的核心板原理图PCB绘制学习笔记简单总结

重点在supplier part是立创商城的编号,可以搜到。

2301_80397661的博客 3261

kotlin关键字operator

kotlin操作符operator

flytosky21的博客 1167

视觉媒体通信作业记录(六)端到端的视频传输系统

将采集、编码、传输、显示各模块连接起来,形成一个端到端的视频通信系统,开发一个特色模块,将其加入系统;

weixin_45774698的博客 1967

Linux内核驱动模型--PCIe(PCI Express)驱动​​

本文系统介绍了Linux内核中PCIe驱动的设计与实现。首先从架构定位入手,指出PCIe驱动基于PCI子系统扩展支持高速、低功耗特性。核心数据结构struct pci_driver包含设备匹配表id_table、生命周期函数probe/remove等关键组件。文章详细解析了驱动与设备的绑定流程、资源管理机制,并重点阐述了MSI-X中断、电源管理、热插拔和多队列等高级特性实现方案。最后提供了lspci、dmesg等调试工具的使用方法,总结了PCIe驱动在支持高性能设备中的关键作用。全文通过架构设计、核心结构、

amy_mhd的博客 425

Kotlin学习系列之:运算符重载(operator overloading)

1.引入:运算符重载,最初接触到这个概念是在C++里,Java中是没有的,取而代之的是通过特定接口来实现,比如进行排序比较大小时,我们可以实现Comparable接口。而Kotlin中,又重新支持该特性,因为这样会显得更加直观。 2.如何实现运算符重载: 方式一:在类内定义,以成员方法(member)的形式 比如,我们定义一个Point类: data class Point(va...

xlh1191860939的博客 2368

196、NPU的编译器开发:教程与示例代码编写

NPU编译器开发实战指南 摘要:本文分享了NPU编译器开发中的核心挑战与实战经验,通过具体代码示例展示了关键实现技术: 指令生成:必须考虑硬件特性(如地址对齐)和芯片配置抽象化 图优化:重点处理常见冗余结构(Reshape合并、BN融合),并注意数值稳定性 算子拆分:采用分块计算策略适配有限SRAM,需特别注意边界条件处理 内存分配:基于张量使用频率的贪心算法优化SRAM使用效率 文中包含多个真实踩坑案例: DMA地址未对齐导致硬件错误 BN融合时的除零风险 tile边界处理不当引起的精度下降 这些经验为开

m0_50546716的博客 78

运算符重载(operator overloading)

运算符重载(operator overloading)只是一种语法上的方便,也就说他只是另一种函数的调用方式。 在C++中,可以定义一个处理类的新运算符。这种定义很像一个普通函数的定义,只是函数的名字由关键字operator及其后紧跟的运算符组成。差别仅此而已。他像任何其他函数一样也是一个函数,当编译器遇到适当的模式时,就会调用这个函数。 对于运算符重载首先它是一个有趣的工具。但是,它仅仅只是

sdausxc的专栏 3996

【100%通过率】2023华为od机试C卷【围棋的气】Python 实现

围棋棋盘由纵横各19条线垂直相交组成,棋盘上一共19 x 19 = 361 个交点,对奔双方一方执白棋,一方执黑棋,落子时只能将棋子置于交点上。 “气”是围棋中很重要的一个概念,某个棋子有几口气,是指其上下左右方向四个相邻的交叉点中,有几个交叉点没有棋子,由此可知:

MISAYAONE的博客 1857

OpenClaw入门必装Skills(附使用场景)

很多同学安装了OpenClaw后,但却不会使用,就相当于你只是拥有了一副强大的躯干,却没有给它装上能够灵活执行任务的“手脚”和负责思考决策的“大脑插件”——Skills。没有这些核心能力的支撑,OpenClaw只是一个“空壳”,无法真正应用到实际业务场景中,更谈不上提升效率或解决复杂问题。所以,安装只是第一步,要真正让OpenClaw“活”起来,为我们所用,就需要给OpenClaw安装各种Skills,这个过程就是养虾的过程。

十二测试录 3222

Kotlin,简直是 Java 的 Pro Max!(笔记3 进阶篇)

a)拓展函数就是动态的给类添加方法.Java 中是不支持对系统的类进行拓展,而 Kotlin 支持.例如,统计一个 List 中,元素大于 0 的元素个数. 如果使用 Java,我们可能会创建一个 ListUtils 然后在里面编写这样一个方法.b)Kotlin 就可以拓展函数实现:创建一个 List.kt,职责就是对 List 进行拓展(创建新文件可使得拓展函数拥有全局访问域,不定义新文件也是可以的,但是郭霖大佬是建议定义新文件).

CYK_byte的博客 927

MDF和DHF、DMR、DHR三者差异?注册与备案文件?医疗器械产品技术要求编写指导原则

定义:设计历史文档(DHF ) 指的是描述某医疗器械成品设计过程的有关记录。内容:DHF包括设计开发活动的所有记录。从最初的策划、客户需求、设计输入,设计输出、设计验证、设计确认、所有的设计评审,设计转换,以及设计变更相关的所有记录。均属于DHF的一部分。要求:各制造商应为每个类型的器械建立并保持设计历史文件。设计历史文件应包含或引用必要的记录,以证实设计符合经批准的设计计划和法规的要求。

学海无涯的专栏 9110

Kotlin Reference (十四) 委托类和委托属性

委托模式是软件设计模式中的一项基本技巧。在委托模式中,有两个对象参与处理同一个请求,接受请求的对象将请求委托给另一个对象来处理。 Kotlin 直接支持委托模式,更加优雅,简洁。Kotlin 通过关键字 by 实现委托。

打渔还是晒网 —— stone 2227

【数据集】全球湿度数据集总结

【数据集】全球湿度数据集总结

WW、forever的博客 1661

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

Kotlin 学习笔记(七)operator约定

约定的意义:就是让函数调用更加简洁。是语法糖的一部分吧。

zjuter的专栏 1388

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

Kotlin语法基础篇十:有趣的操作符重载

操作符在Java中我们也叫运算符,操作符重载是Kotlin语法糖中一个比较有趣的内容。为什么说它有趣呢?因为它可以实现让两个对象相加或者相减等操作。在Java语言中我们常见的操作符有+、-、*、/、++、--、%等。通常我们都是使用这些运算符来操作基本数据类型或字符串。对两个数字进行相加就是求这两个数字之和,对两个字符串相加就是将这两个字符串拼接起来。而在Kotlin中它允许我们对这些操作符进行重载,从而实现一些更加简洁而实用的功能。

huangyi 1942

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

C++运算符重载(Operator Overloading)

需要注意的是,在进行赋值运算符重载时,需要注意资源的管理和释放,避免内存泄漏和悬挂指针的问题。在 C++ 中,运算符重载(Operator Overloading)是一种特殊的函数重载机制,允许我们重新定义已有的运算符的行为。通过运算符重载,我们可以定义自定义类型的对象在使用运算符时的行为,使其能够执行类似于内置类型的操作。后置递增运算符先返回递增前的对象的副本,再对对象进行递增操作。需要注意的是,在使用运算符重载时,应确保重载的行为符合直觉和常规用法,避免引起歧义和混淆。最后,返回当前对象的引用。

ultramand的博客,重生之我在cad上二次开发猛猛敲C#代码~ 2562

Kotlin-14-运算符重载(operator)

目录 1、定义 2、原理 3、作用 4、常用的运算符及对应的函数名 4.1一元运算符 4.2、二元运算符 4.3、复杂运算符 4.4、比较运算符 5、注意 1、定义 运算符重载就是对已有的运算符赋予他们新的含义。重载的修饰符是operator 比如我们的+号,它的含义是两个数值相加:1+1=2。+ 号对应的函数名是plus 然后对+号这个函数进行重载,可以让它可以实现...

Yo.o 8033

Kotlin系列二(kotlin中的操作符)

1.一元操作符 2.二元操作符 kotlin中没有三元操作符

weixin_46112033的博客 2222

Java 程序中的字符串字面值都是String类的实例实现

Java 程序中的字符串字面值都是String类的实例实现 JDK API文档中有这样的介绍: String 类代表字符串。Java 程序中的所有字符串字面值(如 “abc” )都作为此类的实例实现。 The String class represents character strings. All string literals in Java programs, such as “abc”, are implemented as instances of this class. 也就是说,字符

a2516110的博客 320

String类源码详解

/* * Copyright (c) 1994, 2010, Oracle and/or its affiliates. All rights reserved. * ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. */ package java.lang; import java.io.Ob...

嘿↗你的益达 316

Kotlin 基础学习笔记第七章——运算符重载及其他约定

kotlin 运算符重载

liuqinhou的博客 1292

JS里面的一元加号操作符

1.转换为时间戳 <p> <label>getTime:</label><input id="getTime" type="text" readonly value=""/> </p> <p> <label>valueOf:</lab...

anguo1987的专栏 216
上一篇: Koltin简明学习,解构声明
下一篇: Kotlin简明学习,infix函数
android2me
博客等级 码龄14年 30粉丝 21原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值