C 之泛型基礎

2021-08-19 20:08:37 字數 1730 閱讀 3611

1.泛型的基本思想

泛型程式設計(generic programming)是一種語言機制,通過它可以實現乙個標準的容器庫。像類一樣,泛型也是一種抽象資料型別,但是泛型不屬於物件導向,它是物件導向的補充和發展。

在物件導向程式設計中,當演算法與資料型別有關時,物件導向在對演算法的抽象描述方面存在一些缺陷。

比如對棧的描述:

class stack

如果把上面的偽**看作演算法描述,沒問題,因為演算法與引數型別無關。但是如果把它寫成可編譯的源**,就必須指明是什麼型別,否則是無法通過編譯的。使用過載來解決這個問題,即對n種不同的引數型別寫n個push和pop演算法,這樣是很麻煩的,**也無法通用。

若對上面的描述進行改造如下:

首先指定一種通用型別t,不具體指明是哪一種型別。

class stack《引數模板 t>

這裡的引數模板t相當於乙個佔位符,當我們例項化類stack時,t會被具體的資料型別替換掉。

若定義物件s為statc型別,在例項化s時若我們將t指定int型則:

這時候類s就成為:

class s

這時我可以稱class stack《引數模板 t>是類的類,通過它可以生成具體引數型別不同的類。

2.泛型在c++中的應用

泛型在c++中的主要實現為模板函式和模板類。

通常使用普通的函式實現乙個與資料型別有關的演算法是很繁瑣的,比如兩個數的加法,要考慮很多態別:

int add(int a,int b)

float add(float a,float b)

。。。。

雖然在c++中可以通過函式過載來解決這個問題,但是反覆寫相同演算法的函式是比較辛苦的,更重要的是函式過載是靜態編譯,執行時占用過多記憶體。

在此我們可以用c++的模板函式來表達通用型的函式,如下:

template// 模板宣告

t add(t a,t b)  // 注意形參和返回值的型別

這時c++編譯器會根據add函式的引數型別來生成乙個與之對應的帶具體引數型別的函式並呼叫。

例如:#include

using namespace std;

template

t add(t a,t b)  //注意形參和返回型別

void main()

template  t1 fun(t1, t2, int )

template 

t1 fun(t1, t2, int )

template  t1 fun(t1, t2, int )

5.c++模版類的語法

template 

class 類名

成員的實現…

例如://類宣告部分,有兩個模板引數t1,t2

template 

class a

//類實現部分

template 

int a:: fun1(t1 x, int y )

template 

t2 a:: fun2(t1 x, t2 y)

//使用類a

int main( )

由上例可以看出, 類模板引數t1,t2對類的成員變數和成員函式均有效。

在c++程式設計中,當你要實現的乙個類的某些成員函式和成員變數的演算法跟資料型別有關,可以考慮用類模板,且c++版的資料結構演算法大都用類模板實現。

6.類模板的性質

1) 類模板不是真正的類,它只是c++編譯器生成具體類的乙個模子。

2) 類模板可以設定預設模板實參。

C 泛型基礎(二)之泛型型別約束

泛型雖然在例項化時可以指定為任意型別,但是實際業務中,並不是都需要這樣,更多的時候因為業務邏輯而需要新增一些約束。泛型新增約束使用where子句,如listwhere t class表示t只能是引用型別。下文將展示泛型約束的基本用法與基本概念。一 約束型別 約束型別有六種,分別是class,stru...

C 泛型基礎

泛型的基本思想 泛型程式設計 generic programming 是一種語言機制,通過它可以實現乙個標準的容器庫。像類一樣,泛型也是一種抽象資料型別,但是泛型不屬於物件導向,它是物件導向的補充和發展。在物件導向程式設計中,當演算法與資料型別有關時,物件導向在對演算法的抽象描述方面存在一些缺陷。比...

基礎 C 泛型

msdn 章節內容 ms help 泛型是 2.0 版 c 語言和公共語言執行庫 clr 中的乙個新功能。泛型將型別引數的概念引入 net framework,型別引數使得設計如下類和方法成為可能 這些類和方法將乙個或多個型別的指定推遲到客戶端 宣告並例項化該類或方法的時候。例如,通過使用泛型型別引...