Reputation: 2668
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
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
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