淺析C++的特殊工具與技術(shù)
一、優(yōu)化內(nèi)存
1、策略:預(yù)先分配用于創(chuàng)建對(duì)象的內(nèi)存,需要時(shí)在預(yù)先分配的內(nèi)存中構(gòu)造每人新對(duì)象。
2、allocator類(lèi);a.destroy(p),運(yùn)行T*指針p所指對(duì)象的析構(gòu)函數(shù)。注意,運(yùn)行析構(gòu)函數(shù)并不釋放對(duì)象所在的內(nèi)存,要想釋放內(nèi)存就要調(diào)用函數(shù)a.deallocate(p,n),釋放然為p的T*指針中包含的地址處保存T類(lèi)型的n個(gè)對(duì)象。
3、operator new函數(shù)與operator delete函數(shù);注意與new和delete表達(dá)式區(qū)別。operator new和operator delete是函數(shù),而new和delete是表達(dá)式。它們都返回void*指針而不是類(lèi)型化的指針。使用allocator比直接使用operator new和operator delete函數(shù)更為類(lèi)型安全。標(biāo)準(zhǔn)庫(kù)函數(shù)operator new和operator delete可以說(shuō)是allocator的allocate和deallocate成員的低級(jí)版本,它們分配但不初始化內(nèi)存。注意,調(diào)用operator delete函數(shù)不會(huì)運(yùn)行析構(gòu)函數(shù),它只釋放指定的內(nèi)存。
4、定位new表達(dá)式;定位new表達(dá)式在已分配的原始內(nèi)存中初始化一個(gè)對(duì)象,它與new的其他版本的不同之外在于,它不分配內(nèi)存。相反,它接受指向已分配但未構(gòu)造內(nèi)存的指針,并在該內(nèi)存中初始化一個(gè)對(duì)象。定位new表達(dá)式使我們能夠在特定的、預(yù)分配的內(nèi)存地址構(gòu)造一個(gè)新對(duì)象。表達(dá)式為new (place_address) type或new (place_address) type(initialzer-list),place_address必須是一個(gè)指針,initial-list是一個(gè)可為空的初始化列表,例如:new (sp)string(b,e)。定位new表達(dá)式初始化一個(gè)對(duì)象的時(shí)候,它可以使用任何構(gòu)造函數(shù),并直接建立對(duì)象。
5、創(chuàng)建新的對(duì)象的時(shí)候,可以在這個(gè)預(yù)先分配的空間構(gòu)造對(duì)象。釋放對(duì)象的時(shí)候,將它們放回預(yù)先分配對(duì)象的塊中,而不是將內(nèi)存真正返回給系統(tǒng)。所以可以通過(guò)定義(或繼承)自己的名為operator new和operator delete的成員,來(lái)管理自身類(lèi)型的內(nèi)存,否則,調(diào)用這些函數(shù)的標(biāo)準(zhǔn)庫(kù)版本。因?yàn)樵跇?gòu)造對(duì)象前要使用operator new在對(duì)象撤銷(xiāo)后使用operator delete所以,成員new和delete函數(shù)必須是靜態(tài)的。
二、運(yùn)行時(shí)類(lèi)型識(shí)別
1、通過(guò)運(yùn)行時(shí)類(lèi)型識(shí)別(RTTI),程序能夠使用基類(lèi)的指針或引用來(lái)檢索這些指針或引用所指對(duì)象的實(shí)際派生類(lèi)型。通過(guò)兩個(gè)操作符提供RTTI:
*typeid 操作符,返回指針或引用所指對(duì)象的實(shí)際類(lèi)型
*dynamic_cast操作符,將基類(lèi)類(lèi)型的指針或引用安全地轉(zhuǎn)換為派生類(lèi)型的指針或引用
2、dynamic_cast操作符;用法:dynamic_cast<Type */&>(val),Type是轉(zhuǎn)換的目標(biāo)類(lèi)型,val是基類(lèi)類(lèi)型的對(duì)象。
如,if(Derived *derivedPtr==dynamic_cast<Derived*>(basePtr){...}。
dynamic_cast操作符執(zhí)行的驗(yàn)證必須在運(yùn)行時(shí)進(jìn)行。如果轉(zhuǎn)換到指針類(lèi)型失敗,則dynamic_cast的結(jié)果為0;如果轉(zhuǎn)換到引用類(lèi)型的dynamic_cast失敗,則拋出一個(gè)bad_cast類(lèi)型的異常。
3、typeid操作符;表達(dá)式:typeid(e),e是任意表達(dá)式或者是類(lèi)型名。typeid操作符可以與任何類(lèi)型的表達(dá)式一起使用。typeid最常見(jiàn)的用途是比較兩個(gè)表達(dá)式的類(lèi)型,或者將表達(dá)式的類(lèi)型與特定類(lèi)型相比較。例如:if(typeif(*derivedPtr)==typeid(Derived);
三、類(lèi)成員的指針
1、聲明成員指針。成員指針只應(yīng)用于非static成員,static成員指針是普通指針。
2、定義數(shù)據(jù)成員的指針。既要表明成員的類(lèi)型,又要表明成員所屬的類(lèi)。
如string Screen::*,是指向Screen類(lèi)的string成員的指針。
3、定義成員函數(shù)的指針。
一致的匹配要求:
*函數(shù)形參的類(lèi)型和數(shù)目,包括成員是否為const
*返回類(lèi)型
*所屬類(lèi)的類(lèi)型
如:char (Screen::*)()const
4、使用類(lèi)成員的指針;
*成員指針解引用操作符(.*)從對(duì)象或引用獲取成員
*成員指針箭頭操作符(->*)通過(guò)對(duì)象的指針獲取成員
可以定義一個(gè)數(shù)組保存指向每個(gè)光標(biāo)移動(dòng)函數(shù)的指針。
更多內(nèi)容,見(jiàn)上篇:指向類(lèi)成員的指針并非指針?;騾⒖肌禖++必知必會(huì)》
四、嵌套類(lèi)
在一個(gè)類(lèi)內(nèi)部定義另一個(gè)類(lèi)。嵌套類(lèi)是獨(dú)立的類(lèi),基本上與它們的外圍類(lèi)不相關(guān),因此,外圍類(lèi)和嵌套類(lèi)是互相獨(dú)立的。外圍類(lèi)對(duì)嵌套類(lèi)的成員特殊訪(fǎng)問(wèn)權(quán),并且嵌套類(lèi)對(duì)其外圍類(lèi)的成員也沒(méi)有特殊訪(fǎng)問(wèn)權(quán)。嵌套類(lèi)的名字在其外圍類(lèi)的作用域中可見(jiàn),但在其他類(lèi)作用域或定義外圍類(lèi)的作用域中不可見(jiàn)。嵌套類(lèi)可以具有與非嵌套類(lèi)相同種類(lèi)的成員。
1、嵌套在類(lèi)模板內(nèi)部的類(lèi)是模板;
2、定義;在其類(lèi)外部定義的嵌套類(lèi)的成員,不能定義在外圍類(lèi)內(nèi)部,嵌套類(lèi)的成員不是外圍類(lèi)的成員。為了在外圍類(lèi)的外部定義類(lèi)體,必須用外圍類(lèi)的名字既定嵌套類(lèi)的名字。注意,我們?nèi)匀槐仨氃谕鈬?lèi)的定義體中聲明嵌套類(lèi)。嵌套類(lèi)中聲明的靜態(tài)成員的定義也放在外層作用域中。
3、嵌套類(lèi)型對(duì)象只包含嵌套類(lèi)型的成員,不能使用this獲取外圍類(lèi)的成員。外圍類(lèi)也不能直接調(diào)用嵌套類(lèi)中的成員。嵌套類(lèi)可以直接引用外圍類(lèi)的靜態(tài)成員、類(lèi)型名和枚舉成員。
五、聯(lián)合:節(jié)省空間的類(lèi);
1、一個(gè)union對(duì)象可以有多個(gè)數(shù)據(jù)成員,但在任何時(shí)刻,只有一個(gè)成員可以有值。
2、為union對(duì)象分配的存儲(chǔ)量至少與union的最大煩數(shù)據(jù)成員一樣大。
3、union不能作為基類(lèi)使用,成員能為虛函數(shù),也不能定義構(gòu)造函數(shù)、析構(gòu)函數(shù)或賦值操作符的類(lèi)類(lèi)型成員。
4、為了知道union對(duì)象中的值,通常會(huì)把一個(gè)枚舉型的變量作為union對(duì)象的判別式。
上一篇:C語(yǔ)言中函數(shù)聲明與調(diào)用問(wèn)題
欄 目:C語(yǔ)言
下一篇:C語(yǔ)言static修飾函數(shù)詳細(xì)解析
本文標(biāo)題:淺析C++的特殊工具與技術(shù)
本文地址:http://mengdiqiu.com.cn/a1/Cyuyan/4232.html
您可能感興趣的文章
- 04-02c語(yǔ)言的正則匹配函數(shù) c語(yǔ)言正則表達(dá)式函數(shù)庫(kù)
- 04-02c語(yǔ)言中對(duì)數(shù)函數(shù)的表達(dá)式 c語(yǔ)言中對(duì)數(shù)怎么表達(dá)
- 04-02c語(yǔ)言沒(méi)有round函數(shù) round c語(yǔ)言
- 04-02C語(yǔ)言中怎么打出三角函數(shù) c語(yǔ)言中怎么打出三角函數(shù)的值
- 01-10c語(yǔ)言求1+2+...+n的解決方法
- 01-10求子數(shù)組最大和的解決方法詳解
- 01-10深入理解約瑟夫環(huán)的數(shù)學(xué)優(yōu)化方法
- 01-10深入二叉樹(shù)兩個(gè)結(jié)點(diǎn)的最低共同父結(jié)點(diǎn)的詳解
- 01-10數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)- 解析最少換車(chē)次數(shù)的問(wèn)題詳解
- 01-10c語(yǔ)言 跳臺(tái)階問(wèn)題的解決方法


閱讀排行
- 1C語(yǔ)言 while語(yǔ)句的用法詳解
- 2java 實(shí)現(xiàn)簡(jiǎn)單圣誕樹(shù)的示例代碼(圣誕
- 3利用C語(yǔ)言實(shí)現(xiàn)“百馬百擔(dān)”問(wèn)題方法
- 4C語(yǔ)言中計(jì)算正弦的相關(guān)函數(shù)總結(jié)
- 5c語(yǔ)言計(jì)算三角形面積代碼
- 6什么是 WSH(腳本宿主)的詳細(xì)解釋
- 7C++ 中隨機(jī)函數(shù)random函數(shù)的使用方法
- 8正則表達(dá)式匹配各種特殊字符
- 9C語(yǔ)言十進(jìn)制轉(zhuǎn)二進(jìn)制代碼實(shí)例
- 10C語(yǔ)言查找數(shù)組里數(shù)字重復(fù)次數(shù)的方法
本欄相關(guān)
- 04-02c語(yǔ)言函數(shù)調(diào)用后清空內(nèi)存 c語(yǔ)言調(diào)用
- 04-02func函數(shù)+在C語(yǔ)言 func函數(shù)在c語(yǔ)言中
- 04-02c語(yǔ)言的正則匹配函數(shù) c語(yǔ)言正則表達(dá)
- 04-02c語(yǔ)言用函數(shù)寫(xiě)分段 用c語(yǔ)言表示分段
- 04-02c語(yǔ)言中對(duì)數(shù)函數(shù)的表達(dá)式 c語(yǔ)言中對(duì)
- 04-02c語(yǔ)言編寫(xiě)函數(shù)冒泡排序 c語(yǔ)言冒泡排
- 04-02c語(yǔ)言沒(méi)有round函數(shù) round c語(yǔ)言
- 04-02c語(yǔ)言分段函數(shù)怎么求 用c語(yǔ)言求分段
- 04-02C語(yǔ)言中怎么打出三角函數(shù) c語(yǔ)言中怎
- 04-02c語(yǔ)言調(diào)用函數(shù)求fibo C語(yǔ)言調(diào)用函數(shù)求
隨機(jī)閱讀
- 08-05dedecms(織夢(mèng))副欄目數(shù)量限制代碼修改
- 04-02jquery與jsp,用jquery
- 01-10使用C語(yǔ)言求解撲克牌的順子及n個(gè)骰子
- 01-10SublimeText編譯C開(kāi)發(fā)環(huán)境設(shè)置
- 08-05織夢(mèng)dedecms什么時(shí)候用欄目交叉功能?
- 01-10C#中split用法實(shí)例總結(jié)
- 01-10delphi制作wav文件的方法
- 01-11Mac OSX 打開(kāi)原生自帶讀寫(xiě)NTFS功能(圖文
- 08-05DEDE織夢(mèng)data目錄下的sessions文件夾有什
- 01-11ajax實(shí)現(xiàn)頁(yè)面的局部加載