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

huaxiazhihuo

 

難以割舍的二段構造

        兩段構造也是聲名狼藉得很,比之于MFC,好不了多少,貌似MFC中到處都是兩段構造,難道兩段構造的聲譽也是受MFC所累。定義完了一個對象變量之后,還要再調用一次該對象的Create函數,而且還要Create成功了之后,才能對該對象做進一步的操作,否則對象將一直處于非法狀態。這種代碼方式寫起來確實很惡心,為何不直接在構造函數中直接Create,不成功就拋出異常,然后對象就流產了,好過它半死不活地一直茍延殘喘于世上,累己累人。其實,MFC選擇兩段構造也是有苦衷:1、先是很久很久以前,VC編譯器對異常的支持不怎么好,當然,現在的VC編譯器,自然今時不比往日,但是,還要兼容以往的代碼;2、然后是MFC的設計,它只是對API做了一層薄薄的包裝,薄薄的意思,就是,不管怎么搗鼓,都難以將WINDOWS系統中的各種對象包裝成一個干凈的C++對象了,因為,API本身就采用兩段構造。可不是嗎?定義一個句柄變量,然后CreateXXX返回結果,返回值非法,表示創建失敗。失敗了,還要霸王硬上弓,后果會怎么樣,這誰也不知道。
        理論上,構造函數拋出異常確實很優雅,代碼也更具美感,并且,其行為也更加明確,要么就處理,要么,就等著程序異常退出。但是,實際上,異常這種東西,真正實現執行起來,卻相當的困難。更何況,如果完全丟棄兩段法,除了異常,還會引入一些新的問題,正所謂:“前門驅虎,后門進狼”,進來不只是一只狼,而是好幾只。生活的奧妙,就在于制造出新的問題,以解決舊的問題。
        構造函數中直接調用Create,就表示了用戶一定義一個類型變量,程序就會馬上啟動Create函數,也就意味著可能將創建窗口對象、內核對象、甚至啟動新的線程等等,這些操作都不是省油的燈,構造函數中做了太多事情,會有隱藏太多細節之嫌,代碼本來就是為了隱藏細節,這個多事之罪名暫且不論;但是,用戶沒法對創建過程Say NOT,也即是說,用戶一定義對象變量,就只能接受它的高昂的創建過程。難道,一開始就讓對象進入有效狀態,這都有錯嗎?確實是的。有時候,用戶只是先想聲明(定義)對象,等必要(時機成熟)的時候,再讓它進入有效狀態。咦,用戶這樣寫代碼,不太好吧,應該強制他/她等到了那個時候,再定義對象變量。變量怎么可以隨隨便便就定義呢?應該在要使用的時候,才定義它,這才是良好的代碼風格。但是,有些情況,確實需要先暫時定義非法狀態下的對象變量,比如,這個對象是另一個對象(擁有者)的成員變量時,那也沒什么,強制用戶在必要的時候,才定義擁有者對象變量。但是,假如這個擁有者必須是全局變量,那該怎么辦?那也沒什么,將擁有者定義為指針變量就是了?好了,本來只是要對象創建失敗的情況,現在還要考慮內存分配的細節,然后接著就是new delete,然后就是各種智能指針閃亮登臺演出,更糟糕的是,對象有效無效的問題依然沒有根除,因為,只要引入指針,每次使用指針,就必須檢查指針是否有效,咦,難道操作空指針不會拋出異常嗎?C++規范中,操作空指針屬后果未確定的行為,對C++而言,未確定往往就是最糟糕的意思。此外,鑒于對象只能一直處于有效狀態,它就不可能提供讓對象進入無效狀態的操作。如果想要讓對象無效,唯一的辦法,就是讓它死去,強制對象啟動析構函數,方法是離開作用域強者delete它。下次要使用它的時候,就再new一次或者定義一次,不,它已經是另外一條新生命了。但是,對于兩段構造的對象,只須Destroy又或者Create,對象可以永遠只有一個。此外,二段構造頗具擴展性,很輕易地就可搞成三段構造,每一步,用戶都有選擇的權利。但構造異常就沒有這個優點。
        考慮到構造函數中的參數問題,比如,月份的參數,大家都知道,有效值只在1-12月之間。不討論這種情況下,非法的參數傳遞是否屬于代碼的邏輯問題。對此,構造異常指導下的對象是不可能出現無參(沒有參數或者參數都有缺省值)的構造函數,因此,它們也都不能用于數組,難以應用于全局變量、靜態變量、作為其他對象的數據成員,如果非要在這些場合下使用它們,比如占位符的作用,唯有用上指針,于是伴隨而來的,又如上文所述,使用指針之前,必須檢查指針的有效性,只怕不會比檢查二段構造的有效性好多少。
        二段構造不輕易剝奪用戶的權利,提供更多選擇,可用于數組、堆棧、STL中的容器,要它死,它就死,要它活,它就活,但是,它可以從來都未曾消失過,要做的,僅僅是在使用它時,清楚它是死是活就行了,不過多加幾次判斷而已。相比之下,構造異常就更具侵入性了,一旦用上,就只能被迫遵照它的規則行事。
        其實,兩段構造與構造異常,都很惡心,只要一處代碼中用到了它,所有與之相關的代碼都沒法脫身。差別不過在于誰比誰惡心而已,這個,視各人的口味而不同。對于本人這種害怕分配內存,釋放內存,更加畏懼異常的人來說(這并不表示本人寫不出異常安全的代碼),當然優先選擇二段構造,MORE EFFECTIVE的條款中,聲稱,如無必要,不要提供缺省的構造函數,以免對象陷入半死不活的狀態中。而我的習慣作法則是,如無必要,必須提供缺省的構造函數,不要輕易剝奪用戶想要使用對象數組的權利,或者是由于不提供缺省的構造函數,而由此引起的種種不便。
        好了,既然程序中決定用二段構造了,那么,假如用戶定義了一個對象,忘了再構造一次,但是又要執行其他操作,怎么辦?嗯,那也沒什么,既然用戶不遵守契約,我們的對象自然可以做出種種不確定的行為。當然,別忘了,在其他的每一個操作上都添加幾條assert語句,盡管這很惡心,也聊勝于無,減少點罪惡感,以便于在調試版中找出問題。

posted on 2012-06-14 15:08 華夏之火 閱讀(3814) 評論(14)  編輯 收藏 引用 所屬分類: c++技術探討

評論

# re: 難以割舍的二段構造 2012-06-14 16:37 Richard Wei

支持一下,C++里我們一般把分配內存和簡單的初始化工作都放在了構造函數里,而把一些復雜的工作放在一個單獨的初始化函數里,這樣的話比較靈活。如果覺得使用不方便,可以自己封裝一層,也就是所謂的RAII了。  回復  更多評論   

# re: 難以割舍的二段構造 2012-06-14 17:45 華夏之火

是啊,在下也偏向于精簡構造函數。對于多事的構造函數的代碼,內心總是很排斥,本能的對于細節的感興趣,或者這也是C++者們的通病@Richard Wei
  回復  更多評論   

# re: 難以割舍的二段構造 2012-06-14 18:35 春秋十二月

http://www.shnenglu.com/qinqing1984/archive/2011/07/04/150084.html  回復  更多評論   

# re: 難以割舍的二段構造 2012-06-14 20:41 華夏之火

?這些都是深度探索c++對象模型中的內容,每一個想在c++上有所作為的人必須先深度探索這本書。@春秋十二月  回復  更多評論   

# re: 難以割舍的二段構造 2012-06-15 11:25 guilin

有時候,用戶只是先想聲明(定義)對象,等必要(時機成熟)的時候,再讓它進入有效狀態
這是你不用異常的基礎論點。絕對不應該出現這種用法,所以整篇文章都是扯淡  回復  更多評論   

# re: 難以割舍的二段構造 2012-06-15 11:33 guilin


“有時候,用戶只是先想聲明(定義)對象,等必要(時機成熟)的時候,再讓它進入有效狀態。”
這正是二段構造的用法。
你說構造+異常的用法不好的理由卻是:“有時想使用二段構造。”……
這就像為什么不開車:因為有時候想走路,所以開車不好。  回復  更多評論   

# re: 難以割舍的二段構造 2012-06-15 11:42 華夏之火

在下也知道不應該這樣用,只是碰到這樣的需求,該怎么辦,難道要用指針嗎?@guilin
  回復  更多評論   

# re: 難以割舍的二段構造 2012-06-15 16:44 guilin

@華夏之火
我從來沒碰到這樣的需求,你可以舉個簡單例子出來看看  回復  更多評論   

# re: 難以割舍的二段構造 2012-06-15 17:13 華夏之火

好比一個服務器類,我們一般都是先定義一個對象變量,然后讓變量開始監聽端口并啟動監聽的線程,這也可以看成二段構造吧。難道你要定義服務器對象的時候,就讓它在構造函數里面直接就開始監聽并啟動線程嗎@guilin
  回復  更多評論   

# re: 難以割舍的二段構造 2012-06-17 17:57 guilin

@華夏之火
這很正常,可以看看boost asio的幾個例子,都是在構造函數中干的  回復  更多評論   

# re: 難以割舍的二段構造 2012-06-17 18:00 guilin

@華夏之火
類成員對象初始化在初始化列表中已經初始化完成了。C++構造函數其實本質上就是一個init函數,只不過沒有返回值。有了異常,也算有返回值了。所以再多寫一個init函數實在沒有必要  回復  更多評論   

# re: 難以割舍的二段構造 2012-06-18 08:59 華夏之火

受教了,可能是在下內心對于異常的排斥,所以總是要盡量避免這個東西@guilin
  回復  更多評論   

# re: 難以割舍的二段構造 2012-07-09 16:12 哥沒注冊

糾結了
關于C++從C上擴展出來的這類功能。有益則用,無益就不理會。比如鄙人基本不使用NEW/DELETE,也就沒有你的困惑了。HOHO~~  回復  更多評論   

# re: 難以割舍的二段構造 2012-07-09 17:11 華夏之火

NEW/DELETE的問題不大,主要是某些較耗資源的玩意,好比線程、文件、數據庫連接,直接在構造函數中啟動,會讓人很糾結,覺得隱藏太多細節@哥沒注冊
  回復  更多評論   

導航

統計

常用鏈接

留言簿(6)

隨筆分類

隨筆檔案

搜索

積分與排名

最新評論

閱讀排行榜

評論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            亚洲综合二区| 夜久久久久久| 久久蜜桃香蕉精品一区二区三区| 亚洲一区二区黄色| 国产精品老女人精品视频| 香蕉av777xxx色综合一区| 午夜免费久久久久| 在线免费观看日本一区| 欧美二区在线播放| 欧美/亚洲一区| 亚洲夜间福利| 欧美在线一级视频| 91久久亚洲| 亚洲图中文字幕| 国产一区二区三区观看| 欧美电影免费观看| 欧美日韩视频在线第一区| 欧美一区二区三区视频在线| 久久久亚洲国产美女国产盗摄| 亚洲国产小视频| 99亚洲一区二区| 国内精品福利| 日韩午夜在线观看视频| 国产日韩成人精品| 欧美成黄导航| 欧美性理论片在线观看片免费| 久久激情综合网| 美女脱光内衣内裤视频久久网站| 亚洲午夜精品| 免费久久99精品国产自在现线| 亚洲视频一二三| 久久亚洲一区二区| 亚洲女优在线| 欧美精品18+| 久久久五月婷婷| 欧美日韩在线视频观看| 六十路精品视频| 国产女主播一区二区三区| 亚洲国产精品久久久久婷婷884| 欧美午夜免费影院| 亚洲国产美女精品久久久久∴| 国产精品视频xxx| 亚洲毛片在线观看| 在线观看中文字幕亚洲| 亚洲免费影院| 一区二区三区四区五区精品视频| 久久久福利视频| 欧美在线免费观看视频| 欧美色另类天堂2015| 欧美电影在线观看完整版| 国产亚洲精品v| 亚洲男女自偷自拍| 宅男66日本亚洲欧美视频| 美女主播精品视频一二三四| 久久久久久网站| 国产一区二区高清不卡| 亚洲视频每日更新| 亚洲综合电影| 欧美午夜视频| 日韩视频中文| 一区二区欧美日韩| 欧美日韩一区自拍| 日韩视频一区二区在线观看 | 久久精品在线播放| 国产精品青草久久久久福利99| 最新成人av网站| 在线天堂一区av电影| 欧美日韩国产bt| 亚洲免费观看| 亚洲免费视频在线观看| 国产精品久久久久久久久久三级 | 欧美一区二区三区在线观看视频 | 欧美成人自拍| 亚洲国产一区二区视频| 日韩一区二区精品| 欧美女人交a| aa成人免费视频| 小黄鸭精品密入口导航| 国产亚洲欧美另类一区二区三区| 亚洲欧美日韩久久精品| 久久本道综合色狠狠五月| 国产在线精品二区| 久久婷婷av| 亚洲精品一区二区三区在线观看 | 亚洲看片一区| 欧美日韩午夜剧场| 亚洲欧美综合精品久久成人| 久久精品三级| 亚洲黄色尤物视频| 欧美日韩中文在线观看| 亚洲欧美另类在线| 美乳少妇欧美精品| 夜夜嗨网站十八久久| 国产伦精品一区二区三区视频孕妇 | 欧美日韩国产色综合一二三四| 亚洲精品一二| 久久丁香综合五月国产三级网站| 精品不卡一区二区三区| 欧美va天堂| 亚洲天堂av电影| 免费在线日韩av| 一本一道久久综合狠狠老精东影业| 欧美天天综合网| 久久精品国产亚洲一区二区| 亚洲日本一区二区三区| 欧美一区=区| 亚洲久久成人| 国模精品娜娜一二三区| 欧美日韩国产a| 久久精品国产免费观看| 99re热这里只有精品免费视频| 久久精品91久久久久久再现| 日韩一级大片| 一区在线电影| 国产精品亚洲欧美| 欧美精品在线一区二区| 久久精品国产第一区二区三区| 99综合电影在线视频| 欧美电影电视剧在线观看| 欧美一区二区私人影院日本| 日韩视频二区| 在线精品亚洲一区二区| 国产欧美日韩精品a在线观看| 欧美人与性动交a欧美精品| 久久精品一区二区三区不卡牛牛 | 久久精品免费看| 亚洲你懂的在线视频| 亚洲精品久久久久久久久久久久| 国产一区日韩欧美| 国产精品自在线| 国产精品久久久久秋霞鲁丝| 欧美精品18+| 欧美ab在线视频| 裸体一区二区三区| 久久国产欧美精品| 欧美一级理论片| 亚洲一区二区三区精品动漫| 一本一本久久a久久精品综合妖精 一本一本久久a久久精品综合麻豆 | 久久福利精品| 欧美诱惑福利视频| 香蕉亚洲视频| 欧美一区二区在线免费播放| 亚洲欧美中文字幕| 欧美亚洲综合在线| 香蕉久久夜色| 久久电影一区| 久久伊人亚洲| 久久激情五月丁香伊人| 欧美影院视频| 久久亚洲一区二区三区四区| 久久综合伊人77777尤物| 看欧美日韩国产| 欧美高清视频在线观看| 欧美精品自拍偷拍动漫精品| 欧美日韩性生活视频| 欧美午夜一区二区福利视频| 国产精品wwwwww| 国产乱码精品一区二区三区五月婷 | 99热在线精品观看| 亚洲一区免费| 久久精品伊人| 欧美激情2020午夜免费观看| 欧美另类69精品久久久久9999| 欧美理论视频| 国产欧美日韩亚洲| 亚洲国产成人精品女人久久久| 亚洲人久久久| 亚洲欧美久久| 久久野战av| 亚洲人成网站在线观看播放| 亚洲毛片在线| 午夜激情久久久| 久久嫩草精品久久久久| 欧美精品黄色| 国产亚洲一区二区三区在线观看| 亚洲电影免费观看高清完整版| 99成人在线| 久久久久一区| 亚洲日本成人| 久久精品欧美日韩精品| 欧美日韩国产综合视频在线观看| 国产精品羞羞答答xxdd| 亚洲国产欧美国产综合一区| 亚洲欧美日本精品| 欧美二区在线播放| 亚洲中午字幕| 欧美国产亚洲视频| 国产日产欧美精品| 一本色道久久88综合亚洲精品ⅰ | 欧美在线一二三区| 亚洲国产一成人久久精品| 先锋影音一区二区三区| 欧美国产一区视频在线观看| 国产亚洲a∨片在线观看| 亚洲另类视频| 久久综合伊人77777蜜臀| 一区二区三区国产精品| 欧美不卡福利| 国内成人精品视频| 午夜精品理论片|