c++-faq - 最終C++書籍指南和列表




(2)

初學者

介紹,沒有以前的編程經驗

  • C ++ Primer *(Stanley Lippman,JoséeLajoie和Barbara E. Moo)( 針對C ++ 11更新 )以1k頁為單位,這是對C ++的一個非常全面的介紹,它以非常易於訪問的格式涵蓋了語言中的所有內容而且非常詳細。 第五版(2012年8月16日發布)涵蓋了C ++ 11。 [Review]

  • 編程:使用C ++的原理和實踐 (Bjarne Stroustrup,第2版 - 2014年5月25日)( 針對C ++ 11 / C ++更新14 )介紹使用C ++編程的語言創建者。 一個很好的閱讀,假設沒有以前的編程經驗,但不僅適合初學者。

*不要與C ++ Primer Plus (Stephen Prata)混淆, review明顯不太好。

介紹,具有以前的編程經驗

  • C ++之旅 (Bjarne Stroustrup)( C ++ 17第2版 )“tour”是一本快速的(大約180頁和14章)教程概述所有標準C ++(語言和標準庫, 以及使用C ++) 11 )對於已經了解C ++或至少是經驗豐富的程序員的人來說處於中等水平。 本書是構成C ++編程語言第4版第2-5章的材料的擴展版本。

  • 加速C ++ (Andrew Koenig和Barbara Moo,第1版 - 2000年8月24日)這基本上涵蓋了與C ++ Primer相同的基礎,但是它的四分之一空間。 這很大程度上是因為它並不試圖成為編程的介紹,而是為以前用其他語言編程的人們介紹C ++ 。 它有一個更陡峭的學習曲線,但是,對於那些能夠應對這種情況的人來說,它是一種非常緊湊的語言介紹。 (從歷史上看,它作為第一本使用現代方法教授語言的初學者書開闢了新天地。)儘管如此,它所教授的C ++純粹是C ++ 98。 [Review]

最佳做法

  • 有效的C ++ (Scott Meyers,第3版 - 2005年5月22日)這篇文章的目的是成為C ++程序員應該閱讀的最好的第二本書,並且它成功了。 早期版本的目標是來自C的程序員,第三版改變了這一點,並針對來自Java等語言的程序員。 它提供了大約50個易於記憶的經驗法則以及它們在非常容易獲得(和愉快)風格中的基本原理。 對於C ++ 11和C ++ 14,示例和一些問題已經過時,應該首選Effective Modern C ++。 [Review]

  • Effective Modern C ++ (Scott Meyers)這基本上是Effective C ++的新版本,旨在讓C ++程序員從C ++ 03轉換到C ++ 11和C ++ 14。

  • 有效的STL (Scott Meyers)這個目標是對來自STL的標準庫的部分做同樣的事情,即Effective C ++對整個語言的作用:它提供了經驗法則及其基本原理。 [Review]

中間

  • 更有效的C ++ (Scott Meyers)比Effective C ++更有經驗法則。 沒有第一本書那麼重要,但仍然很有用。

  • Exceptional C ++ (Herb Sutter)作為一組謎題,通過資源獲取初始化(RAII)以及對各種類型的深入報導,對C ++中適當的資源管理和異常安全進行了最佳和徹底的討論。其他主題包括pimpl成語,名稱查找,良好的類設計和C ++內存模型。 [Review]

  • 更多特殊C ++ (Herb Sutter)除了討論C ++中有效的面向對象編程和正確使用STL之外,還涵蓋了Exceptional C ++中未涉及的其他異常安全主題。 [Review]

  • 特殊的C ++風格 (Herb Sutter)討論通用編程,優化和資源管理; 本書還對如何使用非成員函數和單一責任原則在C ++中編寫模塊化代碼進行了很好的闡述。 [Review]

  • C ++編碼標準 (Herb Sutter和Andrei Alexandrescu)這裡的“編碼標準”並不意味著“我應該在多少空格中縮進我的代碼?”這本書包含了101個最佳實踐,成語和常見的陷阱,可以幫助你寫出正確的,可理解且高效的C ++代碼。 [Review]

  • C ++模板:完整指南 (David Vandevoorde和Nicolai M. Josuttis)這是關於在C ++ 11之前存在的模板書。 它涵蓋了從基礎知識到一些最先進的模板元編程的所有內容,並解釋了模板如何工作的每個細節(概念上和它們如何實現),並討論了許多常見的陷阱。 在附錄中有一個定義規則(ODR)和重載決策的優秀摘要。 第二版已經發布了涵蓋C ++ 11,C ++ 14和C ++ 17的版本。 [Review]

高級

  • 現代C ++設計 (Andrei Alexandrescu)一本關於高級通用編程技術的開創性著作。 介紹基於策略的設計,類型列表和基本的通用編程習慣,然後解釋有多少有用的設計模式(包括小對象分配器,仿函數,工廠,訪問者和多方法)可以使用通用編程高效,模塊化和乾淨地實現。 [Review]

  • C ++模板元編程 (David Abrahams和Aleksey Gurtovoy)

  • C ++ Concurrency In Action (Anthony Williams)一本涵蓋C ++ 11並發支持的書,包括線程庫,原子庫,C ++內存模型,鎖和互斥,以及設計和調試多線程應用程序的問題。

  • 高級C ++元編程 (Davide Di Gennaro)TMP技術的前C ++ 11手冊,更多地關注實踐而不是理論。 本書中有大量的片段,其中一些片段特徵已經過時,但這些技巧仍然有用。 如果你能忍受古怪的格式/編輯,它比Alexandrescu更容易閱讀,並且可以說更有價值。 對於更有經驗的開發人員來說,很有可能你會發現一些關於C ++(一個怪癖)的黑暗角落,這通常只是通過豐富的經驗來實現的。

參考風格 - 所有級別

  • C ++編程語言 (Bjarne Stroustrup)( 針對C ++ 11更新 )其創建者對C ++的經典介紹。 寫得與經典的K&R並行,這確實非常像它,涵蓋了從核心語言到標準庫,編程範式到語言哲學的所有內容。 [Review]注意:在這個問題中跟踪了C ++標準的所有版本: 我在哪裡可以找到當前的C ++標準 。

  • C ++標準庫教程和參考 (Nicolai Josuttis)( 針對C ++ 11更新 )C ++標準庫介紹和參考。 第二版(2012年4月9日發布)涵蓋了C ++ 11。 [Review]

  • C ++ IO流和語言環境 (Angelika Langer和Klaus Kreft)除瞭如果您想了解有關流和語言環境的任何內容之外,對本書幾乎沒有什麼可說的,那麼這是找到明確答案的地方。 [Review]

C ++ 11/14/17 / ...參考文獻:

  • C ++ 11/14/17標準(INCITS / ISO / IEC 14882:2011/2014/2017)當然,這是所有C ++的最終仲裁者。 但請注意,它純粹是為有經驗的用戶提供參考, 他們願意花費大量的時間和精力來理解它。 C ++ 17標準以198瑞士法郎的電子形式發布。

  • C ++ 17標準可用,但似乎不是經濟形式 - 17它的成本為198瑞士法郎(約合200美元)。 對於大多數人來說, 標準化之前最終草案綽綽有餘(而且是免費的)。 許多人更喜歡更新的草案 ,記錄可能包含在C ++ 20中的新功能。

  • 新C ++概述(C ++ 11/14)( 僅限PDF) (Scott Meyers)( 針對C ++ 1y / C ++ 14更新 )這些是三個的演示材料(幻燈片和一些講義)由Scott Meyers提供的日間培訓課程,他是C ++的備受尊敬的作者。 即使項目清單很短,質量也很高。

  • C ++核心指南(C ++ 11/14/17 / ...) (由Bjarne Stroustrup和Herb Sutter編輯)是一個不斷發展的在線文檔,包含一套很好地使用現代C ++的指南。 指南側重於相對較高級別的問題,例如接口,資源管理,內存管理以及影響應用程序架構和庫設計的並發性。 該項目由Bjarne Stroustrup和其他人在CppCon'15宣布,並歡迎社區的貢獻。 大多數指南都補充了基本原理和示例,以及對可能的工具支持的討論。 許多規則專門設計為可由靜態分析工具自動檢查。

  • C ++ Super-FAQ (Marshall Cline,Bjarne Stroustrup等)是標準C ++基金會的一項努力,旨在統一以前由Marshall Cline和Bjarne Stroustrup單獨維護的C ++常見問題解答,並納入新的貢獻。 這些項目主要針對中級問題,並且通常以幽默的語調編寫。 並非所有項目都可能與最新版本的C ++標準完全一致。

  • cppreference.com(C ++ 03/11/14/17 / ...) (由Nate Kohl發起)是一個wiki,它總結了基本的核心語言特性,並提供了大量的C ++標準庫文檔。 文檔非常精確,但比官方標准文檔更易於閱讀,並且由於其維基性質而提供更好的導航。 該項目記錄了C ++標準的所有版本,該站點允許過濾特定版本的顯示。 該項目由Nate Kohl在CppCon'14上展示

經典/老年人

注意:這些書中包含的某些信息可能不是最新的或不再被視為最佳做法。

  • C ++的設計和演變 (Bjarne Stroustrup)如果你想知道為什麼語言是這樣的,那麼這本書就是你找到答案的地方。 這涵蓋了C ++ 標準化之前的所有內容。

  • 關於C ++的反思 - (Andrew Koenig和Barbara Moo) [Review]

  • 高級C ++編程風格和習語 (James Coplien)模式運動的前身,它描述了許多特定於C ++的“成語”。 這肯定是一本非常好的書,如果你可以節省時間,可能仍然值得閱讀,但是相當陳舊,並且不能與當前的C ++保持同步。

  • 大規模C ++軟件設計 (John Lakos)Lakos解釋了管理非常大的C ++軟件項目的技術。 當然,這是一個很好的閱讀,如果它只是最新的。 它早在C ++ 98之前編寫,並且錯過了許多對大型項目很重要的功能(例如命名空間)。 如果你需要在一個大的C ++軟件項目中工作,你可能想要閱讀它,儘管你需要花費更多的東西。 新版本的第一卷預計在2018年

  • 在C ++對像模型中 (Stanley Lippman)如果你想知道虛擬成員函數是如何被普遍實現的,以及基本對像在多繼承場景中如何通常在內存中佈局,以及所有這些如何影響性能,這就是你要去的地方找到對這些主題的深入討論。

  • Annotated C ++參考手冊 (Bjarne Stroustrup,Margaret A. Ellis)這本書已經過時了,因為它探討了1989 C ++ 2.0版本 - 模板,異常,名稱空間和新演員表尚未引入。 然而,這本書說明了本書貫穿整個C ++標準,解釋了該語言的基本原理,可能的實現和功能。 這不是一本學習C ++編程原理和模式的書,而是了解C ++語言的各個方面。

  • 用C ++思考 (Bruce Eckel,第2版,2000)。 兩卷; 是一套免費的教程風格的入門級書籍。 下載: 第1 第2卷 。 不幸的是,他們被一些微不足道的錯誤所破壞(例如,保持臨時狀態是自動的),沒有正式的勘誤列表。 部分第三方勘誤列表可在( http://www.computersciencelab.com/Eckel.htm )獲得,但顯然沒有維護。

  • 科學與工程C ++:高級技術與實例介紹 (John Barton和Lee Nackman)這是一本全面而且非常詳細的書,試圖在數值方法的背景下解釋和利用C ++中的所有可用功能。 它在當時引入了幾種新技術,例如奇怪的重複模板模式(CRTP,也稱為Barton-Nackman技巧)。 它開創了幾種技術,如尺寸分析和自動微分。 它附帶了許多可編譯和有用的代碼,從表達式解析器到Lapack包裝器。 該代碼仍可在此處獲取: http://www.informit.com/store/scientific-and-engineering-c-plus-plus-an-introduction-9780201533934http://www.informit.com/store/scientific-and-engineering-c-plus-plus-an-introduction-9780201533934 。 不幸的是,這些書在風格和C ++特性方面已經過時了,但是,當時它是一個令人難以置信的巡迴演出(1994年,STL之前)。 關於動力學繼承的章節有點複雜,不太有用。 這本經典書籍的更新版本包括移動語義和從STL學到的經驗教訓將是非常好的。

這個問題試圖收集每年出版的數十本不良C ++書籍中的少數珍珠。

與許多其他編程語言不同,這些編程語言經常從互聯網上的教程中隨處獲取,很少有人能夠快速學習C ++,而無需學習編寫精良的C ++書籍。 這樣做太複雜了。 事實上,它是如此龐大和復雜, 有很多非常糟糕的C ++書籍 。 我們並不是在談論糟糕的風格,而是體育明顯的事實錯誤促進糟糕的編程風格

請編輯接受的答案,以提供高質量的書籍和近似的技能水平 - 最好 C ++聊天室討論您的添加 。 (如果他們不同意推薦,常客可能會毫不留情地撤銷你的工作。)為你親自閱讀/受益的每本書添加簡短的描述/描述。 隨意討論質量,標題等。符合標準的書籍將被添加到列表中。 由C和C ++用戶協會(ACCU)進行評論的書籍都有指向評論的鏈接。

*注意:常見問題和其他資源可以在C ++標籤信息和c ++ - faq中找到 。


聲明在程序中引入了一個名稱; 一個定義提供了一個實體的唯一描述(例如類型,實例和函數)。 聲明可以在給定範圍內重複,它在給定範圍內引入一個名稱。 C ++程序中使用的每個對象,函數或類都必須有一個定義。 聲明是一個定義,除非:

* it declares a function without specifying its body,
* it contains an extern specifier and no initializer or function body,
* it is the declaration of a static class data member without a class definition,
* it is a class name definition,
* it is a typedef declaration.

定義是一種聲明,除非:

* it defines a static class data member,
* it defines a non-inline member function.






c++ c++-faq