More Effective C++, 35 new ways
Scott Meyers

Item 1 Distinguish between pointers and references9
Item 2 Prefer C++-style cast12
Item 3 Never treat arrays polymorphically16
Item 4 Avoid gratuitous default constructors19
Item 5 Be wary of user-defined conversion functions24
Item 6 Distinguish between prefix and postfix forms of increment and decrement operators31
Item 7 Never overload &&, ||, or ,35
Item 8 Understand the different meanings of new and delete38
Item 9 Use destructors to prevent resource leaks45
Item 10 Prevent resource leaks in constructors50
Item 11 Prevent exceptions from leaving destructors58
Item 12 Understand how throwing an exception differs from passing a parameter or calling
a virtual function
Item 13 Catch exceptions by reference68
Item 14 Use exception specifications judiciously72
Item 15 Understand the costs of exception handling78
Item 16 Remember the 80-20 rule82
Item 17 Consider using lazy evaluation85
Item 18 Amortize the cost of expected computations93
Item 19 Understand the origin of temporary objects98
Item 20 Facilitate the return value optimization101
Item 21 Overload to avoid implicit type conversions105
Item 22 Consider using op= instead of stand-alone op107
Item 23 Consider alternative libraries110
Item 24 Understand the costs of virtual functions, multiple inheritance, virtual base classes,
and RTTI
Item 25 Virtualizing constructors and non-member functions123
Item 26 Limiting the number of objects of a class130
Item 27 Requiring or prohibiting heap-based objects145
Item 28 Smart pointers159
Item 29 Reference counting183
Item 30 Proxy classes213
Item 31 Making functions virtual with respect to more than one object228
Item 32 Program in the future tense252
Item 33 Make non-leaf classes abstract258
Item 34 Understand how to combine C++ and C in the same program277
Item 35 Familiarize yourself with the language standard232