Hướng dẫn và Danh sách Sách C ++ Cuối cùng
Câu hỏi này cố gắng thu thập vài viên ngọc trai trong số hàng chục cuốn sách C ++ dở được xuất bản hàng năm.
Không giống như nhiều ngôn ngữ lập trình khác, thường được chọn khi di chuyển từ các hướng dẫn tìm thấy trên Internet, rất ít người có thể nhanh chóng học C ++ mà không cần nghiên cứu một cuốn sách viết về C ++. Nó quá lớn và phức tạp để làm điều này. Trên thực tế, nó quá lớn và phức tạp, có rất nhiều sách C ++ rất tệ trên mạng. Và chúng ta không nói về phong cách tồi, mà là những thứ như lỗi thể thao rõ ràng là thực tế rõ ràng và thúc đẩy phong cách lập trình xấu hoàn toàn .
Vui lòng chỉnh sửa câu trả lời được chấp nhận để cung cấp sách chất lượng và mức độ kỹ năng gần đúng - tốt nhất là sau khi thảo luận về việc bổ sung của bạn trong phòng trò chuyện C ++ . (Các cơ quan quản lý có thể hủy bỏ công việc của bạn một cách không thương tiếc nếu họ không đồng ý với một đề xuất.) Thêm một lời giới thiệu / mô tả ngắn về từng cuốn sách mà bạn đã đọc / được hưởng lợi từ đó. Hãy thoải mái tranh luận về chất lượng, đề mục, v.v. Những cuốn sách đáp ứng tiêu chí sẽ được thêm vào danh sách. Sách có đánh giá của Hiệp hội những người dùng C và C ++ (ACCU) có liên kết đến đánh giá.
* Lưu ý: Câu hỏi thường gặp và các tài nguyên khác có thể được tìm thấy trong thông tin thẻ C ++ và trong c ++ - faq .
Trả lời
Người bắt đầu
Giới thiệu, không có kinh nghiệm lập trình trước đây
C ++ Primer * (Stanley Lippman, Josée Lajoie và Barbara E. Moo) ( cập nhật cho C ++ 11 ) Đến với 1.000 trang, đây là phần giới thiệu rất kỹ lưỡng về C ++ bao gồm mọi thứ trong ngôn ngữ ở định dạng rất dễ tiếp cận và rất chi tiết. Phiên bản thứ năm (phát hành ngày 16 tháng 8 năm 2012) bao gồm C ++ 11. [Ôn tập]
* Đừng nhầm với C ++ Primer Plus (Stephen Prata), với đánh giá kém thuận lợi hơn đáng kể .
Lập trình: Nguyên tắc và Thực hành Sử dụng C ++ (Bjarne Stroustrup, Phiên bản thứ 2 - Ngày 25 tháng 5 năm 2014) ( được cập nhật cho C ++ 11 / C ++ 14 ) Giới thiệu về lập trình bằng C ++ bởi người sáng tạo ra ngôn ngữ này. Một bài đọc tốt, giả sử không có kinh nghiệm lập trình trước đó, nhưng không chỉ dành cho người mới bắt đầu.
Giới thiệu, với kinh nghiệm lập trình trước đó
Một chuyến tham quan C ++ (Bjarne Stroustrup) ( ấn bản thứ 2 cho C ++ 17 ) “Chuyến tham quan” là tổng quan hướng dẫn nhanh (khoảng 180 trang và 14 chương) về tất cả C ++ chuẩn (ngôn ngữ và thư viện chuẩn, và sử dụng C ++ 11 ) ở mức độ cao vừa phải dành cho những người đã biết C ++ hoặc ít nhất là những lập trình viên có kinh nghiệm. Cuốn sách này là phiên bản mở rộng của tài liệu tạo thành Chương 2-5 của Ngôn ngữ lập trình C ++, ấn bản lần thứ 4.
Accelerated C ++ (Andrew Koenig và Barbara Moo, Phiên bản đầu tiên - ngày 24 tháng 8 năm 2000) Điều này về cơ bản bao gồm cùng một nền tảng như C ++ Primer , nhưng làm như vậy trên một phần tư không gian của nó. Điều này phần lớn là vì nó không cố gắng trở thành một bài giới thiệu về lập trình mà là một bài giới thiệu về C ++ cho những người đã từng lập trình bằng một số ngôn ngữ khác. Nó có một đường cong học tập dốc hơn, nhưng, đối với những người có thể đối phó với điều này, nó là một phần giới thiệu rất nhỏ gọn về ngôn ngữ. (Về mặt lịch sử, nó đã tạo ra một nền tảng mới khi là cuốn sách dành cho người mới bắt đầu đầu tiên sử dụng phương pháp hiện đại để dạy ngôn ngữ.) Mặc dù vậy, C ++ mà nó dạy hoàn toàn là C ++ 98. [Ôn tập]
Thực hành tốt nhất
C ++ hiệu quả (Scott Meyers, Ấn bản lần thứ 3 - ngày 22 tháng 5 năm 2005) Cuốn sách này được viết với mục đích trở thành cuốn sách thứ hai tốt nhất mà các lập trình viên C ++ nên đọc, và nó đã thành công. Các phiên bản trước đó nhắm đến các lập trình viên đến từ C, phiên bản thứ ba thay đổi điều này và nhắm mục tiêu đến các lập trình viên đến từ các ngôn ngữ như Java. Nó trình bày ~ 50 quy tắc ngón tay cái dễ nhớ cùng với cơ sở lý luận của chúng theo một phong cách rất dễ tiếp cận (và thú vị). Đối với C ++ 11 và C ++ 14, các ví dụ và một số vấn đề đã lỗi thời và C ++ Hiện đại Hiệu quả nên được ưu tiên. [Ôn tập]
C ++ hiện đại hiệu quả (Scott Meyers) Về cơ bản, đây là phiên bản mới của C ++ hiệu quả , nhằm vào các lập trình viên C ++ đang thực hiện chuyển đổi từ C ++ 03 sang C ++ 11 và C ++ 14.
STL hiệu quả (Scott Meyers) Điều này nhằm mục đích làm điều tương tự với một phần của thư viện tiêu chuẩn đến từ STL những gì Hiệu quả C ++ đã làm cho ngôn ngữ nói chung: Nó trình bày các quy tắc ngón tay cái cùng với cơ sở lý luận của chúng. [Ôn tập]
Trung gian
C ++ hiệu quả hơn (Scott Meyers) Thậm chí nhiều quy tắc ngón tay cái hơn C ++ hiệu quả . Không quan trọng bằng những điều trong cuốn sách đầu tiên, nhưng vẫn tốt để biết.
C ++ đặc biệt (Herb Sutter) Được trình bày dưới dạng một bộ câu đố, đây là một trong những cuộc thảo luận hay nhất và kỹ lưỡng về việc quản lý tài nguyên thích hợp và an toàn ngoại lệ trong C ++ thông qua Resource Acquisition is Initialization (RAII) ngoài phạm vi bao quát chuyên sâu về các chủ đề khác bao gồm thành ngữ ma cô, tra cứu tên, thiết kế lớp học tốt và mô hình bộ nhớ C ++. [Ôn tập]
Thêm Đặc biệt C ++ (Herb Sutter) Bao gồm các chủ đề an toàn ngoại lệ bổ sung không được đề cập trong C ++ Đặc biệt , ngoài việc thảo luận về lập trình hướng đối tượng hiệu quả trong C ++ và sử dụng đúng STL. [Ôn tập]
Phong cách C ++ đặc biệt (Herb Sutter) Thảo luận về lập trình chung, tối ưu hóa và quản lý tài nguyên; cuốn sách này cũng giải thích tuyệt vời về cách viết mã mô-đun trong C ++ bằng cách sử dụng các hàm không phải thành viên và nguyên tắc trách nhiệm duy nhất. [Ôn tập]
Tiêu chuẩn mã hóa C ++ (Herb Sutter và Andrei Alexandrescu) “Tiêu chuẩn mã hóa” ở đây không có nghĩa là “tôi nên thụt lề mã của mình bao nhiêu dấu cách?” Cuốn sách này bao gồm 101 phương pháp hay nhất, thành ngữ và những cạm bẫy phổ biến có thể giúp bạn viết mã C ++ chính xác, dễ hiểu và hiệu quả. [Ôn tập]
C ++ Templates: The Complete Guide (David Vandevoorde và Nicolai M. Josuttis) Đây là những cuốn sách về các mẫu như họ tồn tại trước khi C ++ 11. Nó bao gồm mọi thứ từ những điều cơ bản đến một số lập trình siêu mẫu tiên tiến nhất và giải thích mọi chi tiết về cách thức hoạt động của các mẫu (cả về mặt khái niệm và cách chúng được triển khai) và thảo luận về nhiều cạm bẫy phổ biến. Có các bản tóm tắt tuyệt vời về Quy tắc Một Định nghĩa (ODR) và giải quyết quá tải trong các phụ lục. Một ấn bản thứ hai bao gồm C ++ 11, C ++ 14 và C ++ 17 đã được đã được công bố. [Ôn tập]
C ++ 17 - Hướng dẫn đầy đủ (Nicolai M. Josuttis) Cuốn sách này mô tả tất cả các tính năng mới được giới thiệu trong Tiêu chuẩn C ++ 17 bao gồm mọi thứ từ những tính năng đơn giản như 'Biến nội tuyến', 'constexpr if' cho đến 'Đa hình Tài nguyên Bộ nhớ 'và' Mới và Xóa với Dữ liệu được tổng hợp hóa '. [Ôn tập]
C ++ trong Hành động (Bartosz Milewski). Cuốn sách này giải thích về C ++ và các tính năng của nó bằng cách xây dựng một ứng dụng từ đầu. [Ôn tập]
Lập trình hàm trong C ++ (Ivan Čukić). Cuốn sách này giới thiệu các kỹ thuật lập trình hàm cho C ++ hiện đại (C ++ 11 trở lên). Một bài đọc rất hay cho những ai muốn áp dụng các mô hình lập trình hàm cho C ++.
Nâng cao
Thiết kế C ++ hiện đại (Andrei Alexandrescu) Một cuốn sách đột phá về các kỹ thuật lập trình chung nâng cao. Giới thiệu thiết kế dựa trên chính sách, danh sách kiểu và các thành ngữ lập trình chung cơ bản, sau đó giải thích có bao nhiêu mẫu thiết kế hữu ích (bao gồm trình phân bổ đối tượng nhỏ, trình điều khiển, nhà máy, khách truy cập và đa phương pháp) có thể được triển khai hiệu quả, theo mô-đun và rõ ràng bằng cách sử dụng lập trình chung . [Ôn tập]
Lập trình siêu mẫu C ++ (David Abrahams và Aleksey Gurtovoy)
C ++ Concurrency In Action (Anthony Williams) Một cuốn sách bao gồm hỗ trợ đồng thời C ++ 11 bao gồm thư viện luồng, thư viện nguyên tử, mô hình bộ nhớ C ++, khóa và mutexes, cũng như các vấn đề về thiết kế và gỡ lỗi các ứng dụng đa luồng. Một ấn bản thứ hai bao gồm C ++ 14 và C ++ 17 đã được đã được công bố. [Ôn tập]
Advanced C ++ Metaprogramming (Davide Di Gennaro) Sách hướng dẫn sử dụng các kỹ thuật TMP trước C ++ 11, tập trung nhiều hơn vào thực hành hơn là lý thuyết. Có rất nhiều đoạn trích trong cuốn sách này, một số đoạn trong số đó đã bị lỗi thời bởi các đặc điểm loại, nhưng các kỹ thuật, dù sao cũng rất hữu ích để biết. Nếu bạn có thể áp dụng định dạng / chỉnh sửa kỳ quặc, nó sẽ dễ đọc hơn Alexandrescu và có thể nói là bổ ích hơn. Đối với các nhà phát triển có kinh nghiệm hơn, rất có thể bạn có thể hiểu được điều gì đó về góc tối của C ++ (một điều kỳ quặc) mà thường chỉ xuất hiện thông qua kinh nghiệm dày dặn.
Kiểu tham chiếu - Tất cả các cấp độ
Ngôn ngữ lập trình C ++ (Bjarne Stroustrup) ( được cập nhật cho C ++ 11 ) Lời giới thiệu cổ điển về C ++ của người tạo ra nó. Được viết để song song với K&R cổ điển, điều này thực sự đọc rất thích nó và bao gồm mọi thứ từ ngôn ngữ cốt lõi đến thư viện tiêu chuẩn, đến các mô hình lập trình cho đến triết lý của ngôn ngữ. [Xem lại] Lưu ý: Tất cả các bản phát hành của tiêu chuẩn C ++ đều được theo dõi trong câu hỏi " Tôi tìm tài liệu tiêu chuẩn C hoặc C ++ hiện tại ở đâu? ".
C++ Standard Library Tutorial and Reference (Nicolai Josuttis) (updated for C++11) The introduction and reference for the C++ Standard Library. The second edition (released on April 9, 2012) covers C++11. [Review]
The C++ IO Streams and Locales (Angelika Langer and Klaus Kreft) There's very little to say about this book except that, if you want to know anything about streams and locales, then this is the one place to find definitive answers. [Review]
C++11/14/17/… References:
The C++11/14/17 Standard (INCITS/ISO/IEC 14882:2011/2014/2017) This, of course, is the final arbiter of all that is or isn't C++. Be aware, however, that it is intended purely as a reference for experienced users willing to devote considerable time and effort to its understanding. The C++17 standard is released in electronic form for 198 Swiss Francs.
The C++17 standard is available, but seemingly not in an economical form – directly from the ISO it costs 198 Swiss Francs (about $200 US). For most people, the final draft before standardization is more than adequate (and free). Many will prefer an even newer draft, documenting new features that are likely to be included in C++20.
Overview of the New C++ (C++11/14) (PDF only) (Scott Meyers) (updated for C++14) These are the presentation materials (slides and some lecture notes) of a three-day training course offered by Scott Meyers, who's a highly respected author on C++. Even though the list of items is short, the quality is high.
The C++ Core Guidelines (C++11/14/17/…) (edited by Bjarne Stroustrup and Herb Sutter) is an evolving online document consisting of a set of guidelines for using modern C++ well. The guidelines are focused on relatively higher-level issues, such as interfaces, resource management, memory management and concurrency affecting application architecture and library design. The project was announced at CppCon'15 by Bjarne Stroustrup and others and welcomes contributions from the community. Most guidelines are supplemented with a rationale and examples as well as discussions of possible tool support. Many rules are designed specifically to be automatically checkable by static analysis tools.
The C++ Super-FAQ (Marshall Cline, Bjarne Stroustrup and others) is an effort by the Standard C++ Foundation to unify the C++ FAQs previously maintained individually by Marshall Cline and Bjarne Stroustrup and also incorporating new contributions. The items mostly address issues at an intermediate level and are often written with a humorous tone. Not all items might be fully up to date with the latest edition of the C++ standard yet.
cppreference.com (C++03/11/14/17/…) (initiated by Nate Kohl) is a wiki that summarizes the basic core-language features and has extensive documentation of the C++ standard library. The documentation is very precise but is easier to read than the official standard document and provides better navigation due to its wiki nature. The project documents all versions of the C++ standard and the site allows filtering the display for a specific version. The project was presented by Nate Kohl at CppCon'14.
Classics / Older
Note: Some information contained within these books may not be up-to-date or no longer considered best practice.
The Design and Evolution of C++ (Bjarne Stroustrup) If you want to know why the language is the way it is, this book is where you find answers. This covers everything before the standardization of C++.
Ruminations on C++ - (Andrew Koenig and Barbara Moo) [Review]
Advanced C++ Programming Styles and Idioms (James Coplien) A predecessor of the pattern movement, it describes many C++-specific “idioms”. It's certainly a very good book and might still be worth a read if you can spare the time, but quite old and not up-to-date with current C++.
Large Scale C++ Software Design (John Lakos) Lakos explains techniques to manage very big C++ software projects. Certainly, a good read, if it only was up to date. It was written long before C++ 98 and misses on many features (e.g. namespaces) important for large-scale projects. If you need to work in a big C++ software project, you might want to read it, although you need to take more than a grain of salt with it. The first volume of a new edition is released in 2019.
Inside the C++ Object Model (Stanley Lippman) If you want to know how virtual member functions are commonly implemented and how base objects are commonly laid out in memory in a multi-inheritance scenario, and how all this affects performance, this is where you will find thorough discussions of such topics.
The Annotated C++ Reference Manual (Bjarne Stroustrup, Margaret A. Ellis) This book is quite outdated in the fact that it explores the 1989 C++ 2.0 version - Templates, exceptions, namespaces and new casts were not yet introduced. Saying that however, this book goes through the entire C++ standard of the time explaining the rationale, the possible implementations, and features of the language. This is not a book to learn programming principles and patterns on C++, but to understand every aspect of the C++ language.
Thinking in C++ (Bruce Eckel, 2nd Edition, 2000). Two volumes; is a tutorial style free set of intro level books. Downloads: vol 1, vol 2. Unfortunately they're marred by a number of trivial errors (e.g. maintaining that temporaries are automatically
const
), with no official errata list. A partial 3rd party errata list is available at (http://www.computersciencelab.com/Eckel.htm), but it is apparently not maintained.Scientific and Engineering C++: An Introduction to Advanced Techniques and Examples (John Barton and Lee Nackman) It is a comprehensive and very detailed book that tried to explain and make use of all the features available in C++, in the context of numerical methods. It introduced at the time several new techniques, such as the Curiously Recurring Template Pattern (CRTP, also called Barton-Nackman trick). It pioneered several techniques such as dimensional analysis and automatic differentiation. It came with a lot of compilable and useful code, ranging from an expression parser to a Lapack wrapper. The code is still available online. Unfortunately, the books have become somewhat outdated in the style and C++ features, however, it was an incredible tour-de-force at the time (1994, pre-STL). The chapters on dynamics inheritance are a bit complicated to understand and not very useful. An updated version of this classic book that includes move semantics and the lessons learned from the STL would be very nice.