从 C++ 到 Java,显而易见的未解决问题是为什么 Java 不包含运算符重载?
不是Complex a, b, c; a = b + c;比 简单得多Complex a, b, c; a = b.add(c);吗?
Complex a, b, c; a = b + c;
Complex a, b, c; a = b.add(c);
是否有一个已知的原因,不允许运算符重载的有效 参数 ?原因是随意的,还是被时间遗忘了?
假设您想覆盖由 引用的对象的先前值a,则必须调用成员函数。
a
Complex a, b, c; // ... a = b.add(c);
在 C++ 中,此表达式告诉编译器在堆栈上创建三 (3) 个对象,执行加法,并将结果值从临时对象 复制 到现有对象a中。
但是,在Java中,operator=引用类型不进行值复制,用户只能创建新的引用类型,而不能创建值类型。因此,对于名为 的用户定义类型Complex,赋值意味着复制对现有值的引用。
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=执行引用复制,因此a和b现在引用相同的值。结果,比较将产生“相等”,因为对象将与自身比较相等。
b
副本和引用之间的区别只会增加运算符重载的混乱。正如@Sebastian 提到的,Java 和 C# 都必须分别处理值和引用相等——operator+可能会处理值和对象,但operator=已经实现处理引用。
operator+
在 C++ 中,您一次应该只处理一种比较,这样可以减少混乱。例如, onComplex和operator=都operator==在处理值——分别复制值和比较值。
operator==