Open In App
Related Articles

Output of C++ Program | Set 13

Improve Article
Improve
Save Article
Save
Like Article
Like

Predict the output of following C++ program.




#include<iostream>
using namespace std;
  
class A
{
    // data members of A
public:
    A ()           { cout << "\n A's constructor"; /* Initialize data members */ }
    A (const A &a) { cout << "\n A's Copy constructor"/* copy data members */}
    A& operator= (const A &a) // Assignemt Operator
    {
        // Handle self-assignment:
        if(this == &a) return *this;
  
        // Copy data members
        cout << "\n A's Assignment Operator"return *this;
    }
};
  
class B
{
    A a;
    // Other members of B
public:
    B(A &a) { this->a = a; cout << "\n B's constructor"; }
};
  
int main()
{
    A a1;
    B b(a1);
    return 0;
}


Output:

 A's constructor
 A's constructor
 A's Assignment Operator
 B's constructor

The first line of output is printed by the statement “A a1;” in main().
The second line is printed when B’s member ‘a’ is initialized. This is important.
The third line is printed by the statement “this->a = a;” in B’s constructor.
The fourth line is printed by cout statement in B’s constructor.

If we take a closer look at the above code, the constructor of class B is not efficient as member ‘a’ is first constructed with default constructor, and then the values from the parameter are copied using assignment operator. It may be a concern when class A is big, which generally is the case with many practical classes. See the following optimized code.





#include<iostream>
using namespace std;
  
class A
{
    // data members of A
public:
    A()           { cout << "\n A's constructor"; /* Initialize data members */ }
    A(const A &a) { cout << "\n A's Copy constructor"; /* Copy data members */ }
    A& operator= (const A &a) // Assignemt Operator
    {
        // Handle self-assignment:
        if(this == &a) return *this;
  
        // Copy data members
        cout << "\n A's Assignment Operator"return *this;
    }
};
  
class B
{
    A a;
    // Other members of B
public:
    B(A &a):a(a) {  cout << "\n B's constructor"; }
};
  
int main()
{
    A a;
    B b(a);
    return 0;
}


Output:

 A's constructor
 A's Copy constructor
 B's constructor

The constructor of class B now uses initializer list to initialize its member ‘a’. When Initializer list is used, the member ‘a’ of class B is initialized directly from the parameter. So a call to A’s constructor is reduced.
In general, it is a good idea to use Initializer List to initialize all members of a class, because it saves one extra assignment of members. See point 6 of this post for more details.

Please write comments if you find anything incorrect, or you want to share more information about the topic discussed above


Whether you're preparing for your first job interview or aiming to upskill in this ever-evolving tech landscape, GeeksforGeeks Courses are your key to success. We provide top-quality content at affordable prices, all geared towards accelerating your growth in a time-bound manner. Join the millions we've already empowered, and we're here to do the same for you. Don't miss out - check it out now!

Last Updated : 28 Sep, 2018
Like Article
Save Article
Previous
Next
Similar Reads