C 類模板基礎知識

2021-05-26 23:33:40 字數 3483 閱讀 9917

類模板與模板類

為什麼要引入類模板:類模板是對一批僅僅成員資料型別不同的類的抽象,程式設計師只要為這一批類所組成的整個類家族建立乙個類模板,給出一套程式**,就可以用來生成多種具體的類,(這類可以看作是類模板的例項),從而大大提高程式設計的效率。

注意: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) 類

類,是物件導向語言的基礎。類的三大特性 封裝 繼承 多型。最基本的特性就是封裝性。程式設計師用程式描述世界,將世界的所有事物都看成物件,怎麼描述這個物件?那就是類了。也就是用類來封裝物件。用書上的話說,類是具有相同屬性和行為的物件的抽象。寶馬汽車 別克汽車 五菱之光汽車.基本具有相同的屬性和行為,所...