類模板與模板類
為什麼要引入類模板:類模板是對一批僅僅成員資料型別不同的類的抽象,程式設計師只要為這一批類所組成的整個類家族建立乙個類模板,給出一套程式**,就可以用來生成多種具體的類,(這類可以看作是類模板的例項),從而大大提高程式設計的效率。
注意:1、類模板是引數化的類,即用於實現資料型別引數化的類。
2、應用類模板可以使類中的資料成員、成員函式的引數及成員函式的返回值,能根據模板引數匹配情況取任意資料型別
語法://類模板的定義
template 《型別形參表》
class 類名
;
//類外成員函式的定義
template 《型別形參表》 //不要漏了啊。
返回值型別 類模板名《型別名錶》::成員函式名(參數列)
類模板的例項化:
類模板名 《實際型別》 物件名(實參表);
具體的使用過程:
當類模板建立物件時,根據使用者給出的實際型別,系統將類模板中的模板引數置換為確定的引數型別,生成乙個具體的類(模板類),
有物件之後,和普通類的物件使用方法相同。
注意:1、模板類的成員函式必須是函式模板
2、類模板中的成員函式的定義,若放在類模板中,則與普通類的成員函式的定義方法相同;若在類模板之外定義,則成員函式的定義格式如上
書寫**時要注意 類模板和普通類的**區別:
1、針對類整體而言,在類定義前必須有模板宣告
2、針對類外定義的成員函式(每個函式都有)而言,定義時必須要冒(模板宣告) + 在函式名前、類後必須加
3、針對類的物件而言,在建立物件時,必須在類名和物件之間要寫實際型別《實際型別》
模板類的形參表:template 《型別形參表》
模板形參表類似函式形參表,由型別、非型別和模板三部分組成。
型別形參:代表所有的資料型別-所有的均可代表(類型別+預定義型別)
格式:由 關鍵字class或typename + 名字 組成
例如:template ,其中t和d都是乙個型別形參,名字可以有自己定義
用途:這三種形參作用一樣,均可以模板型別形參可作為型別說明符用在模板中的任何地方,即可以用於指定反回型別,變數宣告等。
說明:這裡的class表示一類型別,t是在例項化時確定,它的替代可以是任何型別,即類型別,預定義資料型別,比較通用
非型別形參=內建型別形參:代表具體的一類(c++的標準資料型別的一種,如整型)
格式:由 標準資料型別 + 名字 組成
例如:template ,其中a和b都是非型別形參 或 如template,t為型別引數,a為非型別引數
引數有三種情況:
1、整型或列舉型別
2、指標型別(包含普通物件的指標型別、函式指標型別、指向成員的指標型別)
3、引用型別(指向物件或指向函式的引用都是允許的)
有些常值不能作為有效的非型別實參,包括:
1、空指標常量
2、浮點型值
3、字串
說明:1、非型別形參在模板定義的內部是常量值,也就是說非型別形參在模板的內部是常量,或者說只能是右值,它們不能被取址,也不能被賦值
2、呼叫非型別模板形參的實參必須是乙個常量表示式,或者是乙個數,即它必須能在編譯時計算出結果。
舉例:
template class a
;aa; //正確
int b;
aa; //錯誤,b不是常量
const int c;
aa; //正確,c是常量
非型別模板形參還可以使用預設值
template class a
;aa;//使用預設值,設定長度100
aa;//不使用預設值長度設定200
說明:
非型別模板形參的形參和實參間所允許的轉換 《引用黃邦勇帥的總結。>
1、允許從陣列到指標,從函式到指標的轉換。如:template class a{}; int b[1]; am;即陣列到指標的轉換
2、const修飾符的轉換。如:templateclass a{}; int b; a<&b> m; 即從int *到const int *的轉換。
3、提公升轉換。如:templateclass a{}; const short b=2; am; 即從short到int的提公升轉換
4、整值轉換。如:templateclass a{}; a<3> m; 即從int到unsigned int的轉換。
5、常規轉換。
模板形參:乙個模板作為另乙個模板的引數
格式:
template class d>
class e
說明:
1、templateclass d 是乙個模板。
2、定義乙個模板e,其中有兩個型別引數a和b,乙個模板引數d。注意c有時候可以省略不寫
模板引數使用說明:
1、首先要定義乙個模板:用來例項化模板e的物件。
2、a和b可以是任意型別;但是d可以是程式設計師自己定義的,也可以是stl中的標準模板庫
**:
//首先定義乙個普通的模板
templateclass array
;//定義乙個模板container,引數列表:乙個型別為t,另乙個模板型別seq
templateclass seq>//這裡seq前面的<>沒有寫引數名字
class container
;注意:注意seq模板的宣告並沒有帶模板引數的名字,因為這裡我們不會用到這個引數,所以可以省略不寫.
例項化:
containercontainer;
說明:模板第乙個引數為int,第二個引數為自己定義的模板(注意這裡array也代表乙個型別,使用者自定義的資料型別)
container> container;
說明:模板第乙個引數為int,第二個引數為stl中提供的模板(注意要使用例項化後的型別,因為這裡引數必須是型別)
不知道直接寫vector能不能用,是不是直接寫vector時,下面使用seq時,要加:seq,寫了就不加:seq.
等以後用到在確定下???
用途:這樣定義乙個泛化的容器,容器裡所儲存的物件也是泛化
分析:需要兩個型別:
乙個是代表容器型別,vector,list。
另乙個是存放資料的型別,如int,string
這時就要使用模板的模板引數:模板引數本身含是乙個模板
舉例:
template> class tcontainer>
class mycontainer : public tcontainer;
例項化時就可以:
mycontainermycontainer;
說明:這裡引數也可以使用預設的引數,就像函式中的確省引數是一樣的,如class allocator=allocator c 模板基礎知識
模板 1,函式模板 template t add t a 非型別引數只能是,整型,指標,引用。以上t可以有對應的預設值 2,類模板 template class a template void a func 以上 可以有非型別引數,t可以有預設值。3,友元函式模板如下。如下包括模板,友元,過載,可以...
C 類 基礎知識
目錄3.2 複製建構函式 3.3 析構函式 4.類組合 class class name功能 用於在建立類時給類設定初值 形式note 在宣告中定義了預設引數時,實現中不能再指定預設引數。下面 執行會報錯 void func int x 0 void func int x 0 呼叫時機 預設建構函式...
C 基礎知識整理 基礎知識(2) 類
類,是物件導向語言的基礎。類的三大特性 封裝 繼承 多型。最基本的特性就是封裝性。程式設計師用程式描述世界,將世界的所有事物都看成物件,怎麼描述這個物件?那就是類了。也就是用類來封裝物件。用書上的話說,類是具有相同屬性和行為的物件的抽象。寶馬汽車 別克汽車 五菱之光汽車.基本具有相同的屬性和行為,所...