I've listed the table of contents from C++ Coding Standards by Herb Sutter and Andrei Alexandrescu below.

Table of Contents

Organizational and Policy Issues

  • 0 Don't sweat the small stuff. (Or: Know what not to standardize.)
  • 1 Compile cleanly at high warning levels.
  • 2 Use an automated build system.
  • 3 Use a version control system.
  • 4 Invest in code reviews.

Design Style

  • 5 Give one entity one cohesive responsibility.
  • 6 Correctness, simplicity, and clarity come first.
  • 7 Know when and how to code for scalability.
  • 8 Don't optimize prematurely.
  • 9 Don't pessimize prematurely.
  • 10 Minimize global and shared data.
  • 11 Hide information.
  • 12 Know when and how to code for concurrency.
  • 13 Ensure resources are owned by objects. Use explicit RAII and smart pointers.

Coding Style

  • 14 Prefer compile- and link-time errors to run-time errors.
  • 15 Use const proactively.
  • 16 Avoid macros.
  • 17 Avoid magic numbers.
  • 18 Declare variables as locally as possible.
  • 19 Always initialize variables.
  • 20 Avoid long functions. Avoid deep nesting.
  • 21 Avoid initialization dependencies across compilation units.
  • 22 Minimize definitional dependencies. Avoid cyclic dependencies.
  • 23 Make header files self-sufficient.
  • 24 Always write internal #include guards. Never write external #include guards.

Functions and Operators

  • 25 Take parameters appropriately by value, (smart) pointer, or reference.
  • 26 Preserve natural semantics for overloaded operators.
  • 27 Prefer the canonical forms of arithmetic and assignment operators.
  • 28 Prefer the canonical form of ++ and --. Prefer calling the prefix forms.
  • 29 Consider overloading to avoid implicit type conversions.
  • 30 Avoid overloading &&, ||, or , (comma) .
  • 31 Don't write code that depends on the order of evaluation of function arguments.

Class Design and Inheritance

  • 32 Be clear what kind of class you're writing.
  • 33 Prefer minimal classes to monolithic classes.
  • 34 Prefer composition to inheritance.
  • 35 Avoid inheriting from classes that were not designed to be base classes.
  • 36 Prefer providing abstract interfaces.
  • 37 Public inheritance is substitutability. Inherit, not to reuse, but to be reused.
  • 38 Practice safe overriding.
  • 39 Consider making virtual functions nonpublic, and public functions nonvirtual.
  • 40 Avoid providing implicit conversions.
  • 41 Make data members private, except in behaviorless aggregates (C-style structs).
  • 42 Don't give away your internals.
  • 43 Pimpl judiciously.
  • 44 Prefer writing nonmember nonfriend functions.
  • 45 Always provide new and delete together.
  • 46 If you provide any class-specific new, provide all of the standard forms (plain, in-place, and nothrow).

Construction, Destruction, and Copying

  • 47 Define and initialize member variables in the same order.
  • 48 Prefer initialization to assignment in constructors.
  • 49 Avoid calling virtual functions in constructors and destructors.
  • 50 Make base class destructors public and virtual, or protected and nonvirtual.
  • 51 Destructors, deallocation, and swap never fail.
  • 52 Copy and destroy consistently.
  • 53 Explicitly enable or disable copying.
  • 54 Avoid slicing. Consider Clone instead of copying in base classes.
  • 55 Prefer the canonical form of assignment.
  • 56 Whenever it makes sense, provide a no-fail swap (and provide it correctly).

Namespaces and Modules

  • 57 Keep a type and its nonmember function interface in the same namespace.
  • 58 Keep types and functions in separate namespaces unless they're specifically intended to work together.
  • 59 Don't write namespace usings in a header file or before an #include.
  • 60 Avoid allocating and deallocating memory in different modules.
  • 61 Don't define entities with linkage in a header file.
  • 62 Don't allow exceptions to propagate across module boundaries.
  • 63 Use sufficiently portable types in a module's interface.

Templates and Genericity

  • 64 Blend static and dynamic polymorphism judiciously.
  • 65 Customize intentionally and explicitly.
  • 66 Don't specialize function templates.
  • 67 Don't write unintentionally nongeneric code.

Error Handling and Exceptions

  • 68 Assert liberally to document internal assumptions and invariants.
  • 69 Establish a rational error handling policy, and follow it strictly.
  • 70 Distinguish between errors and non-errors.
  • 71 Design and write error-safe code.
  • 72 Prefer to use exceptions to report errors.
  • 73 Throw by value, catch by reference.
  • 74 Report, handle, and translate errors appropriately.
  • 75 Avoid exception specifications.

STL: Containers

  • 76 Use vector by default. Otherwise, choose an appropriate container.
  • 77 Use vector and string instead of arrays.
  • 78 Use vector (and string::c_str) to exchange data with non-C++ APIs.
  • 79 Store only values and smart pointers in containers.
  • 80 Prefer push_back to other ways of expanding a sequence.
  • 81 Prefer range operations to single-element operations.
  • 82 Use the accepted idioms to really shrink capacity and really erase elements.

STL: Algorithms

  • 83 Use a checked STL implementation.
  • 84 Prefer algorithm calls to handwritten loops.
  • 85 Use the right STL search algorithm.
  • 86 Use the right STL sort algorithm.
  • 87 Make predicates pure functions.
  • 88 Prefer function objects over functions as algorithm and comparer arguments.
  • 89 Write function objects correctly.

Type Safety

  • 90 Avoid type switching; prefer polymorphism.
  • 91 Rely on types, not on representations.
  • 92 Avoid using reinterpret_cast.
  • 93 Avoid using static_cast on pointers.
  • 94 Avoid casting away const.
  • 95 Don't use C-style casts.
  • 96 Don't memcpy or memcmp non-PODs.
  • 97 Don't use unions to reinterpret representation.
  • 98 Don't use varargs (ellipsis).
  • 99 Don't use invalid objects. Don't use unsafe functions.
  • 100 Don't treat arrays polymorphically.