In general, classes that possess pointers, file handles, and other resources need a user-defined constructor to avoid aliasing. For example:
class Person {private: int age; char * name;public: // the following three member functions must be defined by the class implementer Person (const char * name, int age); Person & operator= (const Person & other); Person (const Person& other);};
Seemingly, there’s no escape from explicitly defining a copy constructor and assignment operator for class Person, or else the compiler-generated copy constructor and assignment operator will result in aliasing. However, the aliasing problem in this case results from the reliance on low-level language constructs (a bare pointer). Had class Person possessed an embedded std::string object instead of a pointer to char, the user-written copy constructor and assignment operator wouldn’t be needed. When a class needs user-defined assignment operator and copy constructor, it may indicate a design flaw rather than an unavoidable necessity.