C++: learning & levelling up
The following is a list of materials I tend to suggest to people learning C++. It approximately follows my own path, can cater for those with some sort of programming experience, and may suit complete newbies. Most of the material is more about using C++ correctly, efficiently and safely, or code design, rather than a guide to the language itself, and makes good reading and re-reading for inexperienced and experienced developers alike.
Knowing the language and standard library facilities
The bulk of my early learning was the language itself, and the facilities provided by the standard library.
Thinking in C++ by Bruce Eckel is a highly-acclaimed book of 2 volumes that is available free online. This is a good place to start for beginners, and helped me really ‘get’ a few of the C++ concepts I found trickier early on.
The C++ Programming Language by Bjarne Stroustrup (the creator of C++) is a great, authoritative reference on the language, second only to the standard document itself, but is rather dry. I find it more useful as a reference than casual reading, but YMMV.
Danny Kalev sat on the C++ standards committee a while back, and has created a good C++ reference guide, which is more like a learning guide than a reference. It seems to be kept well updated, and though I haven’t really scratched the surface reading it, the bits I have read have been good quality. It also introduces some parts of the latest standard.
Most of the time cppreference.com is my first port-of-call for standard library questions, since it’s easy to navigate and has a sensible URL structure (e.g. /w/cpp/container/list/front). cplusplus.com is good too, though at time of writing it hasn’t yet been updated for C++11. (NB: C++11 is the latest C++ language standard that was ratified in 2011. Sometimes called by its draft name C++0x. Far from being a dull tweak to syntax and specification, this update adds some significant modern facilities to the language.)
Levelling up your code quality, safety & design
Scott Meyers is a prominent figure in C++ circles, and his Effective C++ and More Effective C++ books give excellent, in-depth coverage of the practicalities and technicalities of using C++. I haven’t read Effective STL, but expect that it is equally good if you’ll be using those facilities. Both EffC++ and MEffC++ are must-reads for a professional C++ developer.
Herb Sutter’s Guru of the Week blog was a series of articles on aspects of OO design and under-the-bonnet/technical C++. I’d highly recommend it once you’re familiar with C++. He’s currently adding to that for C++11 features here, albeit at a measured pace. The slightly lengthier Sutter’s Mill articles listed here are also great material. Familiarising yourself with everything in GotW is a definite level-up in C++.
Robert C. Martin (“Uncle Bob”), has some good papers on principles of OO design. He’s also rather well-known and has other Good Stuff about software craftsmanship.
Making things easier (and safer)
The Boost C++ Libraries have some extremely useful facilities (both general and specialised), are free, actively developed, well-known and accepted in the C++ world to the point of ubiquity, and are excellently written. Some parts of it are of high enough quality and relevance to have been accepted into the standard library in Technical Report 1 [TR1] and C++11.