特殊工具與技術
一、最佳化記憶體
1、策略:預先分配用於建立對象的記憶體,需要時在預先分配的記憶體中構造每人新對象。
2、allocator類;a.destroy(p),運行T*指標p所指對象的解構函式。注意,運行解構函式並不釋放對象所在的記憶體,要想釋放記憶體就要調用函數a.deallocate(p,n),釋放然為p的T*指標中包含的地址處儲存T類型的n個對象。
3、operator new函數與operator delete函數;注意與new和delete運算式區別。operator new和operator delete是函數,而new和delete是運算式。它們都返回void*指標而不是類型化的指標。使用allocator比直接使用operator new和operator delete函數更為型別安全。標準庫函數operator new和operator delete可以說是allocator的allocate和deallocate成員的低級版本,它們分配但不初始化記憶體。注意,調用operator
delete函數不會運行解構函式,它只釋放指定的記憶體。
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運算式初始化一個對象的時候,它可以使用任何建構函式,並直接建立對象。
5、建立新的對象的時候,可以在這個預先分配的空間構造對象。釋放對象的時候,將它們放回預先指派至的塊中,而不是將記憶體真正返回給系統。所以可以通過定義(或繼承)自己的名為operator new和operator delete的成員,來管理自身類型的記憶體,否則,調用這些函數的標準庫版本。因為在構造對象前要使用operator new在對象撤銷後使用operator delete所以,成員new和delete函數必須是靜態。
二、運行時類型識別 1、通過運行時類型識別(RTTI),程式能夠使用基類的指標或引用來檢索這些指標或引用所指對象的實際衍生類別型。通過兩個操作符提供RTTI:*typeid 操作符,返回指標或引用所指對象的實際類型*dynamic_cast操作符,將基類類型的指標或引用安全地轉換為衍生類別型的指標或引用
2、dynamic_cast操作符;用法:dynamic_cast<Type */&>(val),Type是轉換的目標類型,val是基類類型的對象。如,if(Derived *derivedPtr==dynamic_cast<Derived*>(basePtr){...}。
dynamic_cast操作符執行的驗證必須在運行時進行。如果轉換到指標類型失敗,則dynamic_cast的結果為0;如果轉換到參考型別的dynamic_cast失敗,則拋出一個bad_cast類型的異常。
3、typeid操作符;運算式:typeid(e),e是任意運算式或者是類型名。typeid操作符可以與任何類型的運算式一起使用。typeid最常見的用途是比較兩個運算式的類型,或者將運算式的類型與特定類型相比較。例如:if(typeif(*derivedPtr)==typeid(Derived);
三、類成員的指標 1、聲明成員指標。成員指標只應用於非static成員,static成員指標是普通指標。
2、定義資料成員的指標。既要表明成員的類型,又要表明成員所屬的類。如string Screen::*,是指向Screen類的string成員的指標。
3、定義成員函數的指標。一致的匹配要求:*函數形參的類型和數目,包括成員是否為const*傳回型別*所屬類的類型如:char (Screen::*)()const
4、使用類成員的指標;*成員指標解引用操作符(.*)從對象或引用擷取成員*成員指標箭頭操作符(->*)通過對象的指標擷取成員 可以定義一個數組儲存指向每個游標移動函數的指標。
更多內容,見上篇:指向類成員的指標並非指標。或參考《C++必知必會》
四、嵌套類 在一個類內部定義另一個類。嵌套類是獨立的類,基本上與它們的外圍類不相關,因此,外圍類和嵌套類是互相獨立的。外圍類對嵌套類的成員特殊訪問權,並且嵌套類對其外圍類的成員也沒有特殊訪問權。嵌套類的名字在其外圍類的範圍中可見,但在其他類範圍或定義外圍類的範圍中不可見。嵌套類可以具有與非嵌套類相同種類的成員。
1、嵌套在類模板內部的類是模板;
2、定義;在其類外部定義的嵌套類的成員,不能定義在外圍類內部,嵌套類的成員不是外圍類的成員。為了在外圍類的外部定義類體,必須用外圍類的名字既定嵌套類的名字。注意,我們仍然必須在外圍類的定義體中聲明嵌套類。嵌套類中聲明的靜態成員的定義也放在外層範圍中。
3、巢狀型別對象只包含巢狀型別的成員,不能使用this擷取外圍類的成員。外圍類也不能直接調用嵌套類中的成員。嵌套類可以直接引用外圍類的靜態成員、類型名和枚舉成員。
五、聯合:節省空間的類; 1、一個union對象可以有多個資料成員,但在任何時刻,只有一個成員可以有值。
2、為union對象分配的儲存量至少與union的最大煩資料成員一樣大。
3、union不能作為基類使用,成員能為虛函數,也不能定義建構函式、解構函式或賦值操作符的類類型成員。
4、為了知道union對象中的值,通常會把一個枚舉型的變數作為union對象的判別式。