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


閱讀排行
本欄相關
- 04-02c語言函數(shù)調用后清空內存 c語言調用
- 04-02func函數(shù)+在C語言 func函數(shù)在c語言中
- 04-02c語言的正則匹配函數(shù) c語言正則表達
- 04-02c語言用函數(shù)寫分段 用c語言表示分段
- 04-02c語言中對數(shù)函數(shù)的表達式 c語言中對
- 04-02c語言編寫函數(shù)冒泡排序 c語言冒泡排
- 04-02c語言沒有round函數(shù) round c語言
- 04-02c語言分段函數(shù)怎么求 用c語言求分段
- 04-02C語言中怎么打出三角函數(shù) c語言中怎
- 04-02c語言調用函數(shù)求fibo C語言調用函數(shù)求
隨機閱讀
- 08-05dedecms(織夢)副欄目數(shù)量限制代碼修改
- 04-02jquery與jsp,用jquery
- 01-10使用C語言求解撲克牌的順子及n個骰子
- 01-10SublimeText編譯C開發(fā)環(huán)境設置
- 08-05織夢dedecms什么時候用欄目交叉功能?
- 01-10C#中split用法實例總結
- 01-10delphi制作wav文件的方法
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
- 08-05DEDE織夢data目錄下的sessions文件夾有什
- 01-11ajax實現(xiàn)頁面的局部加載