从《编程的未来》这篇文章想到C++和Java语言的爽与不爽

 从编程的未来这篇文章http://utensil.iteye.com/blog/367415 想到C++和Java语言的爽与不爽:

事实上Java的面向对象模型要比C++要好,C++是一个追求效率而不惜牺牲其他空间和优美方面的语言。
一、C++没有interface的概念,这是面向对象概念的很大的一个缺失,当然纯抽象类就是interface,但至少是概念上的一种缺失。因为interface和抽象类在面向对象中是完全不同
的概念,设计的目的也不同,抽象类是为了别人继承,而接口一种契约和规范。
二、C++的继承体系不够完善。C++在每个对象中安插一个指向虚函数表的指针来完成多态,实则是以空间换时间的做法。而Java有着完善的继承体系的实现,查找方法通过super指针遍历类体系结构,这是大多数语言采用的方法。C++这种做法导致类继承函数隐藏的诡异行为(子类一个不同方法签名相同方法名的方法会隐藏掉继承下来父类的方法),实在不爽。
另一方面C++缺少单根继承(Java的所以类的根都是Object),这其实也是面向对象概念的一个缺失,一切都是对象。这样一些类就没有了一个统一的约束。
三、C++引用这个东西的名字几乎起错了,实际应该叫别名,而不是到处都在说引用就是别名这个东东。引用这个词与大多数语言语义都不同。
四、C++显式对象存在(Java中的对象都不是显式的,是由引用持有的,你看到的都是引用)只会导致误用,由此导致对象的无味拷贝。从而引出像拷贝构造函数,以及引用传递的复杂概念来支持和避免带来的问题。这当然是C++不得不做的,因为class的概念根深与struct,指针的作用指出也必须是这些显式存在才会发挥作用。
五、C++拷贝构造函数,对指针成员深拷贝无能为力,需要手写虚clone方法实现prototype模式,并且没有同一个一个约束,如果原来没实现,使用它作为成员指针的类深拷贝是无能为力,这样是缺少单根继承所造成的后果。而这一切Java都是内置的。
六、C++的异常很不成体系,使用起来让人觉的很是不爽。
七、C++缺少反射机制,这点对使他真正的成为“静态语言”,许多更优雅的框架设计从此离他远去。
其他方面:
八、C++的多维数组作为传递一直很无奈,而Java则足够智能。
九、C++的返回函数内的对象一直没有很好的解决方法。局部对象直接返回造成无意义的拷贝,返回地址则因失去作用范围而无效,使用new在堆中申请需要让别人去delete,而这使用者可能一无所知。使用智能指针,让人阅读代码痛苦不堪,我曾读过Firefox源代码全是智能指针,导致Eclipse ctrl快捷键阅读代码完全失效。这就是托管语言,垃圾回收爽的地方,从而带来代码上的优雅。
九、C++的string和char *不能自动相互转化这点非常不爽。
十、C++的stl库设计缺少和向数组这样基本结构转换的接口。以及一些容器设计不够优雅,
如map的count,find这个函数名字叫的莫名其妙。
十一、其实大量的程序员不会使用C++的const,由此造成传递参数的时候,如果没有参数没有const修饰,而无法传递常量的困苦。以及其他赋值方面没有一个约束机制,例如char *s = "abcd";很自然的一个语法却潜藏阴险的问题。
当然Java也有一些ugly的语法,例如不支持默认参数,泛型是一种擦拭机制。但基本上Java是在去除C++语法的复杂性和糟粕的东西,而吸取了其精华的部分,让你远离了危险的代码而保持健壮性。

 

写道
C++是设计模式最好的描述语言,我看到许多书用Java这种先天不足的语言来描述设计模式,就觉得别扭

 


我倒和你有相反的想法,C++描述设计模式要考虑的C++语言的语法的太多,而Java则简单明了的表明了意图。

写道
Java使OO的一切都变得不再美妙,使一切变得麻烦,这就是我们为所谓的简化付出的代价。

 


我不知道有哪些不美妙的地方。至少我感觉Java的OO机制要比C++美妙的多,C++在向下兼容c的面向过程和一切以效率为目标,以及在stl试图得到使用函数式语言的美妙感觉而背弃面向对象的方法,让它变得不伦不类。

写道
静态语言不能丢失指针,不能丢失引用

 
Java的引用就是安全的指针,在面向对象语言中,指针的++,--操作不仅危险而且显得很别扭,C++引用其实是一种在提供一种防止大对象拷贝的方法,而Java完全不会有大对象拷贝的情况,而引用的副作用可怕的很。在引用传递的时候,形参的突然改成别的对象的别名,
实参的引用仍然很无辜的以为还在是原来那个对象的别名,虽然可以加上const T &t来限制这个东西。C++给程序员的责任太多,我每次写C++代码的时候都要小心翼翼,不是在考虑设计而是在考虑细微的语法所带来的别人如何使用问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值