為什麼要引入模板:為了避免**重複,程式設計師可以編寫脫離資料型別通用模板。
模板的分類:函式模板 + 類模板
注意:模板的宣告或定義只能在全域性,命名空間或類範圍內進行。不能在函式內進行,比如不能在main函式中宣告或定義乙個模板。
函式模板:
定義:模板函式:重點在函式,是對函式模板進行引數例項化後的結果,是乙個具體的函式。
什麼時候使用函式模板:會有一類函式,它們幾乎相同,唯一的區別就是形參型別不同。這時我們可以撇開不同的資料型別,建立乙個模板,並把資料型別也當作乙個引數而設計乙個模板
舉例說明:編寫比較兩個整型資料大小的函式,它只適合於整型資料。如果是比較兩個浮點型資料,就需要重新編寫另外乙個函式。如果我們使用函式模板的話,可以把資料型別忽略,編寫乙個max函式,既可以實現int,也可以實現浮點型。
語法:
template //模板宣告格式
返回值型別 函式名(模板形參表) //模板函式形參表
函式呼叫:函式名(模板實參表) //和普通的函式呼叫沒有區別,只不過執行時,系統會首先根據引數型別確定資料型別,生成乙個模板函式。
說明:
1、這裡的class指一類的意思
2、引數有兩種:型別引數 + 函式引數
3、t 為型別引數,可以是預定義的資料型別,可以是使用者自定義的型別(類,結構體等)。在執行中必須用實際的資料型別替代它
4、template 語句 和 函式模板定義語句不允許有別的語句
如:
template int i; //這是不允許的.
t max(t a , t b)
舉例:求兩個數最大值,使用模板
template t max(t a , t b)
呼叫:int i1,i2;
flaot f1,f2;
max(i1,i2);
max(f1,f2);
執行過程可分兩部分:
第一、傳遞引數型別:用模板實參int將 型別引數t進行例項化。即用 int 代替t
第二、傳遞引數:把引數傳遞給函式
函式模板的過載:
引入函式模板過載的原因:函式模板要求要傳入引數型別必須全都相同,不同則報錯。使用函式模板過載就是要解決這個問題
引入兩種方法解決這個問題:
1、函式模板可以使用多個模板引數:有幾個不同的型別,就是用不同的模板引數來代表它。
2、超載乙個函式模板:定義乙個模板後,在定義乙個超載函式
具體來說:
1、定義乙個多參的函式模板:
template t max(t a,d b)
呼叫:
int a;float b;
max(a,b)
2、超載乙個函式模板
template t max(t a,t b)
int max(int,int);//使用者自己定義乙個同名函式
引數呼叫:int m,n;
char a,b;
char s[10];
max(m,n);//呼叫函式 實參和函式的引數型別完全一致,直接呼叫函式
max(a,b);//呼叫模板 實參和函式引數型別不同,直接掉模板
max(m,a);//呼叫函式 實參的型別不同,模板不適合,則再次呼叫函式
max(m,s);//報錯-函式也不適合,直接報錯
分析:呼叫函式時的順序:先呼叫函式 --- 其次套用模板 --- 再呼叫函式 --- 報錯
執行步驟:
如果呼叫語句的實參型別和函式型別完全一致,這時不找模板,而優先使用函式。
如果呼叫語句的實參型別和函式型別不一致,應該找模板
如果呼叫語句的實參各自型別不同,應重新呼叫函式,並試著把實參型別轉換為形參型別,成功則呼叫,失敗,則報錯
函式模板和類結合
舉例:#include using namespace std;
class point
;point::point(int x1)
bool point::operator>(const point& p)
ostream& operator<<(ostream& cout,const point& p)
void main()
{ point a(1);
point b(2);
cout《什麼時候使用模板:
1、建立乙個型別安全的集合類(如,堆疊)用來處理各種型別的資料
2、為函式新增額外的型別檢查以避免獲得空指標
模板的優勢:為函式大多數以上應用可以不用模板實現
模板具有以下幾個優勢:
1、開發容易。你可以只為你的類或函式建立乙個普通的版本代替手工建立特殊情況處理。
2、理解容易。模板為抽象型別資訊提供了乙個直截了當的方法。
3、型別安全。模板使用的型別在編譯時是明確的,編譯器可以在發生錯誤之前進行型別檢查。
c 函式模板基礎
1.為什麼會有函式模板 includeusing namespace std 函式的業務邏輯一樣,函式的引數型別不一樣,比如說交換變數的值,變數可以是int型別,也可以是char型別,還可以是double型別 void myswap01 int a,int b void myswap02 char ...
C 基礎 函式模板
模板用於生成不同的東西 函式或者類 在c 中有函式模板和類模板。場景 當我們需要自己實現print函式時,怎麼處理傳入引數型別 double int char,short string 不同的情況呢?函式過載 這意味著你至少要寫兩個以上的函式區支援你的引數型別和個數的變化,而且這種方法不支援擴充套件...
C 基礎 模板基礎與函式模板
求兩個int float char型別的資料的最大值 c裡面要這樣寫 int maxint int x,int y double maxdouble double x,double y char maxchar char x,char y c 使用函式過載 多個同名函式處理多種型別資料的語法現象 可...