gpt4 book ai didi

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

转载 作者:bug小助手 更新时间:2023-10-28 01:31:09 25 4
gpt4 key购买 nike

从 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=执行引用复制,所以 ab现在指的是相同的值。结果,比较将产生“相等”,因为对象将与自身相等。

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

在 C++ 中,您应该一次只处理一种比较,这样就不会那么困惑。例如,在 Complex , operator=operator==都在研究值——分别复制值和比较值。

关于java - 为什么 Java 不提供运算符重载?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/77718/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com