C++真是让人又爱又恨的语言之一。很多人都说C++功能强大,其实很多时候他们都是足够幸运的,没有遇到太多需要用代码杂技解决的需求,或者没有亲身维护太多充满“高技巧”的代码的项目。我都遇到过,所以最后终于决定把Java当作自己的第一语言。C++作为以爱好为主的研究语言了。

  从2004年开始,我就陆续看了一些C++语言的书。学完C语言后,觉得它在某写领域过于中级语言化了,我需要一种更高层的抽象方式,所以决定初探C++。那时也未有学习Java或动态语言的想法。一开始看得是入门级别的《C++ Primer Plus》,流水帐似的把语言的基本功能罗列了一遍,看后没有学到什么思路。其次看了较为全面的《C++ Primer》,这本书又不失深度,讲了一些例如虚函数表,模板参数推导等高级话题。看完觉得挺有用的,自己试着写了一个四则运算表达式解析器,挺满意的。当时尚未有面向对象思想的建立,仍然将C++看待为一个增强版的C工具箱。最后看了两本重量级的知名书,《Effective C++》和《More Effective C++》,讲了很多关于STL的内容,当时的水平接受起来确实有困难,只能说读完了文字,但是没有深入的研究。
  直到最近,同事要写一个游戏编辑器,用到了QT,所以我又重温C++了。这次有了Java语言和面向对象编程的经验,看起来就觉得C++值得深入研究的地方太多了。幸好C++的创始人Bjarne Stroustrup曾经写过一本《C++语言的设计与演化》,正好拿来当我的复习教材。这本1995年的书,16年后的今天读来,仍是让人受益匪浅,尤其是那些和我一样,
  1.仅仅将C++作为一个增强的C语言工具包的人。
  2.将C++作为代码杂技试练场的人。
  3.对C++语言各种功能不能系统掌握的人。
  书中讲到的基本是关于如何设计语言、如何给语言增加新功能、如何标准化一门语言之类的问题。那么,对于我们这些暂时不会设计一门语言,至多设计类库、框架乃至终端应用的人来说,可以学到什么呢?我就择要的列出几个有启发性的章节,与大家探讨。
  第三章谈新功能的采用。作者认为任何人都能找到增加一个新功能的理由,然而这么做是不健康的,因为很难保证和既有功能的连贯性。所以,决定增加新功能时,不能单纯靠貌似合理的理由,而是要建立在深入实验的基础上。
  第六章谈到工程质量与语言是否功能多,无必然联系。工程质量的提升主要应着眼于设计,而不是众多花哨的新功能。
  该章还谈到是否接受一个新功能的标准:1.是否表述精确,大家是否能够理解这个功能;2.这个扩展的道理是什么,我们为什么需要它;3.它是否已经被实现过;4.对既有代码的影响;5.对效率和兼容性带来的影响;6.这个改变如何用文档描述,如何教给大家;7.有没有不引入这个扩展的理由;8.有没有其它去实现这个功能。这些标准对库、框架、应用程序设计者都有参考价值。引入新功能而不破坏既有工程结构的一致性、连贯性,是个很值得下工夫的任务。作者在第九章又重新强调了这一点。
  第八章谈到了尽量避免使用强制类型转换。除了一些系统底层接口,过多的强制类型转换必然会破坏类型系统。
  第九章还谈到C++程序员应该将程序看待为类型、函数、语句的信息集合,而非字符和文件的集合。
  第十四章至第十七章应该细读,这四章分别讲了C++四个重要的语言功能。运行时信息识别(RTTI),模板,异常,命名空间。每一个功能都有一些使用时候的注意事项。例如RTTI不可误用,只有当设计从外部信息源(例如文本文件)中制造对象时,才可以合理的使用。模板可以解决一些对继承的误用。如何在C++的终止式异常处理方式下处理需要重试型的异常情况(例如IO错误)。如何合理利用命名空间减少各种库中名称的冲突,避免污染全局命名空间。这些都是C++程序员经常容易出错的领域,同时也可以给例如博主这种从Java语言出身的人一个通过比较法来学习语言的机会。
  第十八章也即最后一章,讲了宏(macro)的害处。除了#include之外,应尽量避免用宏,因为其可以扰乱开发人员对源代码的理解和维护。尤其是慎用和编译器的实现相关的#pragma。
  综观全书,可以体会到:
  1.C++是一个能非常得体得将功能、设计、运行效率、空间占用等因素平衡的语言。我们这些类库、框架、应用设计者,也要在实际代码中学习这种平衡的技艺。
  2.对于新功能的加入要十分的谨慎和清醒。切忌破坏既有代码、工程、设计的一致性、连贯性、内聚性和可用性。好的工程还是要注重设计。只有功能与设计不脱节,才不会使得过多的新功能难以维护。
  3.对于每一个语言功能的运用,都必须建立在充分理解其设计意图的基础上。RTTI,模板,异常都是非常容易被误用的领域。同理,Java语言的反射,RMI亦然。
  作者用近似编年史的方法回顾了C++主要功能的萌发、构思、实验、实现、应用这一连贯流程,希望大家和我一样,在读这本书的过程中,能够对C++语言本身,C++和其它语言的比较,以及如何接受与设计新功能,新扩展这些问题有一个更深入的瞭解。有很多类似C++这样的全面、高效、功能丰富的语言,如何善用它,如何用这种语言设计出符合其设计哲学的库、框架、应用来,这是我们始终应该思考的话题。
(本文为作者原创,如需转载请联系eastarstormlee@gmail.com或http://weibo.com/eastarlee)

转载于:https://blog.51cto.com/eastarlee/717320

好语言,就该善用它——《C++语言的设计与演化》读书笔记相关推荐

  1. 《编码:隐匿在计算机软硬件背后的语言(Code:The Hidden Language of Computer Hardware and Software)》读书笔记

    声明 该文章是阅读<编码:隐匿在计算机软硬件背后的语言>一书之后整理出的读书笔记.若有错误,还需继续修正与增删. Preface 作者Charles Petzold是Windows编程界的 ...

  2. 啊哈c语言读后感500字,《麦田里的守望者》读后感读书笔记500字五篇

    <<麦田里的守望者>读后感读书笔记500字五篇>由会员分享,可在线阅读,更多相关<<麦田里的守望者>读后感读书笔记500字五篇(5页珍藏版)>请在人人文 ...

  3. 有n个学生选修了c语言程序设计这门课程,C语言程序设计报告学生选修课系统(18页)-原创力文档...

    C 语 言 程 序 设 计 学校: 学院: 班级序号: 学号: :姓名 指导老师: C语言程序设计报告 一.C语言课程设计的目的: 高级语言课程设计是学习完<高级语言程序设计>课程后进行的 ...

  4. c语言 字母 八进制表示'/1011',C语言C语言第一课:C语言概述为什么学习C语言怎样学习C语言.DOC...

    [摘要]C语言 第一课: C语言概述 为什么学习C语言 怎样学习C语言 参考资料 ----------------------------------------------------------- ...

  5. 语言都是相通的,学好一门语言,再学第二门语言就很简单,记录一下我复习c语言的过程。...

    语言都是相通的,学好一门语言,再学第二门语言就很简单,记录一下我复习c语言的过程. 为了将本人的python培训提高一个层次,本人最近买了很多算法的书. 这个书上的代码基本都是c语言实现的,c语言很久 ...

  6. c语言输入后没答案,C语言章节习题及答案(无指针)解读.doc

    C语言章节习题及答案(无指针)解读 <C程序设计>复习题集 第2章 基础概念 一.选择题(在下列各题的A).B).C).D)四个选项中,只有一个选项是正确的) 2.1以下叙述中正确的是 A ...

  7. c语言既适合于开发,C语言试题及答案 (1)

    C语言试题及答案 (1) 文章<C语言试题及答案 (1)>是由[作文仓库]的会员[我这么冷你怕不怕]为大家整理并分享的,仅供大家参考,欢迎阅读! 第1章 C语言概述习题 1. 单项选择题 ...

  8. 学习Unix,可从事什么样的工作(1)《精通Unix下C语言与项目实践》读书笔记(3)...

    <精通Unix下C语言编程与项目实践>读书笔记(new) 文章试读 不拘一个遍程序系列:编程序不能一个脑袋钻到底,有时要学会变通,即所谓的曲线救国.一.二.三.四 职场规划:一些杂七杂八的 ...

  9. 《精通Unix下C语言与项目实践》读书笔记(16)

    <精通Unix下C语言编程与项目实践>读书笔记(new) 文章试读  不拘一个遍程序系列:编程序不能一个脑袋钻到底,有时要学会变通,即所谓的曲线救国.一.二.三.四 职场规划:一些杂七杂八 ...

最新文章

  1. 学界 | 邢波团队提出 contrast-GAN:实现生成式语义处理
  2. LNMP下目录访问验证
  3. cdh5.12.1 service monitor监控状态_来,我们在重新说下,线程状态?
  4. try not let others think you are good enough
  5. Ubuntu 必装软件及安装教程
  6. NSOperationQueue简介
  7. Qt工作笔记-QPlainTextEdit中数据的获取
  8. 嘉峪关计算机网络优化,嘉峪关广播电视大学计算机网络技术专业_甘肃报名_网络教育计算机网络技术专业教学计划_中国教育在线...
  9. 深度学习模型的前馈运算与反馈运算
  10. P2604 [ZJOI2010]网络扩容
  11. Typed DataSet的批量操作优化
  12. JZOJ 4230. 淬炼神体
  13. 【疲劳检测】基于形态学实现疲劳检测matlab源码
  14. 信息安全软考—— 第五章 物理与环境安全技术 学习笔记
  15. 【Lintcode】507. Wiggle Sort II
  16. Java流程控制语句-顺序结构
  17. 科学养生:揭秘世界上最健康的作息时间表
  18. 【机器学习】琴生不等式(Jensen's inequality)
  19. IBM李永辉:智慧运算的软硬之道
  20. xin片设计的中的数学问题

热门文章

  1. PHP 设计模式之数据对象映射模式
  2. 收藏一些效果炫酷的可视化网站
  3. 《Netty权威指南》
  4. 编程类-----matlab基础语法复习(1)
  5. UVA - 1587 Box
  6. bzoj2729: [HNOI2012]排队
  7. PHP递归创建多级目录(一道面试题的解题过程)
  8. 10个Flex MVC 框架(转)
  9. JS-立即执行函数(function(){...})() amp;amp; (function(){...})()
  10. Ajax拿取JSON格式的数据