我知道C++编译器为类创建了一个复制构造函数。在哪种情况下,我们必须编写用户定义的复制构造函数?你能举一些例子吗?
发布于 2010-07-19 05:22:37
由编译器生成的复制构造函数执行成员级复制。有时这还不够。例如:
class Class {
public:
Class( const char* str );
~Class();
private:
char* stored;
};
Class::Class( const char* str )
{
stored = new char[srtlen( str ) + 1 ];
strcpy( stored, str );
}
Class::~Class()
{
delete[] stored;
}
在这种情况下,以成员方式复制stored
成员不会复制缓冲区(仅复制指针),因此第一个要销毁的共享缓冲区的副本将成功调用delete[]
,第二个将运行未定义的行为。您需要深度复制复制构造函数(以及赋值运算符)。
Class::Class( const Class& another )
{
stored = new char[strlen(another.stored) + 1];
strcpy( stored, another.stored );
}
void Class::operator = ( const Class& another )
{
char* temp = new char[strlen(another.stored) + 1];
strcpy( temp, another.stored);
delete[] stored;
stored = temp;
}
发布于 2010-07-19 05:24:54
如果你有一个动态分配内容的类。例如,您将一本书的标题存储为char *并将标题设置为new,copy将不起作用。
您必须先编写一个执行title = new char[length+1]
,然后执行strcpy(title, titleIn)
的复制构造函数。复制构造函数将只做一个“浅”复制。
发布于 2010-07-19 05:29:24
当对象通过值传递、通过值返回或显式复制时,将调用Copy Constructor。如果没有复制构造函数,c++会创建一个默认的复制构造函数,用于进行浅层复制。如果对象没有指向动态分配内存的指针,那么浅拷贝就可以了。
https://stackoverflow.com/questions/3278625
复制