text: C++ Language Reference Classes and Structs Constructors
  Constructors Copy Constructors and Copy Assignment Operators
  The preceding code could mean "copy the contents of FILE1.DAT to FILE2.DAT" or it could mean "ignore FILE2.DAT and make b a second handle to FILE1.DAT." You must attach appropriate copying semantics to each class, as follows.
  By using the assignment operator operator= together with a reference to the class type as the return type and the parameter that is passed by const reference—for example ClassName& operator=(const ClassName& x);.
  Compiler-generated copy constructors, like user-defined copy constructors, have a single argument of type "reference to class-name." An exception is when all base classes and member classes have copy constructors declared as taking a single argument of type const class-name&. In such a case, the compiler-generated copy constructor's argument is also const.
  Compiler-generated assignment operators follow the same pattern with regard to const. They take a single argument of type class-name& unless the assignment operators in all base and member classes take arguments of type const class-name&. In this case, the class's generated assignment operator takes a const argument.