花了一个月的时间读完了TC++PL4E,因为我之前读过C++ Primer,C++大部分的语法内容都已了解,所以读的速度还是比较快的,但是通过组合阅读C++标准也发现了很多C++中我原本不知道的东西,从标准和C++之父的视角来看C++确实是足够全面了,由此来对比一下C++ Primer、TC++PL4E和ISO C++文档。
C++ Primer 5th
C++ Primer 5th虽说书名冠以Primer
但是我觉得实际上这不是一本面向零基础的C++书籍,而且我觉得书中章节顺序安排有些古怪,前面出现的内容只有看到后面才会有解答,但是这也确实是一本很好的C++书,如果你具有C语言的基础或者已经对C++有一些了解想比较全面和有些深度地学习C++,这本书是很好的选择,对于工程中常用到的C++的特性都讲解的十分清楚,而且代码示例也都通俗易懂,比较全面和深入的讲解了C++的大部分知识点。
TC++PL 4th
TC++PL(The C++ Programming Language Fourth Edition)这本书也不是C++的零基础书籍,阅读本书的要求其实我觉得比C++ Primer要稍高一些。这是C++之父Bjarne Stroustrup的著作,可以说这本书面面俱到地讲到了C++的所有特性。从C++的语言特性这个角度来看,这本比C++ Primer更全面(如详细讲解了ADL/POD等),但是每个章节及其小结的篇幅更短(言简意赅),如果说更深入或者更详实的资料还是要查阅其他的文档。TC++PL其实更像是一本手册或者是一份纲要,方便快速查询。示例代码也都十分精炼,但是某些知识点对于深度的剖析不如C++ Primer,例如lambda/类那部分在C++ Primer那里写的更全面一些。或许是C++之父想要把C++的各个部分都一碗水端平,他在序言中也讲到了碍于篇幅的膨胀(加上标准库部分已(中文)上千页,英文则一千三百多页),已经是本大部头,总有些取舍。
如果说没有足够的时间来通读这本书,可以用这样一个小技巧:Bjarne在每章的末尾够给出了一些编码的建议,可以通过阅读这些建议来思考为什么,如果说你看到建议能够想到为什么要这么做就算你熟悉了这部分知识,如果看到建议了不知道为什么要这么做就假定你不熟悉这部分知识,然后有针对性的去看。这样读书的效率会高很多,缺点只是不够系统。
ISO C++(2014)
这里说的ISO C++**是基于ISO/IEC 14882:2014(E)**的,也就是C++14。
读标准和阅读语言书籍是两个感觉,读书籍可以看到作者的一些个人见解,很多大师(Bjarne Stroustrup/Stanley B. Lippman)的见解当然十分精妙,但是也有人在很多知识的口口相传或者理解过程中出现了偏差(读别人博客的时候就会发现…),所以这时候就需要更权威的资料来佐证,对于语言来说那必然就是标准文档最权威。
标准文档几乎不涉及具体的语法用途,主要是限定语言的语法应该实现什么样的语义。就这一点来说编译器实现的语言语义应该是完全按照标准要求来进行实现的,所有和标准文档相冲突的编译器都是不标准的,从这一点我们可以判定一个编译器的实现标准与否。
可以在这里这里看各个编译器对标准支持情况。
读语言标准从学习语言的角度来说可以使我们更深层次地了解C++这门语言。因为标准文档对于语义的要求不是含混不清的,标准的规定既是真理(不论优劣)。但是很多语言特性的具体实现是没有规定的,所以在使用的时候由于编译器对语言特性的实现方式不一样(例如vptr),在我们需要用到哪些奇淫巧计的时候会造成很多麻烦,所以如果不是必要还是少用那些奇淫巧计,而且学习C++最重要的是,谨记不要相信一个编译器,因为编译器的实现也可能是不标准的(如MSVC),所以在写代码的时候还是要多用几个编译器来测试代码,遇到有歧义的地方就查阅标准文档。
后记
这三份资料各有优点,但是综合(质量/深度/性价比)来说(没有任何贬低的意思),如果想比较深入全面的学习C++我建议是深入地去读C++ Primer,如果有时间的话可以买本TC++PL快速过一遍然后当做手册,配合标准文档阅读更佳(主要是用来消歧义)。
其实C++ Primer和TC++PL是可以相互替代的,但是由于其书的立意不一样(至少我是这么觉得),所以我建议如果有时间的话两本还是都要读读的,如果时间紧迫C++ Primer和TC+PL读其中一本也行,注意C++Primer一定要买第五版,而TC++PL一定要买第四版,这两个版本都是基于C++11标准的,和之前的标准(C++03)差别很大。
建议的阅读顺序为(<=>
为可相互替代,=
为同时阅读,相互参考):
(C++ Primer
<=>TC++PL
)=ISO C++
对于C++11/14/17之间的概览贴上Bjarne Stroustrup在2016 C++及系统软件技术大会上的PPT: