`

c++的缺点

    博客分类:
  • C++
阅读更多
从编程的未来这篇文章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++代码的时候都要小心翼翼,不是在考虑设计而是在考虑细微的语法所带来的别人如何使用问题。

分享到:
评论
1 楼 Durian 2010-02-26  
很有用的东东

相关推荐

    C++的缺陷与不足

    这是一篇论文,5页,详细论述了C++的不足之处,比一般的博客要规范的多,也深刻的多。学习C++的好素材。

    Effective Modern C++:改善C++11和C++14的42个具体做法(中文版 + 英文版)

    《Effective Modern C++:改善C++11和C++14的42个具体做法(影印版)(英文版)》中包括以下主题:剖析花括号初始化、noexcept规范、完美转发、智能指针make函数的优缺点;讲解std∷move,std∷forward,rvalue引用和...

    C++单元测试三大框架的比较

    缺点: C++单元测试三大框架的比较软件测试 1、TUT 结构框架简单。添加新的测试工作量小;无须注册测试;可移植性好(因其只需两个头文件,就可以完成测试工作);便于装卸;提供接口可以扩展其输出方式等。 最大的...

    DEV C++.zip 资源下载 适合C/C++初学者

    Dev-C++(或者叫做 Dev-Cpp)是 Windows 环境下的一个轻量级(适合C/C++初学者) C/C++ 集成开发环境(IDE)。...Dev-C++ 的缺点是:它并没有完善的可视化开发功能,所以不适用于开发图形化界面的软件。

    Effective Modern C++学习笔记

    《Effective Modern C++:改善C++11和C++14的42个具体做法(影印版)(英文版)》中包括以下主题:剖析花括号初始化、noexcept规范、完美转发、智能指针make函数的优缺点;讲解std∷move,std∷forward,rvalue引用和全局...

    使用 C++ 编写内核模式驱动程序的优点与缺点.mht

    使用 C++ 编写内核模式驱动程序的优点与缺点.mht

    Effective Modern C++

    《Effective Modern C++:改善C++11和C++14的42个具体做法(影印版)(英文版)》中包括以下主题:剖析花括号初始化、noexcept规范、完美转发、智能指针make函数的优缺点;讲解std∷move,std∷forward,rvalue引用和全局...

    4、c语言和c++和Python-和Java优缺点.pdf

    4、c语言和c++和Python-和Java优缺点 4、c语言和c++和Python-和Java优缺点

    《C++编程艺术》教程+代码

    非常优秀的C++教材,并且附有源码。 目 录 第1章 C++的功能 1 1.1 简洁而丰富的语法 1 1.2 功能强大的库 2 1.3 STL 2 1.4 程序员控制一切 3 1.5 细节控制 3 1.6 运算符重载 3 1.7 一种简洁精练的对象模型 4 1.8 C++...

    布隆过滤器之C++实现

    C++实现的布隆过滤器,其中使用到的bitset也是自己简单实现的一个BitContainer。可以处理千万条到亿条记录的存在性判断。做成dll可以在很多场合使用,如自己写爬虫,要判断一个url是否已经访问过,判断一个单词是否...

    谷歌 B-Tree C++ 模板库.

    谷歌开源团队同时也表示,C++ B-tree容器也不是没有缺点,与标准STL容器不同的是,修改C++ B-tree容器,会令所有未在该容器中的迭代器失效。出于这个原因,谷歌在该库中还增加了一个“安全”容器版本,安全容器中的...

    本资源为python和C++联合编程的示例vs工程源码,为g2o的ba优化程序 供参考

    然而,这两种语言各有优劣,因此将它们结合起来使用可以发挥它们的优点,同时弥补它们的缺点。在本文中,我们将介绍如何在 Windows VS 环境下使用 pybind11 进行 C++ 和 Python 联合编程示例,进行机器视觉和相机...

    C++数据结构知识点与经典算法整理

    11、数组和链表的优缺点 42 12、C++操作符优先级: 43 13、B树、B-树、B+树、B*树、红黑树和trie树 44 14、最小生成树算法之Prim算法(C++实现) 49 15、最小生成树之kruskal算法 58 16、单源最短路径 62 三、算法部分 ...

    fackbook 将php转c++ 代码

    随着 Ajax技术的广泛采用,加上SNS对动态要求较高,这些缺点更显得突出。对于每月超过4000亿次PV的Facebook来说,如何实现扩展,尤其具有挑战性。 常见的办法是直接用C++重写PHP应用中比较复杂的部分,作为PHP扩展...

    C++常用开发工具介绍

    里面详细介绍C++的使用工具有哪些,各自的优缺点。

    Dev-C++编程

    Dev-C++是一个Windows环境下C/C++的集成开发环境(IDE),它是一款自由软件,遵守GPL许可协议分发源代码。它集合了MinGW等众多自由软件,并且可以取得最新...Dev-C++是NOI、NOIP等比赛的指定工具,缺点是Debug功能弱。

    CC++ 集成开发环境(IDE) DEV-C++ 5.11.0 中文免费版.zip

    Dev-C++是NOI、NOIP等比赛的指定工具,缺点是Debug功能弱。 C/C++ 集成开发环境(IDE) DEV-C++ 中文版C/C++ 集成开发环境(IDE) DEV-C++ 中文版 Dev-C++使用MingW64/TDM-GCC编译器,遵循C++ 11标准,同时兼容C++98...

    vim配置文件(针对c和c++编程)

    2、原配置在编程中有如下缺点:小括号无法自动完成匹配;双引号和单引号无法跳出。 3、新配置加入了最新的auto-pairs插件,成功的解决了原版本的括号和引号的问题。为区别原配置,在文件名中加入了fish以示版本区别...

    基于C++CORBA高级编程

    本书的独到之处在于它不仅介绍概念及资源,更重要的是讲述超越API的CORBA内部机制、各种设计方案及其优缺点,还有不少令你少走弯路的技巧和建议,此外提供实际开发细节的代码实例。本书是一本使用C++编写CORBA应用...

    课程设计-基于C++的仓库管理系统(源码+报告).7z

    一直以来人们使用传统人工的方式管理仓库中的各种物资设备,这种管理方式存在着许多缺点,如:效率低、另外时间一长,将产生大量的文件和数据,这对于查找、更新和维护都带来了不少的困难。 通过该题目的设计,培养学生...

Global site tag (gtag.js) - Google Analytics