溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

C++ 構(gòu)造函數(shù)中使用new時(shí)注意事項(xiàng)

發(fā)布時(shí)間:2020-08-27 17:49:38 來(lái)源:腳本之家 閱讀:193 作者:xdzhanght 欄目:編程語(yǔ)言

使用new初始化對(duì)象中的指針成員時(shí)遇到的問(wèn)題

在構(gòu)造函數(shù)中使用new初始化指針成員,那么析構(gòu)函數(shù)中就必須使delete,并且new對(duì)應(yīng)delete, new[]則對(duì)應(yīng)于delete[]。

在有多個(gè)構(gòu)造函數(shù)的情況下,必須以相同的方式使用new,要不用new,要不用new[],因?yàn)橹淮嬖谝粋€(gè)析構(gòu)函數(shù),所有的構(gòu)造函數(shù)都必須與虛構(gòu)函數(shù)相兼容。

PS. 當(dāng)然在構(gòu)造函數(shù)中使用new初始化指針的時(shí)候,可以把指針初始化為空(0/NULL 或者是C++11中的nullptr),因?yàn)閐elete不管有沒(méi)帶[]都與空指針兼容。

需要自行定義一個(gè)復(fù)制構(gòu)造函數(shù)和賦值構(gòu)造函數(shù),用深復(fù)制的方式把一個(gè)對(duì)象初始化給另一個(gè)對(duì)象,一個(gè)對(duì)象復(fù)制給另一個(gè)對(duì)象,如下:

復(fù)制構(gòu)造函數(shù):

  • 分配足夠空間存儲(chǔ)復(fù)制的數(shù)據(jù)
  • 復(fù)制數(shù)據(jù),不僅僅地址
  • 更新受到影響的靜態(tài)類成員
String:String(const String & st)
{
  num_Strings++;
  len = st.len;
  str = new char[len+1];
  std::strcpy(str,st.str);
}

賦值構(gòu)造函數(shù):

  • 檢查自我復(fù)制情況
  • 釋放成員指針之前指向內(nèi)存
  • 復(fù)制數(shù)據(jù)不僅僅地址
  • 返回一個(gè)指向調(diào)用對(duì)象的引用
String & String:operator=(const String & st)
{
  if(this == &st)
    return *this;
  else
    delete [] str;
    len = st.len;
    str = new char[len+1];
    std::strcpy(str,st.str);
  return *this;
}

以上就是本文的全部?jī)?nèi)容,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作能帶來(lái)一定的幫助,同時(shí)也希望多多支持億速云!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI