我是第一次阅读复制构造函数。以下是我正在阅读的链接: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
的实际对象时,不会调用构造函数吗?
答案 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);