我试图理解复制构造函数的基础知识,并且遇到了以下示例。
#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()函数会自动创建其处理对象的副本,这就是为什么每个实例都会调用两次复制构造函数的原因?请澄清一下。感谢。
答案 0 :(得分:2)
使用void display(Line obj)
,您可以按值传递对象,因此请创建副本。
你应该通过(const)引用来避免副本:
void display(const Line& obj)
答案 1 :(得分:1)
可能是因为display()函数会自动创建其处理对象的副本,这就是为每个实例调用两次复制构造函数的原因吗?请澄清一下。感谢。
这正是发生的事情。如果通过值将对象传递给函数,则会在执行函数调用之前复制它。如果您不希望发生这种情况,请使用指针或引用。