/* File essential.cpp shinnerl@ucla.edu Example illustrating automatic calls to the essential member functions: 1) Default constructor 2) Copy constructor 3) Destructor 4) Assignment operator Note that there is no need for our class X to have any data members here. */ #include using namespace std; class X{ public: X() { cout << "Class X default constructor called!\n"; } X(const X& x) { cout << "Class X copy constructor called!\n"; } ~X() { cout << "Class X destructor called!\n"; } const X& operator=(const X& ); }; const X& X::operator=(const X& rhs) { cout << "Class X assignment operator called!\n"; return *this; } class Y {public: X x; }; // Each instance of class Y has an instance // of class X as a member. X foo(X x0){ // Receives an X by value and returns return x0; // it by value, causing two copy-constructor calls. } int main(){ X x1, x2; // Two calls to the default constructor for X. Y y1, y2; // Two calls to the default constructor for Y // (and hence, to the default constructor for X also). foo(x1); // Two calls to the copy constructor for X. y2 = y1; // Assignment for Y is memberwise (shallow copy); // hence, assignment for X also. return 0; } // Four calls to the destructor for X. /* Output: whale.77> a.out Class X default constructor called! Class X default constructor called! Class X default constructor called! Class X default constructor called! Class X copy constructor called! Class X copy constructor called! Class X destructor called! Class X destructor called! Class X assignment operator called! Class X destructor called! Class X destructor called! Class X destructor called! Class X destructor called! whale.78> */