CSDN旧文 – Java 为什么没有操作符重载 

最近一直在看Herb 的 Exceptional C++ 系列书籍 ,Scott Meyer 在书的序中写到,Exceptional C++是一本常常会”make me surprise” 的书,的确,即使使用了C++ 已经很多年,但看这样的书仍然让自己觉得对C++的理解还十分浅薄。

但是正如不断有人提出来的这个问题 - “是系统设计的复杂程度本身需要那么多的知识,经验和技巧还是C++ 自己本身太过复杂” (嗯,我个人的理解是二者皆是 ^_^),Bruce 在 Thinking In Java 4 的序中写到,随着自己不断加深的对Java的理解,越来越了解到Java语言的设计目标就是使得描述和构建复杂系统的工作变得更容易,一个即使只有有限的知识和经验的程序员也能够使用Java来进行某种复杂程度的系统建构工作,Java就是一门更容易,能够在更高的抽象层次上描述系统的语言,也许它不那么高效,有时也显得不够灵活,但是它不会经常让你 surprise…

回到题目的话题,Java为什么没有操作符重载,C++ 的操作符重载是其语言强大与灵活的一个重要特征, 我今年因为工作原因接触过Quatro DSP的模拟器,Quatro DSP是一个用于打印机,扫描仪的数字图象处理器,模拟器本身其实是一个C++库,通过库的支持能够把Quatro DSP的汇编语言转化为合法的C++ 函数调用,从而在C++的集成开发环境(如 VC)中模拟DSP汇编语言的执行,主要工作原理无非是将寄存器定义为某个类类型对象,从而使用宏替换和操作符重载将汇编语言变成函数调用。

C++不但有操作符重载,还有自定义类型转换 (嗯,大多数的C++书籍都会劝你在没有正当理由的情况下千万不用去使用后者),Exceptional C++书中在讲到异常安全代码的章节中有这么一段话 ——

“In particular, it helps to develop a habit of eyeing with mild suspicion anything that might turn out to be a function call — including user-defineed operators, user-defined conversions, and silent temporary objects among the more subtle cluprits – because any function call might throw.”

“实际上,它会帮你养成这样的习惯,对所有语句都带着怀疑的眼光,猜测这有可能会是一个函数调用 - 包括自定义操作符,自定义类型转换,和一些更是难以捉摸的语境中悄悄产生的临时对象 - 因为函数调用就有可能抛出异常。”

Herb写这段话的目的是为了说明在C++中写异常安全或者异常中立的代码,你必须小心分析那些语句有可能抛出异常,而一个模版代码中的大部分语句都十分有可能是一个函数调用,而函数调用就有可能抛出异常,最后剩下给你的确定不会抛出异常的语句会非常的少… … 如果你没有做好这样的心理预期,想当然的认为大多数语句都不会抛出异常,那么你被 surprise的几率就会非常之高 … …

Advertisements