首頁(yè) - 網(wǎng)校 - 萬(wàn)題庫(kù) - 美好明天 - 直播 - 導(dǎo)航

計(jì)算機(jī)二級(jí)C++語(yǔ)言程序設(shè)計(jì)考試輔導(dǎo)筆記(七)

來源:考試吧 2018-03-26 10:02:09 要考試,上考試吧! 萬(wàn)題庫(kù)
“計(jì)算機(jī)二級(jí)C++語(yǔ)言程序設(shè)計(jì)考試輔導(dǎo)筆記(七)”供考生參考。更多計(jì)算機(jī)等級(jí)考試內(nèi)容請(qǐng)?jiān)L問考試吧計(jì)算機(jī)等級(jí)考試網(wǎng)。

  點(diǎn)擊查看:計(jì)算機(jī)二級(jí)C++語(yǔ)言程序設(shè)計(jì)考試輔導(dǎo)筆記匯總

  析構(gòu)函數(shù)和this指針

  一、析構(gòu)函數(shù)

  前面的一些例子都沒有說明析構(gòu)函數(shù),這是因?yàn)樗玫降念愒诮Y(jié)束時(shí)不需要做特別的清理工作。下面的程序給出了一新的Date類,其中包括一個(gè)字符串指針,用來表示月份。

  #include iostream.h

  #include string.h

  class Date

  {

  int mo,da,yr;

  char *month;

  public:

  Date(int m=0, int d=0, int y=0);

  ~Date();

  void display() const;

  };

  Date::Date(int m,int d,int y)

  {

  static char *mos[] =

  {

  January,February,March,April,May,June,

  July,August,September,October,November,December

  };

  mo=m; da=d; yr=y;

  if(m!=0)

  {

  month=new char[strlen(mos[m-1])+1];

  strcpy(month, mos[m-1]);

  }

  else month = 0;

  }

  Date::~Date()

  {

  delete [] month;

  }

  void Date::display() const

  {

  if(month!=0) cout< }

  int main()

  {

  Date birthday(8,11,1979);

  birthday.display();

  return 0;

  }

  在Date對(duì)象的構(gòu)造函數(shù)中,首先用new運(yùn)算符為字符串month動(dòng)態(tài)分配了內(nèi)存,然后從內(nèi)部數(shù)組中把月份的名字拷貝給字符串指針month。

  析構(gòu)函數(shù)在刪除month指針時(shí),可能會(huì)出現(xiàn)一些問題。當(dāng)然從這個(gè)程序本身來看,沒什么麻煩;但是從設(shè)計(jì)一個(gè)類的角度來看,當(dāng)Date類用于賦值時(shí),就會(huì)出現(xiàn)問題。假設(shè)上面的main()修改為“

  int main()

  {

  Date birthday(8,11,1979);

  Date today;

  today=birthday;

  birthday.display();

  return 0;

  }

  這會(huì)生成一個(gè)名為today的空的Date型變量,并且把birthday值賦給它。如果不特別通知編譯器,它會(huì)簡(jiǎn)單的認(rèn)為類的賦值就是成員對(duì)成員的拷貝。在上面的程序中,變量birthday有一個(gè)字符型指針month,并且在構(gòu)造函數(shù)里用new運(yùn)算符初始化過了。當(dāng)birthday離開其作用域時(shí),析構(gòu)函數(shù)會(huì)調(diào)用delete運(yùn)算符來釋放內(nèi)存。但同時(shí),當(dāng)today離開它的作用域時(shí),析構(gòu)函數(shù)同樣會(huì)對(duì)它進(jìn)行釋放操作,而today里的month指針是birthday里的month指針的一個(gè)拷貝。析構(gòu)函數(shù)對(duì)同一指針進(jìn)行了兩次刪除操作,這會(huì)帶來不可預(yù)知的后果。

  如果假設(shè)today是一個(gè)外部變量,而birthday是一個(gè)自變量。當(dāng)birthday離開其作用域時(shí),就已經(jīng)把對(duì)象today里的month指針刪除了。顯然這也是不正確的。

  再假設(shè)有兩個(gè)初始化的Date變量,把其中一個(gè)的值賦值給另一個(gè):

  Date birthday(8,11,1979);

  Date today(12,29,2003);

  today=birthday;

  問題就更復(fù)雜了,當(dāng)這兩個(gè)變量離開作用域時(shí),birthday中的month的值已經(jīng)通過賦值傳遞給了today。而today中構(gòu)造函數(shù)用new運(yùn)算符給month的值卻因?yàn)橘x值被覆蓋了。這樣,birthday中的month被刪除了兩次,而today中month卻沒有被刪除掉。

掃描/長(zhǎng)按二維碼幫助考試通關(guān)
2018年等考報(bào)考資訊
2018等考各科通關(guān)技巧
2018各科最新預(yù)測(cè)試卷
2018等考各科備考資料

微信搜索"考試吧"了解更多考試資訊、下載備考資料

  相關(guān)推薦:

  2018年全國(guó)計(jì)算機(jī)等級(jí)考試必做試題匯總(各科目)

  2018年全國(guó)計(jì)算機(jī)等級(jí)考試復(fù)習(xí)知識(shí)點(diǎn)匯總(各科目)

  2018年全國(guó)計(jì)算機(jī)等級(jí)考試時(shí)間|教材目錄(2018年版)

  2018全國(guó)計(jì)算機(jī)等級(jí)考試備考經(jīng)驗(yàn)及應(yīng)試技巧匯總

  考試內(nèi)容|考試大綱|2018計(jì)算機(jī)等級(jí)考試科目

  歷年真題匯總|考試吧策劃:2018年計(jì)算機(jī)等級(jí)考試報(bào)考指南

0
收藏該文章
0
收藏該文章
文章搜索
萬(wàn)題庫(kù)小程序
萬(wàn)題庫(kù)小程序
·章節(jié)視頻 ·章節(jié)練習(xí)
·免費(fèi)真題 ·�?荚囶}
微信掃碼,立即獲��!
掃碼免費(fèi)使用
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
此欄目下沒有文章
版權(quán)聲明:如果計(jì)算機(jī)等級(jí)考試網(wǎng)所轉(zhuǎn)載內(nèi)容不慎侵犯了您的權(quán)益,請(qǐng)與我們聯(lián)系800@exam8.com,我們將會(huì)及時(shí)處理。如轉(zhuǎn)載本計(jì)算機(jī)等級(jí)考試網(wǎng)內(nèi)容,請(qǐng)注明出處。
Copyright © 2004-2025 考試吧計(jì)算機(jī)等級(jí)考試網(wǎng) 出版物經(jīng)營(yíng)許可證新出發(fā)京批字第直170033號(hào)  
京ICP證060677 京ICP備05005269號(hào) 中國(guó)科學(xué)院研究生院權(quán)威支持(北京)
在線模擬試題
考證通關(guān)殺器
考試最新資訊
學(xué)
一次通關(guān)技巧