C++和Java区别

来源:互联网 发布:足球关注软件 编辑:程序博客网 时间:2024/05/10 22:33
 
(1)      Java有垃圾回收机制,当然也就没有C++的析构函数。但是,可控制性和C++相比就差了一点,而且也不是说有了垃圾回收,就不会产生内存泄漏。由于相互引用等原因可能造成对象的生存周期过长,垃圾回收失效。对象内存的回收,个人认为应该是由程序员来掌握的事情。C++可以用auto_ptr,shared_ptr等智能指针来完成自动析构,当然前提是你要熟悉他们的实现机制和应用场合
(2)      Java中所有的对象都是分配在堆上,在Java中只有句柄,也就是引用,没有指针。这样做有哪些好处呢? a)没有指针。在java中没有sizeof, 没有*。看看下面这些语句吧,感觉是不是很象。b) 避免了临时对象。在Java中所有的对象都是以句柄表示,函数参数传递,结果返回等都是以句柄形式。也就避免了C++中经常出现的局部指针局部引用问题, 对象参数拷贝赋值,切片等问题,提高了效率和可靠性。
String a = new String(“123”); // Java Code
std::string *a = new string(“123”);  //c++ code
(c) Java中,包含关系只能由句柄表示。
(3) Java是单根继承体系,而C++可以有多重继承。java可以用interface来实现多重继承。来谈谈Java中的Object类,许多有趣的地方。
Clone方法,C++也可以实现,呵呵,虚拟构造函数,参见<<More Effective C++>>
Equals方法, 由于Java中对象只能由句柄表示,又没有C++操作符重载的能力,所以这个来比较等价对象。C++中我们可以重载”==”操作符来判断等价对象。
Finalize方法,呵呵,类似于析构函数,但是千万不要当成析构函数来用哦,这个方法何时调用不是你能把握的,取决于垃圾回收机制
hashCode方法, STL没有HashMap,HashTable等,但是java.util中有,所以…..
剩余的都是满足线程和同步的方法,跟C++没有可比性
(3)      java中数组也是对象,所以当你下标越界的时候,会收到一个异常。而C++数组显然要比Java快点,因为他不检查index
(4)      java中,”123”这种字符串也是对象,而在C++中确是const char*, 最让人范错的是那个字符串结束符。但是javac++对这种const char* 字符去有相同的优化,试试下面的代码:
String a = "123";                             
String b = "123";
if (a == b)
{
   System.out.println("OK");
}
 C++代码:
const char *p = "123";
const char *q = "123";
    if ( q == p)
    {
         std::cout<<"OK"<<std::endl;
    }
(5)     Java中所有的对象方法都是virtual, 除了声明为final的方法。
(6)     没有操作符重载
(7)     语言级的序列化机制, C++也可以实现,呵呵,看看C++高手对话中的,那位用模板模式来实现序列化。
(8)     语言级的线程类极其配套互斥类等
(9)     语言级的异常体系。C++中的异常少的可怜,就STL中那几个,当然C++要的就是高效
(10)  Java反射机制
哎,从反射机制就可以看出来,Java和C++根本就没有可比性嘛。编译器能和平台比吗。那天我在公司论坛上说Java是脚本,别人还一本正经跟我争,我觉得我自己很无聊啊
 
原创粉丝点击