编译器对c++ 操作符认知,比如:
{
...
obj a,b;
//a,b为obj对象
a += b
}
编译器会去寻找a中的 += 符号定义,如果存在则相当于调用a的+=函数,入参为b。
//伪函数 成员c++函数隐藏入参this 就是例子中的a
//python中self就是c++中的this显式
obj::operator += (this,const obj& b) {
return ...
}
kotlin的操作符重载:
也是编译器干活,也是编译器找左边的实例函数去执行,只不过kotlin的重载函数有严格限定。比如,operator fun plus 就是重载+号。可以重载的操作符有严格限定(c++也限定几种操作符),具体哪些参考官网说明。严格的讲可以认为重载是kt编译器的提供的一种语法糖,扩展了java编译器,由此产生了新的编码风格(dsl)。
kotlin举例(用Kout模拟cout输出):
class Kout {
val msg: StringBuilder = StringBuilder()
fun endl(){
println(msg.toString())
}
}
fun Kout.and(str:String) = this.also { it.msg.append(str) }
这样我们打印控制台就可以
Kout().and("abc").and("Test").endl()
利用kotlin 操作符重载+号(class 内增加):
operator fun plus(str:String)= this.also { it.msg.append(str) }
打印可以这样写:
//仅仅是为了说明,不推荐生产环境使用
(Kout() + "abc" + "test2").endl()
安卓可以替换println 为日志工具。
cpp中重载<< 实现cout打印 :
//cpp全局重载 complex是标准库中的
inline ostream&
operator << (ostream& os,const complex& x){
return os << '(' << real(x) << ',' << imag(x) << ')' ;
}