原文出自:http://discussion.forum.nokia.com/forum/showthread.php?t=68969
譯自Developer Library » Symbian OS Guide » Essential idioms » Class types
概要
Symbian OS上的應用程式使用4種常用的類,它們是:
以T開頭的值類,這種類不擁有任何外部對象,只是通過指標直接引用或通過控制代碼間接引用外部對象。
以C開頭的基於堆分配的類,這種類全部是從CBase派生過來的。
以R開頭的資源類,R類對象包含其它位置擁有資源的控制代碼。
以M開頭的介面類,這種類定義了介面但需要衍生類別實現。
這些類與清除機制的需求相關,具體細節請參考SDK(Developer Library » Symbian OS Guide » C++ API guide » Base » Memory Management » Using Cleanup Support » Cleanup Stack Basics » Cleanup requirements)。
實值型別:T類
最基本的類是實值型別,它們的名字以T開頭。
T類包含有它們的值,但這它們不擁有任何外部對象,只是通過指標直接引用或通過控制代碼間接引用外部對象。
T類可以在棧上分配(C++自動變數),也可以是其它類的成員。
T類的基本特徵將在下面講述。
建構函式:
許多T類非常簡單以至於根本不需要建構函式,那些包含有建構函式的,是通過建構函式初始化成員資料。
拷貝建構函式和賦值運算子:
拷貝建構函式(TX(const TX&))和賦值操作符(TX& operator=(const TX&))很少需要,這是因為拷貝是淺拷貝,T類幾乎都是按成員進行拷貝。C++編譯器會產生預設的拷貝建構函式和賦值操作符。
當T類是有一個整數參數的模板類時會需要這兩個函數,這種情況下,拷貝或賦值TX<32>到TX<40> 比按位拷貝要複雜一些,因此需要明確實現拷貝建構函式和賦值操作符。
解構函式:
T類不需要解構函式,因為當T類生命週期結束後沒有需要清除的外部資源。
消毀
T類可以安全的在棧上消毀,消毀意味著不用通過解構函式就可以釋放記憶體。因為T類自己不擁有外部資源,所以當T類對象被消毀時不會有外部資源變的不可訪問。
函數參數
做為函數參數時T類可以通過值和引用進行傳遞。
資料成員
T類可以包含其它T類對象,另外,可以包含R類對象或C類對象的指標,包含的這些對象是通過另一個類或函數進行清除的,在實踐中,很少用這種方法。
標準類層次:C類和CBase類
使用最多的類除了T類還有C類,C類是直接或間接從CBase類派生出來的。
從CBase派生的類有下面的特性:
它們總是在堆上而不是棧上建立,並且不做為其它類的成員。
分配程式會把類層次中的成員資料初按二進位0初始化。
它們通過指標或引用傳遞,並且不需要拷貝建構函式和重載賦值運算子,除非確定某個類確實需要支援拷貝操作。
它們不用通常的構造方法,因為在通常的構造過程中可能會有leave發生,習慣上通過一個二階段構造(two-phase construction)來實現,C++中的建構函式只負責那些不會產生leave的構造,然後在一個名為ConstructL()的函數中處理那些可能會產生leave的構造。
它們有一個虛解構函式,它被用來進行標準的清除過程。
因為有一個虛解構函式,C類對象可以很簡單的使用清除(cleanup stack)進行清除;另外,因為C類對象是在堆(heap)上分配的,當有leave發生時,它們必需要被清除:這要求在處理所有C類對象時必須要有清除的意識。
C類的具體要求請查看SDK文檔(Developer Library » Symbian OS Guide » C++ API guide » Base » Memory Management » Using Cleanup Support » Two Phase Construction)。
資源類型:R類
R 類是其它地方對象的代理,這樣做有兩個主要的動機:
直正的對象是一個server擁有的,在不同的線程或地址空間。
真正的對象對client來說必須是隱藏的。
下面是R類對象的關鍵特徵:
它們含有一個用來傳遞請求到另一個對象的控制代碼。
R類通常用名為“open”的函數開啟,用名為“close”的函數關閉。一個R類對象開啟後必須被關閉。通常如果開啟資源的線程關閉後與R類對象關聯的資源被自動關閉。
它們可以直接按位拷貝。
它們沒有建構函式,解構函式,拷貝建構函式或重載賦值運算子。
R類使用許多協議來處理這些需求:
R類間的控制代碼特徵可能是不同的。
R類沒有共用基類。
初始化函數可能有許多名字:可能是Open(), Create(), Allocate()等等。
終止函數可能有許多名字:可能是Close(), Destroy(), Free()等等。
因為R類擁有外部對象,在清除時就有一些要求:這些要求根據不同的類有不同的處理方法。
介面類型:M類
M類定義抽象協議或介面,具體的實現由衍生類別提供。
M類有下面的限制:
它們不可以有資料成員。
l 它們不可以有建構函式、解構函式,或者重載的操作符,比如‘=’。
M類常常包含定義完全抽象介面的純虛函數。一些M類在上面的限制內實現一些或全部的成員函數。
M類是Symbian OS中唯一使用多重繼承的方法。更多細節請查看SDK文檔(» Developer Library » Symbian OS Guide » Essential idioms » Multiple inheritance and interfaces)。