亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

我們什么時候必須使用復制構造函數?

我們什么時候必須使用復制構造函數?

C++
偶然的你 2019-12-16 11:07:46
我們什么時候必須使用復制構造函數?我知道C ++編譯器會為一個類創建一個副本構造函數。在哪種情況下,我們必須編寫用戶定義的副本構造函數?你能舉一些例子嗎?
查看完整描述

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;


查看完整回答
反對 回復 2019-12-16
?
哈士奇WWW

TA貢獻1799條經驗 獲得超6個贊

如果您具有動態分配內容的類。例如,將書名存儲為char *并將書名設置為new,則復制將不起作用。

您將必須編寫一個復制構造函數,title = new char[length+1]然后執行strcpy(title, titleIn)。復制構造函數只會執行“淺”復制。


查看完整回答
反對 回復 2019-12-16
  • 4 回答
  • 0 關注
  • 620 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號