函式模版和模版函式,類模版和模版類的區別

2021-08-26 21:53:36 字數 2502 閱讀 7871

什麼是函式模板和類模板

函式模板是一種抽象函式定義,它代表一類同構函式。通過使用者提供的具體引數,c++編譯器在編譯時刻能夠將函式模板例項化,根據同乙個模板建立出不同的具體函式,這些函式之間的不同之處主要在於函式內部一些資料型別的不同,而由模板建立的函式的使用方法與一般函式的使用方法相同。函式模板的定義格式如下:

templatefunction_definition

其中,function_definition為函式定義;type_list被稱為型別參數列,是由—系列代表型別的識別符號組成的,其間用逗號分隔,這些識別符號的通常風格是由大寫字母組成,arg_list稱為變數表,其中含有由逗號分隔開的多個變數說明,相當於一般函式定義中的形式引數。前面例題中的 max就是函式模板的乙個例子,因此這裡不再另外舉例。

c++提供的類模板是一種更高層次的抽象的類定義,用於使用相同**建立不同類模板的定義與函式模板的定義類似,只是把函式摸板中的函式定義部分換作類說明,並對類的成員函式進行定義即可。在類說明中可以使用出現在type_list中的各個型別標識以及出現在arg_list中的各變數。

1 template《模版參數列》

2 class《類模板名》

3 ,例如我們需要定義乙個表示平面的點(point)類,這個類有兩個成員變數分別表示橫座標和縱座標,並且這兩個座標的型別可以是int、float、 double等等型別。因此可能寫出類似point_int_int、point_float_int、point_float_float等這樣的類。通過類模板,我們只需要寫乙個類。

1 #include

2 using namespace std;

3 4 template

5 class point_t

6 //預設建構函式

11 point_t(t1 ta, t2 tb) : a(ta), b(tb) {} //帶引數的建構函式

12 point_t& operator=(point_t &pt); //賦值函式

13 friend point_t operator +(point_t &pt1, point_t &pt2); //過載+

14 };

15 16 template

17 point_t& point_t::operator=(point_t &pt) //賦值函式

18 23

24 template

25 point_t operator +(point_t &pt1, point_t &pt2) //過載+

26 32

33 template

34 ostream& operator << (ostream& out, point_t& pt) //過載輸出流操作符

35 40

41 int main()

42 point_t類就是乙個類模板,它的成員a和b分別為t1和t2型別,這裡我們還實現了它的建構函式、賦值函式、「+」運算子的過載以及輸出流操作符「<<」的過載。

使用point_t類非常方便,我們可以進行各種型別的組合。

**43、44行,定義了兩個point_t類的物件intpt1和intpt2,表明這兩個物件的成員a和b都是int型別。

**45、46行,定義了兩個point_t類的物件floatpt1和floatpt2,表明這兩個物件的成員a和b都是float型別。

**51行,對intpt1和intpt2進行物件加法,結果儲存到inttotalpt中,此過程先呼叫「+」函式,再呼叫了「=」函式。

**52行,與51行類似,只是相加的物件和結果物件都是point_t類的物件。

**54、55行,輸出物件inttotalpt和floattotalpt的內容。

可以看出,通過使用類模板point_t我們可以建立不同的類,大大提高了**的可維護性以及可重用性。

有一些概念需要區別:函式模板與模板函式,類模板和模板類是不同的意思

函式模板的重點是模板,它表示的是乙個模板,用來生產函式。例如前面例題的max是乙個函式模板。而模板函式的重點是函式,它表示的是由乙個模板生成而來的函式。例如max,max等都是模板函式。

類模板和模板類的區別與上面的類似,類模板用於生產類,例如point_t就是乙個類模板。而模板類是由乙個模板生成而來的類,例如point_t和point_t都是模板類。

函式模板和類模板有什麼區別?

在面試例題1的程式**中,我們在使用函式模板max時不一定要必須指明t的型別,函式模板max的例項化是由編譯程式在處理函式呼叫時自動完成的,當呼叫max(1, 2)時自動生成例項max,而呼叫max(1.1f, 2.2f)時自動生成例項max。當然也可以顯示指定t的型別。

對於本例題的類模板point_t來說,其實例化必須被顯示地指定,比如point_t、point_t。

答案:函式模板是一種抽象函式定義,它代表一類同構函式。類模板是一種更高層次的抽象的類定義。

函式模板的例項化是由編譯程式在處理函式呼叫時自動完成的,而類模板的例項化必須由程式設計師在程式中顯式地指定。

類模板不能巢狀(區域性類模板)。

類模板中的靜態成員僅屬於例項化後的類(模板類),不同例項之間不存在共享。

函式模版 特化 模版指標

函式特化在下面做了大量的補充 類模版 函式模版與類模版的乙個不同點是 類模版如 template class a 那麼 a或 a是乙個類 即a是模版,a後面帶著則是乙個類 函式模版如 template t compare const t a,const t b 那麼compare生成compare ...

c 函式模版

如果需要多個將同乙個演算法用於不同型別的函式,請使用模版 函式模版 要讓編譯器知道程式需要乙個特定形式的交換函式,只需在程式中使用swap 函式即可,編譯器將檢查所使用的引數型別,並生成相應的函式,1.template void swap anytype a,anytype b anytype te...

大數模版 (Kuangbin模版)

直接嵌入 中用即可。完全大數模板 輸出cin a 輸出a.print 注意這個輸入不能自動去掉前導0的,可以先讀入到char陣列,去掉前導0,再用建構函式。define maxn 9999 define maxsize 1010 define dlen 4 class bignum bignum c...