如何在这个拷贝构造函数中调用?

时间:2015-07-22 21:14:19

标签: c++

我是第一次阅读复制构造函数。以下是我正在阅读的链接:http://www.tutorialspoint.com/cplusplus/cpp_copy_constructor.htm

现在,在他们的第一个例子中,在输出中,他们写了这个:

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

我只想知道,复制构造函数究竟是如何调用的?在main函数中,他们将其写为:

#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;
}

所以,它只是Line line(10),它将调用构造函数来设置长度。为什么要调用复制构造函数?当我们传递类Line的实际对象时,不会调用构造函数吗?

4 个答案:

答案 0 :(得分:2)

您将line的值传递给display

按值将对象传递给函数时,会在堆栈上创建对象的副本。在您的情况下,创建obj函数的display参数,调用class Line的复制构造函数。

答案 1 :(得分:1)

当您将实体对象作为显示(Line)函数参数传递时,将调用复制构造函数,因为在传递实体对象时,C ++参数是按值传递的。因此,当您将Line对象传递给函数时,将调用复制构造函数以从现有对象创建对象副本。为避免复制,您需要通过引用或指针(智能或正常)传递参数。

答案 2 :(得分:1)

display的定义如下:

void display(Line obj)

这是按值传递而不是通过引用传递。必须制作副本,这就是调用复制构造函数的原因。

答案 3 :(得分:1)

您的函数display定义如下:

void display(Line obj)

这是call-by-value,在call-by-value的情况下,参数的副本被创建,而不是传递实际的对象。因此,当调用函数时,将调用copy constructor。 如果要避免它,请通过引用或指针传递参数。

Display的定义从void display(Line obj)更改为

void display(Line *obj)

并在main中将函数调用从display(line);更改为display(&line);