Shreyas
Shreyas

Reputation: 351

Explain this c++ code

#include <iostream>
using namespace std;

class A
{
    int n;
public:
    A()
    {
        cout << "Constructor called" << endl;
    }
    ~A()
    {
        cout << "Destructor called" << endl;
    }
};

int main()
{
    A a;           //Constructor called
    A b = a;       //Constructor not called
    return 0;
}

output:

Constructor called
Destructor called
Destructor called

Constructor is called once while the destructor is called twice What is happning here? Is this undefined behaviour?

Upvotes: 2

Views: 172

Answers (5)

Santosh Sahu
Santosh Sahu

Reputation: 2244

A b=a => A b(a) => This calls the default copy constructor of the class.

Upvotes: 0

Pete B.
Pete B.

Reputation: 3286

There are two instances of object A created. One is created by a constructor, the other by the copy constructor. Since you did not explicitly define one, the compiler did the work for you.

Once the app exits, since there are two objects, the destructor method is called twice.

Upvotes: 0

Nemanja Boric
Nemanja Boric

Reputation: 22187

In the snippet

A b = a

you are not calling your constructor, but the generated copy constructor:

class A
{
    int n;
public:
    A()
    {
        cout << "Constructor called" << endl;
    }
    A(const A& rv)
    {
        cout << "Copy constructor called" << endl;
        // If you are not using default copy constructor, you need
        // to copy fields by yourself.
        this->n = rv.n;
    }
    ~A()
    {
        cout << "Destructor called" << endl;
    }
};

Upvotes: 3

Karthik T
Karthik T

Reputation: 31972

The second line invokes what is called a Copy Constructor. Much like lawyers, if you do not have one, one will be provided for you by the compiler.

It is a special type of converter that is invoked when you initialize a variable with another of the same type.

A b(a)
A b = a

Both of these invoke it.

A(const A& a)
{
    cout << "Copy Constructor called" << endl;
    //manually copy one object to another
}

Add this code to see it. Wikipedia has more info.

Upvotes: 13

asafrob
asafrob

Reputation: 1858

Default Copy Constructor is used to create the second instance. When you leave the scope the destractor for both objects is called

Upvotes: 2

Related Questions