答C++复杂多余者之惑
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++复杂多余者之惑的更多相关文章
- Java进阶(二十)解疑答惑之何时字符串才算真正为空?
解疑答惑之何时字符串才算真正为空? 在一次编码过程中,有一个现象一直困扰着自己,经过后台的不断调试,才发现原来有时候字符串的空非空.测试代码如下: // medname可为药品名称或药品ID Stri ...
- vue computed计算属性和watch监听属性解疑答惑
computed计算属性 计算属性类似于方法,用于输出data中定义的属性数据的结果,data数据变化时,计算属性的结果会同步变化,需要注意的是计算属性不可与data定义的属性同名. 相比于方 ...
- OpenGL快问快答
OpenGL快问快答 本文内容主要来自对(http://www.opengl.org/wiki/FAQ)的翻译,随机加入了本人的观点.与原文相比,章节未必完整,含义未必雷同,顺序未必一致.仅供参考. ...
- python实用小技巧自问自答系列(一):查看类中函数文档doc的方法
问题:如何查看某个类的方法文档说明或者是函数的参数列表情况? 答: 方法一:直接在需要查询的方法后面加上".__doc__"即可以打印出该方法的文档说明(需要先导入该方法所属模块) ...
- NIO的一坑一惑小记
前言 不知不觉,已那么长时间没有更新东西了,说来真是汗颜啊.(主要是最近在技术上豁然开朗的感觉越来越少了-_-|||) 最近一直在学习Linux相关的东西.又一次接触到了I/O复用模型(select/ ...
- SCI答复审稿人的策略和答复信的写作技巧
SCI论文被录用的最后一步 –---答复审稿人的策略和答复信的写作技巧 [好文转载] : 一篇稿子从酝酿到成型历经艰辛,投出去之后又是漫长的等待,好容易收到编辑的回信,得到的往往又是审稿人不留情面的一 ...
- STM32学习笔记(六) SysTick系统时钟滴答实验(stm32中断入门)
系统时钟滴答实验很不难,我就在面简单说下,但其中涉及到了STM32最复杂也是以后用途最广的外设-NVIC,如果说RCC是实时性所必须考虑的部分,那么NVIC就是stm32功能性实现的基础,NVIC的难 ...
- [python]自问自答:python -m参数?
python -m xxx.py 作用是:把xxx.py文件当做模块启动 但是我一直不明白当做模块启动到底有什么用.python xxx.py和python -m xxx.py有什么区别! 自问自答: ...
- Android View事件机制 21问21答
原文: http://www.cnblogs.com/punkisnotdead/p/5179115.html#3358859 1.View的坐标参数 主要有哪些?分别有什么注意的要点? 答:Left ...
随机推荐
- 「新手向」koa2从起步到填坑
前传 出于兴趣最近开始研究koa2,由于之前有过一些express经验,以为koa还是很好上手的,但是用起来发现还是有些地方容易懵逼,因此整理此文,希望能够帮助到一些新人. 如果你不懂javascri ...
- 页面报错Uncaught SyntaxError: Unexpected identifier
错误描述:未捕获的语法错误:意想不到的标识符. 如图所示:检查之后发现是页面js内缺少“,”引起的.添加之后就OK了.
- Unity3D研究院之Assetbundle的原理(六十一)
www.xuanyusong.com/archives/2373 Assetbundle 是Unity Pro提供提供的功能,它可以把多个游戏对象或者资源二进制文件封装到Assetbundle中,提供 ...
- 3、Selenium调用IEDriverServer打开IE浏览器
学习Selenium时若想调用IE浏览器,均需要以下步骤 (1).http://selenium-release.storage.googleapis.com/index.html 下载IEDrive ...
- QString 乱谈(1)
一个月前尝试写了一篇关于QStringLiteral,存盘时MoinMoin罢工了.吸取一点经验,还是写成短篇吧 可是,可是,QString不就是简简单单一个字符串么?能有什么可谈的.真的么... ( ...
- Oracle 文件
参数文件 跟踪文件 告警文件 数据文件 临时文件 控制文件 重做日志文件 密码文件 闪回日志 dum文件 数据泵文件 1参数文件 Parameter file:告诉oracle实例在那里可以找到控制文 ...
- C语言学习笔记--#和##操作符
1. #运算符 (1)#运算符用于在预处理期将宏的参数转换为字符串 (2)#的转换作用是在预处理期完成的,因此只在宏定义中有效,即其他地方不能用#运算符 (3)用法:#define STRING(x) ...
- DAY11-MYSQL单表查询
一 单表查询的语法 SELECT 字段1,字段2... FROM 表名 WHERE 条件 GROUP BY field HAVING 筛选 ORDER BY field LIMIT 限制条数 二 关键 ...
- DAY3-python函数
目录 一.了解函数 二. 函数定义 三.函数使用原则:先定义,后调用 四.定义函数的三种形式 五.函数的调用 六.函数的参数 七. 函数对象 八.函数嵌套 九.名称空间与作用域 十. 闭包函数 十一. ...
- vesamenu.c32:not a COM32R image报错解决方案
今天用U盘刻录安装Linux Mint 的时候,一直出现 vesamenu.c32:not a COM32R image这个报错,查了很久,原因好像是电脑是老电脑的原因.处理的办法很简单,只需要输入l ...