Effective C++, 50 ways to improve programs and designs
Scott Meyers

Shifting from C to C++
Item 1 Prefer const and inline to #define.13
Item 2 Prefer <iostream> to <stdio.h>.17
Item 3 Prefer new and delete to malloc and free.19
Item 4 Prefer C++-style comments.21
Memory Management
Item 5 Use the same form in corresponding uses of new and delete.23
Item 6 Use delete on pointer members in destructors.24
Item 7 Be prepared for out-of-memory conditions.25
Item 8 Adhere to convention when writing operator new and operator delete.33
Item 9 Avoid hiding the "normal" form of new.37
Item 10 Write operator delete if you write operator new.39
Constructors, Destructors, and Assignment Operators
Item 11 Declare a copy constructor and an assignment operator for classes with dynamically
allocated memory.
49
Item 12 Prefer initialization to assignment in constructors.52
Item 13 List members in an initialization list in the order in which they are declared.57
Item 14 Make destructors virtual in base classes.59
Item 15 Have operator= return a reference to *this.64
Item 16 Assign to all data members in operator=.68
Item 17 Check for assignment to self in operator=.71
Classes and Functions: Design and Declaration
Item 18 Strive for class interfaces that are complete and minimal.79
Item 19 Differentiate among member functions, non-member functions, and friend functions.84
Item 20 Avoid data members in the public interface.89
Item 21 Use const whenever possible.91
Item 22 Prefer pass-by-reference to pass-by-value.98
Item 23 Don't try to return a reference when you must return an object.101
Item 24 Choose carefully between function overloading and parameter defaulting.106
Item 25 Avoid overloading on a pointer and a numerical type.109
Item 26 Guard against potential ambiguity.113
Item 27 Explicitly disallow use of implicitly generated member functions you don't want.116
Item 28 Partition the global namespace.117
Classes and Functions: Implementation
Item 29 Avoid returning "handles" to internal data.123
Item 30 Avoid member functions that return non-const pointers or references to members
less accessible than themselves.
129
Item 31 Never return a reference to a local object or to a dereferenced pointer initialized
by new within the function.
131
Item 32 Postpone variable definitions as long as possible.135
Item 33 Use inlining judiciously.137
Item 34 Minimize compilation dependencies between files.143
Inheritance and Object-Oriented Design
Item 35 Make sure public inheritance models "isa."154
Item 36 Differentiate between inheritance of interface and inheritance of implementation.161
Item 37 Never redefine an inherited nonvirtual function.169
Item 38 Never redefine an inherited default parameter value.171
Item 39 Avoid casts down the inheritance hierarchy.173
Item 40 Model "has-a" or "is-implemented-in-terms-of" through layering.182
Item 41 Differentiate between inheritance and templates.185
Item 42 Use private inheritance judiciously.189
Item 43 Use multiple inheritance judiciously.194
Item 44 Say what you mean; understand what you're saying.210
Miscellany
Item 45 Know what functions C++ silently writes and calls.212
Item 46 Prefer compile-time and link-time errors to runtime errors.216
Item 47 Ensure that non-local static objects are initialized before they're used.219
Item 48 Pay attention to compiler warnings.223
Item 49 Familiarize yourself with the standard library.224
Item 50 Improve your understanding of C++.232