什麼是函式模板
所謂函式模板,實際上是建立乙個通用函式,其函式型別和形參型別不具體指定,用乙個虛擬的型別來代表。這個通用函式就稱為函式模板。
凡是函式體相同的函式都可以用這個模板來代替,不必定義多個函式,只需在模板中定義一次即可。在呼叫函式時系統會根據實參的型別來取代模板中的虛擬型別,從而實現了不同函式的功能。
定義:
template
《型別形式參數列》
例如:template
函式模板宣告:
型別 函式名 (形式參數列)
函式模板和普通函式的區別:函式模板不允許自動型別轉化;普通函式能夠進行自動型別轉換。
函式模板和普通函式在一起呼叫規則:
1 函式模板可以像普通函式一樣被過載
2 c++編譯器優先考慮普通函式
3 如果函式模板可以產生乙個更好的匹配,那麼選擇模板
4 可以通過空模板實參列表的語法限定編譯器只通過模板匹配
函式模板機制
乙個函式模板就可以代表一系列的函式,很是神奇,那麼,它的原理到底是什麼呢?編譯器並不是把函式模板處理成能夠處理任意類的函式。編譯器真正的做法是:從函式模板通過具體型別產生不同的函式,對函式模板進行兩次編譯:在宣告的地方對模板**本身進行編譯;在呼叫的地方對引數替換後的**進行編譯。例如:
template
t max(t a, t b)
max(10,20);
兩次編譯後,實際上相當於:
int max(int a, int b)
max(10,20);
編譯器代替我們實現了這個函式。
類模板
template
class a
void print ()
private:
t a;
};// 類模板物件做函式引數傳遞的時候
// 1、寫乙個具體的 模板類 物件
void myprint(a &a)
void myprint(a &a)
// 2、使用函式模板
template
void printa(a&a)
int main()
2、類模板的派生
1)派生普通類(具體的類)
class b : public a
private:
int b;
};
2)派生類模板(非具體的類)
template class c:public a
private:
t c;
};
3、類模板中的static關鍵字
*從類模板例項化的每個模板類有自己的類模板資料成員,該模板類的所有物件共享乙個static資料成員
*和非模板類的static資料成員一樣,模板類的static資料成員也應該在檔案範圍定義和初始化
*每個模板類有自己的類模板的static資料成員副本
小結:
1模板是c++型別引數化的多型工具。c++提供函式模板和類模板。
2 模板定義以模板說明開始。類屬引數必須在模板定義中至少出現一次。
3同乙個類屬引數可以用於多個模板。
4 類屬引數可用於函式的引數型別、返回型別和宣告函式中的變數。
5模板由編譯器根據實際資料型別例項化,生成可執行**。例項化的函式模板稱為模板函式;例項化 的類模板稱為模板類。
6 函式模板可以用多種方式過載。
7類模板可以在類層次中使用 。
C 函式模板和類模板
一 函式模板 c 提供了函式模板 function template 所謂函式模板,實際上是建立乙個通用函式,其函式型別和形參型別不具體指定,用乙個虛擬的型別來代表。這個通用函式就稱為函式模板。凡是函式體相同的函式都可以用這個模板來代替,不必定義多個函式,只需在模板中定義一次即可。在呼叫函式時系統會...
函式模板和類模板(C )
所謂函式模板,實際上是建立乙個通用函式,其函式型別和形參型別不具體指定,用乙個虛擬的型別來代表。這個通用函式就稱為函式模板。函式模板和普通函式的區別 函式模板不允許自動型別轉化,普通函式能夠進行自動型別轉換 函式模板和普通函式在一起呼叫的規則 1 函式模板可以像普通函式一樣被過載 2 c 編譯器優先...
C 函式模板和類模板
一 函式模板 1.概念 實際是建立乙個模型,然後根據這個模板去例項化一些物件,它的函式型別和形參型別不具體指定,用乙個虛擬的型別來代表,這個通用的函式就稱為函式模板,只要是函式體相同的函式都可以用這個模板來代替,不必定義多個函式,只需要在模板中定義一次,在呼叫函式時,編譯器會根據實參的型別對函式進行...