首頁 - 網(wǎng)校 - 萬題庫 - 直播 - 雄鷹 - 團(tuán)購 - 書城 - 模考 - 學(xué)習(xí)通 - 導(dǎo)航 - 510 -
首頁考試吧網(wǎng)校萬題庫直播雄鷹510團(tuán)購書城模考論壇實(shí)用文檔作文大全寶寶起名
2015中考
法律碩士
2015高考
MBA考試
2015考研
MPA考試
在職研
中科院
考研培訓(xùn)
專升本
自學(xué)考試 成人高考
四 六 級(jí)
GRE考試
攻碩英語
零起點(diǎn)日語
職稱英語
口譯筆譯
申碩英語
零起點(diǎn)韓語
商務(wù)英語
日語等級(jí)
GMAT考試
公共英語
職稱日語
新概念英語
專四專八
博思考試
零起點(diǎn)英語
托福考試
托業(yè)考試
零起點(diǎn)法語
雅思考試
成人英語三級(jí)
零起點(diǎn)德語
等級(jí)考試
華為認(rèn)證
水平考試
Java認(rèn)證
職稱計(jì)算機(jī) 微軟認(rèn)證 思科認(rèn)證 Oracle認(rèn)證 Linux認(rèn)證
公 務(wù) 員
導(dǎo)游考試
物 流 師
出版資格
單 證 員
報(bào) 關(guān) 員
外 銷 員
價(jià)格鑒證
網(wǎng)絡(luò)編輯
駕 駛 員
報(bào)檢員
法律顧問
管理咨詢
企業(yè)培訓(xùn)
社會(huì)工作者
銀行從業(yè)
教師資格
營養(yǎng)師
保險(xiǎn)從業(yè)
普 通 話
證券從業(yè)
跟 單 員
秘書資格
電子商務(wù)
期貨考試
國際商務(wù)
心理咨詢
營 銷 師
司法考試
國際貨運(yùn)代理人
人力資源管理師
廣告師職業(yè)水平
衛(wèi)生資格 執(zhí)業(yè)醫(yī)師 執(zhí)業(yè)藥師 執(zhí)業(yè)護(hù)士
會(huì)計(jì)從業(yè)資格
基金從業(yè)資格
統(tǒng)計(jì)從業(yè)資格
經(jīng)濟(jì)師
精算師
統(tǒng)計(jì)師
會(huì)計(jì)職稱
法律顧問
ACCA考試
初級(jí)會(huì)計(jì)職稱
資產(chǎn)評(píng)估師
高級(jí)經(jīng)濟(jì)師
注冊(cè)會(huì)計(jì)師
高級(jí)會(huì)計(jì)師
美國注冊(cè)會(huì)計(jì)師
審計(jì)師考試
國際內(nèi)審師
注冊(cè)稅務(wù)師
理財(cái)規(guī)劃師
一級(jí)建造師
安全工程師
設(shè)備監(jiān)理師
公路監(jiān)理師
公路造價(jià)師
二級(jí)建造師
招標(biāo)師考試
物業(yè)管理師
電氣工程師
建筑師考試
造價(jià)工程師
注冊(cè)測繪師
質(zhì)量工程師
巖土工程師
注冊(cè)給排水
造價(jià)員考試
注冊(cè)計(jì)量師
環(huán)保工程師
化工工程師
暖通工程師
咨詢工程師
結(jié)構(gòu)工程師
城市規(guī)劃師
材料員考試
消防工程師
監(jiān)理工程師
房地產(chǎn)估價(jià)
土地估價(jià)師
安全評(píng)價(jià)師
房地產(chǎn)經(jīng)紀(jì)人
投資項(xiàng)目管理師
環(huán)境影響評(píng)價(jià)師
土地登記代理人
寶寶起名
繽紛校園
實(shí)用文檔
入黨申請(qǐng)
英語學(xué)習(xí)
思想?yún)R報(bào)
作文大全
工作總結(jié)
求職招聘 論文下載 直播課堂

2015年國家計(jì)算機(jī)二級(jí)C++考試復(fù)習(xí)資料(5)

考試吧整理了“2015年國家計(jì)算機(jī)二級(jí)C++考試復(fù)習(xí)資料”,提供給各位考生備考,更多考試資料請(qǐng)持續(xù)關(guān)注考試吧計(jì)算機(jī)等級(jí)考試頻道!

  點(diǎn)擊查看:2015年國家計(jì)算機(jī)二級(jí)C 考試復(fù)習(xí)資料匯總

  二級(jí)C++輔導(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ì)簡單的認(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卻沒有被刪除掉。

  二、重載賦值運(yùn)算符

  為了解決上面的問題,我們應(yīng)該寫一個(gè)特殊的賦值運(yùn)算符函數(shù)來處理這類問題。當(dāng)需要為同一個(gè)類的兩個(gè)對(duì)象相互賦值時(shí),就可以重載運(yùn)算符函數(shù)。這個(gè)方法可以解決類的賦值和指針的釋放。

  下面的程序中,類中的賦值函數(shù)用new運(yùn)算符從堆中分配了一個(gè)不同的指針,該指針獲取賦值對(duì)象中相應(yīng)的值,然后拷貝給接受賦值的對(duì)象。

  在類中重載賦值運(yùn)算符的格式如下:

  void operator = (const Date&)

  后面我們回加以改進(jìn)。目前,重載的運(yùn)算符函數(shù)的返回類型為void。它是類總的成員函數(shù),在本程序紅,是Date類的成員函數(shù)。它的函數(shù)名始終是operator =,參數(shù)也始終是同一個(gè)類的對(duì)象的引用。參數(shù)表示的是源對(duì)象,即賦值數(shù)據(jù)的提供者。重載函數(shù)的運(yùn)算符作為目標(biāo)對(duì)象的成員函數(shù)來使用。

  #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 operator=(const 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< char name[25];

  cin >> name;

  if (strncmp(name, end, 3) == 0) break;

  ListEntry* list = new ListEntry(name);

  if (prev != 0) prev->AddEntry(*list);

  prev = list;

  }

  while (prev != 0)

  {

  prev->display();

  ListEntry* hold = prev;

  prev = prev->PrevEntry();

  delete hold;

  }

  return 0;

  }

  程序運(yùn)行時(shí),會(huì)提示輸入一串姓名,當(dāng)輸入完畢后,鍵入end,然后程序會(huì)逆序顯示剛才輸入的所有姓名。

  程序中ListEntry類含有一個(gè)字符串和一個(gè)指向前一個(gè)表項(xiàng)的指針。構(gòu)造函數(shù)從對(duì)中獲取內(nèi)存分配給字符串,并把字符串的內(nèi)容拷貝到內(nèi)存,然后置鏈接指針為NULL。析構(gòu)函數(shù)將釋放字符串所占用的內(nèi)存。

  成員函數(shù)PrevEntry()返回指向鏈表前一個(gè)表項(xiàng)的指針。另一個(gè)成員函數(shù)顯示當(dāng)前的表項(xiàng)內(nèi)容。

  成員函數(shù)AddEntry(),它把this指針拷貝給參數(shù)的preventry指針,即把當(dāng)前表項(xiàng)的地址賦值給下一個(gè)表項(xiàng)的鏈接指針,從而構(gòu)造了一個(gè)鏈表。它并沒有改變調(diào)用它的listEntry對(duì)象的內(nèi)容,只是把該對(duì)象的地址賦給函數(shù)的參數(shù)所引用的那個(gè)ListEntry對(duì)象的preventry指針,盡管該函數(shù)不會(huì)修改對(duì)象的數(shù)據(jù),但它并不是常量型。這是因?yàn),它拷貝?duì)象的地址this指針的內(nèi)容給一個(gè)非長常量對(duì)象,而編譯器回認(rèn)為這個(gè)非常量對(duì)象就有可能通過拷貝得到的地址去修改當(dāng)前對(duì)象的數(shù)據(jù),因此AddEntry()函數(shù)在聲明時(shí)不需要用const.

  相關(guān)推薦:

  各地2015年計(jì)算機(jī)等級(jí)考試報(bào)名時(shí)間匯總

  各地2015年上半年計(jì)算機(jī)等級(jí)考試費(fèi)用匯總

  2015年計(jì)算機(jī)二級(jí)C++模擬練習(xí)題及答案匯總

文章搜索
版權(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- 考試吧計(jì)算機(jī)等級(jí)考試網(wǎng) All Rights Reserved 
中國科學(xué)院研究生院權(quán)威支持(北京) 電 話:010-62168566 傳 真:010-62192699