#include using namespace std; class MyClass { public: int * a; private: int * b; int c; string name; public: // Constructor MyClass(int x=0, const string n="") : name(n) { static int counter = 1; // Allocated in static memory a = new int; // Allocated on the heap *a = x; b = new int[*a]; // Allocated on the heap for (int ii=0;ii<*a;ii++) { b[ii] = ii * *a; } c = counter; cout << " Constructor " << name << " " << *a << " {" << a << "} : " << "b=" << b << " c=" << c << endl; counter++; } // Copy Constructor MyClass(const MyClass & original) { a = new int; // Allocated on the heap *a = *(original.a); b = new int[*a]; // Allocated on the heap for (int ii=0;ii<*a;ii++) { b[ii] = original.b[ii]; } c = original.c + 6000; cout << " Copy ctor " << name << " " << *a << " {" << a << "} : " << "b=" << b << " c=" << c << endl; } // Destructor ~MyClass() { cout << " Destructor " << name << " " << *a << " {" << a << "} : " << "b=" << b << " c=" << c << endl; delete a; a = nullptr; delete[] b; // b points to an array, so use delete[] b = nullptr; } void print() const; }; void MyClass::print() const { cout << " Print: " << name << " " << *a << " {" << a << "} : " << "b=" << b << " c=" << c << endl; } void func(MyClass funParam) { cout << " FUNC: ++++++++++++ start func ++++++++++++" << endl; cout << " FUNC: begin declare func1" << endl; MyClass func1(3, "func1"); cout << " FUNC: end declare func1" << endl; cout << " FUNC: begin print func1" << endl; func1.print(); cout << " FUNC: end print func1" << endl; cout << " FUNC: begin print funParam" << endl; funParam.print(); cout << " FUNC: end print funParam" << endl; cout << " FUNC: ++++++++++++ end func ++++++++++++" << endl; } int main() { cout << "MAIN: begin" << endl; cout << "MAIN: begin declare main1 (object)" << endl; MyClass main1(1, "main1"); cout << "MAIN: end declare main1 (object)" << endl; cout << "MAIN: begin declare main2ptr (pointer)" << endl; MyClass * main2ptr; cout << "MAIN: end declare main2ptr (pointer)" << endl; cout << "MAIN: begin declare main2ptr (pointer)" << endl; main2ptr = new MyClass(2, "main2ptr"); cout << "MAIN: end declare main2ptr (pointer)" << endl; cout << "MAIN: print main1 (&main1 = " << &main1 << ")" << endl; main1.print(); cout << "MAIN: print main2ptr (&main2ptr = " << &main2ptr << ", main2ptr = " << main2ptr << ")" << endl; main2ptr->print(); cout << "MAIN: begin call to func(main1)" << endl; func(main1); cout << "MAIN: end call to func(main1)" << endl; cout << "MAIN: print main1 (&main1 = " << &main1 << ")" << endl; main1.print(); cout << "MAIN: begin delete main2ptr" << endl; delete main2ptr; cout << "MAIN: end delete main2ptr" << endl; cout << "MAIN: complete" << endl; return 0; }