// Demonstrate constructors and destructors // George F. Riley, ECE2036, Georgia Tech, Fall 2012 #include using namespace std; class A { public: // Define three constructors A(); A(int a0); A(const A& a0); // Define the destructor ~A(); public: int a; // Member variable }; // Default Constructor A::A() : a(0) { cout << "Default constructor, a = " << a << endl; } // Non-Default Constructor A::A(int a0) : a(a0) { cout << "Int constructor, a = " << a << endl; } // Copy Constructor A::A(const A& a0) : a(a0.a) { cout << "Copy constructor, a = " << a << endl; } // Destructor A::~A() { cout << "Destructor, a = " << a << endl; } // Define some global variables of class A A ga1; A ga2(2); A ga3(ga2); // This compiles, but is not a good idea. Why? // Subroutine with no arguments void sub1() { cout << "Entering sub1" << endl; A sub1a; A sub1a2(2); A sub1a3(sub1a2); cout << "Exiting sub1" << endl; } // Subroutine with object A passed by value void sub2(A a) { cout << "Entering sub2" << endl; A sub2a(a); cout << "Exiting sub2" << endl; } // Subroutine with object A passed by address void sub3(A* a) { cout << "Entering sub3" << endl; A sub2a(3); cout << "Exiting sub3" << endl; } int main() { cout << "Entering main" << endl; A a0; A a1(a0); A a2(2); A a3(3); A a4 = a2; // What about this one? cout << "Calling sub1" << endl; sub1(); cout << "Back from sub1" << endl; cout << "Calling sub2" << endl; sub2(a3); cout << "Back from sub2" << endl; cout << "Calling sub3" << endl; sub3(&a2); cout << "Back from sub3" << endl; cout << "Exiting main" << endl; }