前言
在本文的前半部分我我會談談 我看過的書,和我個人的一些理解 ,并且會提供 C++標準委員會相關鏈接 和 C++第三方輪子/庫總結 。本文的后半部分翻譯了來自 The Definitive C++ Book Guide and List - StackOverflow Forum 的推薦書籍。讀者有補充或有異議的話可以在評論區進行評論。另外,感謝余思雨同學在本文下篇的翻譯,下篇翻譯由她完成。
上篇:我看過的書和經驗總結
溫馨提醒
C++之父在CppCon說現在學C++的話,最起碼的baseline應該是C++11,所以希望大家可以從C++11開始學。然后C++的學習主要分為兩個部分: C++語言特性的學習, C++庫的學習, 現在 isocpp Core-Guide-Lines 和 isocpp C++ Technical Specification Status 分別為C++之父對大家使用語言的一些建議和標準委員會對新的庫規格或語言規格標準的指定狀態。
入門讀物
C++Primer第5版, 這是一本主要介紹C++語言的書籍,講述地比較詳細,在第5版之后加入了 C++11 的許多內容,比如 auto/可變參數模板/lambda表達式等等,學了這本書之后可以開始寫寫玩具程序了。
Effective C++, 這是一本通過一些條目介紹C++11之前的C++標準上的一些實踐注意點,想寫非玩具程序(容易讀懂并且高效的工程程序)的讀者推薦看看。
Effective Modern C++, 這是一本通過一些條目介紹C++11/14新特性的書籍,我覺得它提綱挈領地講述了C++11語言新特性的使用注意點,想寫非玩具程序(容易讀懂并且高效的工程程序)的讀者推薦看看。
進階讀物
Inside C++ Object Model,可以看看,了解面向對象是怎么實現出來的,所謂的封裝/繼承/多態。書的作者推薦大家使用面向對象。
STL源碼剖析,這本中文書書講地不錯,從源碼角度來介紹STL的實現,不過要求讀者熟悉 C++ Tempalates ,C++1x的模板包括函數模板/類模板/別名模板/變量模板,在這本書的第一章會介紹一些編譯器對于模板處理的知識,不過我推薦大家可以先看看這個Youtube視頻: Template Normal Programming Part1 和 Template Normal Programming Part2 ,講得不錯,言簡意賅,看了視頻再看書,應該沒什么問題了。從這本書可以復習數據結構和算法的一些知識。
Boost程序庫指南, 簡單講述了使用的Boost庫中組件,比較基礎。
Boost程序庫探秘, 主要講解Boost庫中的一些實現,在領會了 STL源碼剖析 之后看起來不會非常費力,并且比較有趣。
上篇:C++資源推薦
C++標準委員會相關鏈接
isocpp Get-Started 版塊推薦, 標準委員會教大家開始使用C++。
isocpp Core-Guide-Lines, C++之父和標準委員會總結出來的寫C++代碼的一些指導。
isocpp C++ Technical Specification Status,C++當前標準演化的進度,比如說有我關注的Parallelism, Concurrency, Transactional Memory,File System, Networking,Concepts, Modules。
cplusplus techinical specifications and standard,C++當前標準的規格文檔。
cppcon2016,CppCon2016的演示文檔。
cppcon2015,CppCon2015的演示文檔。
cppcon2014,CppCon2014的演示文檔。
C++第三方輪子/庫總結
下篇:Beginner
Introductory, no previous programming experience
- Programming: Principles and Practice Using C++ (Bjarne Stroustrup)(更新至版本 C++11/C++14) :由C ++語言的創建者編寫編程參考書的。 這是一本挺好的讀本,全書基于讀者沒有編程經驗的編寫思路,但不僅僅局限于滿足初學者水平。
Introductory, with previous programming experience
C++ Primer * (Stanley Lippman, Josée Lajoie, and Barbara E. Moo)(更新至版本 C++11) :全書有1k頁,非常徹底的介紹了C ++,以一種易于理解的格式和詳盡的內容涵蓋了這門語言涉及的方方面面。 第五版(2012年8月16日發布)與C++11同步。
A Tour of C++ (Bjarne Stroustrup)(電子書):“tour”約180頁,包含14章,是一個概述所有的標準C ++(語言和標準庫,并使用C ++ 11)的快速教程。此書適用于處于中高水平且已經知道C + +或至少是有經驗的程序員。在內容上,此書相當于The C++ Programming Language (4th edition)一書的第2-5章的擴展版本。
Accelerated C++ (Andrew Koenig and Barbara Moo): 這本書基本上覆蓋了與C ++ Primer一書相同的章節內容,但僅僅是后者的四分之一字數。這主要是因為成書的目的不是作為編程的介紹,而是向以前用其他語言編程的人介紹C ++。此書常給讀者一種學習難度起伏較大的感覺,但是,如果你可以應付這種章節難度的不一致性,此書將是你學習C++的一個非常緊湊的介紹工具。(歷史上,此書是第一本使用現代方法教授語言的初學者書籍,這一點是一個大的突破。)
Thinking in C++ (Bruce Eckel): 全書含兩卷,是一個免費的教程風格的介紹級讀本。下載:vol 1,vol 2.然而,此書存在一些瑣碎的錯誤(例如,臨時變量自動變成const),關鍵是你找不到官方勘誤表。部分第三方勘誤表可以在(http://www.computersciencelab.com/Eckel.htm)上找到,但顯然沒有維護。
Not to be confused with C++ Primer Plus (Stephen Prata), 這本書評價不太好,大家自己感受吧。
下篇:Best practices
Effective C++ (Scott Meyers) 此書旨在成為最好的C ++程序員應該閱讀的第二本書(強調:這本書不是入門書),顯然作者成功了。早期版本針對是C程序員,第三版做了改變了,并瞄準Java等語言的程序員。它提供了50多個容易記住的經驗規則并解釋了緣由,讀者體驗比較愉快輕松。對于C ++ 11和C ++ 14,示例和一些問題已經過時,這種情況下Effective Modern C++ 是首選。
Effective Modern C++ (Scott Meyers) 這基本上就是Effective C++ 的新版本,目標實現C ++程序員從C ++ 03到C ++ 11和C ++ 14的過渡。
Effective STL (Scott Meyers) 此書目的是實現類似Effective C++對標準庫中來自STL的那部分所實現的功能:此書提出了經驗法則以及其解釋。
下篇:Intermediate
More Effective C++ (Scott Meyers) 此書包含比Effective C++更多的經驗法則。作為入門書,沒有一本書可以比擬此書,所以,不多說,大家去看吧。
Exceptional C++ (Herb Sutter) 以解決問題的方式呈現,此書是C ++中關于適當的資源管理和異常安全的最好最徹底的討論之一,通過資源獲取初始化(RAII)和對各種其他主題的深入報道,包括指向實現的指針,名稱查找,好的類設計和C ++內存模型。
More Exceptional C++ (Herb Sutter) 此書涵蓋Exceptional C++中未涵蓋的額外的異常安全問題和對C ++中有效的面向對象編程和正確使用STL的探討。
Exceptional C++ Style (Herb Sutter) 此書討論通用編程,優化和資源管理三個方面;這本書還針對如何使用非成員函數和單責任原則在C ++中編寫模塊化代碼問題進行了很好的闡述。
C++ Coding Standards (Herb Sutter and Andrei Alexandrescu) “ Coding Standards”這里并不意味著“我的代碼中應該有多少空格縮進?”此書包含101個最好的實例,指針和常見的陷阱,可以幫助讀者編寫正確的,可理解的,高效的C ++代碼。
C++ Templates: The Complete Guide (David Vandevoorde and Nicolai M. Josuttis) 這是一本關于模塊的書,寫于C ++ 11出現之前。 此書涵蓋從基礎知識到一些最先進的模塊編程的所有內容,并細節化地解釋了模塊的工作原理(概念和如何實現),討論了許多常見的陷阱。 在附錄中有單一定義規則(ODR)和重載分辨率的重要摘要。 第二版定于2017年出版。
下篇:Advanced
Modern C++ Design (Andrei Alexandrescu) 這是一本關于高級通用編程技術的開創性讀本。 此書引入基于策略的設計,類型列表和基本的通用編程習語,并解釋了可以有效,模塊化和干凈地使用通用編程實現多少有用的設計模式(包括小對象分配器,函子,工廠,訪問者和多方法)。
C++ Template Metaprogramming (David Abrahams and Aleksey Gurtovoy) 略
C++ Concurrency In Action (Anthony Williams) 一本涵蓋C ++ 11并發支持的書,包括線程庫,原子庫,C ++內存模型,鎖定和互斥量,以及設計和調試多線程應用程序的問題。
Advanced C++ Metaprogramming (Davide Di Gennaro) TMP技術的前C ++ 11手冊,著重點在于實例而不是理論。在這本書中有很多片段,其中一些片段被typetrait淘汰了,但是知道這些技術總是有用的。如果你能忍受古怪的格式/編輯,此書會比Alexandrescu(一個C++大師 Andrei Alexandrescu)更容易閱讀,可以說,更有價值。對于更有經驗的開發人員,此書提供了一個很好的機會,因為只有通過豐富的經驗才能學到關于C ++的盲區(一個怪癖)的一些知識。
下篇:Reference Style - All Levels
The C++ Programming Language (Bjarne Stroustrup) (更新至版本 C++11):此書是C++的創作者寫的關于C ++的經典介紹。作為與經典K&R的并行,此書確實讀起來非常相似,內容涵蓋了核心語言到標準庫,到編程范式到語言哲學。
C++ Standard Library Tutorial and Reference (Nicolai Josuttis) (更新至版本 C++11):此書是對于C ++標準庫的介紹和參考。 第二版(2012年4月9日發布)同步與C ++ 11。
The C++ IO Streams and Locales (Angelika Langer and Klaus Kreft) 沒什么可多說的,如果你想知道關于流本和地環境的任何知識,那么這本書會給你滿意的答案。
C++11/14 References:
The C++ Standard (INCITS/ISO/IEC 14882-2011) 此書當然是標準的最終仲裁者,不論是或不是C ++。 但是,值得注意的是,這僅僅是為了給有經驗且愿意花費大量的時間和精力來理解它的用戶寫的參考。一如既往,第一個版本是相當昂貴的($ 300 +美國),但它現在已經以電子版形式發布$ 60US。版本C ++ 14標準是可用的,但似乎不是很經濟 - 直接從ISO,成本198瑞士法郎(約200美元)。 對于大多數人來說,在標準化之前的最后草案是足夠的(和免費的)。許多人會喜歡甚至更新的草案,記錄可能包括在C ++ 17中的新功能。
Overview of the New C++ (C++11/14) (PDF only) (Scott Meyers) (更新至版本 C++11/C++14):這是Scott Meyers提供的為期三天的培訓課程的演講材料(幻燈片和一些演講),Scott Meyers是C ++的一位備受尊敬的作家。 盡管內容列表很短,但是質量很高。
The C++ Core Guidelines (C++11/14/17/…) (edited by Bjarne Stroustrup and Herb Sutter) 此書是一個不斷發展的在線文檔,包括一套使用現代C ++的指南。該指南著重于解決相對較高級別的問題,如接口,資源管理,內存管理和并發影響應用程序體系結構和庫設計。此項目是由Bjarne Stroustrup和其他人在CppCon'15發布,并歡迎社區的貢獻。大多數指南補充了一個理由和例子,以及討論可能的工具支持。許多規則被專門設計為可由靜態分析工具自動檢查。
The C++ Super-FAQ (Marshall Cline, Bjarne Stroustrup and others) 這是標準C ++基金會力爭統一以前由Marshall Cline和Bjarne Stroustrup個別維護的C ++常見問題,并納入新的貢獻。 這些項目主要解決中間層面的問題,寫作語調幽默。并非所有項目都可能完全更新到最新版本的C ++標準。
cppreference.com (C++03/11/14/17/…) (initiated by Nate Kohl) 本質是一個維基百科(wiki),總結了基本的核心語言特性,并有大量的C ++標準庫文檔。文檔非常精確,且比官方標準文檔更容易閱讀,并且由于其wiki性質而提供更好的內容導航。該項目記錄了C ++標準的所有版本,并且站點允許過濾特定版本的顯示。 該項目由Nate Kohl在CppCon'14展示。
下篇:Classics / Older
注意:這些圖書中包含的一些信息可能不是最新的或不是當前的最佳做法。
The Design and Evolution of C++ (Bjarne Stroustrup) 如果你想知道這門語言的演變過程,這本書是你找到答案的地方。此書涵蓋了C ++標準化之前的一切。
Ruminations on C++ - (Andrew Koenig and Barbara Moo) 略
Advanced C++ Programming Styles and Idioms (James Coplien) 作為模式化運動的前身,此書描述了許多C ++特定的“成語”。 毋庸置疑,這是一本非常棒的讀本,如果你有時間,此書實在是值得一讀,但是書的內容相當舊,沒有更新到當前的C + +。
Large Scale C++ Software Design (John Lakos) Lakos解釋了管理非常大的C ++軟件項目的技術。 毋庸置疑,這是一本非常棒的讀本,如果更新的話。此書成書于C ++ 98之前,并且缺少針對大型項目的很重要的許多功能(例如命名空間)。如果你需要在一個大的C ++軟件項目中工作,建議讀一下,雖然在讀的時候需要多一點輔助資料。(新版的第一卷預計于2015年發行?)
Inside the C++ Object Model (Stanley Lippman) 解釋了:虛擬成員函數是如何被普遍實現的,基本對象如何在多繼承場景中被共同布置在內存中,以上這些工作如何影響性能。
The Annotated C++ Reference Manual (Bjarne Stroustrup, Margaret A. Ellis) 這本書涉及1989 C ++ 2.0版本,已經相當過時了 - 沒有介紹模板,異常,命名空間和新的鑄造。然而,此書覆蓋了整個C ++標準的時間,包括解釋的理由,語言的可能的實現和功能。這是一本學習C ++編程原理和模式的書,幫助讀者理解C ++語言的每一個方面。