Effective C++ by Scott Meyers (Short Summary)
  • Introduction
  • 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 a 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.
Powered by GitBook
On this page
  1. Chapter 2 - Constructors, Destructors, and Assignment Operators

Item 10 - Have assignment operators return a reference to *this.

One of the interesting things about assignemnts is that you can chain them together:

int x,y,z;
x = y = z = 15;                    // chain of assignments.

Also interesting is that assignment is right-associative, so the above assignment chain is parsed like this:

x = (y = (z = 15));

The way this is implemented is that assignment returns a reference to its left-hand argument, and that's the convention you should follow when you implement assignment operators for you classes:

class Widget {
public:
    ...
    Widget& operator= (const Widget& rhs)        // return type is a reference to the current class
    {
        ...
        return *this;
    }
    ...
};

This convention applies to all assignment operators, not just the standard form shown above. Hence:

class Widget {
public:
    ...
    Widget& operator+=(const Widget& rhs)        // it applies even if the operator's parameter type is unconventional
    {
        ...
        return *this;
    }
    ...
};

This is only a conventionl code that doesn't follow it will compile. However, the convention is followed by all the built-in types as well as by all the types in the STL.

Things to Remember

  • Have assignment operators return a reference to *this

PreviousItem 9 - Never call virtual functions during construction or destruction.NextItem 11 - Handle assignment to self in operator=.

Last updated 3 years ago