函式模版和類模版

mf1crystal發表於2018-01-20

概述:
C++提供了函式模板(function template)。所謂函式模板,實際上是建立一個通用函式,其函式型別和形參型別不具體指定,用一個虛擬的型別來代表。這個通用函式就稱為函式模板。凡是函式體相同的函式都可以用這個模板來代替,不必定義多個函式,只需在模板中定義一次即可。在呼叫函式時系統會根據實參的型別來取代模板中的虛擬型別,從而實現了不同函式的功能。

1)C++提供兩種模板機制:函式模板、類别範本
2)類屬 —— 型別引數化,又稱引數模板
使得程式(演算法)可以從邏輯功能上抽象,把被處理的物件(資料)型別作為引數傳遞。
總結:
模板把函式或類要處理的資料型別引數化,表現為引數的多型性,稱為類屬。
模板用於表達邏輯結構相同,但具體資料元素型別不同的資料物件的通用行為。

為什麼要有函式模版:
寫n個函式,交換char型別、int型別、double型別變數的值。
函式模版語法:
template <型別形式參數列>
型別 函式名 (形式參數列)

語句序列

函式模版定義由模版說明和函式定義組成
模版說明的類屬引數必須在函式定義中至少出現一次。
函式參數列中可以使用類屬型別引數,也可以使用一般型別引數
myswap(a, b); //顯示型別呼叫
myswap(a, b); //自動資料型別推導

函式模版遇上函式過載,函式模版和普通函式的區別:函式模板不允許自動型別轉化
普通函式能夠進行自動型別轉換
函式模版和普通函式在一起呼叫規則
1 函式模板可以像普通函式一樣被過載
2 C++編譯器優先考慮普通函式
3 如果函式模板可以產生一個更好的匹配,那麼選擇模板
4 可以通過空模板實參列表的語法限定編譯器只通過模板匹配
函式模版機制
編譯器並不是把函式模板處理成能夠處理任意類的函式
編譯器從函式模板通過具體型別產生不同的函式
編譯器會對函式模板進行兩次編譯
在宣告的地方對模板程式碼本身進行編譯;在呼叫的地方對引數替換後的程式碼進行編譯。

為什麼有類模版
類别範本用於實現類所需資料的型別引數化
類别範本在表示如陣列、表、圖等資料結構顯得特別重要,這些資料結構的表示和演算法不受所包含的元素型別的影響

繼承中的類模版語法
派生普通類
class B : public A
{
public:
B(int a=10, int b=20) : A(a)
{
this->b = b;
}
void printB()
{
cout << “a:” << a << ” b: ” << b << endl;
}

protected:
private:
int b;
};
派生類模版
template
class C : public A
{
public:
C(T c, T a) : A(a)
{
this->c = c;
}
void printC()
{
cout << “c:” << c <

相關文章