多次调用C ++拷贝构造函数

时间:2016-10-14 16:30:39

标签: c++ constructor copy-constructor

我试图理解复制构造函数的基础知识,并且遇到了以下示例。

#include <iostream>

using namespace std;

class Line
{
   public:
      int getLength() const;
      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()
{
    cout << "Freeing memory!" << endl;
    delete ptr;
}
int Line::getLength() const
{
    return *ptr;
}

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

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

   Line line2 = line1; // This also calls copy constructor

   //display(line1);
   //display(line2);

   return 0;
}

执行时,它会提供以下输出。

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

复制构造函数只在Line line2 = line1;中调用一次但似乎复制构造函数被调用了两次。所以我评论了 display(line1);display(line2);。之后输出就是这样的。

Normal constructor allocating ptr
Copy constructor allocating ptr.
Freeing memory!
Freeing memory!

所以问题(我不知道我是应该把它称为问题还是C ++中的默认标准)是显示功能。可能是因为display()函数会自动创建其处理对象的副本,这就是为什么每个实例都会调用两次复制构造函数的原因?请澄清一下。感谢。

2 个答案:

答案 0 :(得分:2)

使用void display(Line obj),您可以按值传递对象,因此请创建副本。

你应该通过(const)引用来避免副本:

void display(const Line& obj)

答案 1 :(得分:1)

  

可能是因为display()函数会自动创建其处理对象的副本,这就是为每个实例调用两次复制构造函数的原因吗?请澄清一下。感谢。

这正是发生的事情。如果通过值将对象传递给函数,则会在执行函数调用之前复制它。如果您不希望发生这种情况,请使用指针或引用。