前言:這裡僅介紹c++primer plus中的簡單函式模板和模板過載
物件導向的繼承和多型機制有效提高了程式的可重用性和可擴充性。在程式的可重用性方面,程式設計師還希望得到更多支援。舉乙個最簡單的例子,為了交換兩個整型變數的值,需要寫下面的 swap 函式:
void swap(int & x, int & y)
為了交換兩個 double 型變數的值,還需要編寫下面的 swap 函式:
void swap (double & xr double & y)
如果還要交換兩個 char 型變數的值,交換兩個 cstudent 類物件的值……都需要再編寫 swap 函式。而這些 swap 函式除了處理的資料型別不同外,形式上都是一樣的。能否只寫一遍 swap 函式,就能用來交換各種型別的變數的值呢?繼承和多型顯然無法解決這個問題。因此,「模板」的概念就應運而生了。
眾所周知,有了「模子」後,用「模子」來批量製造陶瓷、塑料、金屬製品等就變得容易了。程式語言中的模板就是用來批量生成功能和形式都幾乎相同的**的。有了模板,編譯器就能在需要的時候,根據模板自動生成程式的**。從同乙個模板自動生成的**,形式幾乎是一樣的。
c++ 語言支援模板。有了模板,可以只寫乙個 swap 模板,編譯器會根據 swap 模板自動生成多個 sawp 函式,用以交換不同型別變數的值。
在 c++ 中,模板分為函式模板和類模板兩種。函式模板是用於生成函式的,類模板則是用於生成類的。
函式模板的寫法如下:
template 返回值型別 模板名(形參表)
其中的 class 關鍵字也可以用 typename 關鍵字替換,例如:
template
函式模板看上去就像乙個函式。前面提到的 swap 模板的寫法如下:
template void swap(t & x, t & y)
t 是型別引數,代表型別。編譯器由模板自動生成函式時,會用具體的型別名對模板中所有的型別引數進行替換,其他部分則原封不動地保留。同乙個型別引數只能替換為同一種型別。編譯器在編譯到呼叫函式模板的語句時,會根據實參的型別判斷該如何替換模板中的型別引數。
例如下面的程式:
#include using namespace std;
templatevoid swap(t & x, t & y)
int main()
編譯器在編譯到swap(n, m);時找不到函式 swap 的定義,但是發現實參 n、m 都是 int 型別的,用 int 型別替換 swap 模板中的 t 能得到下面的函式:
void swap (int & x, int & y)
該函式可以匹配swap(n, m);這條語句。於是編譯器就自動用 int 替換 swap 模板中的 t,生成上面的 swap 函式,將該 swap 函式的源**加入程式中一起編譯,並且將swap(n, m);編譯成對自動生成的 swap 函式的呼叫。
同理,編譯器在編譯到swap(f, g);時會用 double 替換 swap 模板中的 t,自動生成以下 swap 函式:
void swap(double & x, double & y)
函式模板中可以有不止乙個型別引數。例如,下面這個函式模板的寫法是合法的:、
template t2 print(t1 argl, t2 arg2)
注意:在書寫模板時,我們通常將函式模板寫進標頭檔案中,並且注意,函式宣告和定義前均要加上 template <。。。。>這句話。其實與我們之前寫函式一樣,只不過在宣告和定義前加上了 template <>
函式模板本質上還是函式,所以他也有過載,即函式名相同,引數型別或者個數不同。
比如:
templatevoid swap(t & x, t & y)
templatevoid swap(t & x, t & y ,t &z)
c 函式模板
include using namespace std template t max t a,t b,t c int main int main int i1 185,i2 76,i3 567,i double d1 56.63,d2 90.23,d3 3214.78,d long g1 67854...
c 函式模板
關鍵字template總是放在模板的電腦關於與宣告的最前面,關鍵字後面是用逗號分隔的模板參數列,該列表是模板參數列,不能為空。模板引數可以是乙個模板型別引數,它代表了一種型別 也可以是乙個模板非型別引數,它代表了乙個常量表示式。模板型別引數由關鍵字class或typename後加乙個識別符號構成。在...
C 函式模板
c 提供了函式模板 function template 所謂函式模板,實際上是建立乙個通用函式,其函式型別和形參型別不具體指定,用乙個虛擬的型別來代表。這個通用函式就稱為函式模板。凡是函式體相同的函式都可以用這個模板來代替,不必定義多個函式,只需在模板中定義一次即可。在呼叫函式時系統會根據實參的型別...