Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/124.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java不包括运算符重载(至少对于赋值)的一个更根本的原因是什么? 参考java java()中没有操作符重载的事实,并从许多强C++年到java,我想知道是否有更基本的原因,运算符重载不是Java语言的一部分,至少在赋值的情况下,而该链接中评分最高的答案则位于答案底部(即,这是詹姆斯·戈斯林的个人选择) 具体而言,考虑赋值。 // 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; }_Java_C++_Operator Overloading - Fatal编程技术网

Java不包括运算符重载(至少对于赋值)的一个更根本的原因是什么? 参考java java()中没有操作符重载的事实,并从许多强C++年到java,我想知道是否有更基本的原因,运算符重载不是Java语言的一部分,至少在赋值的情况下,而该链接中评分最高的答案则位于答案底部(即,这是詹姆斯·戈斯林的个人选择) 具体而言,考虑赋值。 // 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; }

Java不包括运算符重载(至少对于赋值)的一个更根本的原因是什么? 参考java java()中没有操作符重载的事实,并从许多强C++年到java,我想知道是否有更基本的原因,运算符重载不是Java语言的一部分,至少在赋值的情况下,而该链接中评分最高的答案则位于答案底部(即,这是詹姆斯·戈斯林的个人选择) 具体而言,考虑赋值。 // 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; },java,c++,operator-overloading,Java,C++,Operator Overloading,但是,在Java中,行myRef=myObj2(假设前一行中的myRef声明是myClass myRef=myObj1,这是Java所要求的,因为所有这些变量都自动地是Java样式的“引用”)行为非常不同-它不会导致myObj1.x改变,并且输出会 myObj1.x = 1 myObj2.x = 2 < C++和java之间的这种差异导致我认为java中操作符重载的缺乏,至少在赋值的情况下,不是詹姆斯·高斯林的“个人选择”,而是java语法的根本必要性,它把所有的对象变量当作引用。(即MyCl

但是,在Java中,行
myRef=myObj2
(假设前一行中的
myRef
声明是
myClass myRef=myObj1
,这是Java所要求的,因为所有这些变量都自动地是Java样式的“引用”)行为非常不同-它不会导致
myObj1.x
改变,并且输出会

myObj1.x = 1
myObj2.x = 2
< C++和java之间的这种差异导致我认为java中操作符重载的缺乏,至少在赋值的情况下,不是詹姆斯·高斯林的“个人选择”,而是java语法的根本必要性,它把所有的对象变量当作引用。(即
MyClass myRef=myObj1
myRef
定义为Java风格的引用)我这样说是因为如果Java中的赋值导致左侧引用引用引用不同的对象,而不是允许对象本身更改其值,那么似乎不可能提供重载赋值运算符


换句话说,这不仅仅是一个“选择”,甚至不可能“屏住呼吸”希望它能被引入,正如前面提到的高评分答案(接近尾声)所述。引用:“现在不添加它们的原因可能是内部政治、对该功能的过敏、对开发人员的不信任(你知道,破坏者)、与以前的JVM的兼容性、编写正确规范的时间等等。因此,不要屏息等待该功能。“这并不能解释为什么他们不能允许其他操作符重载,比如
+
-
。考虑到James Gosling设计了Java语言,他说这是他个人的选择,他在你链接的问题中详细解释了这一点,我想这就是你的答案:

<> P>有一些事情我觉得很累,比如操作符重载。我把运算符重载作为一个个人的选择,因为我看到过很多人在C++中滥用它。我花了很多时间在过去的五到六年里,观察人们关于操作符重载的事情,这真的很有趣,因为你得到了CUMU。nity分为三部分:大约20%到30%的人认为运算符重载是魔鬼的产物;有人做了一些运算符重载的事情,这让他们非常生气,因为他们使用like+来插入列表,这让生活变得非常非常混乱。很多问题都源于此事实上,只有大约六个操作符你可以合理地重载,但是有成千上万的操作符人们想要定义——所以你必须选择,而且选择往往与你的直觉相冲突。然后有大约10%的社区实际使用了操作符重载正确地说,谁真正关心它,对谁来说它真的很重要;这几乎完全是做数字工作的人,其中符号对于吸引人们的直觉非常重要,因为他们带着对+的含义的直觉,以及说“a+b”的能力其中a和b是复数或矩阵,或者一些真正有意义的东西。当你谈到乘法时,你会有点动摇,因为实际上有多种乘法运算符——向量积和点积,它们在本质上是非常不同的。但是只有一种运算符,你怎么办这两个阵营都是两极,然后在60个百分点的中间有这样一个混血儿,不管是哪种方式,他们都不太关心。人们认为操作员超载是个坏主意,只是从我非正式的统计抽样来看,明显更大,当然更具说服力。一个数字的家伙。所以,考虑到今天的情况,语言中的一些特性是由社区投票决定的——它不仅仅像一些小的标准委员会,它真的是大规模的——很难让操作符过载。但它让这个由相当重要的人组成的社区变成了托塔这是公地问题悲剧的一种味道


更新:Re:您的附录、其他赋值运算符
+=
-=
等也将受到影响。您也不能编写类似
无效交换(int*a、int*b)的
交换
函数

和其他的东西。

为什么C++语言中操作符重载被滥用的原因是因为它的特性太复杂了。这里有一些复杂的方面:

  • 表达式是一棵树
  • 运算符重载是这些表达式的接口/文档
  • 接口在c中基本上是不可见的++
  • 自由函数/静态函数/友元函数在C语言中是一团混乱++
  • 功能原型已经是复杂的特性
  • 运算符重载的语法选择不够理想
  • C++语言中没有其他可比的API
  • 用户定义的类型/函数名的处理方式不同于函数原型中的内置类型/函数名
  • 它使用高等数学,比如
    myObj1.x = 1
    myObj2.x = 2
    
    class A { friend void f(); }; class B { friend void f(); }
    void f() { /* use both A and B members inside this function */ }
    
    class A { static void f(); }; void f() { /* use only class A here */ }
    
    class A { }; void f() { /* you have no special access to any classes */ }
    
      ostream &operator<<(ostream &o, std::string s) { ... } // inside stdlib
      int main() { std::cout << "Hello World" << std::endl; }
    
    int main() {
       type a(1), b(2);
       type *pa = &a, *pb = &b;
       pa = pb;
       // a is still 1, b is still 2, pa == pb == &b
    }
    
    Type a = new Type(1);
    Type b = new Type(2);
    a = b;                 // dispatched to Type.operator=( Type )??
    a.foo();
    a = new Type(3);       // do you want to copy Type(3) into a, or work with a new object?