青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

C++分析研究  
C++
日歷
<2025年12月>
30123456
78910111213
14151617181920
21222324252627
28293031123
45678910
統計
  • 隨筆 - 92
  • 文章 - 4
  • 評論 - 4
  • 引用 - 0

導航

常用鏈接

留言簿

隨筆檔案

文章檔案

搜索

  •  

最新評論

閱讀排行榜

評論排行榜

 

  構造函數中拋出的異常

  1、標準C++中定義構造函數是一個對象構建自己,分配所需資源的地方,一旦構造函數執行完畢,則表明這個對象已經誕生了,有自己的行為和內部的運行狀態,之后還有對象的消亡過程(析構函數的執行)??烧l能保證對象的構造過程一定能成功呢?說不定系統當前的某個資源不夠,導致對象不能完全構建好自己(人都有畸形兒,更何況別的呢?朋友們!是吧!),因此通過什么方法來表明對象的構造失敗了呢?C++程序員朋友們知道,C++中的構造函數是沒有返回值的,所以不少關于C++編程方面的書上得出結論:"因為構造函數沒有返回值,所以通知對象的構造失敗的唯一方法那就是在構造函數中拋出異常".主人公阿愚非常不同意這種說法,誰說的,便不信邪!雖然C++標準規定構造函數是沒有返回值,可我們知道每個函數實際上都會有一個返回值的,這個值被保存在eax寄存器中,因此實際上是有辦法通過編程來實現構造函數返回一個值給上層的對象創建者。當然即便是構造函數真的不能有返回值,我們也可以通過一個指針類型或引用類型的出參來獲知對象的構造過程的狀態。示例如下:

  class MyTest_Base

  {

  public:

  MyTest_Base (int& status)

  {

  //do other job

  // 由于資源不夠,對象構建失敗

  // 把status置0,通知對象的構建者

  status = 0;

  }

  protected:

  };

  void main()

  {

  int status;

  MyTest_Base obj1(status);

  // 檢查對象的構建是否成功

  if(status ==0) cout 《 "對象構建失敗" 《 endl;

  }

  程序運行的結果是:

  對象構建失敗

  是啊!上面我們不也得到了對象構造的成功與否的信息了嗎?可大家有沒有覺得這當中有點問題?主人公阿愚建議大家在此停留片刻,仔細想想它會有什么問題?OK!也許大家都知道了問題的所在,來驗證一下吧!

  class MyTest_Base

  {

  public:

  MyTest_Base (int& status)

  {

  //do other job

  // 由于資源不夠,對象構建失敗

  // 把status置0,通知對象的構建者

  status = 0;

  }

  virtual ~ MyTest_Base ()

  {

  cout 《 "銷毀一個MyTest_Base類型的對象" 《 endl;

  }

  protected:

  };

  void main()

  {

  int status;

  MyTest_Base obj1(status);

  // 檢查對象的構建是否成功

  if(status ==0) cout 《 "對象構建失敗" 《 endl;

  }

  程序運行的結果是:

  對象構建失敗

  銷毀一個MyTest_Base類型的對象

  沒錯,對象的析構函數被運行了,這與C++標準中所規定的面向對象的一些特性是有沖突的。一個對象都沒有完成自己的構造,又何來析構!好比一個夭折的畸形兒還沒有出生,又何來死之言。因此這種方法是行不通的。那怎么辦?那就是上面那個結論中的后一句話是對的,通知對象的構造失敗的唯一方法那就是在構造函數中拋出異常,但原因卻不是由于構造函數沒有返回值而造成的。恰恰相反,C++標準中規定構造函數沒有返回值正是由于擔心很容易與面向對象的一些特性相沖突,因此干脆來個規定,構造函數不能有返回值(主人公阿愚的個人理解,有不同意見的朋友歡迎討論)。

  2、構造函數中拋出異常將導致對象的析構函數不被執行。哈哈^-^,阿愚很開心,瞧瞧!如果沒有C++的異常處理機制鼎立支持,C++中的面向對象特性都無法真正實現起來,C++標準總不能規定所有的對象都必須成功構造吧!這也太理想化了,也許只有等到共產主義社會實現的那一天(CPU可以隨便拿,內存可以隨便拿,所有的資源都是你的?。┎耪f不定有可能·····,所以說C++的異常處理和面向對象確實是誰也離不開誰。當然示例還是要看一下,如下:

  class MyTest_Base

  {

  public:

  MyTest_Base (string name = "") : m_name(name)

  {

  throw std::exception("在構造函數中拋出一個異常,測試!");

  cout 《 "構造一個MyTest_Base類型的對象,對象名為:"《m_name 《 endl;

  }

  virtual ~ MyTest_Base ()

  {

  cout 《 "銷毀一個MyTest_Base類型的對象,對象名為:"《m_name 《 endl;

  }

  void Func() throw()

  {

  throw std::exception("故意拋出一個異常,測試!");

  }

  void Other() {}

  protected:

  string m_name;

  };

  void main()

  {

  try

  {

  // 對象構造時將會拋出異常

  MyTest_Base obj1("obj1");

  obj1.Func();

  obj1.Other();

  }

  catch(std::exception e)

  {

  cout 《 e.what() 《 endl;

  }

  catch(…)

  {

  cout 《 "unknow exception"《 endl;

  }

  }

  程序的運行結果將會驗證:"構造函數中拋出異常將導致對象的析構函數不被執行"

  3、是不是到此,關于構造函數中拋出異常的處理的有關討論就能結束了呢?非也!非也!主人公阿愚還有進一步的故事需要講述!來看一個更復雜一點的例子吧!如下:

  class MyTest_Base

  {

  public:

  MyTest_Base (string name = "") : m_name(name)

  {

  cout 《 "構造一個MyTest_Base類型的對象,對象名為:"《m_name 《 endl;

  }

  virtual ~ MyTest_Base ()

  {

  cout 《 "銷毀一個MyTest_Base類型的對象,對象名為:"《m_name 《 endl;

  }

  void Func() throw()

  {

  throw std::exception("故意拋出一個異常,測試!");

  }

  void Other() {}

  protected:

  string m_name;

  };

  class MyTest_Parts

  {

  public:

  MyTest_Parts ()

  {

  cout 《 "構造一個MyTest_Parts類型的對象" 《 endl;

  }

  virtual ~ MyTest_Parts ()

  {

  cout 《 "銷毀一個MyTest_Parts類型的對象"《 endl;

  }

  };

  class MyTest_Derive : public MyTest_Base

  {

  public:

  MyTest_Derive (string name = "") : m_component(), MyTest_Base(name)

  {

  throw std::exception("在MyTest_Derive對象的構造函數中拋出了一個異常!");

  cout 《 "構造一個MyTest_Derive類型的對象,對象名為:"《m_name 《 endl;

  }

  virtual ~ MyTest_Derive ()

  {

  cout 《 "銷毀一個MyTest_Derive類型的對象,對象名為:"《m_name 《 endl;

  }

  protected:

  MyTest_Parts m_component;

  };

  void main()

  {

  try

  {

  // 對象構造時將會拋出異常

  MyTest_Derive obj1("obj1");

  obj1.Func();

  obj1.Other();

  }

  catch(std::exception e)

  {

  cout 《 e.what() 《 endl;

  }

  catch(…)

  {

  cout 《 "unknow exception"《 endl;

  }

  }

  程序運行的結果是:

  構造一個MyTest_Base類型的對象,對象名為:obj1

  構造一個MyTest_Parts類型的對象

  銷毀一個MyTest_Parts類型的對象

  銷毀一個MyTest_Base類型的對象,對象名為:obj1

  在MyTest_Derive對象的構造函數中拋出了一個異常!

  上面這個例子中,MyTest_Derive從MyTest_Base繼承,同時MyTest_Derive還有一個MyTest_Parts類型的成員變量?,F在MyTest_Derive構造的時候,是在父類MyTest_Base已構造完畢和MyTest_Parts類型的成員變量m_component也已構造完畢之后,再拋出了一個異常,這種情況稱為對象的部分構造。是的,這種情況很常見,對象總是由不斷的繼承或不斷的聚合而來,對象的構造過程實際上是這些所有的子對象按規定順序的構造過程,其中這些過程中的任何一個子對象在構造時發生異常,對象都不能說自己完成了全部的構造過程,因此這里就有一個棘手的問題,當發生對象的部分構造時,對象將析構嗎?如果時,又將如何析構呢?托福答案

  從運行結果可以得出如下結論:

 ?。?) 對象的部分構造是很常見的,異常的發生點也完全是隨機的,程序員要謹慎處理這種情況;

 ?。?) 當對象發生部分構造時,已經構造完畢的子對象將會逆序地被析構(即異常發生點前面的對象);而還沒有開始構建的子對象將不會被構造了(即異常發生點后面的對象),當然它也就沒有析構過程了;還有正在構建的子對象和對象自己本身將停止繼續構建(即出現異常的對象),并且它的析構是不會被執行的。sat答案

  構造函數中拋出異常時概括性總結

 ?。?) C++中通知對象構造失敗的唯一方法那就是在構造函數中拋出異常;

  (2) 構造函數中拋出異常將導致對象的析構函數不被執行;

 ?。?) 當對象發生部分構造時,已經構造完畢的子對象將會逆序地被析構;

  (4) 其是還是那句話, "C++的異常處理不會破壞任何一條面向對象的特性!",因此主人公阿愚再次建議朋友們,牢牢記住這一條!

posted on 2014-01-10 21:30 HAOSOLA 閱讀(667) 評論(0)  編輯 收藏 引用

只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


 
Copyright © HAOSOLA Powered by: 博客園 模板提供:滬江博客
PK10開獎 PK10開獎
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            99re视频这里只有精品| 亚洲精品国产精品国产自| 久久在线免费观看| 亚洲永久精品国产| 麻豆av一区二区三区久久| 午夜日韩视频| 欧美激情1区2区| 欧美成人一区二区| 国产日韩综合| 亚洲男女自偷自拍图片另类| 日韩一级在线观看| 久久视频国产精品免费视频在线| 性欧美暴力猛交69hd| 欧美日韩精品中文字幕| 亚洲第一黄网| 91久久精品国产91久久性色| 久久精品国产亚洲高清剧情介绍 | 欧美精品在线一区二区| 久久中文精品| 精品88久久久久88久久久| 午夜激情综合网| 性欧美大战久久久久久久久| 欧美日韩亚洲在线| 亚洲日本欧美天堂| 亚洲最新视频在线播放| 欧美日韩精品久久| 一本大道久久精品懂色aⅴ| 一本色道久久综合| 欧美精品一区二| 亚洲精品综合久久中文字幕| 99视频日韩| 国产精品久久福利| 亚洲女同在线| 久久精品视频免费| 亚洲电影在线观看| 欧美肥婆在线| 一本色道久久综合亚洲精品按摩| 一区二区三区日韩欧美精品| 国产精品久久一级| 欧美一区深夜视频| 欧美岛国激情| 亚洲婷婷国产精品电影人久久| 国产精品国色综合久久| 亚洲欧美视频一区| 欧美不卡三区| 亚洲视频综合| 国产一区二区三区四区hd| 久久久久国产一区二区三区四区| 欧美激情黄色片| 亚洲婷婷免费| 精品成人一区二区三区| 欧美激情精品久久久久久| 一二三区精品| 久久久久国产精品厨房| 最新国产乱人伦偷精品免费网站 | 91久久精品一区二区别| 一区二区三区 在线观看视频| 国产精品久久777777毛茸茸| 久久精品国产清自在天天线| 亚洲国产精品v| 久久成人精品电影| 最新日韩精品| 国产精品夜夜嗨| 可以看av的网站久久看| 亚洲婷婷综合久久一本伊一区| 久久手机精品视频| 洋洋av久久久久久久一区| 国产日本欧洲亚洲| 欧美成人伊人久久综合网| 小嫩嫩精品导航| 亚洲日本成人在线观看| 久久成人精品电影| 在线亚洲一区观看| 在线免费观看一区二区三区| 国产精品日韩一区二区三区| 欧美国产综合视频| 久久福利视频导航| 亚洲一二三区在线| 亚洲精品免费在线播放| 久久在线免费视频| 欧美在线视频a| 亚洲视频欧美视频| 亚洲每日更新| 亚洲国产中文字幕在线观看| 国产亚洲成av人在线观看导航| 欧美日韩在线第一页| 欧美国产视频一区二区| 久久久久国产精品麻豆ai换脸| 亚洲天堂黄色| 中文日韩电影网站| 99国内精品久久| 亚洲激情偷拍| 欧美激情一区二区三区在线| 久久婷婷综合激情| 久久精品视频免费| 久久精品国产亚洲高清剧情介绍| 亚洲欧美变态国产另类| 亚洲天堂久久| 亚洲一区二区三区高清不卡| 日韩视频在线播放| 亚洲伦理在线免费看| 亚洲人成在线影院| 亚洲精品乱码久久久久久按摩观| 亚洲国产成人av在线| 一区二区在线不卡| 在线精品国精品国产尤物884a| 国产专区欧美精品| 激情久久五月天| 伊大人香蕉综合8在线视| 狠狠色狠狠色综合人人| 黄色成人在线免费| 在线看片欧美| 亚洲人人精品| 在线中文字幕一区| 亚洲欧美日韩人成在线播放| 亚洲在线观看视频| 欧美一进一出视频| 久久久久国产精品www| 久久综合伊人77777麻豆| 免费观看成人鲁鲁鲁鲁鲁视频 | 乱中年女人伦av一区二区| 久久蜜桃资源一区二区老牛 | 亚洲电影在线播放| 亚洲国产一区在线| 一区二区三区高清不卡| 亚洲欧美国产精品桃花| 欧美在线不卡| 欧美电影打屁股sp| 亚洲最新在线视频| 欧美在线观看视频一区二区三区| 久久精品国产免费| 欧美久久一级| 国产欧美精品日韩| 亚洲国产激情| 亚洲主播在线播放| 久久综合色8888| 亚洲欧洲一区二区天堂久久| 亚洲天堂av图片| 久久视频一区| 国产精品久久久久9999| 精品999日本| 亚洲视频1区2区| 久久一本综合频道| 99国产精品视频免费观看一公开| 欧美一区二区在线免费播放| 欧美交受高潮1| 国产精品一级在线| 亚洲欧洲一区| 久久国产精品黑丝| 亚洲欧洲精品一区二区三区| 亚洲在线一区二区| 欧美成人蜜桃| 国产日韩精品一区二区浪潮av| 亚洲国产成人在线| 欧美一区二区在线免费观看| 欧美激情视频免费观看| 午夜精品久久久久影视| 欧美精品播放| 一区二区三区在线免费播放| 亚洲欧美偷拍卡通变态| 亚洲国产婷婷| 久久久www| 国产精品一区三区| 亚洲小视频在线观看| 免费观看在线综合| 亚洲欧美经典视频| 欧美亚日韩国产aⅴ精品中极品| 在线精品国产欧美| 久久久久久有精品国产| 亚洲婷婷在线| 欧美午夜剧场| 99国产精品99久久久久久粉嫩| 久久天堂精品| 午夜国产精品视频免费体验区| 欧美三级视频在线播放| 亚洲久久成人| 亚洲国产欧美一区二区三区久久| 欧美一区二区三区在线视频| 国产精品va在线播放我和闺蜜| 亚洲精品在线电影| 欧美顶级艳妇交换群宴| 久久伊人亚洲| 精久久久久久| 嫩草伊人久久精品少妇av杨幂| 小黄鸭精品密入口导航| 国产日韩欧美综合精品| 欧美一区二区精品| 亚洲影院色无极综合| 国产精品久久久久秋霞鲁丝 | 免费视频一区| 久久人人97超碰国产公开结果| 国产一级揄自揄精品视频| 欧美在线播放视频| 午夜精品久久久| 国产亚洲精品bt天堂精选| 久久久噜噜噜久久狠狠50岁| 欧美在线视频免费观看| 国产综合av| 欧美国产精品日韩| 欧美大胆成人|