Shashwat
Shashwat

Reputation: 2668

Copy constructor understanding

I was going through this to study copy constructor again.

CODE:

#include <iostream>

using namespace std;

class Line
{
   public:
      int getLength( void );
      Line( int len );             // simple constructor
      Line( const Line &obj);  // copy constructor
      ~Line();                     // destructor

   private:
      int *ptr;
};

// Member functions definitions including constructor
Line::Line(int len)
{
    cout << "Normal constructor allocating ptr" << endl;
    // allocate memory for the pointer;
    ptr = new int;
    *ptr = len;
}

Line::Line(const Line &obj)
{
    cout << "Copy constructor allocating ptr." << endl;
    ptr = new int;
   *ptr = *obj.ptr; // copy the value
}

Line::~Line(void)
{
    cout << "Freeing memory!" << endl;
    delete ptr;
}
int Line::getLength( void )
{
    return *ptr;
}

void display(Line obj)
{
   cout << "Length of line : " << obj.getLength() <<endl;
}

// Main function for the program
int main( )
{
   Line line(10);

   display(line);

   return 0;
}

OUTPUT:

Normal constructor allocating ptr
Copy constructor allocating ptr.
Length of line : 10
Freeing memory!
Freeing memory!

I was wondering why it is calling Copy constructor in Line line(10). I think it should call the normal constructor only. I'm not cloning any object here. Please someone explain me this.

Upvotes: 1

Views: 267

Answers (2)

Alok Save
Alok Save

Reputation: 206518

I was wondering why it is calling Copy constructor in Line line(10).

No, it does not.
It just calls the constructor for Line class constructor which takes a int as parameter.


void display(Line obj)    

Passes Line object by value and hence copy constructor is called to create the copy being passed to the function.

In C++ function arguments are passsed by value by default. And the copy of these objects is created by calling the copy constructor of that class.

Upvotes: 3

mathematician1975
mathematician1975

Reputation: 21351

The copy constructor is called because the function parameter is passed by value. Here

void display(Line obj)

the function is defined as taking the Line parameter by value. This results in a copy of the argument being made. Had you passed by reference, the copy constructor would not be called

Upvotes: 9

Related Questions