More Books
Effective C++ 55 Specific Ways to Improve Your Programs and Designs
Effective C++ Third Edition 55 Specific Ways to Improve Your Programs and Designs
Table of Contents
Copyright
Praise for Effective C++, Third Edition
Addison-Wesley Professional Computing Series
Preface
Acknowledgments
Introduction
Terminology
Chapter 1. Accustoming Yourself to C++
Item 1: View C++ as a federation of languages
Item 2: Prefer consts, enums, and inlines to #defines
Item 3: Use const whenever possible
Item 4: Make sure that objects are initialized before they're used
Chapter 2. Constructors, Destructors, and Assignment Operators
Item 5: Know what functions C++ silently writes and calls
Item 6: Explicitly disallow the use of compiler-generated functions you do not want
Item 7: Declare destructors virtual in polymorphic base classes
Item 8: Prevent exceptions from leaving destructors
Item 9: Never call virtual functions during construction or destruction
Item 10: Have assignment operators return a reference to *this
Item 11: Handle assignment to self in operator=
Item 12: Copy all parts of an object
Chapter 3. Resource Management
Item 13: Use objects to manage resources.
Item 14: Think carefully about copying behavior in resource-managing classes.
Item 15: Provide access to raw resources in resource-managing classes.
Item 16: Use the same form in corresponding uses of new and delete.
Item 17: Store newed objects in smart pointers in standalone statements.
Chapter 4. Designs and Declarations
Item 18: Make interfaces easy to use correctly and hard to use incorrectly
Item 19: Treat class design as type design
Item 20: Prefer pass-by-reference-to-const to pass-by-value
Item 21: Don't try to return a reference when you must return an object
Item 22: Declare data members private
Item 23: Prefer non-member non-friend functions to member functions
Item 24: Declare non-member functions when type conversions should apply to all parameters
Item 25: Consider support for a non-throwing swap
Chapter 5. Implementations
Item 26: Postpone variable definitions as long as possible.
Item 27: Minimize casting.
Item 28: Avoid returning "handles" to object internals.
Item29: Strive for exception-safe code.
Item 30: Understand the ins and outs of inlining.
Item31: Minimize compilation dependencies between files.
Chapter 6. Inheritance and Object-Oriented Design
Item 32: Make sure public inheritance models "is-a."
Item 33: Avoid hiding inherited names
Item 34: Differentiate between inheritance of interface and inheritance of implementation
Item 35: Consider alternatives to virtual functions
Item 36: Never redefine an inherited non-virtual function
Item 37: Never redefine a function's inherited default parameter value
Item 38: Model "has-a" or "is-implemented-in-terms-of" through composition
Item 39: Use private inheritance judiciously
Item 40: Use multiple inheritance judiciously
Chapter 7. Templates and Generic Programming
Item 41: Understand implicit interfaces and compile-time polymorphism
Item 42: Understand the two meanings of typename
Item 43: Know how to access names in templatized base classes
Item 44: Factor parameter-independent code out of templates
Item 45: Use member function templates to accept "all compatible types."
Item 46: Define non-member functions inside templates when type conversions are desired
Item 47: Use traits classes for information about types
Item 48: Be aware of template metaprogramming
Chapter 8. Customizing new and delete
Item 49: Understand the behavior of the new-handler
Item 50: Understand when it makes sense to replace new and delete
Item 51: Adhere to convention when writing new and delete
Item 52: Write placement delete if you write placement new
Chapter 9. Miscellany
Item 53: Pay attention to compiler warnings.
Item 54: Familiarize yourself with the standard library, including TR1
Item.55: Familiarize yourself with Boost.
Appendix A. Beyond Effective C++
Appendix B. Item Mappings Between Second and Third Editions
Index
index_SYMBOL
index_A
index_B
index_C
index_D
index_E
index_F
index_G
index_H
index_I
index_J
index_K
index_L
index_M
index_N
index_O
index_P
index_R
index_S
index_T
index_U
index_V
index_W
index_X
index_Z

Appendix A. Beyond Effective C++

Effective C++ covers what I consider to be the most important general guidelines for practicing C++ programmers, but if you're interested in more ways to improve your effectiveness, I encourage you to examine my other C++ books, More Effective C++ and Effective STL.

More Effective C++ covers additional programming guidelines and includes extensive treatments of topics such as efficiency and programming with exceptions. It also describes important C++ programming techniques like smart pointers, reference counting, and proxy objects.

Effective STL is a guideline-oriented book like Effective C++, but it focuses exclusively on making effective use of the Standard Template Library.

Tables of contents for both books are summarized below.

Contents of More Effective C++

Basics

Item 1:

Distinguish between pointers and references

Item 2:

Prefer C++-style casts

Item 3:

Never treat arrays polymorphically

Item 4:

Avoid gratuitous default constructors


Operators

Item 5:

Be wary of user-defined conversion functions

Item 6:

Distinguish between prefix and postfix forms of increment and decrement operators

Item 7:

Never overload &&, ||, or,

Item 8:

Understand the different meanings of new and delete


Exceptions

Item 9:

Use destructors to prevent resource leaks

Item 10:

Prevent resource leaks in constructors

Item 11:

Prevent exceptions from leaving destructors

Item 12:

Understand how throwing an exception differs from passing a parameter or calling a virtual function

Item 13:

Catch exceptions by reference

Item 14:

Use exception specifications judiciously

Item 15:

Understand the costs of exception handling


Efficiency

Item 16:

Remember the 80-20 rule

Item 17:

Consider using lazy evaluation

Item 18:

Amortize the cost of expected computations

Item 19:

Understand the origin of temporary objects

Item 20:

Facilitate the return value optimization

Item 21:

Overload to avoid implicit type conversions

Item 22:

Consider using op= instead of stand-alone op

Item 23:

Consider alternative libraries

Item 24:

Understand the costs of virtual functions, multiple inheritance, virtual base classes, and RTTI


Techniques

Item 25:

Virtualizing constructors and non-member functions

Item 26:

Limiting the number of objects of a class

Item 27:

Requiring or prohibiting heap-based objects

Item 28:

Smart pointers

Item 29:

Reference counting

Item 30:

Proxy classes

Item 31:

Making functions virtual with respect to more than one object


Miscellany

Item 32:

Program in the future tense

Item 33:

Make non-leaf classes abstract

Item 34:

Understand how to combine C++ and C in the same program

Item 35:

Familiarize yourself with the language standard


Contents of Effective STL

Chapter 1: Containers

Item 1:

Choose your containers with care.

Item 2:

Beware the illusion of container-independent code.

Item 3:

Make copying cheap and correct for objects in containers.

Item 4:

Call empty instead of checking size() against zero.

Item 5:

Prefer range member functions to their single-element counterparts.

Item 6:

Be alert for C++'s most vexing parse.

Item 7:

When using containers of newed pointers, remember to delete the pointers before the container is destroyed.

Item 8:

Never create containers of auto_ptrs.

Item 9:

Choose carefully among erasing options.

Item 10:

Be aware of allocator conventions and restrictions.

Item 11:

Understand the legitimate uses of custom allocators.

Item 12:

Have realistic expectations about the thread safety of STL containers.


Chapter 2: vector and string

Item 13:

Prefer vector and string to dynamically allocated arrays.

Item 14:

Use reserve to avoid unnecessary reallocations.

Item 15:

Be aware of variations in string implementations.

Item 16:

Know how to pass vector and string data to legacy APIs.

Item 17:

Use "the swap TRick" to trim excess capacity.

Item 18:

Avoid using vector<bool>.


Chapter 3: Associative Containers

Item 19:

Understand the difference between equality and equivalence.

Item 20:

Specify comparison types for associative containers of pointers.

Item 21:

Always have comparison functions return false for equal values.

Item 22:

Avoid in-place key modification in set and multiset.

Item 23:

Consider replacing associative containers with sorted vectors.

Item 24:

Choose carefully between map::operator[] and map::insert when efficiency is important.

Item 25:

Familiarize yourself with the nonstandard hashed containers.


Chapter 4: Iterators

Item 26:

Prefer iterator to const_iterator, reverse_iterator, and const_reverse_iterator.

Item 27:

Use distance and advance to convert a container's const_iterators to iterators.

Item 28:

Understand how to use a reverse_iterator's base iterator.

Item 29:

Consider istreambuf_iterators for character-by-character input.


Chapter 5: Algorithms

Item 30:

Make sure destination ranges are big enough.

Item 31:

Know your sorting options.

Item 32:

Follow remove-like algorithms by erase if you really want to remove something.

Item 33:

Be wary of remove-like algorithms on containers of pointers.

Item 34:

Note which algorithms expect sorted ranges.

Item 35:

Implement simple case-insensitive string comparisons via mismatch or lexicographical_compare.

Item 36:

Understand the proper implementation of copy_if.

Item 37:

Use accumulate or for_each to summarize ranges.


Chapter 6: Functors, Functor Classes, Functions, etc.

Item 38:

Design functor classes for pass-by-value.

Item 39:

Make predicates pure functions.

Item 40:

Make functor classes adaptable.

Item 41:

Understand the reasons for ptr_fun, mem_fun, and mem_fun_ref.

Item 42:

Make sure less<T> means operator<.


Chapter 7: Programming with the STL

Item 43:

Prefer algorithm calls to hand-written loops.

Item 44:

Prefer member functions to algorithms with the same names.

Item 45:

Distinguish among count, find, binary_search, lower_bound, upper_bound, and equal_range.

Item 46:

Consider function objects instead of functions as algorithm parameters.

Item 47:

Avoid producing write-only code.

Item 48:

Always #include the proper headers.

Item 49:

Learn to decipher STL-related compiler diagnostics.

Item 50:

Familiarize yourself with STL-related web sites.