下面这句话如何理解?操作符重载在C++中却是必须的,因为在C++中有栈分配,同时又有堆上的分配,你只有通过重载好操作符来处理好不同类型的内存分配,并保证不会产生内存泄漏。但Java只有一种内存分配和垃圾回收机制,这样操作符重载在Java中就变得多余
(见:http://blog.csdn.net/haoel/archive/2009/03/22/4015361.aspx)

解决方案 »

  1.   

    楼主可以参考一下文章:
    http://blog.csdn.net/sky04/archive/2009/02/06/3865891.aspx虽然里面有部分说法我认为不是很准确。
      

  2.   

    已结,见C++论坛的帖子 :)http://topic.csdn.net/u/20090527/14/db79a70f-1416-441f-81a7-00eae3510a0a.html?1213866189
      

  3.   

    不大能认同。Bruce Eckel 的观点就是操作符重载只是"语法糖",好玩但没用,是不必要的(《Think in C++》)。操作符重载跟堆栈,一个是语言的实现,一个是操作系统的内存管理机制,完全风马牛不相及。操作符重载仅仅是函数调用的另一种写法,每一种操作符重载都可以等价的替换成函数调用,并且在内部实现上也就是函数调用。因此完全没有他,c++的世界也照样运转。只不过把函数调用写成操作符,很好玩,看上去也简洁漂亮,但仅此而已!
      

  4.   

    "因为在C++中有栈分配,同时又有堆上的分配“这句话尤其古怪,不知从那儿出来的。堆栈是操作系统的内存管理机制,windows,linux都有这么一套的东西,管你什么语言写的程序,c,c++,还是delphi。跑在不管是windows,还是linux操作系统上就都有这种内存管理机制。大约java只跑在java虚拟机上,或许没有这套机制吧。
      

  5.   

    看了一下楼主引用的原文,呃,还真是......首先呢,我觉得Bruce Eckel在写博客的时候,有点随心所欲,言辞不太严谨。 因为很显然,堆栈跟C++完全扯不到一块儿去。不过考虑到他当时谈论的是c++和java的对比问题,从那个语义环境来看,也不能完全说错。但是这句话要单独抽离出来,就错的厉害了。原因楼上我说过了。
    看看他的原话:It also fooled the Java designers who didn't understand C++ well enough. For example, they thought operator overloading was too hard for programmers to use properly. Which is basically true in C++, because C++ has both stack allocation and heap allocation and you must overload your operators to handle all situations and not cause memory leaks. 他说的是你必须(must)用操作符重载来解决内存分配问题。着重点是要解决内存分配问题,并不能以此说操作符重载是必须的。中文的翻译大约是机器翻译的,意思有曲解。凭空冒出了“操作符重载在C++中却是必须的”这一论断。
      

  6.   


    堆栈和C++并不是没有关系的,C/C++的确需要考虑内存在堆上分配还是在栈上分配等问题,并且其函数调用、临时对象都是使用的栈机制,而new、malloc等是使用的堆机制。这个是和操作系统的内存管理不同层次的东西,每个层次上有自己的机制。“操作符重载仅仅是函数调用的另一种写法”,这一点完全同意。
    更严格的说法也许是,操作符重载有很多作用,控制内存分配(主要是类的深拷贝和浅拷贝)是其中一种作用。
      

  7.   

    如果你能很好的理解堆和栈的数据,new分配的,合理的delete了,也不一定要自己重载
      

  8.   

    我说没关系是因为完全是不同层面的东西。或者是堆栈不是c/c++的范畴,而是操作系统的内存管理机制的。不单单是c/c++,只要是编译跑在操作系统上的,不管是c/c++还是pascal/delphi,甚至于汇编,都一样需要利用到操作系统的堆栈机制。c/c++不可能脱离操作系统的堆栈机制,并不能说堆栈机制就是c/c++的了。我看到楼主另一个同名的帖子,里面有一个观点也有点误导性。 就是认为 operator = 必须被使用以避免 对象拷贝的问题。其实是不必的。拷贝对象有特定的拷贝构造函数。 operator = 也不过是参数化构造函数的另一种写法。 至于深拷贝浅拷贝,是拷贝构造函数的意义所在,也跟操作符重载没有必然关系。
      

  9.   


    再争论下去没什么意义了,呵呵。
    是否是使用operator =,还是自己写函数来实现深浅拷贝,只是方式问题。根据个人喜好或习惯,爱怎样用怎样用,只要确保内存上的操作是正确,没有泄露或重复引用等问题就ok。
    本帖原义只是一时对所引用的那句话没回过神来,结合各位的回文也基本弄清楚了。It's enough :)