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

歡迎訪問(wèn) 生活随笔!

生活随笔

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

c/c++

Effective C++ -- 零散知识点整理

發(fā)布時(shí)間:2025/3/21 c/c++ 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Effective C++ -- 零散知识点整理 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

Effective C++ --1讓自己習(xí)慣C++

Effective C++ --2構(gòu)造/析構(gòu)/賦值運(yùn)算

Effective C++ --3資源管理

Effective C++ --4設(shè)計(jì)與聲明

Effective C++ --5實(shí)現(xiàn)

Effective C++ -- 6繼承與面向?qū)ο笤O(shè)計(jì)

EffectiveC++ --7模板與泛型編程

Effective C++ --8 定制new和delete && 9雜談?dòng)懻?/strong>

?

下面整理的書(shū)中遇到的零碎知識(shí)點(diǎn):

?

1、符號(hào)表

在條款02中提到,參考http://bbscsdnnet/topics/330129162

英語(yǔ)為symbol?table?翻譯成"符號(hào)表"應(yīng)該好理解一些,針對(duì)計(jì)算機(jī)語(yǔ)言,在不同的地方,它的用處也不一樣。有詞法分析時(shí)分詞用的符號(hào)表。用來(lái)把所有用到的標(biāo)識(shí)符區(qū)分出來(lái)。也有做語(yǔ)法分析時(shí)用的語(yǔ)法元素的符號(hào)表。編譯成目標(biāo)文件時(shí),也會(huì)產(chǎn)生用于內(nèi)/外部符號(hào)定位/鏈接用的符號(hào)表。生成可執(zhí)行文件時(shí)也有類似的符號(hào)表。不論在什么地方,符號(hào)表的基本都可以看成一個(gè)名稱索引表,為了方便數(shù)據(jù)歸類查找用的。

?#define不會(huì)講宏放入記號(hào)表,這是為何?

symbol?table是動(dòng)態(tài)的。
比如你寫int?a?=?10,那分詞后會(huì)得到?int?a?=?10?;?這五個(gè)符號(hào)。這時(shí),分詞用的符號(hào)表里就只有這幾個(gè)符號(hào)及與之對(duì)應(yīng)的信息(比如類型,行號(hào),偏移,文件之類的)。在做語(yǔ)法分析的時(shí)候,會(huì)直接使用分詞的結(jié)果。一般就是分詞用的符號(hào)表中的編號(hào)。當(dāng)需要更多的符號(hào)信息的時(shí)候,就會(huì)從分詞符號(hào)表時(shí)查。
而像宏之類的東西,在編譯之前,會(huì)進(jìn)行預(yù)處理。它所用的符號(hào)在預(yù)處理時(shí)就處理過(guò)了,所以在具體的編譯時(shí),是沒(méi)有這些信息的。
實(shí)際上,預(yù)處理本身也是一次"編譯"的過(guò)程。在預(yù)處理的過(guò)程中也會(huì)有它自己的"符號(hào)表"

2the enum hack

在條款02中提到,當(dāng)編譯器不允許static整數(shù)型class常量完成in class初值設(shè)定時(shí)使用的策略,理論基礎(chǔ)是“一個(gè)屬于枚舉類型的數(shù)值可權(quán)充ints被使用”。

classd GamePlayer{private:enum{ NumTurns = 5 };intscores[NumTurns];};

3mutable

在條款03中提到。

mutable的中文意思是:“可變的、易變的”與constant(即C++ const)是反義詞。C++中的mutable是為了突破const限制而設(shè)置的,被mutable修飾的變量將永遠(yuǎn)處于可變狀態(tài),即使是位于const修飾的函數(shù)中。mutable又是一個(gè)奇怪的修飾符(specifier),它只能夠用于一個(gè)類的非靜態(tài)數(shù)據(jù)成員。

4、常量性轉(zhuǎn)除

在條款03中提到,這里利用此技術(shù)來(lái)實(shí)現(xiàn)由non-const成員函數(shù)轉(zhuǎn)換為調(diào)用const函數(shù)來(lái)避免代碼重復(fù)。用到了兩個(gè)轉(zhuǎn)型,一個(gè)轉(zhuǎn)型用static_cast來(lái)把non-const對(duì)象轉(zhuǎn)型為const對(duì)象,調(diào)用const成員函數(shù),第二個(gè)把const成員函數(shù)返回值const類型轉(zhuǎn)換為non-const類型。

const char& operator[](std::size_tposition) const{ //const成員函數(shù)returntext[position];}char& operator[](std::size_tposition){ //non-const成員函數(shù)returnconst_cast<char&>( //將返回值的const移出static_cast<constTextBlock&>(*this) //為*this加上const[position] //調(diào)用const成員函數(shù));}

5、堆和棧

一般動(dòng)態(tài)分配空間在堆,局部變量在棧。

堆:操作系統(tǒng)有一個(gè)記錄空閑內(nèi)存地址的鏈表,當(dāng)系統(tǒng)收到程序的申請(qǐng)時(shí),會(huì)遍歷該鏈表,尋找第一個(gè)空間大于所申請(qǐng)空間的堆結(jié)點(diǎn),然后將該結(jié)點(diǎn)從空閑結(jié)點(diǎn)鏈表中刪除,并將該結(jié)點(diǎn)的空間分配給程序,另外,對(duì)于大多數(shù)系統(tǒng),會(huì)在這塊內(nèi)存空間中的首地址處記錄本次分配的大小,這樣代碼 中的delete語(yǔ)句才能正確的釋放本內(nèi)存空間。我們常說(shuō)的內(nèi)存泄露,最常見(jiàn)的就是堆泄露(還有資源泄露),它是指程序在運(yùn)行中出現(xiàn)泄露,如果程序被關(guān)閉掉的話,操作系統(tǒng)會(huì)幫助釋放泄露的內(nèi)存。

棧:在函數(shù)調(diào)用時(shí)第一個(gè)進(jìn)棧的主函數(shù)中的下一條指令(函數(shù)調(diào)用語(yǔ)句的下一條可執(zhí)行語(yǔ)句)的地址然后是函數(shù) 的各個(gè)參數(shù),在大多數(shù)的C編譯器中,參數(shù)是由右往左入棧,然后是函數(shù)中的局部變量。

6、編譯單元

產(chǎn)出單一目標(biāo)文件的源碼。當(dāng)一個(gè)ccpp文件在編譯時(shí),預(yù)處理器首先遞歸包含頭文件,形成一個(gè)含有所有必要信息的單個(gè)源文件,這個(gè)源文件就是一個(gè)編譯單元。這個(gè)編譯單元會(huì)被編譯成為一個(gè)與cpp文件名同名的目標(biāo)文件(.o或是.obj)。連接程序把不同編譯單元中產(chǎn)生的符號(hào)聯(lián)系起來(lái),構(gòu)成一個(gè)可執(zhí)行程序。

7vptrvirtual table pointer

在條款07中提到。欲實(shí)現(xiàn)virtual函數(shù),對(duì)象必須攜帶某些信息,主要用來(lái)在運(yùn)行時(shí)決定哪一個(gè)virtual函數(shù)該被調(diào)用。Vptr指向一個(gè)由函數(shù)指針構(gòu)成的數(shù)組,稱為vtblvirtual table)。每一個(gè)帶有virtual函數(shù)的類都有一個(gè)相應(yīng)的vtbl。當(dāng)對(duì)象調(diào)用某個(gè)virtual函數(shù)時(shí),實(shí)際被調(diào)用的函數(shù)取決于該對(duì)象的vptr所指的那個(gè)vtbl—編譯器在其中尋找適當(dāng)?shù)暮瘮?shù)指針。

8TR1

在條款13中提到,在條款54中仔細(xì)介紹。

C++ TechnicalReport 1 (TR1)ISO/IEC TR 19768, C++ Library Extensions(函式庫(kù)擴(kuò)充)的一般名稱。TR1是一份文件,內(nèi)容提出了對(duì)C++標(biāo)準(zhǔn)函式庫(kù)的追加項(xiàng)目。這些追加項(xiàng)目包括了正則表達(dá)式、智能指針、哈希表、隨機(jī)數(shù)生成器等。TR1自己并非標(biāo)準(zhǔn),他是一份草稿文件。然而他所提出的項(xiàng)目很有可能成為下次的官方標(biāo)準(zhǔn)。這份文件的目標(biāo)在于「為擴(kuò)充的C++標(biāo)準(zhǔn)函式庫(kù)建立更為廣泛的現(xiàn)成實(shí)作品」。

C++ tr1是針對(duì)C++標(biāo)準(zhǔn)庫(kù)的第一次擴(kuò)展。即將到來(lái)的下一個(gè)版本的C++標(biāo)準(zhǔn)c++0x會(huì)包括它,以及一些語(yǔ)言本身的擴(kuò)充。tr1包括大家期待已久的smart pointer,正則表達(dá)式以及其他一些支持范型編程的東東。草案階段,新增的類和模板的名字空間是std::tr1

980-20經(jīng)驗(yàn)法則

平均而言一個(gè)程序往往將80%的執(zhí)行時(shí)間花費(fèi)在20%的代碼上。

這一法則提醒我們,要找出這可以有效增加程序整體效率的20%代碼,然后將它inline或竭盡所能地將它瘦身。

10、“mixin”風(fēng)格的基類

在條款49中提到。

mixin風(fēng)格的bases class,用以支持class專屬的set_new_handler。如何針對(duì)某個(gè)類別計(jì)數(shù)?通常的做法是:針對(duì)該類別設(shè)計(jì)一組static成員和函數(shù)。使用“mixin”風(fēng)格的基類,可以解決多個(gè)類需要多個(gè)static成員和函數(shù)的問(wèn)題。此類專為管理類型信息,或者說(shuō)專為管理static而存在,建立一個(gè)同一的包含static的基類,需要的類繼承此類。

mixin”風(fēng)格之基類應(yīng)具有如下特征:
1)是個(gè)模板類
2)模板參數(shù)不被使用(此參數(shù)只為生成相應(yīng)類別之static)
3)只有static成員和函數(shù)

11、“怪異的循環(huán)模板模式” (curiously recurring template patternCRTP)

在條款49中提到。

意圖:使用派生類作為模板參數(shù)特化基類。CRTP不是多態(tài),多態(tài)是動(dòng)態(tài)綁定,CRTP是靜態(tài)編譯期綁定。如果想在編譯期確定通過(guò)基類來(lái)得到派生類的行為,CRTP便是一種獨(dú)佳選擇,它是通過(guò)派生類覆蓋基類成員函數(shù)來(lái)實(shí)現(xiàn)靜態(tài)綁定的。

示例代碼:

class derived :public base<derived>{// attributes and behaviors}template <classDerived>struct base{void interface(){// 轉(zhuǎn)換為子類指針,編譯期將綁定至子類方法static_cast<Derived*>(this)->implementation();}static void static_interface(){// 編譯期將綁定至子類方法Derived::static_implementation();}// 下面兩個(gè)方法,默認(rèn)實(shí)現(xiàn)可以存在,或者應(yīng)該被繼承子類的相同方法覆蓋void implementation();static void static_implementation();};// The Curiously Recurring Template Pattern(CRTP)struct derived_1 : base<derived_1>{// 這里子類不實(shí)現(xiàn),將使用父類的默認(rèn)實(shí)現(xiàn)//void implementation();// 此方法將覆蓋父類的方法static void static_implementation();};struct derived_2 : base<derived_2>{// 此方法將覆蓋父類的方法void implementation();// 這里子類不實(shí)現(xiàn),將使用父類的默認(rèn)實(shí)現(xiàn)//static void static_implementation();};

英文鏈接:

http://en.wikibooks.org/wiki/More_C++_Idioms/Curiously_Recurring_Template_Pattern

12、派生類中定義基類的虛函數(shù)需要注意的事項(xiàng)

在條款53中介紹了一個(gè)派生類定義基類中虛函數(shù)少了const引發(fā)的問(wèn)題。

如果我們決定改寫基類所提供的虛擬函數(shù),那么派生類所提供的新定義,其函數(shù)型別必須完全符合基類所聲明的函數(shù)原型,包括:參數(shù)列、返回型別、常量性(const-ness)。當(dāng)派生類中參數(shù)列和返回類型有一個(gè)不一樣時(shí)編譯器會(huì)出錯(cuò),當(dāng)常量性改變時(shí),例如條款中將平派生類中少了const時(shí),會(huì)重新定義函數(shù),此時(shí)會(huì)造成當(dāng)調(diào)用const子類時(shí),只會(huì)調(diào)用基類的函數(shù),而不會(huì)調(diào)用子類的。

有一點(diǎn)需要注意:

“返回型別必須完全吻合” 這一規(guī)則有個(gè)例外:當(dāng)基類的虛擬函數(shù)返回某個(gè)基類形式(通常是pointer或reference)時(shí):派生類中的同名函數(shù)便可以返回該基類所派生出來(lái)的型別,例如:

class Base{ public:virtual Base * clone() const; };class Derived: Base { public:virtual Derived * clone() const; };

可以參考http://www.cnblogs.com/ziyoudefeng/archive/2012/03/20/2407659.html



總結(jié)

以上是生活随笔為你收集整理的Effective C++ -- 零散知识点整理的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

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