Last update 10 Nov 2017.
There are an ENORMOUS number of C++ books. Many of them (sadly) have major errors, describing a language that is similar to, but fundamentally different from, the actual C++ language. There are many lists like Stack Overflow’s book guides, both for books to read and books to avoid.
There have been several book lists about learning C++ over the years. Some were once recommend and have fallen from favor as the language evolved. There is a long history of the language. It started as C back before there was an official C standard. As was common in the 1970s languages were customized for their unique hardware. One language started as C, then became K&R C, then an international standard. Another language was C, then became AT&T/Stroustrup C, then C with classes, C++ 2.0, and later its own international standard. The standardized versions are C++98 (initial standard), C++03 (minor update), some updates generally called ‘TR1’ (minor update), C++11 (major update), C++14 (minor update), and now the C++17 major update.
This is my own list of books, and the reason I recommend them. The list has evolved from the old Undernet’s #C++ list with some updates over the years.
Read them mostly in the order listed.
# “Accelerated C++” by Andrew Koenig and Barabara Moo
This is a fairly gentle introduction with good coverage of the language. They expect that you either have programmed before or that you are bright enough to figure out preliminary stuff. The book is old covering C++98, but the things it teaches have not changed much.
# “C++ Primer” by Lippman, Lajoie, and Moo. (NOT “C++ Primer Plus”)
An even gentler introduction for those who need more hand-holding. It is a very mild recommendation, only if Accelerated C++ is too sharp of a learning curve. Fifth edition covers the updates through C++11.
# “Effective C++” by Scott Meyers
If you are comfortable with C++ from reading the first two books, or if you are coming from another language like Java or C#, read this next. It basically outlines the reasons for certain decisions and patterns in the language. Third edition covers C++03.
# “Effective Modern C++” by Scott Meyers
The 2015 followup to Effective C++. C++ is an evolving language, and there have been three updates to the language since the earlier book. This covers useful tips and tricks for features added to the language in TR1, C++11, and C++14.
# “Effective STL” by Scott Meyers
This was one of the earliest books teaching the C++ standard library. It is a gentle book to read that covers common ways to use the standard library. (Note that the name choice is unfortunate due to historical reasons. There were several “Standard Template Libraries” and most old “STL” referred to libraries by Silicon Graphics. The C++ Standard Library is unfortunately incorrectly referred to as STL.) Written against C++98, some portions are outdated but still work.
These books assume you are comfortable with the language and are ready to deal with some of the sharp edges. Herb Sutter has been in charge of the C++ Standards Committee since the beginning, although he left for a time and was talked into returning. These books come from online discussions where people struggled over ‘gotcha’ cases, subtle bugs, and unexpected behavior in the language. Written against C++98, but they still apply.
# “The C++ Standard Library” by Nicolai Josuttis
This is an advanced book, not for beginners. This is a very deep, very technical, very enlightening book sometimes used in university studies. It covers highly detailed notes about using and leveraging the standard library. It gives excellent examples of how to use everything in the C++ Standard Library, and explains occasional details about how not to use it. I recommend working through it like you would a college textbook, carefully studying a chapter at a time over a three month span. Second edition updated to C++11.
# The actual current C++ standard [PDF format]
Many programmers don’t even know it exists! Unlike the other books that are references to teach you the language, this is is the actual language definition the books describe. Once you are very comfortable with the language, it is good to read the actual language standard. It specifies what is, and what is not, C++. I’ve worked with lifelong programmers who misunderstood core features of the language, others who didn’t understand that some things were recommended rather than required, and that some of their frequent patterns were actually “undefined” by the language. It is a highly technical read, but that is because it is a specification and reference rather than a tutorial.
Note that there have been other books that were good for their time but are no longer recommended. Meyer’s book “More Effective C++” falls into this category. It is an interesting read with many little tidbits that can be useful, but overall the book was based on the draft C++98 standard and large portions are out of date. Many people recommend Stroustrup’s books (“The C++ Programming Language” and “Programming Principles and Practice using C++”) that interesting reads if you are familiar with the language, but I don’t think they are the best teaching books nor the best reference books. Also his book”The C++ Programming Language” was considered the standard in the mid 1980s and early 1990s, but it is no longer a must-read. It has some interesting tidbits and trivia in it, but the language they describe is not the standard any more and much of the code no longer compiles. Bruce Eckel’s “Thinking in C++ second edition” is freely available from his web site and has helped many people around the globe, but it is out of date and contains some errors. Read them if you want, just be aware there are better books to learn from.