天天看点

C++书籍

(虽然没啥价值,但是转载请标明作者和出处)

欢迎关注我的个人网站《程序员网》 

->https://www.itmangoto.cn/

背景:

        最近面试了几份C++的工作,被虐出了翔。原因很简单,自己做C++的时间不短,但是缺乏系统的学习,很多东西都是“知其然不知其所以然”。

就好像我喜欢看知乎,关于各类的问题,都能略知一二,但是往往看到各行各业的大牛的一些精彩回答,就会自惭形愧。离散化的知识体系造就的是一个多面手,知道如何整合资源,如何用最低的成本去解决问题,很多时候甚至会有一种“一夫当关,万夫莫开”的感觉。

        我曾经试过在一个项目里,从硬件到软件、从客户端到服务器、从单片机到windows到linux再到Android、从方案设计到软硬件采购、从前端到后台、从客户需求分析到设计到编码、从开发到测试都一手包办了。这样的人,在很多小公司任职具有相当大的优势,拿着一个人的工资,做的是很多个人的活。结果是,自己累到就像一条狗(更可悲的是,拿的工资就只有半狗)。然后在离职跳槽的过程中,被鄙视得体无完肤,尤其是在大公司的面试里。有感于此,我打算重新打磨一下的技能。

        我认为自己目前是一个“一”字型的人,很多大公司里面的人是“1”字型的。我对自己的规划是,成为一个“十”字型的人才,甚至是一个“卅”字型的人才。但是,这是一条特别艰难的路,而且一不小心就会堕入到万劫不复的深渊。but,没有人能够改变我的想法,我会坚持下去。

正文:

        好吧,下面是C++博客的开篇。就暂且先总结归纳一下C++的学习方法,列一下书单,以及对接下来的博客内容做个提纲。

一、C++学习方法

        如果我说,C++是一门难学难精的语言,估计没有人会反对。这里所提及到的学习方法和路线,并不全是我个人的看法,很多都是借鉴一些前辈和C++专家的看法,主要的目的是帮助我自己制定学习计划,也顺便记录下来供其他朋友参考。

        本人有数年的编程经验,从最坑爹的汇编,到面像过程的C语言,到面相对象的C++、Java、C#,到函数式的Lisp都有学习和使用过。C++学习和使用了大概两三年的时间。除了大学期间的C++课程以外,再也没有系统的学习和研究过C++。工作以来,断断续续的用C++进行过开发,包括在windows上面的Visual C++,Linux上用vim和g++,以及开源的UI库Qt。中间的学习过程主要是,在使用到相关的知识和技术的时候,查阅书籍和别人的博客。

    因此,我其实只能算是一个C++新手,博客的内容部分涉及一些基础知识的学习,然后写一些C++进阶与提高的内容。

(1)学习C++的四个层次(引自《C++强大背后》,作者是Milo Yip大牛)

        1.第一层次,C++基础:挑选一本入门书籍,如《C++ Primer》、《C++大学教程》、或Stroustrup撰写的经典《C++程序设计语言》或他一年半前的新作《C++程序设计原理与实践》,而一般C++课程也止于此,另外《C++ 标准程序库》及《The C++ Standard LibraryExtensions》可供参考;

        2.第二层次,正确高效地使用C++:此层次开始必须自修,阅读过《(More)Effective C++》《(More)Exceptional C++》、《Effective STL》及《C++编程规范》等,才适宜踏入专业C++开发之路;

        3.第三层次,深入了解C++:关于全局问题可读《深入探索C++对象模型》、《Imperfect C++》、《C++沉思录》、《STL源码剖析》,要挑战智商,可看关于模版及模版元编程的书籍如《C++ Templates》、《C++设计新思维》、《C++模版元编程》;

       4.第四层次,研究C++:阅读《C++语言的设计和演化》、《编程的本质》(含STL设计背后的数学根基)、C++标准文件《ISO/IEC 14882:2003》、C++标准委员会的提案书和报告书、关于C++的学术文献。

        5.Milo Yip的建议:“由于我主要是应用C++,大约只停留于第二、三个层次。然而,C++只是软件开发的一环而已,单凭语言并不能应付业务和工程上的问题。建议读者不要强求几年内“彻底学会C++的知识”,到达第二层左右便从工作实战中汲取经验,有兴趣才慢慢继续学习更高层次的知识。虽然学习C++有难度,但也是相当有趣且有满足感的。”

        尤其是对于新手来说C++的内容较多,试图通过一本教材或者入门书籍从而掌握C++各方面的知识,几乎是不可能的。比较明智的做法是,先掌握一些基本的知识和比较重点的内容,然后尝试写一些比较短的代码或者小型的项目,在实践过程中碰到了问题再仔细深入研究。

PS:此外我这里提及一下刘未鹏的观点。(至于他是程序里面的top0.1%还是top1%还是top5%,这里不作讨论。个人觉得他的看法还是挺实在的)

原文请参考:《你应当如何学习C++(以及编程)》

        1.C++语言的细节太多

        2.一些著名的C++书籍在暗示语言细节的重要性和有趣

        3.现代C++库的开发哲学必须用到一些犄角旮旯的语言细节

        对于广大的C++程序员呢,以为掌握了更多的语言细节就更牛,但实际却是那些语言细节十有八九是平时编程用都用不到的。C++中众多的细节虽然在库设计者手里面有其用武之地,但普通程序员则根本无需过多关注,尤其是没有实际动机的关注。一般性的编码实践准则,以及基本的编程能力和基本功,乃至基本的程序设计理论以及算法设计。才是真正需要花时间掌握的东西。(他称之为“懒惰原则”,或许这可以安慰一下在C++笔试中被虐的我)

        应该说,刘的看法和本文所提及的C++学习路线其实并不冲突。C++学习路线,主要是给出一条从了解、到掌握、到熟练、到精通、到深入研究C++的思路,而刘的看法是从一个普通的C++语言使用者的角度来提醒初学者不必要过度的深入细节。

(2)C++中接触到的编程范式(引自轮子哥)

1.面向对象(灵活应用virtual继承+shared_ptr可以达到java/C#的效果)

2.模板(这里分两类,分别为type rich programming和meta programming,区别很大)

3.函数式编程(如今有了lambda,配合<algorithm>文件,简直无敌了)

4.面向过程

1)当我搞语言设计和编译器的时候,我总是会倾向于创造各种小DSL来给自己用,用的都是模板(想想boost的spirit大概就明白我的意思了,虽然我不用它),尽量让跟我有同样背景的人一眼能看懂我代码的意思。

2)当我做我那个GUI库(www.gaclib.net)的时候,纯粹是用OO和IoC那一套。

3)当我写3D渲染程序的时候,我会变成一个为了性能不惜牺牲可读性的人。

        如轮子哥所说,未必需要每一种都深入。但是如果经常需要用到C++和使用C++干活的人来说,起码要有所了解。

(3)C++的具体应用(引自MiloYip)

        C++并非万能,我按经验举出一些C++的适用时机。

(1)C++适合构造程序中需求较稳定的部分,需求变化较大的部分可使用脚本语言;

(2)程序须尽量发挥硬件的最高性能,且性能瓶颈在于CPU和内存;

(3)程序须频繁地与操作系统或硬件沟通;

(4)程序必须使用C++框架/库,大部分游戏引擎(如Unreal/Source)及中间件(如Havok/FMOD),有些C++库提供其他语言的绑定,但通常原生的API性能最好最新;

(5)项目中某个目标平台只提供C++编译器的支持。

        按应用领域来说,C++适用于开发服务器软件、桌面应用、游戏、实时系统、高性能计算、嵌入式系统等。

 欢迎关注我的个人网站《程序员网》 

->https://www.itmangoto.cn/

二、C++书单

        这里不想讨论谭浩强老师的教材是好是坏。但是想在IT和编程领域更进一步,多看外国权威著作甚至英文原版,是必然的选择。上面的C++学习的四个层次中,已经提及了很多,下面再做一个详细一点的归纳(引自知乎,作者不详)。

(1)阶段 1

《Essential C++》

这是一本内容不多但很实用的C++入门书籍,强调快速上手与理解C++编程。本书主要围绕一系列逐渐复杂的程序问题,以及用以解决这些问题的语言特性展开讲解。你不只学到C++的函数和结构,也会学习到它们的设计目的和基本原理。

《C++ Primer》

本书对C++基本概念、技术、以及现代C++编程风格进行了全面而且权威的阐述,是C++初学者的最佳指南;本书可以帮助你编写实用的程序,而无需首先精通每个语言细节。对于中高级程序员,本书也是不可或缺的参考书。

(2)阶段 2

《Effective C++》和《More effective C++》

作者是Scott Meyers。你应该熟读它们,并清楚地理解每个项目。该书围绕55条准则,每一条都介绍了一个可让你写出更好的C++程序代码的方法,并以特别设计过的例子详加讨论。

《Exceptional C++(C++编程剖析)》和《More exceptional C++》

这两本书中都包含了40个C++编程问题,这些问题会让你磨练自己的技能,最终成为优秀的C++程序员。这些问题是Herb Sutter精心挑选,与ISO/ANSI C++官方标准相一致,帮助程序员在设计、架构和编码过程中保持良好的风格,从而使编写的C++软件更健壮、更高效。

(3)阶段 3

《Inside the C++ object model(深度探索C++对象模型)》

本书专注于C++面向对象程序设计的底层机制,包括结构式语意、临时性对象的生成、封装、继承,以及虚拟——虚拟函数和虚拟继承,帮助你理解程序的底层实现,以便写出更高效的代码。

《The design and evolution of C++(C++语言的设计与演化)》

本书作者也是C++语言的设计者Bjarne Stroustrup,作者在书中综合性地介绍了C++的发展历史,C++中各种重要机制的本质意义和设计背景,这些机制的基本用途和使用方法,讨论了C++所适合的应用领域及其未来的发展前景,既没有忽略关键性的详情,又没有过多地陷入技术细节。

(4)阶段 4

《The C++ standard library(C++标准程序库)》

这是标准模板库字典,你可以在本书中找到STL相关的一切知识。本书焦点放在标准模板库、检查容器、迭代器、函数对象和STL算法上。每一个元素都有深刻的呈现,包括其介绍、设计、运用实例、细节解说、陷阱、意想不到的危险,以及相关类别和函数等。

《Effective STL》

这是Scott Meyers的第三本C++专著,也是学习STL最权威的书籍。作者对书中的50个指导方针都作了详尽的分析,并配以示例。通过这些规则,C++开发者可以最大限度地使用STL。

《Generic programming and the STL(泛型编程与STL)》

本书阐述了泛型程序设计的核心理念:concepts(概念)、modeling(模型)和refinement(改善),并为你展示这些观念如何导出STL的基础概念:iterators(迭代器)、containers(容器)和function objects(函数对象)。按照本书所述,你可以把STL想象成一个由concepts组成的library,你将学习到STL正式结构并理解其强大的优势。

(5)阶段 5

《Exceptional C++ style》

作者为Herb Sutter。本书同样提出了40个C++风格相关的问题,对一些至关重要的C++细节和相互关系提出了新的见解,为当今的关键C++编程技术(如泛型编程、STL、异常安全等)提供了新的策略,帮助开发者在开销与功能之间、优雅与可维护性之间、灵活性与过分灵活之间寻找完美的平衡点。

《C++ template》

这是一本关于C++模板的完整的参考手册和教程,它强调模板的使用实践,包含了现实世界中的例子。每个C++程序员都应该好好读一读这本书。

《Modern C++ design(现代C++设计)》

作者Andrei Alexandrescu为C++程序员打开了一个新的局面。本书提供了一些针对软件设计的前沿方法,如联合设计模式、泛型编程,使程序员可以编写有表现力的、灵活的、高度可重用的代码。

《Thinking in C++(C++编程思想)》

C++ 领域权威著作,介绍了C++实用的编程技术和最佳的实践方法。

PS:或者参考:《C++必读书籍推荐》

        个人看法:虽然说,越是C++的高手越不敢说自己精通C++,但是熟读这些书籍并且能够熟练的运用,称之为C++专家应该也不为过了。但是对于大部分人来说,全部读完这些书籍是不太现实的。也正是这个原因,才会把这些书籍根据不同层次做了一个分类。

        正如Milo Yip所说,正确的做法应该是,循序渐进并在实践中根据自身的需求逐步深入。很惭愧,上面列出的书籍本人仅读过两三本,而且算不上精读,目前正在按照计划逐步深入,但没有打算朝“精通C++”的方向狂奔,只是想在目前的基础上更深入一点,满足工作的需要。后续的博客中,我会适当记录和分享一下读书的心得。

三、计划中本人C++博客的内容(大牛的计划称作“挖坑”,小白的计划称作“空想”,希望不要吐槽)

(1)C++基础知识里面的一些重点难点

(2)C++的编程风格

(3)C++的优点和缺点归纳

(4)C++的适用场合

(3)C++程序的优化

(4)C++的各种范式归纳

(5)C++某些技术的进阶

(5)C++的应用以及相关开源项目

有兴趣的,可以交流一下

欢迎关注我的个人网站《程序员网》 

->https://www.itmangoto.cn/

IT从业人员需要及时关注技术动态,但是互联网的内容却过于离散,好东西往往隐藏得很深。现在可以在微信公众号里面 搜索关注“小鱼儿的IT技术分享”,订阅我为大家每天汇总的IT技术信息。欢迎大家关注!

  • 有兴趣的请点击《与IT技术相关的微信公众号》
C++书籍

继续阅读