C和C++有太多的历史包袱而其它语言并没有这些,从另一个角度下来讲C和C++其实就是现代语言的活字典,也是现代软件设计的基础,当然有更古老的语言,但像C和C++影响力这么大的却无其它语言可以出其左右。

C++和其它语言最大的不同在于它不属于任何人,任何公司,而Java,C#,Python,Ruby等都是由某个公司或个人控制的,在相对封闭的体系之下设计的语言很容易可以做到易用性,但灵活性和设计思想的广泛度上与C++这样的语言不可同日而语。且不说其它语言从C/C++中借鉴的大量的特性,单就语言本身能够体现的设计思想广泛性上来讲只能说其它语言只作到了”溺水三千 只取一瓢”,像C++可以支持设计风格就有四种:面向过程、基于对象、面向对象、泛型。今日的C++并不是一开始就这样,最初的C++ 中连stl都没有,stl最初是HP内部开发使用的,后来才加入到标准中去,template技术也是后来加入的,反过来stl又引template的出现作了相应修改。由于C++开放的特性,在其被快速、广泛应用的同时,也出现标准落后于编译器实现的情况,因为业界的需求总是先于标准出现的,而商业化的产品必须满足这种需求。比较具体的例子如早期的VC++ ,在其MFC库中加入了很多现在看来冗余的设计比如说List这样的容器,那是不得已而为之,MFC出现的时候C++本身还不够完善,如此VC++本身就有了另一种历史负担,由于Windows平台在国内事实上的统治地位,造就了大批C++开发从VC++开始的进入这个领域的局面,而由于VC++、MFC本身的实现就不够标准,所以在入门的时候就把人引入了歧途,让学C++的根本没搞清楚到底什么是C什么是C++。大多数人从写界面开始,所以MFC的影响很不好,另一个角度来讲Windows本身所提倡的API风格,编码风格(匈牙利命名法)完全自成一体,与Unix-like这种提倡,简洁、明了的设计风格背后的设计哲学完全不同,但现代软件的历史其实是C/C++和Unix历史,所以在没有搞明白这些之前贸然进入Windows开发领域反而给更多的人造成的更多的困惑,我不是说Windows不好,而是想说不懂Linux、Unix、C/C++,那更不可能真正的搞懂Windows。因为操作系统理论上很多东西都是由unix发展过来的。简单如strcpy这样的C函数和StringCopy这样的函数名称在编码的时候有多少在会去思考它背后的东西呢?

C++样的背景正好和GNU以及互联网的发展过程相切合,从软件工程的角度来讲正如《人月神话》所说,C++实际上和Linux一样,是在一种“大集市”的模式下产生的,从而产生了类似Linux的问题,灵活、强大,但进入的门槛比较高。各种思想在C++ 中全面开花造成C++本身强大的同时复杂度也飙升。但就像Unix-like OS使用一样,他就是面向技术人员的,而且面向的是喜欢技术的人员,如果你是个比较懒的技术人员那么C/C++绝不适合你,因为它在不停的发展,也有浩瀚如海的思想和技巧在里面,不时常的琢磨是绝对用不好的。

C++中异常的处理之所以不如Java这样的语言完善,是因为操作系统的限制,真正的异常处理机制完全是由操作系统提供的,在各种平台的差异下编译器没有办法作到面面俱到,而Java之所以可以做的更好,之是因为有JVM的存在,C++编译器不能代替操作系统的工作,但JVM却可以胜任这个角色。

至于大而全的库,C++发展至念已经有很多不错的库了,比如说boost,poco,正因为很多人没搞清楚c/c++是什么,还在思想的混乱中纠结就更不可能对库有更准确的看法了。如果你真的在使用C++那么学习使用好的库如boost,那么价值远大于去学习另一门语言。

答C++复杂多余者之惑的更多相关文章

  1. Java进阶(二十)解疑答惑之何时字符串才算真正为空?

    解疑答惑之何时字符串才算真正为空? 在一次编码过程中,有一个现象一直困扰着自己,经过后台的不断调试,才发现原来有时候字符串的空非空.测试代码如下: // medname可为药品名称或药品ID Stri ...

  2. vue computed计算属性和watch监听属性解疑答惑

    computed计算属性     计算属性类似于方法,用于输出data中定义的属性数据的结果,data数据变化时,计算属性的结果会同步变化,需要注意的是计算属性不可与data定义的属性同名. 相比于方 ...

  3. OpenGL快问快答

    OpenGL快问快答 本文内容主要来自对(http://www.opengl.org/wiki/FAQ)的翻译,随机加入了本人的观点.与原文相比,章节未必完整,含义未必雷同,顺序未必一致.仅供参考. ...

  4. python实用小技巧自问自答系列(一):查看类中函数文档doc的方法

    问题:如何查看某个类的方法文档说明或者是函数的参数列表情况? 答: 方法一:直接在需要查询的方法后面加上".__doc__"即可以打印出该方法的文档说明(需要先导入该方法所属模块) ...

  5. NIO的一坑一惑小记

    前言 不知不觉,已那么长时间没有更新东西了,说来真是汗颜啊.(主要是最近在技术上豁然开朗的感觉越来越少了-_-|||) 最近一直在学习Linux相关的东西.又一次接触到了I/O复用模型(select/ ...

  6. SCI答复审稿人的策略和答复信的写作技巧

    SCI论文被录用的最后一步 –---答复审稿人的策略和答复信的写作技巧 [好文转载] : 一篇稿子从酝酿到成型历经艰辛,投出去之后又是漫长的等待,好容易收到编辑的回信,得到的往往又是审稿人不留情面的一 ...

  7. STM32学习笔记(六) SysTick系统时钟滴答实验(stm32中断入门)

    系统时钟滴答实验很不难,我就在面简单说下,但其中涉及到了STM32最复杂也是以后用途最广的外设-NVIC,如果说RCC是实时性所必须考虑的部分,那么NVIC就是stm32功能性实现的基础,NVIC的难 ...

  8. [python]自问自答:python -m参数?

    python -m xxx.py 作用是:把xxx.py文件当做模块启动 但是我一直不明白当做模块启动到底有什么用.python xxx.py和python -m xxx.py有什么区别! 自问自答: ...

  9. Android View事件机制 21问21答

    原文: http://www.cnblogs.com/punkisnotdead/p/5179115.html#3358859 1.View的坐标参数 主要有哪些?分别有什么注意的要点? 答:Left ...

随机推荐

  1. angular : copy vs extend

    While using AngularJS, we come across some situation in which we need to copy one object to another ...

  2. BZOJ2648:SJY摆棋子

    浅谈\(K-D\) \(Tree\):https://www.cnblogs.com/AKMer/p/10387266.html 题目传送门:https://lydsy.com/JudgeOnline ...

  3. VerilogHDL编译预处理

    编译预处理语句 编译预处理是VerilogHDL编译系统的一个组成部分,指编译系统会对一些特殊命令进行预处理,然后将预处理结果和源程序一起在进行通常的编译处理.以”`” (反引号)开始的某些标识符是编 ...

  4. 【转】Jquery修改image的src属性,图片不加载问题

    1.当点击某一按钮的时候,把图片域中的图片改变一下    <img id="randimg" src="/servlet/CreateValidateNum&quo ...

  5. 关于WinPE安装操作系统

    在WinPE安装操作系统,最好用虚拟光驱打开安装镜像文件,或者把镜像文件解压后直接安装. 最好不要用工具盘里所带的一键安装,复制等等功能,因为这些功能往往会安装一些其他的附带功能,不是清洁版的.

  6. Rozor视图(c#代码与html混合编程原则)

    (1)大括号的匹配原则(就近原则){} (2)html标签有截断c#代码的功能 @*服务器端的注释*@    <!--客户端注释-->

  7. C#实现有向无环图(DAG)拓扑排序

    对一个有向无环图(Directed Acyclic Graph简称DAG)G进行拓扑排序,是将G中所有顶点排成一个线性序列,使得图中任意一对顶点u和v,若边(u,v)∈E(G),则u在线性序列中出现在 ...

  8. UML设计九种图例

    一.作为一种建模语言,UML的定义包括UML语义和UML表示法两个部分. UML语义:描述基于UML的精确元模型定义. UML表示法:定义UML符号的表示法,为开发者或开发工具使用这些图形符号和文本语 ...

  9. 关于使用字库-雅黑字体(msyh.ttf )显示中文的一些。。。

    开发中有关程序在使用字库 雅黑字体的 的时候 vs下一开始没有显示出中文来,都是乱码. 在android下使用该字体库的时候同样也没有显示出中文,后来搜搜了原因,得知编码必须是UTF-8 也就是使用字 ...

  10. JavaScript去除空格的三种方法(正则/传参函数/trim)

    方法一: 个人认为最好的方法.采用的是正则表达式,这是最核心的原理. 其次.这个方法使用了JavaScript 的prototype 属性 其实你不使用这个属性一样可以用函数实现.但这样做后用起来比较 ...