一个更基本的原因Java不包括运算符重载(至少对于赋值)?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了一个更基本的原因Java不包括运算符重载(至少对于赋值)?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2712字,纯文字阅读大概需要4分钟。
内容图文
![一个更基本的原因Java不包括运算符重载(至少对于赋值)?](/upload/InfoBanner/zyjiaocheng/748/98dc96d237d742dc9b279b4a1c9562df.jpg)
关于Java(Why doesn’t Java offer operator overloading?)中没有运算符重载这一事实的讨论已经有两年了,并且我自己经历了很多C年的Java,我想知道运算符重载是否不是一部分的根本原因Java语言,至少在分配的情况下,而不是答案底部附近的最高评级答案(即James Gosling的个人选择).
具体来说,考虑分配.
// C++
#include <iostream>
class MyClass
{
public:
int x;
MyClass(const int _x) : x(_x) {}
MyClass & operator=(const MyClass & rhs) {x=rhs.x; return *this;}
};
int main()
{
MyClass myObj1(1), myObj2(2);
MyClass & myRef = myObj1;
myRef = myObj2;
std::cout << "myObj1.x = " << myObj1.x << std::endl;
std::cout << "myObj2.x = " << myObj2.x << std::endl;
return 0;
}
输出是:
myObj1.x = 2
myObj2.x = 2
然而,在Java中,行myRef = myObj2(假设前一行中myRef的声明是myClass myRef = myObj1,因为Java需要,因为所有这些变量都是自动Java样式的’引用’)表现得非常不同 – 它不会导致myObj1.x改变,输出将是
myObj1.x = 1
myObj2.x = 2
C和Java之间的这种差异使我认为Java中缺少运算符重载,至少在赋值的情况下,不是James Gosling的“个人选择问题”,而是Java的基本必要性.将所有对象变量视为引用的语法(即MyClass myRef = myObj1将myRef定义为Java样式引用).我这样说是因为如果Java中的赋值导致左侧引用引用不同的对象,而不是允许对象本身改变其值的可能性,那么似乎不可能提供重载的赋值运算符.
换句话说 – 它不仅仅是一种“选择”,甚至没有“屏住呼吸”的可能性,希望它会被引入,因为前面提到的高评价答案也说明了(接近结束).引用:“现在不添加它们的原因可能是内部政治,对功能的过敏,对开发人员的不信任(你知道,破坏者),与以前的JVM的兼容性,编写正确规范的时间等等.所以不要屏住呼吸等待这个功能.“ < - 所以这是不正确的,至少对于赋值运算符:没有运算符重载(至少对于赋值)的原因是Java本质的基础. 这是我的正确评估吗? 附录 假设赋值运算符是一个特殊情况,那么我的后续问题是:是否有任何其他运算符,或者更普遍的任何其他语言特性,必然会以与赋值运算符类似的方式受到影响?我想知道Java和C之间关于变量作为值/引用的差异有多深.也就是说,在C中,变量标记表示值(并注意,即使变量标记最初被声明为引用,它仍然被视为一个基本上在任何地方使用的值),而在Java中,变量标记表示诚实到良好的引用以后使用令牌的地方.
解决方法:
Is this a correct assessment on my part?
一般来说缺乏运算符是“个人选择”. C#是一种非常相似的语言,它允许运算符重载.但你仍然是can’t overload assignment.甚至在参考语义语言中会做什么?
Are there any other operators, or more
generally any other language features,
that would by necessity be affected in
a similar way as the assignment
operator? I would like to know how
‘deep’ the difference goes between
Java and C++ regarding
variables-as-values/references.
最明显的是复制.在引用语义语言中,clone()并不常见,并且根本不需要像String这样的不可变类型.但在C中,默认赋值语义基于复制,复制构造函数非常常见.如果您没有定义,则自动生成.
一个更微妙的区别是,参考语义语言支持RAII比使用值语义语言困难得多,因为对象生命周期更难跟踪. Raymond Chen has a good explanation.
内容总结
以上是互联网集市为您收集整理的一个更基本的原因Java不包括运算符重载(至少对于赋值)?全部内容,希望文章能够帮你解决一个更基本的原因Java不包括运算符重载(至少对于赋值)?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。