| |
| |
Preface | |
| |
| |
Acknowledgements | |
| |
| |
| |
Introduction | |
| |
| |
| |
Shifting From C to C++ | |
| |
| |
Prefer const and inline to #define | |
| |
| |
Prefer iostream to stdio.h | |
| |
| |
Prefer new and delete to malloc and free | |
| |
| |
Prefer C++-style comments | |
| |
| |
| |
Memory Management | |
| |
| |
Use the same form in corresponding uses of new and delete | |
| |
| |
Use delete on pointer members in destructors | |
| |
| |
Be prepared for out-of-memory conditions | |
| |
| |
Adhere to convention when writing operator new and operator delete | |
| |
| |
Avoid hiding the "normal" form of new | |
| |
| |
Write operator delete if you write operator new | |
| |
| |
| |
Constructors, Destructors, and Assignment Operators | |
| |
| |
Declare a copy constructor and an assignment operator for classes with dynamically allocated memory | |
| |
| |
Prefer initialization to assignment in constructors | |
| |
| |
List members in an initialization list in the order in which they are declared | |
| |
| |
Make destructors virtual in base classes | |
| |
| |
Have operator return a reference to *this | |
| |
| |
Assign to all data members in operator | |
| |
| |
Check for assignment to self in operator | |
| |
| |
| |
Classes and Functions: Design and Declaration | |
| |
| |
Strive for class interfaces that are complete and minimal | |
| |
| |
Differentiate among member functions, non-member functions, and friend functions | |
| |
| |
Avoid data members in the public interface | |
| |
| |
Use const whenever possible | |
| |
| |
Prefer pass-by-reference to pass-by-value | |
| |
| |
Don't try to return a reference when you must return an object | |
| |
| |
Choose carefully between function overloading and parameter defaulting | |
| |
| |
Avoid overloading on a pointer and a numerical type | |
| |
| |
Guard against potential ambiguity | |
| |
| |
Explicitly disallow use of implicitly generated member functions you don't want | |
| |
| |
Partition the global namespace | |
| |
| |
| |
Classes and Functions: Implementation | |
| |
| |
Avoid returning "handles" to internal data | |
| |
| |
Avoid member functions that return non-const pointers or references to members less accessible than themselves | |
| |
| |
Never return a reference to a local object or to a dereferenced pointer initialized by new within the function | |
| |
| |
Postpone variable definitions as long as possible | |
| |
| |
Use inlining judiciously | |
| |
| |
Minimize compilation dependencies between files | |
| |
| |
| |
Inheritance and Object-Oriented Design | |
| |
| |
Make sure public inheritance models "isa." | |
| |
| |
Differentiate between inheritance of interface and inheritance of implementation | |
| |
| |
Never redefine an inherited nonvirtual function | |
| |
| |
Never redefine an inherited default parameter value | |
| |
| |
Avoid casts down the inheritance hierarchy | |
| |
| |
Model "has-a" or "is-implemented-in-terms-of" through layering | |
| |
| |
Differentiate between inheritance and templates | |
| |
| |
Use private inheritance judiciously | |
| |
| |
Use multiple inheritance judiciously | |
| |
| |
Say what you mean; understand what you're saying | |
| |
| |
| |
Miscellany | |
| |
| |
Know what functions C++ silently writes and calls | |
| |
| |
Prefer compile-time and link-time errors to runtime errors | |
| |
| |
Ensure that non-local static objects are initialized before they're used | |
| |
| |
Pay attention to compiler warnings | |
| |
| |
Familiarize yourself with the standard library | |
| |
| |
Improve your understanding of C++ | |
| |
| |
Afterword | |
| |
| |
Index | |