c++提供了函式模板(function template.)所謂函式模板,實際上是建立乙個通用函式,其函式型別和形參型別不具體制定,用乙個虛擬的型別來代表。這個通用函式就成為函式模板。凡是函式體相同的函式都可以用這個模板代替,不必定義多個函式,只需在模板中定義一次即可。在呼叫函式時系統會根據實參的型別來取代模板中的虛擬型別,從而實現不同函式的功能。
函式模板具有自動推導,類模板必須顯示指定型別。
1. c++提供兩種模板機制:函式模板和類模板
2. 類屬 - 型別引數化,又稱引數模板
使得程式(演算法)可以從邏輯上抽象,把被處理的物件(資料)型別作為引數傳遞。
總結:模板把函式或類要處理的資料型別引數化,表現為引數的多型性,成為類屬。
模板用於表達邏輯結構相同,但具體資料元素型別不同的資料物件的通用行為。
//交換int資料
void swapint(int& a,int& b)
//交換char資料
void swapchar(char& a,char& b)
//問題:如果我要交換double型別資料,那麼還需要些乙個double型別資料交換的函式
//繁瑣,寫的函式越多,當交換邏輯發生變化的時候,所有的函式都需要修改,無形當中增加了**的維護難度
//如果能把型別作為引數傳遞進來就好了,傳遞int就是int型別交換,傳遞char就是char型別交換
//我們有一種技術,可以實現型別的引數化---函式模板
//class 和 typename都是一樣的,用哪個都可以
templatevoid myswap(t& a,t& b)
void test01()
用模板是為了實現泛型,可以減輕程式設計的工作量,增強函式的重用性。
//模板列印函式
templatevoid printarray(t arr,int len)
cout << endl;}
//模板排序函式
templatevoid mysort(t arr,int len)
}} }
void test();
int intlen = sizeof(tempint) / sizeof(int);
//排序前列印函式
printarray(tempchar, charlen);
printarray(tempint, intlen);
//排序
mysort(tempchar, charlen);
mysort(tempint, intlen);
//排序後列印
printarray(tempchar, charlen);
printarray(tempint, intlen);
}
函式模板不允許自動型別轉化
普通函式能夠自動進行型別轉化
//函式模板
templatet myplus(t a, t b)
//普通函式
int myplus(int a,char b)
void test02()
l函式模板可以像普通函式那樣可以被過載
c++編譯器優先考慮普通函式
如果函式模板可以產生乙個更好的匹配,那麼選擇模板
可以通過空模板實參列表的語法限定編譯器只能通過模板匹配
//函式模板
templatet myplus(t a, t b)
//普通函式
int myplus(int a, int b)
void test03()
//函式模板過載
templatet myplus(t a, t b, t c)
void test04()
編譯器並不是把函式模板處理成能夠處理任何型別的函式函式模板機制結論:
函式模板通過具體型別產生不同的函式
編譯器會對函式模板進行兩次編譯,在宣告的地方對模板**本身進行編譯,在呼叫的地方對引數替換後的**進行編譯。
編譯器根據函式的呼叫情況,產生具體函式,這個具體函式根據型別產生。
C 模板一 函式模板
c 另一種程式設計思想稱為 泛型程式設計 主要利用的技術就是模板 c 提供兩種模板機制 函式模板和類模板 template函式申明或定義template 宣告建立模板 typename 表面其後面的符號是一種資料型別,可以用class代替 t 通用的資料型別,名稱可以替換,通常為大寫字母 函式模板使...
C 模板 函式模板和模板函式
1.函式模板的宣告和模板函式的生成 1.1函式模板的宣告 函式模板可以用來建立乙個通用的函式,以支援多種不同的形參,避免過載函式的函式體重複設計。它的最大特點是把函式使用的資料型別作為引數。函式模板的宣告形式為 template 返回型別 函式名 參數列 其中,template是定義模板函式的關鍵字...
C 模板 函式模板和模板函式
1.函式模板的宣告和模板函式的生成 1.1函式模板的宣告 函式模板可以用來建立乙個通用的函式,以支援多種不同的形參,避免過載函式的函式體重複設計。它的最大特點是把函式使用的資料型別作為引數。函式模板的宣告形式為 template 返回型別 函式名 參數列 其中,template是定義模板函式的關鍵字...