下面这句话如何理解?操作符重载在C++中却是必须的,因为在C++中有栈分配,同时又有堆上的分配,你只有通过重载好操作符来处理好不同类型的内存分配,并保证不会产生内存泄漏。但Java只有一种内存分配和垃圾回收机制,这样操作符重载在Java中就变得多余
(见:http://blog.csdn.net/haoel/archive/2009/03/22/4015361.aspx)
(见:http://blog.csdn.net/haoel/archive/2009/03/22/4015361.aspx)
http://blog.csdn.net/sky04/archive/2009/02/06/3865891.aspx虽然里面有部分说法我认为不是很准确。
看看他的原话: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++中却是必须的”这一论断。
堆栈和C++并不是没有关系的,C/C++的确需要考虑内存在堆上分配还是在栈上分配等问题,并且其函数调用、临时对象都是使用的栈机制,而new、malloc等是使用的堆机制。这个是和操作系统的内存管理不同层次的东西,每个层次上有自己的机制。“操作符重载仅仅是函数调用的另一种写法”,这一点完全同意。
更严格的说法也许是,操作符重载有很多作用,控制内存分配(主要是类的深拷贝和浅拷贝)是其中一种作用。
再争论下去没什么意义了,呵呵。
是否是使用operator =,还是自己写函数来实现深浅拷贝,只是方式问题。根据个人喜好或习惯,爱怎样用怎样用,只要确保内存上的操作是正确,没有泄露或重复引用等问题就ok。
本帖原义只是一时对所引用的那句话没回过神来,结合各位的回文也基本弄清楚了。It's enough :)