小编典典

为什么 Java 不提供运算符重载?

all

从 C++ 到 Java,显而易见的未解决问题是为什么 Java 不包含运算符重载?

不是Complex a, b, c; a = b + c;比 简单得多Complex a, b, c; a = b.add(c);吗?

是否有一个已知的原因,不允许运算符重载的有效 参数 ?原因是随意的,还是被时间遗忘了?


阅读 122

收藏
2022-03-16

共1个答案

小编典典

假设您想覆盖由 引用的对象的先前值a,则必须调用成员函数。

Complex a, b, c;
// ...
a = b.add(c);

在 C++ 中,此表达式告诉编译器在堆栈上创建三 (3) 个对象,执行加法,并将结果值从临时对象 复制 到现有对象a中。

但是,在Java中,operator=引用类型不进行值复制,用户只能创建新的引用类型,而不能创建值类型。因此,对于名为
的用户定义类型Complex,赋值意味着复制对现有值的引用。

改为考虑:

b.set(1, 0); // initialize to real number '1'
a = b; 
b.set(2, 0);
assert( !a.equals(b) ); // this assertion will fail

在 C++ 中,这会复制值,因此比较结果会不相等。在 Java
中,operator=执行引用复制,因此ab现在引用相同的值。结果,比较将产生“相等”,因为对象将与自身比较相等。

副本和引用之间的区别只会增加运算符重载的混乱。正如@Sebastian 提到的,Java 和 C#
都必须分别处理值和引用相等——operator+可能会处理值和对象,但operator=已经实现处理引用。

在 C++ 中,您一次应该只处理一种比较,这样可以减少混乱。例如,
onComplexoperator=operator==在处理值——分别复制值和比较值。

2022-03-16