为什么此代码在传递的对象不是Line类型时调用复制构造函数,并且没有等于operator / explicit调用。 A行和A行()之间是否有区别 我从许多在线教程中读到它应该是Line类型。我是C ++的新手。请帮忙
#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;
}
答案 0 :(得分:10)
这是因为您的display
方法通过值接受其参数 - 因此在传递参数时会生成副本。要避免复制,请将参数声明为{em>引用,而不是Line
,方法是添加&符号&
:
void display(Line& obj)
{
cout << "Length of line : " << obj.getLength() <<endl;
}
如果您想确保display
方法无法修改Line
,请考虑将其设为const
参考:
void display(const Line& obj)
{
cout << "Length of line : " << obj.getLength() <<endl;
}
您还需要将Line::getLength()
方法声明为const
成员函数,否则编译器不会允许您在{{1}上调用它object:
const
答案 1 :(得分:2)
通常在以下情况下会调用复制构造函数: