从 C++ 到 Java,明显没有答案的问题是为什么 Java 不包括运算符重载?
不是Complex a, b, c; a = b + c;
比 Complex a, b, c; a = b.add(c);
简单得多?
是否有一个已知的原因,不允许运算符重载的有效参数?原因是武断的,还是时间错了?
假设您想覆盖 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=
执行引用复制,所以
a
和
b
现在指的是相同的值。结果,比较将产生“相等”,因为对象将与自身相等。
副本和引用之间的差异只会增加运算符重载的困惑。正如@Sebastian 提到的,Java 和 C# 都必须分别处理值和引用相等性 --
operator+
可能会处理值和对象,但
operator=
已经实现来处理引用。
在 C++ 中,您应该一次只处理一种比较,这样就不会那么困惑。例如,在
Complex
,
operator=
和
operator==
都在研究值——分别复制值和比较值。
我是一名优秀的程序员,十分优秀!