日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

STL编程:C++的忠告!

發(fā)布時(shí)間:2023/12/31 c/c++ 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 STL编程:C++的忠告! 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

Copy別人的,有少量修改,可以做為一下參考!

C++之父Bjarne Stroustrup 寫的?The C++ Programming Language (Special Edition)?中各章后面的忠告。

Chapter One:致讀者
[1] 在編寫程序時(shí),你是在為你針對(duì)某個(gè)問題的解決方案中的思想建立起一種具體表示。讓程序的結(jié)構(gòu)盡可能地直接反映這些思想。
[a] 如果你能把“它”看成一個(gè)獨(dú)立的概念,就把它做成一個(gè)類。
[b] 如果你能把“它”看成一個(gè)獨(dú)立地實(shí)體,就把它做成某個(gè)類的一個(gè)對(duì)象。
[c] 如果兩個(gè)類有共同的界面,將此界面做成一個(gè)抽象類。
[d] 如果兩個(gè)類的實(shí)現(xiàn)有某些顯著的共同東西,靜這些共性做成一個(gè)基類。
[e] 如果一個(gè)類是一種對(duì)象的容器,將它做成一個(gè)模板。
[f] 如果一個(gè)函數(shù)實(shí)現(xiàn)對(duì)某容器的一個(gè)算法,將它實(shí)現(xiàn)為對(duì)一族容器可用的模板函數(shù)。
[g] 如果一組類、模板等互相之間有邏輯關(guān)系,將它們放進(jìn)一個(gè)名字空間力。
[2] 在你定義一個(gè)并不是實(shí)現(xiàn)某個(gè)像矩陣或復(fù)數(shù)這樣的數(shù)學(xué)對(duì)象的類時(shí),或者定義一個(gè)低層的類型如鏈表的時(shí)候:
[a] 不要使用全局?jǐn)?shù)據(jù)(使用成員)。
[b] 不要使用全局函數(shù)。
[c] 不要使用公用數(shù)據(jù)成員。
[d]
不要使用友元,除非為了避免[a]或[c]
[e] 不要在一個(gè)類里面放“類型域”;采用虛函數(shù)
[f] 不要使用內(nèi)聯(lián)函數(shù),除非作為效果顯著的優(yōu)化

Chapter Two:C++概覽
[1]
不用害怕,一切都會(huì)隨著時(shí)間的推移而逐漸明朗起來。
[2] 你并不需要在知道了C++地所有細(xì)節(jié)之后才能寫出好的C++程序。
[3] 請(qǐng)?zhí)貏e關(guān)注程序設(shè)計(jì)技術(shù),而不是各種語言特征。

Chapter Three:標(biāo)準(zhǔn)庫概念
[1]
不要像重新發(fā)明車輪那樣企圖做每件事;去使用庫
[2] 不要相信奇跡;要理解你的庫能做什么,它們?nèi)绾巫?#xff0c;它們做時(shí)需要多大代價(jià)。
[3] 當(dāng)你遇到一個(gè)選擇時(shí),應(yīng)該優(yōu)先選擇標(biāo)準(zhǔn)庫而不是其他的庫。
[4] 不要認(rèn)為標(biāo)準(zhǔn)庫對(duì)于任何事情都是最理想的。
[5] 切記#include 你所用到的功能的頭文件。
[6] 記住,標(biāo)準(zhǔn)庫的功能定義在名字空間std 中。
[7] 請(qǐng)用string,而不是char*。
[8] 如果懷疑,就用一個(gè)檢查區(qū)間范圍的向量。
[9]
vector<T>、list<T>和map<key, value>都比T[]好
[10] 如果要向一個(gè)容器中添加一個(gè)元素,用push_back()或back_insert()。
[11] 采用對(duì)vector 的push_back(),而不是realloc()。
[12] 在main()中捕捉公共的異常。

Chapter Four:類型和聲明
[1]
保持較小的作用域
[2] 不要在一個(gè)作用域和它外圍的作用域里采用同樣的名字。
[3] 在一個(gè)聲明中(只)聲明一個(gè)名字。
[4] 讓
常用的和局部的名字比較短,讓不常用的和全局的名字比較長(zhǎng)
[5] 避免看起來類似的名字。
[6] 維持某種統(tǒng)一的命名風(fēng)格。
[7] 仔細(xì)選擇名字,反映其意義而不是反映實(shí)現(xiàn)方式。
[8] 如果所用的內(nèi)部類型表示某種可能變化的值,請(qǐng)用typdef 為它定義一個(gè)有意義的名字。
[9] 用typedef 為類型定義同義詞,用枚舉或類去定義新類型。
[10] 切記每個(gè)聲明中都必須描述一個(gè)類型(沒有隱式的int )。
[11] 避免有關(guān)字符值的不必要的假設(shè)。
[12] 避免有關(guān)整數(shù)大小的不必要假設(shè)。
[13] 避免有關(guān)浮點(diǎn)類型表示范圍的不必要假設(shè)。
[14] 優(yōu)先使用普通的int 而不是short int 或者long int 。
[15] 優(yōu)先使用double 而不是float 或者long double。
[16] 優(yōu)先使用普通的char 而不是signed char 或者unsigned char。
[17] 避免做出有關(guān)對(duì)象大小的不必要假設(shè)。
[18] 避免無符號(hào)算術(shù)。
[19] 應(yīng)該帶著疑問去看待從signed 到unsigned,或者從unsigned 到singed 的轉(zhuǎn)換。
[20] 應(yīng)該帶著疑問去看待從浮點(diǎn)到整數(shù)的轉(zhuǎn)換。
[21] 應(yīng)該帶著疑問其看待向較小類型的轉(zhuǎn)換,如將int 轉(zhuǎn)換到char。

Chapter Five:指針、數(shù)組和結(jié)構(gòu)
[1] 避免非平凡的指針?biāo)阈g(shù)。
[2] 當(dāng)心,不要超出函數(shù)的界限去寫。
[3]
盡量使用0 而不是NULL
[4] 盡量使用vector 和valarrray 而不是內(nèi)部(C 風(fēng)格)的數(shù)組
[5] 盡量使用string 而不是以0 結(jié)尾的char 數(shù)組。
[6] 盡量少使用普通的引用參數(shù)。
[7] 避免void*,除了在某些低級(jí)代理。
[8] 避免在代碼中使用非平凡的文字量(“神秘的數(shù)”)。相反,應(yīng)該定義和使用各種符號(hào)常量。

Chapter Six:表達(dá)式和語句
[1] 應(yīng)
盡量可能使用標(biāo)準(zhǔn)庫,而不是其他的庫和“手工打造的代碼”。
[2] 避免過于復(fù)雜的表達(dá)式。
[3] 如果對(duì)運(yùn)算符的優(yōu)先級(jí)有疑問,加括號(hào)。
[4]
避免顯式類型轉(zhuǎn)換
[5] 若必須做顯式類型轉(zhuǎn)換,提倡使用特殊強(qiáng)制運(yùn)算符,而不是C 風(fēng)格的強(qiáng)制。
[6] 只對(duì)定義良好的構(gòu)造使用T(e)記法。
[7] 避免帶有無定義求值順序的表達(dá)式。
[8] 避免goto。
[9] 避免do 語句。
[10] 在你已經(jīng)有了去初始化某個(gè)變量的值之前,不要去聲明它。
[11] 式注釋簡(jiǎn)潔、清晰、有意義。
[12] 保持一致的縮進(jìn)編排風(fēng)格。
[13] 傾向于去定義一個(gè)成員函數(shù)operator new()去取代全局的operator new()。
[14] 在讀輸入的時(shí)候,總應(yīng)考慮病態(tài)形式的輸入。

Chapter Seven:函數(shù)
[1] 質(zhì)疑那些非const 的引用參數(shù);如果你想要一個(gè)函數(shù)去修改其參數(shù),請(qǐng)使用指針或者返回值。
[2] 當(dāng)你需要盡可能減少參數(shù)復(fù)制時(shí),應(yīng)該使用const 引用參數(shù)。
[3]
廣泛而一致地使用const
[4] 避免宏。
[5] 避免不確定數(shù)目的參數(shù)。
[6] 不要返回局部變量的指針或者引用。
[7] 當(dāng)一些函數(shù)對(duì)不同的類型執(zhí)行概念上相同的工作時(shí),請(qǐng)使用重載。
[8] 在各種整數(shù)上重載時(shí),通過提供函數(shù)去消除常見的歧義性
[9] 在考慮使用指向函數(shù)的指針時(shí),請(qǐng)考慮虛函數(shù)或模板是不是更好的選擇。
[10] 如果你必須使用宏,請(qǐng)使用帶有許多大寫字母的丑陋的名字

Chapter Eight:名字空間和異常
[1] 用
名字空間表示邏輯結(jié)構(gòu)
[2] 將每個(gè)非局部的名字放入某個(gè)名字空間里,除了main()之外。
[3] 名字空間的設(shè)計(jì)應(yīng)該讓你能很方便地使用它,而又不會(huì)意外地訪問了其他的無關(guān)名字空間。
[4] 避免對(duì)名字空間使用很短的名字。
[5] 如果需要,通過名字空間別名去緩和和長(zhǎng)名字空間的影響。
[6] 避免給你的名字空間的用戶添加太大的記法負(fù)擔(dān)。
[7] 在定義名字空間的成員時(shí)使用namespace::member 的形式。
[8] 只在轉(zhuǎn)換時(shí),或者在局部作用域里,才用using namespace
[9] 利用異常去松弛“錯(cuò)誤”處理代碼和正常處理代碼之間的聯(lián)系。
[10] 采用用戶定義類型作為異常,不用內(nèi)部類型。
[11] 當(dāng)局部控制結(jié)構(gòu)足以應(yīng)付問題,不要使用異常

Chapter Nine:源文件和程序
[1] 利用
頭文件去表示界面和強(qiáng)調(diào)邏輯結(jié)構(gòu)
[2] 用#include 將頭文件包含到實(shí)現(xiàn)有關(guān)功能的源文件里。
[3] 不要在不同編譯單位里定義具有同樣名字,意義類似但又不同的全局變量。
[4] 避免在頭文件里定義非inline 函數(shù)。
[5] 只在全局作用域或名字空間里使用#include。
[6] 只用#include 包含完整的定義。
[7] 使用包含保護(hù)符
[8] 用#include 將C 頭文件包含到名字空間里,以避免全局名字。
[9] 將頭文件做成自給自足的。
[10] 區(qū)分用戶界面和實(shí)現(xiàn)界面。
[11] 區(qū)分一般用戶界面和專家用戶界面。
[12] 在有意向用于非C++程序組成部分的代碼中,應(yīng)避免需要運(yùn)行時(shí)初始化的非局部對(duì)象。

Chapter Ten:類 Class
[1] 用類表示概念。
[2] 只將public 數(shù)據(jù)(struct)用在它實(shí)際殺過那僅僅時(shí)數(shù)據(jù),而且對(duì)于這些數(shù)據(jù)成員并不存在不變式的地方。
[3] 一個(gè)
具體類型屬于最簡(jiǎn)單的類。如果有用的話,就應(yīng)該盡可能使用具體類型,而不要采用更復(fù)雜的,也不要用簡(jiǎn)單的數(shù)據(jù)結(jié)構(gòu)。
[4] 只將那些需要直接訪問類的表示的函數(shù)作為成員函數(shù)。
[5] 采用名字空間,使類與其協(xié)助函數(shù)之間的關(guān)系更明確。
[6] 將那些不修改對(duì)象值的成員函數(shù)做成const 成員函數(shù)。
[7] 將那些需要訪問類的表示,但無須針對(duì)特定對(duì)象調(diào)用的成員函數(shù)做成static 成員函數(shù)。
[8] 通過構(gòu)造函數(shù)建立起類的不變式。
[9] 如果構(gòu)造函數(shù)申請(qǐng)某種資源,析構(gòu)函數(shù)就應(yīng)該釋放一資源。
[10] 如果在一個(gè)類里有指針成員,它就要有復(fù)制操作(包括復(fù)制構(gòu)造函數(shù)和復(fù)制賦值)。
[11] 如果在一個(gè)類里有引用成員,它就可能需要有復(fù)制操作(包括復(fù)制構(gòu)造函數(shù)和復(fù)制賦值)。
[12] 如果一個(gè)類需要復(fù)制操作或析構(gòu)函數(shù),它多半還需要有構(gòu)造函數(shù)、析構(gòu)函數(shù)、復(fù)制賦值函數(shù)和復(fù)制構(gòu)造函數(shù)。
[13] 在復(fù)制賦值函數(shù)里需要檢查自我賦值。
[14] 在寫復(fù)制構(gòu)造函數(shù)時(shí),請(qǐng)小心地復(fù)制每個(gè)需要復(fù)制的元素(當(dāng)心默認(rèn)的初始式)。
[15] 在向某個(gè)類中添加新成員函數(shù)時(shí),一定要仔細(xì)檢查,看是否存在需要更新的用戶定義構(gòu)造函數(shù),以使它能夠初始化新成員。
[16] 在類聲明中需要定義整型常量時(shí),請(qǐng)使用枚舉。
[17] 在構(gòu)造全局的和名字空間的對(duì)象時(shí),應(yīng)避免順序依賴性
[18] 用第一次開關(guān)去緩和順序依賴性問題。
[19] 請(qǐng)記住,臨時(shí)對(duì)象將在建立它們的那個(gè)完整表達(dá)式結(jié)束時(shí)銷毀(作用域問題)。

Chapter Eleven:運(yùn)算符重載
[1] 定義運(yùn)算符主要是為了模仿習(xí)慣使用方式。
[2] 對(duì)于大型運(yùn)算對(duì)象,請(qǐng)使用const 引用參數(shù)類型。
[3] 對(duì)于大型的結(jié)果,請(qǐng)考慮優(yōu)化返回方式。
[4] 如果
默認(rèn)復(fù)制操作對(duì)一個(gè)類和合適,最好是直接用它
[5] 如果默認(rèn)復(fù)制操作對(duì)一個(gè)類不和合適,重新定義它,或者禁止它
[6] 對(duì)于需要訪問表示的操作,優(yōu)先考慮作為成員函數(shù)而不是作為非成員函數(shù)。
[7] 對(duì)于不訪問表示的操作,優(yōu)先考慮作為非成員函數(shù)而不是作為成員函數(shù)。
[8] 用名命名空間將協(xié)助函數(shù)與“它們的”類關(guān)聯(lián)起來。
[9] 對(duì)于對(duì)稱的運(yùn)算符采用非成員函數(shù)。
[10] 用()作為多維數(shù)組的下標(biāo)。
[11] 將只有一個(gè)“大小參數(shù)”的構(gòu)造函數(shù)做成explicit。
[12] 對(duì)于非特殊的使用,最好是用標(biāo)準(zhǔn)string 而不是你自己的練習(xí)。
[13] 要注意引進(jìn)隱式轉(zhuǎn)換的問題。
[14] 用成員函數(shù)表達(dá)那些需要左值作為其左運(yùn)算對(duì)象的運(yùn)算符。

Chapter Twelve:派生類
[1] 避免類型

[2] 用指針和引用避免切割問題。
[3] 用抽象類將設(shè)計(jì)的中心集中到提供清晰的界面方面。
[4] 用抽象類是界面最小化
[5] 用抽象類從界面中排除實(shí)現(xiàn)細(xì)節(jié)。
[6] 用虛函數(shù)是新的實(shí)現(xiàn)能夠添加進(jìn)來,又不會(huì)影響用戶代碼。
[7] 用抽象類去盡可能減少用戶代碼的重新編譯。
[8] 用抽象類是不同的實(shí)現(xiàn)能夠共存。
[9] 一個(gè)有虛函數(shù)的類應(yīng)該有一個(gè)虛析構(gòu)函數(shù)。
[10] 抽象類通常不需要構(gòu)造函數(shù)。
[11] 讓不同概念的表示也不同。

Chapter Thirteen:模板 Template
[1] 用模板描述需要使用到許多參數(shù)類型上去的算法。
[2] 用
模板表述容器
[3] 為指針的容器提供專門化,以減小代碼規(guī)模。
[4] 總是在專門化之前聲明模板的一般形式。
[5] 在專門化的使用之前先聲明它。
[6] 盡量減少模板定義對(duì)于實(shí)例化環(huán)境的依賴性。
[7] 定義你所聲明的每一個(gè)專門化
[8] 考慮一個(gè)模板是否需要有針對(duì)C 風(fēng)格字符串和數(shù)組的專門化。
[9] 用表述策略的對(duì)象進(jìn)行參數(shù)化
[10] 用專門化和重載為同一概念的針對(duì)不同類型的實(shí)現(xiàn)提供統(tǒng)一界面。
[11] 為簡(jiǎn)單情況提供簡(jiǎn)單界面,用重載和默認(rèn)參數(shù)去表述不常見的情況。
[12] 在修改為通用模板之前,在具體實(shí)例上排除程序錯(cuò)誤。
[13] 如果模板定義需要在其他編譯單位里訪問,請(qǐng)記住寫export。
[14] 對(duì)大模板和帶有非平凡環(huán)境依賴性的模板,應(yīng)采用分開編譯的方式。
[15] 用模板表示轉(zhuǎn)換,但要非常小心地定義這些轉(zhuǎn)換。
[16] 如果需要,用constraint()成員函數(shù)給模板的實(shí)參增加限制。
[17] 通過顯式實(shí)例化減少編譯和連接時(shí)間
[18] 如果運(yùn)行時(shí)的效率非常重要,那么最好用模板而不是派生類。
[19] 如果增加各種變形而又不重新編譯是很重要的,最好用派生類而不是模板。
[20] 如果無法定義公共的基類,最好用模板而不是派生類。
[21] 當(dāng)有兼容性約束的內(nèi)部類型和結(jié)構(gòu)非常重要時(shí),最好用模板而不是派生類。

Chapter Fourteen:異常處理
[1] 用異常做錯(cuò)誤處理。
[2] 當(dāng)更局部的控制機(jī)構(gòu)足以應(yīng)付時(shí),不要使用異常。
[3] 采用“資源申請(qǐng)即初始化”技術(shù)去管理資源。
[4] 并不是美國(guó)程序都要求具有異常時(shí)的安全性。
[5] 才用“資源申請(qǐng)即初始化”技術(shù)和異常處理器去維持不變式。
[6] 盡量少用try 塊,用“資源申請(qǐng)即初始化”技術(shù),而不是顯式的處理器代碼。
[7] 并不是美國(guó)函數(shù)都需要處理每個(gè)可能的錯(cuò)誤。
[8] 在構(gòu)造函數(shù)里通過拋出異常指明出現(xiàn)失敗。
[9] 在從賦值中拋出異常之前,式操作對(duì)象處于合法狀態(tài)。
[10] 避免從析構(gòu)函數(shù)里拋出異常。
[11] 讓main()捕捉并報(bào)告所有的異常。
[12] 使正常處理代碼和錯(cuò)誤處理代碼相互分離。
[13] 在構(gòu)造函數(shù)里拋出異常之前,應(yīng)保證釋放在此構(gòu)造函數(shù)里申請(qǐng)的所有資源。
[14] 使資源管理具有層次性。
[15] 對(duì)于主要界面使用異常描述。
[16] 當(dāng)心通過new 分配的內(nèi)存在發(fā)生異常時(shí)沒有釋放,并由此而導(dǎo)致存儲(chǔ)的流失。
[17] 如果一函數(shù)可能拋出某個(gè)異常,就應(yīng)該假定它一定會(huì)拋出這個(gè)異常。
[18] 不要假定所有異常都時(shí)由excepion 類派生出來的。
[19] 庫不應(yīng)該單方面終止程序。相反,應(yīng)該拋出異常,讓調(diào)用者去做決定。
[20] 庫不應(yīng)該生成面向最終用戶的錯(cuò)誤信息。相反,它應(yīng)該拋出異常,讓調(diào)用者去做決定。
[21] 在設(shè)計(jì)的前期開發(fā)出一種錯(cuò)誤處理策略。

Chapter Fifteen:類層次結(jié)構(gòu)
[1] 利用常規(guī)的多重繼承表述特征的合并。
[2] 利用多重繼承完成實(shí)現(xiàn)細(xì)節(jié)與界面分離。
[3] 用virtual 基類表達(dá)在類層次結(jié)構(gòu)里對(duì)某些類(不是全部類)共同的東西。
[4] 避免顯式的類型轉(zhuǎn)換(強(qiáng)制)。
[5] 在不可避免地需要漫游類層次結(jié)構(gòu)的地方,使用dynamic_cast。
[6] 盡量使用dynamic_cast 而不是typeid。
[7] 盡量使用private 而不是protected。
[8] 不要聲明protected 數(shù)據(jù)成員。
[9] 如果某個(gè)類定義了operator delete(),它也應(yīng)該有虛析構(gòu)函數(shù)。
[10] 在構(gòu)造和析構(gòu)期間不要調(diào)用虛函數(shù)。
[11] 盡量少用為解析成員名而寫的顯式限定詞,最好時(shí)在覆蓋函數(shù)里用它。

Chapter Sixteen:庫組織和容器
[1] 利用標(biāo)準(zhǔn)庫功能,以維持可移植性。
[2] 決不要另行定義標(biāo)準(zhǔn)庫的功能。
[3] 決不要認(rèn)為標(biāo)準(zhǔn)庫比什么都好。
[4] 在定義一種新功能時(shí),應(yīng)考慮它是否能納入標(biāo)準(zhǔn)庫所提供的框架中。
[5] 記住標(biāo)準(zhǔn)庫功能都定義在名字空間std 里。
[6] 通過包含保準(zhǔn)卡頭文件聲明其功能,不要自己另行顯式聲明。
[7] 利用后續(xù)抽象的優(yōu)點(diǎn)。
[8] 避免肥大的界面。
[9] 與自己寫按照反向順序的顯式循環(huán)相比,最好是寫利用反向迭代器的算法。
[10] 用base()從reverse_iterator 抽取出iterator。
[11] 通過引用傳遞容器。
[12] 用迭代器類型,如list<char>::iterator,而不要采用索引容器元素的指針。
[13] 在不需要修改容器元素時(shí),使用const 迭代器。
[14] 如果希望檢查訪問范圍,請(qǐng)(直接或間接)使用at()。
[15] 多用容器和push_back()或resize(),少用數(shù)組和realloc().
[16] vector 改變大小之后,不要使用指向其中的迭代器。
[17] 利用reserve()避免使迭代器非法。
[18] 在需要的時(shí)候,reserve()可以使執(zhí)行情況更容易預(yù)期。

Chapter Seventeen:標(biāo)準(zhǔn)庫容器
[1] 如果要用容器,首先考慮用vector。
[2] 了解你經(jīng)常使用的每個(gè)操作的代價(jià)(復(fù)雜性,大O 度量)。
[3] 容器的界面、實(shí)現(xiàn)和表示使不同的概念,不要混淆。
[4] 你可以依據(jù)多種不同準(zhǔn)則去排序和搜索。
[5] 不要用C 風(fēng)格的字符串作為關(guān)鍵碼,除非你提供了一種適當(dāng)?shù)谋容^準(zhǔn)則。
[6] 你可以定義這樣的比較準(zhǔn)則,使等價(jià)的但是不相同的關(guān)鍵碼值映射到同一個(gè)關(guān)鍵碼。
[7] 在插入和刪除元素時(shí),最好時(shí)使用序列末端的操作(back 操作)。
[8] 當(dāng)你需要在容器的前端或中間做許多插入和刪除時(shí),請(qǐng)用list。
[9] 當(dāng)你主要通過關(guān)鍵碼訪問元素時(shí),請(qǐng)用map 或multimap。
[10] 盡量用最小的操作集合,以取得最大的靈活性。
[11] 如果要保持元素的順序性,選用map 而不是hash_map。
[12] 如果查找速度極其重要,選hash_map 而不是map。
[13] 如果無法對(duì)元素定義小于操作時(shí),選hash_map 而不是map。
[14] 當(dāng)你需要檢查某個(gè)關(guān)鍵碼是否在關(guān)聯(lián)容器里的時(shí)候,用find()。
[15] 用equal_range()在關(guān)聯(lián)容器里找出所有具有給定關(guān)鍵碼的所有元素。
[16] 當(dāng)具有同樣關(guān)鍵碼的多個(gè)值需要保持順序時(shí),用multimap。
[17] 當(dāng)關(guān)鍵碼本身就是你需要保存的值時(shí),用set 或multiset。

Chapter Eighteen:算法和函數(shù)對(duì)象
[1] 多用算法,少用循環(huán)。
[2] 在寫循環(huán)時(shí),考慮是否能將它表述為一個(gè)通用的算法。
[3] 常規(guī)性地重溫算法集合,看看是不是能將新應(yīng)用變得更明晰。
[4] 保證一對(duì)迭代器參數(shù)確實(shí)表述了一個(gè)序列。
[5] 設(shè)計(jì)時(shí)應(yīng)該讓使用最頻繁的操作時(shí)簡(jiǎn)單而安全的。
[6] 吧測(cè)試表述成能夠作為謂詞使用的形式。
[7] 切記
謂詞是函數(shù)和對(duì)象,不是類型。
[8] 你可以用約束器從 二元謂詞 制造出 一元謂詞。
[9] 利用mem_fun()和mem_fun_ref() 將算法 應(yīng)用于 容器container。
[10] 當(dāng)你需要將一個(gè)參數(shù)約束到一個(gè)函數(shù)上時(shí),用ptr_fun()。
[11] 切記srrcmp()用0 表示“相等”,與==不同。
[12] 僅在沒有更特殊的算法時(shí),才使用lambada表達(dá)式for_each()和tranform()。
[13] 利用謂詞,以便能以各種比較準(zhǔn)則和相等準(zhǔn)則使用算法。
[14] 利用謂詞和其他函數(shù)對(duì)象,以使標(biāo)準(zhǔn)算法能用于 表示范圍廣泛的意義。
[15] 運(yùn)算符< 和== 在指針上的默認(rèn)意義很少適用于標(biāo)準(zhǔn)算法。
[16] 算法并不直接為它們的參數(shù)序列增加或減少元素。
[17] 應(yīng)保證用于同一個(gè)序列的小于和相等謂詞相互匹配。
[18] 有時(shí)排好序的序列用起來更有效且優(yōu)雅。
[19] 僅為兼容性而使用qsort()和bsearch()。

Chapter Nineteen:迭代器和分配器 iterator/ allocator
[1] 在寫一個(gè)算法時(shí),設(shè)法確定需要用哪種迭代器才能提供可接受的效率,并(只)使用這種迭代器所支持的操作符去表述算法。
[2] 當(dāng)給定的迭代器參數(shù)提供了多于算法所需的最小支持時(shí),請(qǐng)通過重載為該算法提供效率更高的實(shí)現(xiàn)。
[3] 利用istream_traits 為不同迭代器類別描述適當(dāng)?shù)乃惴ā?br /> [4] 記住在istream_iterator 和ostream_iterator 的訪問之前使用++。
[5] 用插入器 ?避免容器 ?溢出 : subrange over。
[6] 在排錯(cuò)時(shí)使用額外的檢查,后面只在必須時(shí)才刪除這些檢查。
[7] 多用++p,少用p++ (
這是一個(gè)加法和返回對(duì)象的區(qū)別)。
[8] 使用未初始化的存儲(chǔ)去 改善那些擴(kuò)展數(shù)據(jù)結(jié)構(gòu)的算法性能。
[9] 使用臨時(shí)緩沖區(qū)去改善需要臨時(shí)數(shù)據(jù)結(jié)構(gòu)的算法的性能。
[10] 在寫自己的分配器之前三思。
[11] 避免malloc()、free()、realloc() (內(nèi)存的分配會(huì)導(dǎo)致看不見的問題)等。
[12] 你可以通過為rebind 所用的技術(shù)去模擬對(duì)模板的typedef。

Chapter Twenty:串(String)
[1] 盡量使用string 操作,少用C 風(fēng)格字符串函數(shù)。
[2] 用string 作為變量或者成員,不作為基類。
[3] 你可以將string 作為參數(shù)值或者返回值,讓系統(tǒng)去關(guān)心存儲(chǔ)管理問題。
[4] 當(dāng)你希望做范圍檢查時(shí),請(qǐng)用at()而不是迭代器或者[]。
[5] 當(dāng)你希望優(yōu)化速度時(shí),請(qǐng)用迭代器或[]而不是at()。
[6] 直接或者間接地使用substr()去讀字子串,用replace()去寫子串。
[7] 用find()操作在string 里確定值的位置(而不是寫一個(gè)顯式的循環(huán))。
[8] 在你需要高效率地添加字符時(shí),請(qǐng)?jiān)趕tring 的后面附加。
[9] 在沒有極端時(shí)間要求情況下用string 作為字符輸入的目標(biāo)。
[10] 用string::npos 表示“sring 的剩余部分”。
[11] 如果必要,就采用低級(jí)操作去實(shí)現(xiàn)極度頻繁使用的strng(而不是到處用低級(jí)數(shù)據(jù)結(jié)構(gòu))。
[12] 如果你使用string,請(qǐng)?jiān)谀承┑胤?/span>捕捉length_error 和out_of_rang 異常
[13] 小心,不要將帶值0 的char*傳遞給字符串函數(shù) (可能會(huì)導(dǎo)致舍去零值)。
[14] 只是到必須做的時(shí)候,(再)用c_str()產(chǎn)生string 的C 風(fēng)格表示。
[15] 當(dāng)你需要知道字符串的類別時(shí),用isalpha()、isdigit()等函數(shù),不要自己去寫對(duì)字符值的檢測(cè)。

Chapter TwentyOne:流(Stream)
[1] 在為用戶定義類型的值定義<<和>>時(shí),應(yīng)該采用意義清晰的正文表達(dá)形式。
[2] 在打印包含低優(yōu)先級(jí)運(yùn)算符的表達(dá)式時(shí)需要用括號(hào)。
[3] 在添加新的<<和>>運(yùn)算符時(shí),你不必修改istream 或ostream。
[4] 你可以定義函數(shù),時(shí)其能基于第二個(gè)(或更后面的)參數(shù),具有像virtual 函數(shù)那樣的行為。
[5] 切記,按默認(rèn)約定>>跳過所有空格。
[6] 使用低級(jí)輸入函數(shù)(如get()和read())主要是為了實(shí)現(xiàn)高級(jí)輸入函數(shù)。
[7] 在使用get()、getline()和read()時(shí)留心其終止準(zhǔn)則。
[8] 在控制I/O 時(shí),盡量采用操控符,少用狀態(tài)標(biāo)志。
[9] (只)用異常 throw/catch 去捕捉罕見的I/O 錯(cuò)誤。
[10] 聯(lián)結(jié)用于交互式I/O 的流。
[11] 使用哨位將許多函數(shù)的入口和出口代碼集中到一個(gè)地方。
[12] 在無參數(shù)操控符最后不要寫括號(hào)。
[13] 使用標(biāo)準(zhǔn)操控符式應(yīng)記住寫#include <iomanip>。
[14] 你可以通過定義一個(gè)簡(jiǎn)單函數(shù)對(duì)象得到三元運(yùn)算符的效果(和效率)。
[15] 切記,width 描述只應(yīng)用于隨后的一個(gè)I/O 操作。
[16] 切記precision 描述只對(duì)所后所的浮點(diǎn)數(shù)輸出操作有效。
[17] 用字符串流做內(nèi)存里的格式化。
[18] 你可以描述一個(gè)文件流的模式。
[19] 在擴(kuò)充I/O 系統(tǒng)時(shí),應(yīng)該清楚地區(qū)分格式化(iostream)和緩沖(streambuf)。
[20] 將傳輸值的非標(biāo)準(zhǔn)方式實(shí)現(xiàn)為流緩沖。
[21] 將格式化值的非標(biāo)準(zhǔn)方式實(shí)現(xiàn)為流操作。
[22] 你可以利用一對(duì)函數(shù)隔離和封裝其對(duì)用戶定義代碼的調(diào)用。
[23] 你可以在讀入之前用in_avail()去確定輸入操作是否會(huì)被阻塞。
[24] 劃分清楚需要高效的簡(jiǎn)單操作和實(shí)現(xiàn)某種策略的操作(將前者做成inline,將后者做成virtual)。
[25] 用locale 將“文化差異”局部化。
[26] 用sync_with_stdio(x)去混合C 風(fēng)格和C++風(fēng)格的I/O,或者離解C 風(fēng)格和C++風(fēng)格的I/O。
[27] 當(dāng)心
C 風(fēng)格I/O 的類型錯(cuò)誤。

Chapter TwentyTwo:數(shù)值(Numberic)
[1] 數(shù)值問題常常和微妙。如果你對(duì)數(shù)值問題的數(shù)學(xué)方面不是100%有把握,請(qǐng)去找專家或者做試驗(yàn)。
[2] 用numberic_limits 去確定內(nèi)部類型的性質(zhì)。
[3] 為用戶定義的標(biāo)量類型描述numberic_limits。
[4] 如果運(yùn)行時(shí)效率比對(duì)于操作和元素的靈活性更重要的話,那么請(qǐng)用valarray 去做數(shù)值計(jì)算。
[5] 用切割表述在數(shù)組的一部分上的操作,而不是用循環(huán)。
[6] 利用組合器,通過清除臨時(shí)量和更好的算法來獲得效率。
[7] 用std::complex 做復(fù)數(shù)算術(shù)。
[8] 你可以把使用complex 類的老代碼通過一個(gè)typedef 轉(zhuǎn)為用str::complex 模板。
[9] 在寫循環(huán)從一個(gè)表出發(fā)計(jì)算某個(gè)值之前,先考慮一下accumulate()、inner_produce()、partial_sum()和adjacent_difference()。
[10] 最好使用具有特定分布的隨機(jī)數(shù),少直接用rand()。
[11] 注意是你的隨機(jī)數(shù)
充分隨機(jī)(種子和算法問題都要注意)

Chapter TwentyThree:開發(fā)和設(shè)計(jì)
[1] 知道你試圖達(dá)到什么目的(工程學(xué) 需求分析)。
[2] 心中牢記軟件開發(fā)是一項(xiàng)人的活動(dòng)。
[3] 用類比來證明是有意的欺騙。
[4] 保持一個(gè)特定的實(shí)實(shí)在在的目標(biāo)。
[5] 不要試圖用技術(shù)方式去解決社會(huì)問題。
[6] 在設(shè)計(jì)和對(duì)待人員方面都應(yīng)該有長(zhǎng)期考慮。
[7] 對(duì)于什么程序在編碼之前先行設(shè)計(jì)是有意義的,在程序規(guī)模上并沒有下限。
[8] 設(shè)計(jì)過程應(yīng)鼓勵(lì)反饋。
[9] 不要將做事情都當(dāng)做取得了進(jìn)展(有可能僅僅是探索!)。
[10] 不要推廣到超出了所需要的、你已有直接經(jīng)驗(yàn)的和已經(jīng)測(cè)試過的東西。
[11] 將概念表述為類(抽象)。
[12] 系統(tǒng)里也存在一些不應(yīng)該用類表述的性質(zhì)。
[13] 將概念間的層次關(guān)系用類層次結(jié)構(gòu)表示。
[14] 主動(dòng)到應(yīng)用和實(shí)現(xiàn)中去尋找概念間的共性,將由此得到的一般性概念表示為基類。
[15] 在其他領(lǐng)域中的分類方式未必適合作為應(yīng)用中的繼承模型的分類方式。
[16] 基于行為和不變式設(shè)計(jì)類層次結(jié)構(gòu)。
[17] 考慮用例。
[18] 考慮用CRC 卡。
[19] 用現(xiàn)存系統(tǒng)作為模型、靈感的源泉和出發(fā)點(diǎn)。
[20] 意識(shí)到視覺圖形工程的重要性。
[21] 在原型成為負(fù)擔(dān)時(shí)就拋棄它。
[22] 為變化而設(shè)計(jì),將注意力集中到靈活性、可擴(kuò)展性、可移植性和重用。
[23] 將注意力集中到組件設(shè)計(jì)。
[24] 讓每個(gè)界面代表在一個(gè)抽象層次中的一個(gè)概念。
[25] 面向變化進(jìn)行設(shè)計(jì),以求得穩(wěn)定性。
[26] 通過將廣泛頻繁使用的界面做得最小、最一般和抽象來使設(shè)計(jì)穩(wěn)定。
[27] 保持盡可能小,不為“特殊需要”增加新特征。
[28] 總考慮類的其他表示方式。如果不可能有其他方式,這個(gè)類可能就沒有代表某個(gè)清晰的概念。
[29] 反復(fù)評(píng)審、精化設(shè)計(jì)和實(shí)現(xiàn)。
[30] 采用那些能用于調(diào)試,用于分析問題、設(shè)計(jì)和實(shí)現(xiàn)的最好工具。
[31] 盡早、盡可能頻繁地進(jìn)行試驗(yàn)、分析和測(cè)試。
[32] 不要忘記效率。
[33] 保持某種適合項(xiàng)目規(guī)模的規(guī)范性水平。
[34] 保證有人負(fù)責(zé)項(xiàng)目的整體設(shè)計(jì)。
[35] 為可重用組件做文檔、推介和提供支持。
[36] 將目標(biāo)與細(xì)節(jié)一起寫進(jìn)文檔里。
[37] 將為新開發(fā)者提供的教許材料作為文檔的一部分。
[38] 鼓勵(lì)設(shè)計(jì)、庫和類的重用,并給予回報(bào)。

Chapter TwentyFour:設(shè)計(jì)和編程(Designer and compile)
[1] 應(yīng)該向數(shù)據(jù)抽象和面向?qū)ο笤O(shè)計(jì)的方向發(fā)展。
[2] (僅僅)根據(jù)需要去使用C++的特征和技術(shù)。
[3] 設(shè)計(jì)應(yīng)與編程風(fēng)格相互匹配。
[4] 將類/概念作為設(shè)計(jì)中最基本的關(guān)注點(diǎn),而不是功能/處理。
[5] 用類表示概念。
[6] 用
繼承(僅僅)表示概念間的層次結(jié)構(gòu)關(guān)系。
[7] 利用應(yīng)用層靜態(tài)類型的方式給出有關(guān)界面的更強(qiáng)的保證。
[8] 使用程序生成器和直接界面操作工具去完成定義良好的工作。
[9] 不要去使用那些與任何通用程序設(shè)計(jì)語言之間都沒有清晰界面的程序生成器或者直接界面操作工具。
[10] 保存不同層次的抽象相互分離。
[11] 關(guān)注組件設(shè)計(jì)。
[12] 保證虛函數(shù)有定義良好的意義,每個(gè)覆蓋函數(shù)都實(shí)現(xiàn)預(yù)期行為
[13] 公用界面表示的是“是一個(gè)”關(guān)系。
[14] 成員表示的是“有一個(gè)”關(guān)系。
[15] 在表示簡(jiǎn)單包容時(shí)最好用直接成員,不用指向單獨(dú)分配的對(duì)象的指針。
[16] 設(shè)法保證使用依賴關(guān)系為易理解的,盡可能不出現(xiàn)循環(huán),而且最小。
[17] 對(duì)于所有的類,定義好不變式。
[18] 顯式地將前條件、后條件和其他斷言表述為斷言(可能使用Assert())。
[19] 定義的界面應(yīng)該只暴露初盡可能少的信息。
[20] 盡可能減少一個(gè)界面對(duì)其他界面的依賴性。
[21] 保持界面為強(qiáng)類型的。
[22] 利用應(yīng)用層的類型來表述界面。
[23] 將界面表述得使請(qǐng)求可以傳遞給遠(yuǎn)程得服務(wù)器。
[24] 避免肥大的界面。
[25] 盡可能地使用private 數(shù)據(jù)和成員函數(shù)。
[26] 用protected/private 區(qū)分開派生類的設(shè)計(jì)者與一般用戶間的不同需要。
[27] 使用模板去做通用型程序設(shè)計(jì)。
[28] 使用模板去做算法策略的參數(shù)化。
[29] 如果需要在編譯時(shí)做類型解析,情使用模板。
[30] 如果需要在運(yùn)行時(shí)做類型解析,請(qǐng)使用層次結(jié)構(gòu)。

Chapter TwentyFive:類的作用(類似于消息)
[1] 應(yīng)該對(duì)一個(gè)類的使用方式做出有意識(shí)的決策(作為設(shè)計(jì)師或者作為用戶)。
[2] 應(yīng)注意到涉及不同種類的類之間的權(quán)衡問題。
[3] 用具體類型去表示簡(jiǎn)單的獨(dú)立概念。
[4] 用具體類型去表示那些最佳效果及其關(guān)鍵的概念。
[5] 不要從具體類派生。
[6] 用抽象類去表示那些對(duì)象的表示可能變化的界面。
[7] 用抽象類去表示那些可能出現(xiàn)多種對(duì)象表示共存情況的界面。
[8] 用抽象類去表示現(xiàn)存類型的新界面。
[9] 當(dāng)類似概念共享許多實(shí)現(xiàn)細(xì)節(jié)時(shí),應(yīng)該使用結(jié)點(diǎn)類。
[10] 用結(jié)點(diǎn)類去逐步擴(kuò)充一個(gè)實(shí)現(xiàn)。
[11] 用運(yùn)行時(shí)類型識(shí)別從對(duì)象獲取界面。
[12] 用類去表示具有與之關(guān)聯(lián)的狀態(tài)信息的動(dòng)作。
[13] 用類去表示需要存儲(chǔ)、傳遞或者延遲執(zhí)行的動(dòng)作。
[14] 利用界面類去為某種新的用法而調(diào)整一個(gè)類(不修改這個(gè)類)。
[15] 利用界面類增加檢查。
[16] 利用句柄去避免直接使用指針和引用。
[17] 利用句柄去管理共享的表示。
[18] 在那些能預(yù)先定義控制結(jié)構(gòu)的應(yīng)用領(lǐng)域中使用應(yīng)用框架。

附錄B
[1] 要學(xué)習(xí)C++,應(yīng)該使用你可以得到的標(biāo)準(zhǔn)C++的最新的和完全的實(shí)現(xiàn)。
[2] C 和C++的公共子集并不是學(xué)習(xí)C++時(shí)最好的開始子集。
[3] 對(duì)于產(chǎn)品代碼,請(qǐng)記住并不是每個(gè)C++實(shí)現(xiàn)都是完全的最新的。在產(chǎn)品代碼中使用某個(gè)新特征之前應(yīng)先做試驗(yàn),寫一個(gè)小程序,測(cè)試你計(jì)劃使用的實(shí)現(xiàn)與標(biāo)準(zhǔn)的相符情況和性能。
[4] 避免被貶斥的特征,例如全局的static;還應(yīng)避免C 風(fēng)格的強(qiáng)制。
[5]"隱含的int"已禁止,因此請(qǐng)明確描述每個(gè)函數(shù)、變量、const 等的類型。
[6] 在將C 程序轉(zhuǎn)為C++程序時(shí),首先保證函數(shù)聲明(原型)和標(biāo)準(zhǔn)頭文件的一致使用。
[7] 在將C 程序轉(zhuǎn)為C++程序時(shí),對(duì)以C++關(guān)鍵字為名的變量重新命名。
[8] 在將C 程序轉(zhuǎn)為C++程序時(shí),將malloc()的結(jié)果強(qiáng)制到適當(dāng)類型,或者將malloc()的所有使用都改為new。
[9] 在將malloc()和free()轉(zhuǎn)為new 和delete 時(shí),請(qǐng)考慮用vector、push_back()和reserve()而不是realloc()。
[10] 在將C 程序轉(zhuǎn)為C++程序時(shí),記住這里沒有從int 到枚舉的隱式轉(zhuǎn)換;如果需要,請(qǐng)用顯式轉(zhuǎn)換。
[11] 在名字空間std 里定義的功能都定義在無后綴的頭文件里(例如,std::cout 聲明在里)。早些的實(shí)現(xiàn)將標(biāo)準(zhǔn)庫功能定義在全局空間里,聲明在帶.h 后綴的頭文件里(例如,std::cout聲明在里)。
[12] 如果老的代碼檢測(cè)new 的結(jié)果是否為0,那么必須將它修改為捕捉bad_alloc 或者使用new(nothrow)。
[13] 如果你用的實(shí)現(xiàn)不支持默認(rèn)模板參數(shù),請(qǐng)顯式提供參數(shù);用typedef 可以避免重復(fù)寫模板參數(shù)(類似于string 的typedef 使你無須寫basic_string, allocator >)。
[14] 用得到std::string(里保存的是C 風(fēng)格的串函數(shù))。
[15] 對(duì)每個(gè)標(biāo)準(zhǔn)C 頭文件,它將名字放入全局名字空間;與之對(duì)應(yīng)的頭文件將名字放入名字空間std。
[16] 許多系統(tǒng)有一個(gè)"String.h"頭文件里定義了一個(gè)串類型。注意,這個(gè)串類型與標(biāo)準(zhǔn)庫的string 不同。
[17] 盡可能使用標(biāo)準(zhǔn)庫功能,而不是非標(biāo)準(zhǔn)的功能。
[18] 在聲明C 函數(shù)時(shí)用extern "C"。

附錄C
[1] 應(yīng)
集中關(guān)注軟件開發(fā)而不是技術(shù)細(xì)節(jié)。
[2] 堅(jiān)持標(biāo)準(zhǔn)并不能保證可移植性。
[3] 避免無定義行為(包括專有的擴(kuò)充)。
[4] 將那些實(shí)現(xiàn)定義的行為局部化。
[5] 在沒有{、}、[、]、|或!的系統(tǒng)里用關(guān)鍵字和二聯(lián)符表示程序,在沒有\(zhòng)的地方用三聯(lián)符。
[6] 為了方便通信,用ASCII 字符去表示程序。
[7] 采用符號(hào)轉(zhuǎn)義字符比用數(shù)值表示字符更好些。
[8] 不要依賴于char 的有符號(hào)或者無符號(hào)性質(zhì)。
[9] 如果對(duì)整數(shù)文字量的類型感到有疑問,請(qǐng)使用后綴。
[10] 避免破壞值的隱式轉(zhuǎn)換。
[11] 用vector 比數(shù)組好。
[12] 避免union。
[13] 用位域表示外部確定的布局。
[14] 注意不同存儲(chǔ)管理風(fēng)格間的權(quán)衡。
[15] 不要污染全局名字空間。
[16] 在需要作用域(模塊)而不是類型的地方,用namespace 比class 更合適。
[17] 記住static 類成員需要定義。
[18] 用typename 消除對(duì)模板參數(shù)中類型成員的歧義性。
[19] 在需要用模板參數(shù)顯式限定之處,用template 消除模板類成員的歧義性。
[20] 寫模板定義時(shí),應(yīng)盡可能減少對(duì)實(shí)例化環(huán)境的依賴性。
[21] 如果模板實(shí)例化花的時(shí)間過長(zhǎng),請(qǐng)考慮顯式實(shí)例化。
[22] 如果需要編譯順序的顯式可預(yù)見性,請(qǐng)考慮顯式實(shí)例化。

附錄D
[1] 應(yīng)預(yù)期每個(gè)直接與人打交道的非平凡程序或者系統(tǒng)都會(huì)用在多個(gè)國(guó)家。
[2] 不要假定每個(gè)人使用的都是你所用的字符集。
[3] 最好是用locale 而不是寫實(shí)質(zhì)性代碼去做對(duì)文化敏感的I/O。
[4] 避免將現(xiàn)場(chǎng)名字字符串嵌入到程序正文里。
[5] 盡可能減少全局格式信息的使用。
[6] 最好是用與現(xiàn)場(chǎng)有關(guān)的字符串比較和排序。
[7] 保存facet 的不變性。
[8] 應(yīng)保證改變現(xiàn)場(chǎng)的情況只出現(xiàn)在程序里的幾個(gè)地方。
[9] 利用現(xiàn)場(chǎng)去管理刻面的生存期。
[10] 在寫對(duì)現(xiàn)場(chǎng)敏感的I/O 函數(shù)時(shí),記住去處理用戶(通過覆蓋)提供的函數(shù)所拋出的異常。
[11] 用簡(jiǎn)單的Money 類型保存貨幣值。
[12] 要做對(duì)現(xiàn)場(chǎng)敏感的I / O,最好是用簡(jiǎn)單的用戶定義類型保存所需的值(而不是從內(nèi)部類型的值強(qiáng)制轉(zhuǎn)換)。
[13] 在你對(duì)涉及到的所有因素有了很好的看法之前,不要相信計(jì)時(shí)結(jié)果。
[14] 當(dāng)心time_t 的取值范圍。
[15] 使用能接受多種輸入格式的日期輸入例程。
[16] 最好采用那些明顯表明了所用現(xiàn)場(chǎng)的字符分類函數(shù)。

附錄E
[1] 弄清楚你想要什么級(jí)別的異常時(shí)安全性。
[2] 異常時(shí)安全性應(yīng)該是整體容錯(cuò)策略的一部分。
[3] 為所有的類提供基本保證,也就是說,維持一個(gè)不變式,而且不流失資源。
[4] 在可能和可以負(fù)擔(dān)之處提供強(qiáng)保證,使操作或者成功,或者保持所有操作對(duì)象不變。
[5] 不要從析構(gòu)函數(shù)里拋出異常。
[6] 不要從一個(gè)遍歷合法序列的迭代器里拋出異常。
[7] 異常時(shí)安全性涉及到仔細(xì)檢查各個(gè)操作。
[8] 將模板設(shè)計(jì)為對(duì)異常透明的。
[9] 更應(yīng)該用申請(qǐng)資源的構(gòu)造函數(shù)方式,不要采用init()函數(shù)。
[10] 為類定義一個(gè)不變式,使什么是合法狀態(tài)變得非常清晰。
[11] 確保總將對(duì)象放在合法狀態(tài)中,也不要怕拋出異常。
[12] 保持不變式簡(jiǎn)單。
[13] 在拋出異常之前,讓所有操作對(duì)象都處于合法狀態(tài)。
[14] 避免資源流失。
[15] 直接表示資源。
[16] 記住swap()有時(shí)可以成為復(fù)制元素的替代方式。
[17] 在可能時(shí)依靠操作的順序,而不是顯式地使用try 塊。
[18] 在替代物已經(jīng)安全生成之前不銷毀"老"信息。
[19] 依靠"資源申請(qǐng)即初始化"技術(shù)。
[20] 確保關(guān)聯(lián)容器的比較操作能夠復(fù)制。
[21] 標(biāo)明關(guān)鍵性數(shù)據(jù)結(jié)構(gòu),并為它們定義能夠提供強(qiáng)保證的操作。

總結(jié)

以上是生活随笔為你收集整理的STL编程:C++的忠告!的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。