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 關注
- 620 瀏覽
添加回答
舉報