亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

Effective C++ 2e Item46

2019-09-10 09:07:18
字體:
來源:轉載
供稿:網友

條款46: 寧可編譯和鏈接時出錯,也不要運行時出錯

除了極少數情況下會使C++拋出異常(例如,內存耗盡 ---- 見條款7)外,運行時錯誤的概念和C++沒什么關系,就象在C中一樣。沒有下溢,上溢,除零檢查;沒有數組越界檢查,等等。一旦程序通過了編譯和鏈接,你就得靠自己了 ---- 一切后果自負。這很象跳傘運動,一些人從中找到了刺激,另一些人則嚇得摔成了殘廢。這一思想背后的動機當然在于效率:沒有運行時檢查,程序會更小更快。

處理這類事情有另一個不同的方法。一些語言如Smalltalk和LISP通常在編譯鏈接期間只是檢查極少一些錯誤,但卻提供了強大的運行時系統來處理執行期間的錯誤。不象C++,這些語言幾乎都是解釋型的,在提供額外靈活性的同時,它們也帶來了性能上的損失。

不要忘了你是在用C++編程。即使發現Smalltalk/LISP的方法很吸引人,也要忘掉它們。常說要堅持黨的路線,現在的情況下,它的含義就是要避免運行時錯誤。只要有可能,就要讓出錯檢查從運行時退回到鏈接時,或者,最理想的是,編譯時。

這種方法帶來的好處不僅僅在于程序的大小和速度,還有可靠性。如果程序通過了編譯和鏈接而沒有產生錯誤信息,你就可以確信程序中沒有編譯器和鏈接器能檢查得到的任何錯誤,僅此而已。(當然,另一個可能性是,編譯器或鏈接器有問題,但不要拿這種可能性來困擾我們。)

對于運行時錯誤來說,情況大不一樣。在某次運行期間程序沒有產生任何運行時錯誤,你就能確信另一次不同的運行期內不會產生錯誤嗎?比如:在另一次運行中,你以不同的順序做事,或者采用不同的數據,或者運行更長或更短時間,等等。你可以不停地測試自己的程序直到面色發紫,但你還是不能覆蓋所有的可能性。因而,運行時發現錯誤比在編譯鏈接期間檢查錯誤更不能讓人放心。

通常,對設計做一點小小的改動,就可以在編譯期間消除可能產生的運行時錯誤。這常常涉及到在程序中增加新的數據類型(參見條款M33)。例如,假設想寫一個類來表示時間中的日期,最初的做法可能象這樣:

class Date {
public:
 Date(int day, int month, int year);

 ...

};

準備實現這個構造函數,面臨的一個問題是對day和month值的合法性檢查。讓我們來看看,對于傳給month的值來說,怎么做可以免于對它進行合法性檢查呢?

一個明顯的辦法是采用枚舉類型而不用整數:

enum Month { Jan = 1, Feb = 2, ... , Nov = 11, Dec = 12 };

class Date {
public:
 Date(int day, Month month, int year);

 ...

};

遺憾的是,這不會換來多少好處,因為枚舉類型不需要初始化:

Month m;
Date d(22, m, 1857);      // m是不確定的

所以,Date構造函數還是得驗證month參數的值。

既想免除運行時檢查,又要保證足夠的安全性,你就得用一個類來表示month,你就得保證只有合法的month才被創建:

class Month {
public:
 static const Month Jan() { return 1; }
 static const Month Feb() { return 2; }
 ...
 static const Month Dec() { return 12; }

 int asInt() const/t   // 為了方便,使Month
 { return monthNumber; }     // 可以被轉換為int

private:
 Month(int number): monthNumber(number) {}

 const int monthNumber;
};

class Date {
public:
 Date(int day, const Month& month, int year);
 ...
};

這個設計在幾個方面的特點綜合確定了它的工作方式。首先,Month構造函數是私有的。這防止了用戶去創建新的month??晒┦褂玫闹荒苁荕onth的靜態成員函數返回的對象,再加上它們的拷貝。第二,每個Month對象為const,所以它們不能被改變(否則,很多地方會忍不住將一月轉換成六月,特別是在北半球)。最后一點,得到Month對象的唯一辦法是調用函數或拷貝現有的Month(通過隱式Month拷貝構造函數 ---- 見條款45)。這樣,就可以在任何時間任何地方使用Month對象;不必擔心無意中使用了沒有被初始化的對象。(否則就可能有問題。條款47進行了說明)

有了這些類,用戶幾乎不可能指定一個非法的month,甚至完全不可能 ---- 如果不出現下面這種可惡的情況的話:

Month *pm;/t/t // 定義未被初始化的指針

Date d(1, *pm, 1997);      // 使用未被初始化的指針!

但這種情況所涉及的是另一個問題,即通過未被初始化的指針取值,其結果是不可確定的。(參見條款3,看看我對 "不確定行為" 的感受)遺憾的是,我沒有辦法來防止或檢查這種異端行為。但是,如果假設這種情況永遠不會發生,或者如果我們不考慮這種情況下軟件的行為,Date構造函數對它的Month參數就可以免于合法性檢查。另一方面,構造函數還是必須檢查day參數的合法性 ---- 九月,四月,六月和十一月各有多少天呢?

Date的例子將運行時檢查用編譯時檢查來取代。你可能想知道什么時候可以使用鏈接時檢查。實際上,不是經常這么做。C++用鏈接器來保證所需要的函數只被定義一次(參見條款45,"需要" 一個函數會帶來什么)。它還使用鏈接器來保證靜態對象(參見條款47)只被定義一次。你可以用同樣的方法使用鏈接器。例如,條款27說明,對于一個顯式聲明的函數,如果想有意禁止對它進行定義,鏈接器檢查就很有用。

但不要過于強求。想消除所有的運行檢查是不切實際的。例如,任何允許交互式輸入的程序都要進行輸入驗證。同樣地,某個類中如果包含需要執行上下限檢查的數組,每次訪問數組時就要對數組下標進行檢查。盡管如此,將檢查從運行時轉移到編譯或鏈接時一直是值得努力的目標,只要實際可行,就要追求這一目標。這樣做的獎賞是,程序會更小,更快,更可靠。

上一篇:DataList控件也玩分頁

下一篇:返回列表

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩精品久久久久| 亚洲剧情一区二区| 91免费在线视频网站| 亚洲一区二区久久久| 亚洲精品999| 91在线中文字幕| 久热国产精品视频| 久久综合久中文字幕青草| 欧美制服第一页| 成人有码视频在线播放| 久久天天躁狠狠躁夜夜爽蜜月| 国产最新精品视频| 九色成人免费视频| 亚洲激情视频在线观看| 日韩成人在线免费观看| 精品国产自在精品国产浪潮| 黑人巨大精品欧美一区免费视频| 国产精品色午夜在线观看| 日韩中文字幕久久| 一区二区三区四区精品| 欧美大片大片在线播放| 亚洲精品狠狠操| 国产精品va在线播放我和闺蜜| 亚洲国产精品人人爽夜夜爽| 国内自拍欧美激情| 欧美精品亚州精品| 国产日韩欧美夫妻视频在线观看| 亚洲视频在线免费看| 亚洲伊人成综合成人网| 国产精品成人一区二区三区吃奶| 精品国产乱码久久久久久天美| 亚洲最大福利视频网| 久久精品国产99国产精品澳门| 欧美国产日韩视频| 亚洲www视频| 久久在精品线影院精品国产| 91视频免费在线| 精品国产一区二区三区在线观看| 亚洲一区中文字幕在线观看| 国产欧美精品日韩| 亚洲丝袜av一区| 亚洲欧美激情在线视频| 欧美电影免费在线观看| 欧美国产激情18| 精品国内亚洲在观看18黄| 91精品国产自产在线老师啪| 欧美在线视频播放| 亚洲精品久久久久久久久久久久| 亚洲美女性生活视频| 亚洲xxxx视频| 欧美黄色三级网站| 欧美性猛交99久久久久99按摩| 久久亚洲国产成人| 国产婷婷色综合av蜜臀av| 亚洲图片在区色| 欧美自拍视频在线观看| 亚洲伊人第一页| 国产精品丝袜白浆摸在线| 国产成人精品久久亚洲高清不卡| 欧美精品aaa| 色青青草原桃花久久综合| 久久精品欧美视频| 国产精品久久久久久久7电影| 午夜精品国产精品大乳美女| 国产手机视频精品| 精品人伦一区二区三区蜜桃免费| 91色视频在线观看| 国产综合视频在线观看| 国产一区二中文字幕在线看| 久久久久久久成人| 亚洲精品视频在线播放| 日韩精品在线私人| 夜夜狂射影院欧美极品| 日本免费一区二区三区视频观看| 国产成人亚洲综合91| 青青久久aⅴ北条麻妃| 色黄久久久久久| 欧美一区二区三区精品电影| 一本一道久久a久久精品逆3p| 欧美性猛交xxxx黑人| 在线视频欧美性高潮| 91夜夜揉人人捏人人添红杏| 国产亚洲精品日韩| 久久国产精彩视频| 亚洲欧美中文字幕在线一区| 7777kkkk成人观看| 欧美精品videossex性护士| 亚洲日本中文字幕| 亚洲午夜国产成人av电影男同| 亚洲成人aaa| 亚洲人成77777在线观看网| 国语自产精品视频在线看抢先版图片| 911国产网站尤物在线观看| 日韩在线www| 久久人人看视频| 欧美激情免费观看| 日韩欧美国产一区二区| 韩日精品中文字幕| 91久久精品美女高潮| 中文字幕日韩在线视频| 日本一本a高清免费不卡| 国产精品日韩在线| 久久天天躁狠狠躁夜夜躁| 精品一区电影国产| 国产精品99久久久久久久久久久久| 亚洲va欧美va国产综合久久| 亚洲老头同性xxxxx| 亚洲男人av电影| 最新69国产成人精品视频免费| 国产精品第七十二页| 国产精品老女人视频| 国产一区二区三区在线观看视频| 欧美性猛交xxxxx水多| 亚洲第一区在线| 国产国语videosex另类| 中文字幕av一区中文字幕天堂| 日韩精品在线电影| 国产精品永久免费在线| 国产日韩精品综合网站| 亚洲国产天堂网精品网站| 136fldh精品导航福利| 国产免费一区二区三区香蕉精| 国产午夜精品全部视频在线播放| 亚洲国产精品成人av| 久久成人人人人精品欧| 国产做受高潮69| 欧美激情视频三区| 亚洲国产成人精品久久| 91九色视频在线| 久久久www成人免费精品张筱雨| 国产精品一区二区三区毛片淫片| 欧美视频精品一区| 国产在线观看精品| 中文字幕综合一区| 成人免费在线网址| 亚洲国产精彩中文乱码av在线播放| 久久手机精品视频| 亚洲日本欧美中文幕| 国模精品系列视频| 日韩极品精品视频免费观看| 国产精品亚洲片夜色在线| 中文字幕欧美日韩| 精品国产91久久久久久| 色综合久久88色综合天天看泰| 亚洲人成电影网站色xx| 欧美日韩xxxxx| 亚洲一区亚洲二区亚洲三区| 亚洲片在线观看| 欧美人在线观看| 亚洲午夜精品久久久久久性色| 中文字幕自拍vr一区二区三区| 国产一区二区三区视频在线观看| 欧美中文在线视频| 欧美日韩国产成人| 最近2019年好看中文字幕视频| 久久偷看各类女兵18女厕嘘嘘| 久久精品青青大伊人av| 精品亚洲夜色av98在线观看| 亚洲视频axxx| 亚洲一区二区三区四区视频| 最近2019年手机中文字幕| 欧美在线性视频| 自拍偷拍亚洲在线| 国产小视频91|