4 回答
TA贡献1864条经验 获得超2个赞
编译器生成的副本构造函数执行成员级复制。有时这还不够。例如:
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;
TA贡献1799条经验 获得超6个赞
如果您具有动态分配内容的类。例如,将书名存储为char *并将书名设置为new,则复制将不起作用。
您将必须编写一个复制构造函数,title = new char[length+1]
然后执行strcpy(title, titleIn)
。复制构造函数只会执行“浅”复制。
- 4 回答
- 0 关注
- 601 浏览
添加回答
举报