黄色在线观看视频-黄色在线免费看-黄色在线视频免费-黄色在线视频免费看-免费啪啪网-免费啪啪网站

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

2015年國家計算機二級C++考試復習資料(5)

來源:考試吧 2014-12-22 14:41:20 考試吧:中國教育培訓第一門戶 模擬考場
考試吧整理了“2015年國家計算機二級C++考試復習資料”,提供給各位考生備考,更多考試資料請持續關注考試吧計算機等級考試頻道!

  點擊查看:2015年國家計算機二級C 考試復習資料匯總

  二級C++輔導筆記:析構函數和this指針

  一、析構函數

  前面的一些例子都沒有說明析構函數,這是因為所用到的類在結束時不需要做特別的清理工作。下面的程序給出了一新的Date類,其中包括一個字符串指針,用來表示月份。

  #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對象的構造函數中,首先用new運算符為字符串month動態分配了內存,然后從內部數組中把月份的名字拷貝給字符串指針month。

  析構函數在刪除month指針時,可能會出現一些問題。當然從這個程序本身來看,沒什么麻煩;但是從設計一個類的角度來看,當Date類用于賦值時,就會出現問題。假設上面的main()修改為“

  int main()

  {

  Date birthday(8,11,1979);

  Date today;

  today=birthday;

  birthday.display();

  return 0;

  }

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

  如果假設today是一個外部變量,而birthday是一個自變量。當birthday離開其作用域時,就已經把對象today里的month指針刪除了。顯然這也是不正確的。

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

  Date birthday(8,11,1979);

  Date today(12,29,2003);

  today=birthday;

  問題就更復雜了,當這兩個變量離開作用域時,birthday中的month的值已經通過賦值傳遞給了today。而today中構造函數用new運算符給month的值卻因為賦值被覆蓋了。這樣,birthday中的month被刪除了兩次,而today中month卻沒有被刪除掉。

  二、重載賦值運算符

  為了解決上面的問題,我們應該寫一個特殊的賦值運算符函數來處理這類問題。當需要為同一個類的兩個對象相互賦值時,就可以重載運算符函數。這個方法可以解決類的賦值和指針的釋放。

  下面的程序中,類中的賦值函數用new運算符從堆中分配了一個不同的指針,該指針獲取賦值對象中相應的值,然后拷貝給接受賦值的對象。

  在類中重載賦值運算符的格式如下:

  void operator = (const Date&)

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

  #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;

  }

  程序運行時,會提示輸入一串姓名,當輸入完畢后,鍵入end,然后程序會逆序顯示剛才輸入的所有姓名。

  程序中ListEntry類含有一個字符串和一個指向前一個表項的指針。構造函數從對中獲取內存分配給字符串,并把字符串的內容拷貝到內存,然后置鏈接指針為NULL。析構函數將釋放字符串所占用的內存。

  成員函數PrevEntry()返回指向鏈表前一個表項的指針。另一個成員函數顯示當前的表項內容。

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

  相關推薦:

  各地2015年計算機等級考試報名時間匯總

  各地2015年上半年計算機等級考試費用匯總

  2015年計算機二級C++模擬練習題及答案匯總

文章責編:luoyuting  
看了本文的網友還看了
文章搜索
版權聲明:如果計算機等級考試網所轉載內容不慎侵犯了您的權益,請與我們聯系800@exam8.com,我們將會及時處理。如轉載本計算機等級考試網內容,請注明出處。
Copyright © 2004- 考試吧計算機等級考試網 All Rights Reserved 
中國科學院研究生院權威支持(北京) 電 話:010-62168566 傳 真:010-62192699
主站蜘蛛池模板: 成人一a毛片免费视频 | 日韩高清欧美精品亚洲 | 91精品视频在线免费观看 | 日韩精品视频美在线精品视频 | 人人做人人做人人爱 | 国产高清免费的视频 | 九七在线视频 | 黄色a级片在线观看 | 国产成人综合久久精品红 | 特黄特黄一级高清免费大片 | 国产成人a∨麻豆精品 | 亚洲观看视频 | 人成免费网站 | 日韩欧美一区二区久久 | 免费无遮挡十八女禁污污网站 | 波多野结衣一区二区三区四区 | 免费网站看v片在线播放器 免费无毒片在线观看 | free性欧美高清另类 | 每日更新国产 | 欧美亚洲日本在线 | 欧美专区在线观看 | 欧美成a人片在线观看 | 一区二区三区四区视频在线观看 | 九九成人 | 波多一区 | 欧美人一级淫片a免费播放 欧美人妖猛交 | 在线免费一区二区 | 亚洲欧美一区二区三区图片 | 国产一区二区在线观看动漫 | 欧美日本亚洲国产一区二区 | 欧美片欧美日韩国产综合片 | 在线成h人视频网站免费观看 | 国产欧美日韩另类一区乌克兰 | 国产亚洲一区二区麻豆 | 亚洲精品视频导航 | 亚洲制服丝袜在线观看 | 一个人看的www免费在线视频 | 亚洲第一视频 | 日韩毛片在线 | 色热热| 免费看特级淫片日本 |