• <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>

            Robin Chow's C++ Blog

             

            [導(dǎo)入]Effective C++讀書筆記

            條款1:盡量用const和inline而不用#define
            1.為方便調(diào)試,最好使用常量。
            注意:常量定義一般放在頭文件中,可將指針和指針?biāo)傅念愋投级x成const,如const char * const authorName = “Scott Meyers”;
            類中常量通常定義為靜態(tài)成員, 而且需要先聲明后定義??梢栽诼暶鲿r(shí)或定義時(shí)賦值,也可使用借用enum的方法。如enum{Num = 5};
            2.#define語句造成的問題。
            如#define max(a, b) ((a) > (b) ? (a) : (b))
            在下面情況下:
            Int a= 5, b = 0;
            max(++ a, b);
            max(++ a, b + 10);
            max內(nèi)部發(fā)生些什么取決于它比較的是什么值。解決方法是使用inline函數(shù),可以使用template來產(chǎn)生一個(gè)函數(shù)集。

            條款2:盡量用而不用
            用>> 和<<使得編譯器自己可以根據(jù)不同的變量類型選擇操作符的不同形式,而采取的語法形式相同。

            條款3:盡量用new和delete而不用malloc和free
            使用malloc和free的時(shí)候不會(huì)自己調(diào)用構(gòu)造函數(shù)和析構(gòu)函數(shù),因此如果對(duì)象自己分配了內(nèi)存的話,那么這些內(nèi)存會(huì)全部丟失。另外,將new和malloc混用會(huì)導(dǎo)致不可預(yù)測(cè)的后果。

            條款4:盡量使用C++風(fēng)格的注釋
            C++的注釋可以在注釋里還有注釋,所以注釋掉一個(gè)代碼塊不用刪除這段代碼的注釋。C則不行。

            條款5:對(duì)應(yīng)的new和delete要采用相同的形式
            調(diào) 用new時(shí)用了[],調(diào)用delete時(shí)也要用 []。如果調(diào)用new時(shí)沒有用[],那調(diào)用delete時(shí)也不要用[]。對(duì)于typedef來說,用new創(chuàng)建了一個(gè)typedef定義的類型的對(duì)象后, delete時(shí)必須根據(jù)typedef定義的類型來刪除。因此,為了避免混亂,最好杜絕數(shù)組類型用typedef。

            條款6:析構(gòu)函數(shù)里對(duì)指針成員調(diào)用delete
            刪除空指針是安全的,因此在析構(gòu)函數(shù)里可以簡(jiǎn)單的delete類的指針成員,而不用擔(dān)心他們是否被new過。

            條款7:預(yù)先準(zhǔn)備好內(nèi)存不足的情況
            1.用try-cache來捕獲拋出的異常。
            2. 當(dāng)內(nèi)存分配請(qǐng)求不能滿足時(shí),調(diào)用預(yù)先指定的一個(gè)出錯(cuò)處理函數(shù)。這個(gè)方法基于一個(gè)常規(guī),即當(dāng)operator new不能滿足請(qǐng)求時(shí),會(huì)在拋出異常之前調(diào)用客戶指定的一個(gè)出錯(cuò)處理函數(shù)—一般稱之為new-handler函數(shù)。還可以創(chuàng)建一個(gè)混合風(fēng)格的基類—這種基 類允許子類繼承它某一特定的功能(即函數(shù))。

            條款8:寫operator new和operator delete時(shí)要遵循常規(guī)
            內(nèi)存分配程序支持new-handler函數(shù)并正確地處理了零內(nèi)存請(qǐng)求,并且內(nèi)存釋放程序處理了空指針。此外還必須要有正確的返回值。

            條款9:避免隱藏標(biāo)準(zhǔn)形式的new
            在 類里定義了一個(gè)稱為“operator new”的函數(shù)后,會(huì)不經(jīng)意地阻止了對(duì)標(biāo)準(zhǔn)new的訪問(到底如何隱藏的???)。一個(gè)辦法是在類里寫一個(gè)支持標(biāo)準(zhǔn)new調(diào)用方式的operator new,它和標(biāo)準(zhǔn)new做同樣的事,這可以用一個(gè)高效的內(nèi)聯(lián)函數(shù)來封裝實(shí)現(xiàn)。另一種方法是為每一個(gè)增加到operator new的參數(shù)提供缺省值。

            條款10:如果寫了operator new就要同時(shí)寫operator delete
            operator new和operator delete需要同時(shí)工作,如果寫了operator new,就一定要寫operator delete。對(duì)于為大量的小對(duì)象分配內(nèi)存的情況,可以考慮使用內(nèi)存池,以犧牲靈活性來換取高效率。

            條款11:為需要?jiǎng)討B(tài)分配內(nèi)存的類聲明一個(gè)拷貝構(gòu)造函數(shù)和一個(gè)賦值操作符
            如果沒有自定已拷貝構(gòu)造函數(shù)和賦值操作符,C++會(huì)生成并調(diào)用缺省的拷貝構(gòu)造函數(shù)和賦值操作符,它們對(duì)對(duì)象里的指針進(jìn)行逐位拷貝,這會(huì)導(dǎo)致內(nèi)存泄漏和指針重復(fù)刪除。因此,只要類里有指針時(shí),就要寫自己版本的拷貝構(gòu)造函數(shù)和賦值運(yùn)算符函數(shù)。

            條款12:盡量使用初始化而不要在構(gòu)造函數(shù)里賦值
            盡量使用成員初始化列表,一方面對(duì)于成員來說只需承擔(dān)一次拷貝構(gòu)造函數(shù)的代價(jià),而非構(gòu)造函數(shù)里賦值時(shí)的一次(缺省)構(gòu)造函數(shù)和一次賦值函數(shù)的代價(jià);另一方面const和引用成員只能被初始化而不能被賦值。

            條款13:初始化列表中的成員列出的順序和它們?cè)陬愔新暶鞯捻樞蛳嗤?br />類的成員是按照它們?cè)陬惱锉宦暶鞯捻樞蜻M(jìn)行初始化的,和它們?cè)诔蓡T初始化列表中列出的順序沒有關(guān)系。

            條款14:確定基類有虛析構(gòu)函數(shù)
            通過基類的指針去刪除派生類的對(duì)象,而基類有沒有虛析構(gòu)函數(shù)時(shí),結(jié)果將是不可確定的。因此必須將基類的析構(gòu)函數(shù)聲明為virtual。但是,無故的聲明虛析構(gòu)函數(shù)和永遠(yuǎn)不去聲明一樣是錯(cuò)誤的,聲明虛函數(shù)將影響效率。

            條款15:讓operator=返回*this的引用
            當(dāng) 定義自己的賦值運(yùn)算符時(shí),必須返回賦值運(yùn)算符左邊參數(shù)的引用,*this。如果不這樣做,就會(huì)導(dǎo)致不能連續(xù)賦值,或?qū)е抡{(diào)用時(shí)的隱式類型轉(zhuǎn)換不能進(jìn)行(隱 式類型轉(zhuǎn)換時(shí)要用到臨時(shí)對(duì)象,而臨時(shí)對(duì)象是const的),或兩種情況同時(shí)發(fā)生。對(duì)于沒有聲明相應(yīng)參數(shù)為const的函數(shù)來說,傳遞一個(gè)const對(duì)象是 非法的。

            條款16:在operator=中對(duì)所有數(shù)據(jù)成員賦值
            當(dāng)類里增加新的數(shù)據(jù)成員時(shí),要記住更新賦值運(yùn)算符函數(shù)。對(duì)基類的私有成員賦值時(shí),可以顯示調(diào)用基類的operator=函數(shù)。派生類的拷貝構(gòu)造函數(shù)中必須調(diào)用基類的拷貝構(gòu)造函數(shù)而不是缺省構(gòu)造函數(shù),否則基類的數(shù)據(jù)成員將不能初始化。

            條款17:在operator=中檢查給自己賦值的情況
            顯 示的自己給自己賦值不常見,但是程序中可能存在隱式的自我賦值:一個(gè)對(duì)象的兩個(gè)不同名字(引用)互相賦值。首先,如果檢查到自己給自己賦值就立即返回,可 以節(jié)省大量的工作;其次,一個(gè)賦值運(yùn)算符必須首先釋放掉一個(gè)對(duì)象的資源,然后根據(jù)新值分配新的資源,在自己給自己的情況下,釋放舊的資源將是災(zāi)難性的。

            條款18:爭(zhēng)取使類的接口完整并且最小
            必要的函數(shù)是拷貝構(gòu)造函數(shù),賦值運(yùn)算符函數(shù),然后在此基礎(chǔ)上選擇必要的、方便的函數(shù)功能進(jìn)行添加。

            條款19:分清成員函數(shù),非成員函數(shù)和友元函數(shù)
            ■虛函數(shù)必須是成員函數(shù)。如果f必須是虛函數(shù),就讓它稱為類c的成員函數(shù)。
            ■ioerator>>和operator<<決不能是成員函數(shù)。如果f是operator>>或operator<<,讓f稱為非成員函數(shù)。如果f還需要 訪問c的非公有成員,讓f稱為c的友元。
            ■其它情況下都聲明為成員函數(shù)。如果以上情況都不是,讓f稱為c的成員函數(shù)。
            Result = onehalf * 2;能通過編譯的原因:調(diào)用重載*操作符的成員函數(shù),對(duì)參數(shù)2進(jìn)行隱式類型轉(zhuǎn)換。
            Result = 2 * onehalf;不能通過編譯的原因:不能對(duì)成員函數(shù)所在對(duì)象(即成員函數(shù)中this指針指向的對(duì)象)進(jìn)行轉(zhuǎn)換。

            條款20:避免public接口出現(xiàn)數(shù)據(jù)成員
            訪問一致性,public接口里都是函數(shù)。
            精確的訪問控制,可以精確設(shè)置數(shù)據(jù)成員的讀寫權(quán)限。
            功能分離,可以用一段計(jì)算來取代一個(gè)數(shù)據(jù)成員。舉例:計(jì)算汽車行駛的平均速度。

            條款21:盡量使用const
            如果const出現(xiàn)在*號(hào)左邊,指針指向的數(shù)據(jù)為常量;如果const出現(xiàn)在*號(hào)右邊,則指針本身為常量;如果const在兩邊都出現(xiàn),二者都是常量。
            將operator的返回結(jié)果聲明為const,以防止對(duì)返回結(jié)果賦值,這樣不合常規(guī)。
            c+ +中的const:成員函數(shù)不修改對(duì)象中的任何數(shù)據(jù)成員時(shí),即不修改對(duì)象中的任何一個(gè)比特時(shí),這個(gè)成員函數(shù)才是const的。造成的問題是可以修改指針指 向的值,而且不能修改對(duì)象中的一些必要修改的值。解決方案是將必要修改的成員運(yùn)用mutable關(guān)鍵字。另一種方法是使用const_cast初始化一個(gè) 局部變量指針,使之指向this所指的同一個(gè)對(duì)象來間接實(shí)現(xiàn)。還有一種有用又安全的方法:在知道參數(shù)不會(huì)在函數(shù)內(nèi)部被修改的情況下,將一個(gè)const對(duì)象 傳遞到一個(gè)取非const參數(shù)的函數(shù)中。

            條款22:盡量用“傳引用”而不用“傳值”
            傳值將導(dǎo)致昂貴的對(duì)象開銷,而傳引用則非常高效。
            傳引用避免了“切割問題”,即當(dāng)一個(gè)派生類的對(duì)象作為基類對(duì)象被傳遞是,派生類的對(duì)象的作為派生類所具有的所有行為特性會(huì)被“切割”掉,從而變成了一個(gè)簡(jiǎn)單的基類對(duì)象。

            條款23:必須返回一個(gè)對(duì)象時(shí)不要試圖返回一個(gè)引用縮寫
            典型情況:操作符重載。
            常見的錯(cuò)誤:
            返回引用,返回的是局部對(duì)象的引用。
            堆中構(gòu)造,使用new分配內(nèi)存,但是無人負(fù)責(zé)delete的調(diào)用,從而造成內(nèi)存泄漏。
            返回靜態(tài)對(duì)象,導(dǎo)致調(diào)用同一函數(shù)比較時(shí)總是相等。
            正確的方法是直接在堆棧中創(chuàng)建對(duì)象并返回。

            條款24:在函數(shù)重載和設(shè)定參數(shù)缺省值間慎重選擇
            如果可以選擇一個(gè)合適的缺省參數(shù),否則就使用函數(shù)重載。
            有一些情況必須使用重載:函數(shù)的結(jié)果取決于傳入?yún)?shù)的個(gè)數(shù);需要完成一項(xiàng)特殊的任務(wù)。

            條款25:避免對(duì)指針和數(shù)字類型重載
            對(duì)于f(0):0代表int還是null。編譯器認(rèn)為是int,這和人們的想象不一樣。解決辦法是使用成員模板,構(gòu)造一個(gè)可以產(chǎn)生null指針對(duì)象的類。最重要的是,只要有可能,就要避免對(duì)一個(gè)數(shù)字和一個(gè)指針類型重載。

            條款26:當(dāng)心潛在二義性
            情形1:可以通過構(gòu)造函數(shù)和轉(zhuǎn)換運(yùn)算符產(chǎn)生另一個(gè)類的對(duì)象,這時(shí)編譯器將拒絕對(duì)其中的一種方法進(jìn)行選擇。
            情形2:f(int);f(char);對(duì)于f(double)時(shí)產(chǎn)生二義。
            情形3:多繼承時(shí),兩個(gè)基類有同名的成員。此時(shí)必須指定基類方可調(diào)用,而不考慮訪問控制權(quán)限和返回值。

            條款27:如果不想使用隱式生成的函數(shù)就要顯式地禁止它
            方法是聲明該函數(shù),并使之為private。顯式地聲明一個(gè)成員函數(shù),就防止了編譯器去自動(dòng)生成它的版本;使函數(shù)為private,就防止了別人去調(diào)用它。為了防止成員函數(shù)和友元函數(shù)的調(diào)用,只聲明而不定義這個(gè)函數(shù)。

            條款28:劃分全局名字空間
            使用名字空間,以防止不同庫的名字沖突。對(duì)于不支持名字空間的編譯器,可以使用struct來模擬名字空間,但是此時(shí)運(yùn)算符只能通過函數(shù)調(diào)用來使用。

            條款29:避免返回內(nèi)部數(shù)據(jù)的句柄
            對(duì)于const成員函數(shù)來說,返回句柄可能會(huì)破壞數(shù)據(jù)抽象。如果返回的不是指向const數(shù)據(jù)的句柄,數(shù)據(jù)可能被修改。對(duì)非const成員函數(shù)來說,返回句柄會(huì)帶來麻煩,特別是涉及到臨時(shí)對(duì)象時(shí)。句柄就象指針一樣,可以是懸浮的。

            條款30:避免這樣的成員函數(shù):其返回值是指向成員的非const指針或引用,但成員的訪問級(jí)比這個(gè)函數(shù)要低
            如果獲得了私有或保護(hù)成員(包括成員函數(shù))的地址(指針或引用),那么就可以象對(duì)待公有成員一樣進(jìn)行訪問。如果不得不返回其引用或指針,可以通過返回指向const對(duì)象的指針或引用來達(dá)到兩全其美的效果。

            條款31:千萬不要返回局部對(duì)象的引用,也不要返回函數(shù)內(nèi)部用new初始化的指針的引用
            如 果返回局部對(duì)象的引用,那個(gè)局部對(duì)象其實(shí)已經(jīng)在函數(shù)調(diào)用者使用它之前就被銷毀了。而返回廢棄指針的問題是必須要有人負(fù)責(zé)調(diào)用delete,而且對(duì)于 product=one*two*three*four;的情況,將產(chǎn)生內(nèi)存泄漏。因此,寫一個(gè)返回廢棄指針的函數(shù)無異于坐等內(nèi)存泄漏的來臨。

            條款32:盡可能地推遲變量的定義
            不 僅要強(qiáng)變量的定義推遲到必須使用它的時(shí)候,還要盡量推遲到可以為它提供一個(gè)初始化參數(shù)位置。這樣做,不僅可以避免對(duì)不必要的對(duì)象進(jìn)行構(gòu)造和析構(gòu),還可以避 免無意義的對(duì)缺省構(gòu)造函數(shù)的調(diào)用。而且,在對(duì)變量初始化的場(chǎng)合下,變量本身的用途不言自明,在這里定義變量有益于表明變量的含義。

            條款33:明智使用內(nèi)聯(lián)
            內(nèi)聯(lián)函數(shù)的本質(zhì)是將每個(gè)函數(shù)調(diào)用以它的代碼體來替換。
            大多數(shù)編譯器拒絕“復(fù)雜”的內(nèi)聯(lián)函數(shù)(例如,包含循環(huán)和遞歸的函數(shù));還有,即使是最簡(jiǎn)單的虛函數(shù)調(diào)用,編譯器的內(nèi)聯(lián)處理程序?qū)λ矏勰苤?br />若編譯器不進(jìn)行內(nèi)聯(lián),則將內(nèi)聯(lián)函數(shù)當(dāng)作一般的“外聯(lián)”函數(shù)來處理。這稱為“被外聯(lián)的內(nèi)聯(lián)”。
            找出重要的函數(shù),將它內(nèi)聯(lián)。同時(shí)要注意代碼膨脹帶來的問題,并監(jiān)視編譯器的警告信息,看看是否有內(nèi)聯(lián)函數(shù)沒有被編譯器內(nèi)聯(lián)。

            條款34:將文件間的編譯依賴性降至最低
            ■如果可以使用對(duì)象的引用和指針,就要避免使用對(duì)象本身。定義某個(gè)類型的引用和指針只會(huì)涉及到這個(gè)類型的聲明,定義此類型的對(duì)象則需要類型定義的參與。
            ■盡可能使用類的聲明,而不使用類的定義。因?yàn)樵诼暶饕粋€(gè)函數(shù)時(shí),如果用到某個(gè)類,是絕對(duì)不需要這個(gè)類的定義的,即使函數(shù)是通過傳值來傳遞和返回這個(gè)類。
            ■不要在頭文件中再包含其它頭文件,除非缺少了它們就不能編譯。相反,要一個(gè)一個(gè)地聲明所需要的類,讓使用這個(gè)頭文件的用戶自己去包含其它的頭文件。
            ■最后一點(diǎn),句柄類和協(xié)議類都不大會(huì)使用類聯(lián)函數(shù)。使用任何內(nèi)聯(lián)函數(shù)時(shí)都要訪問實(shí)現(xiàn)細(xì)節(jié),而設(shè)計(jì)句柄類和協(xié)議類的初衷正是為了避免這種情況。

            條款35:使公有繼承體現(xiàn)“是一個(gè)”的含義
            如果類D從類B公有繼承時(shí),類型D的每一個(gè)對(duì)象也是類型B的一個(gè)對(duì)象,但反之不成立。任何可以使用類型B的對(duì)象的地方,類型D的對(duì)象也可以使用。
            特別注意一般理解中的“是一個(gè)”,比如企鵝是鳥,并不嚴(yán)密。如果涉及到飛這個(gè)動(dòng)作,二者之間不適合使用公有繼承。

            條款36:區(qū)分接口繼承課實(shí)現(xiàn)繼承
            定義純虛函數(shù)的目的在于,使派生類僅僅只是繼承函數(shù)的接口。也可以為純虛函數(shù)提供一種缺省實(shí)現(xiàn)。
            聲明簡(jiǎn)單虛函數(shù)的目的在于,使派生類繼承函數(shù)的接口和缺省實(shí)現(xiàn)。
            聲明非虛函數(shù)的目的在于,使派生類繼承函數(shù)的接口和強(qiáng)制性實(shí)現(xiàn)。

            條款37:絕不要重新定義繼承而來的非虛函數(shù)
            如果重新定義繼承而來的非虛函數(shù),將導(dǎo)致對(duì)象對(duì)函數(shù)的調(diào)用結(jié)果由指向其的指針決定,而不是由對(duì)象本身的類型來決定。另外,也是類的設(shè)計(jì)產(chǎn)生矛盾,因?yàn)楣欣^承的含義是“是一個(gè)”,改變繼承而來的方法顯然是不合理的。

            條款38:絕不要重新定義繼承而來的缺省參數(shù)值
            虛函數(shù)動(dòng)態(tài)綁定,而缺省參數(shù)是靜態(tài)綁定。因此重新定義繼承而來的缺省參數(shù)值可能造成調(diào)用的是定義在派生類,但使用了基類中缺省參數(shù)值的虛函數(shù)。

            條款39:避免“向下轉(zhuǎn)換”繼承層次
            采用向下轉(zhuǎn)換時(shí),將不利于對(duì)代碼進(jìn)行維護(hù),可以采用虛函數(shù)的方法來解決。
            不得不進(jìn)行向下轉(zhuǎn)換時(shí),采用安全的向下轉(zhuǎn)換:dynamic_cast運(yùn)算符。dynamic_cast運(yùn)算符先嘗試轉(zhuǎn)換,若轉(zhuǎn)換成功就返回新類型的合法指針,若失敗則返回空指針。

            條款40:通過分層來體現(xiàn)“有一個(gè)”或“用...來實(shí)現(xiàn)”
            公有繼承的含義是“是一個(gè)”。對(duì)應(yīng)地,分層的含義是“有一個(gè)”或“用...來實(shí)現(xiàn)”。例如,要實(shí)現(xiàn)set類,因?yàn)閘ist中可以包含重復(fù)元素,因此set不是一個(gè)list。set可以用list來實(shí)現(xiàn),即在set中包含一個(gè)list。

            條款41:區(qū)分繼承和模板
            當(dāng)對(duì)象的類型不影響類中函數(shù)的行為時(shí),就要使用模板來生成這樣一組類。
            當(dāng)對(duì)象的類型影響類中函數(shù)的行為時(shí),就要使用繼承來得到這樣一組類。

            條款42:明智地使用私有繼承
            關(guān)于私有繼承的兩個(gè)規(guī)則:和公有繼承相反,如果兩個(gè)類之間的繼承關(guān)系為私有,編譯器一般 不會(huì)將派生類對(duì)象轉(zhuǎn)換為基類對(duì)象;從私有基類繼承而來的成員都稱為了派生類的私有成員,即使它們?cè)诨愔惺潜Wo(hù)或公有成員。
            私有繼承意味這“用...”來實(shí)現(xiàn),但是應(yīng)盡可能使用分層,必須時(shí)才使用私有繼承。
            條款43:明智地使用多繼承
            多 繼承后果:二義性,如果一個(gè)派生類從多個(gè)基類繼承了一個(gè)成員名,所有對(duì)這個(gè)名字的訪問都是二義的,你必須明確說出你所指的是哪個(gè)成員。這可能導(dǎo)致虛函數(shù)的 失效,并且不能對(duì)多繼承而來的幾個(gè)相同名稱虛函數(shù)同時(shí)進(jìn)行重定義。鉆石型繼承,此時(shí)向虛基類傳遞構(gòu)造函數(shù)參數(shù)時(shí)要在繼承結(jié)構(gòu)中最底層派生類的成員初始化列 表中指定。同時(shí)還要仔細(xì)想想虛函數(shù)的優(yōu)先度。
            然而在適當(dāng)時(shí)候還是可以使用多繼承,例如將接口的公有繼承和實(shí)現(xiàn)的私有繼承結(jié)合起來的情況。
            以增加中間類的代價(jià)來消除多繼承有時(shí)侯是值得的。一般應(yīng)該避免使用多繼承以減少繼承結(jié)構(gòu)的復(fù)雜性。

            條款44:說你想說的,理解你所說的
            理解不同的面向?qū)ο髽?gòu)件在C++中的含義:
            · 共同的基類意味著共同的特性。
            · 公有繼承意味著 "是一個(gè)"。
            · 私有繼承意味著 "用...來實(shí)現(xiàn)"。
            · 分層意味著 "有一個(gè)" 或 "用...來實(shí)現(xiàn)"。
            下面的對(duì)應(yīng)關(guān)系只適用于公有繼承的情況:
            · 純虛函數(shù)意味著僅僅繼承函數(shù)的接口。
            · 簡(jiǎn)單虛函數(shù)意味著繼承函數(shù)的接口加上一個(gè)缺省實(shí)現(xiàn)。
            · 非虛函數(shù)意味著繼承函數(shù)的接口加上一個(gè)強(qiáng)制實(shí)現(xiàn)。

            條款45:弄清C++在幕后為你所寫、所調(diào)用的函數(shù)
            如 果沒有聲明下列函數(shù),編譯器會(huì)聲明它自己的版本:一個(gè)拷貝構(gòu)造函數(shù),一個(gè)賦值運(yùn)算符,一個(gè)析構(gòu)函數(shù),一對(duì)取址運(yùn)算符和一個(gè)缺省構(gòu)造函數(shù)。對(duì)于拷貝構(gòu)造函數(shù) 和賦值運(yùn)算符,官方的規(guī)則是:缺省拷貝構(gòu)造函數(shù)(賦值運(yùn)算符)對(duì)類的非靜態(tài)數(shù)據(jù)成員進(jìn)行“以成員為單位的”逐一拷貝構(gòu)造(賦值)。
            特別要注意由于編譯器自動(dòng)生成的函數(shù)造成的編譯錯(cuò)誤。

            條款46:寧可編譯和鏈接是出錯(cuò),也不要運(yùn)行時(shí)出錯(cuò)
            通常,對(duì)設(shè)計(jì)做一點(diǎn)小小的改動(dòng),就可以在編譯期間消除可能產(chǎn)生的運(yùn)行時(shí)錯(cuò)誤。這常常涉及到在程序中增加新的數(shù)據(jù)類型。例如對(duì)于需要類型檢查的Month,可以將其設(shè)為一個(gè)Month類:構(gòu)造函數(shù)私有,產(chǎn)生對(duì)象使用靜態(tài)成員函數(shù),每個(gè)Month對(duì)象為const。

            條款47:確保非局部靜態(tài)對(duì)象在使用前被初始化
            如果在某個(gè)被編譯單元中,一個(gè)對(duì)象的初始化要依賴于另一個(gè)被編譯單元中的另一個(gè)對(duì)象的值,并且這第二個(gè)對(duì)象本身也需要初始化,就有可能造成混亂。
            雖 然關(guān)于 "非局部" 靜態(tài)對(duì)象什么時(shí)候被初始化,C++幾乎沒有做過說明;但對(duì)于函數(shù)中的靜態(tài)對(duì)象(即,"局部" 靜態(tài)對(duì)象)什么時(shí)候被初始化,C++卻明確指出:它們?cè)诤瘮?shù)調(diào)用過程中初次碰到對(duì)象的定義時(shí)被初始化。如果不對(duì)非局部靜態(tài)對(duì)象直接訪問,而用返回局部靜態(tài) 對(duì)象引用的函數(shù)調(diào)用來代替,就能保證從函數(shù)得到的引用指向的是被初始化了的對(duì)象。

            條款48:重視編譯器警告
            重視編譯器產(chǎn)生的每一條警告信息。在忽略一個(gè)警告之前,一定要準(zhǔn)確理解它想告訴你的含義。

            條款49:熟悉標(biāo)準(zhǔn)庫
            對(duì) 于C++頭文件,最大的挑戰(zhàn)是把字符串頭文件理清楚:是舊的C頭文件,對(duì)應(yīng)的是基于char*的字符串處理函數(shù); 是包裝了std的C++頭文件,對(duì)應(yīng)的是新的string類(看下文);是對(duì)應(yīng)于舊C頭文件 的std版本。如果能掌握這些,其余的也就容易了。
            庫中的一切都是模板。

            條款50:提高對(duì)C++的認(rèn)識(shí)
            C++的設(shè)計(jì)目標(biāo):和C兼容,效率,和傳統(tǒng)開發(fā)工具及環(huán)境的兼容性,解決真實(shí)問題的可應(yīng)用性。
            參考C++標(biāo)準(zhǔn),理解C++的設(shè)計(jì)過程。
            文章來源:http://my.donews.com/robinchow/2007/01/10/ofzrlddyftbhlvscqmkjicnypymamyhaehrq/

            posted on 2007-10-23 21:01 Robin Chow 閱讀(152) 評(píng)論(0)  編輯 收藏 引用


            只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


            導(dǎo)航

            統(tǒng)計(jì)

            常用鏈接

            留言簿(1)

            隨筆分類

            隨筆檔案

            搜索

            最新評(píng)論

            閱讀排行榜

            評(píng)論排行榜

            国产香蕉久久精品综合网| 久久精品国内一区二区三区| 狠狠色综合网站久久久久久久| 亚洲狠狠久久综合一区77777 | 久久男人AV资源网站| 美女久久久久久| 中文国产成人精品久久不卡| 97久久精品人妻人人搡人人玩| 国产毛片久久久久久国产毛片| 99久久精品国产综合一区| 亚洲精品久久久www| 久久精品国产亚洲AV嫖农村妇女| 精品久久久久中文字| 久久精品aⅴ无码中文字字幕不卡| 久久线看观看精品香蕉国产| 久久久久久国产a免费观看黄色大片 | 国产精品久久久久aaaa| 日本久久中文字幕| 精品国产91久久久久久久| 国产69精品久久久久APP下载| 91超碰碰碰碰久久久久久综合| 久久九九精品99国产精品| 中文成人久久久久影院免费观看| 欧美777精品久久久久网| 无码人妻久久久一区二区三区| 中文精品99久久国产 | 久久久久久九九99精品| 久久亚洲国产最新网站| 久久97久久97精品免视看| 欧美亚洲另类久久综合| 69国产成人综合久久精品| 麻豆成人久久精品二区三区免费 | 亚洲国产成人久久综合一区77 | 性做久久久久久久久老女人| 国产精品美女久久久网AV| 国产99久久九九精品无码| 久久午夜电影网| 久久久久97国产精华液好用吗| 久久久精品波多野结衣| 久久国产成人亚洲精品影院| 精品久久人人爽天天玩人人妻|