C 入門學習 模板

2022-08-19 09:03:08 字數 3223 閱讀 1938

我們已經學過過載(overloading),對過載函式而言,c++ 通過函式引數(引數個數、引數型別)的正確匹配來呼叫過載函式。比如。為求兩個數的最大值,我們定義 max () 函式須要對不同的資料型別分別定義不同過載(overload)版本號。

//函式1

int max(int x, int y);

//函式2

float max( float x, float y)

//函式3

double max(double x, double y)

如今。我們再又一次審視上述的 max() 函式,它們都具有相同的功能,即求兩個數的最大值,是否能僅僅寫一套**解決問題呢?這樣就會避免因過載函式定義不全面而帶來的呼叫錯誤(如。我們分別定義了 char a,b; 那麼在執行 max(a,b) 時 程式就會出錯,由於我們未定義char 型別的過載版本號)。

相同的,對於類而言,也存在相同的問題(基本上是反覆性的工作):

//對兩個整數作比較

class compare_int

int max( )

int min( )

private:

int x,y;

};//對兩個浮點數作比較

class compare_float

float max( )

float min( )

private:

float x,y;

}

為解決上述問題 c++ 引入模板機制:模板就是實現**重用機制的一種工具,它能夠實現型別引數化,即把型別定義為引數。 從而實現了真正的**可重用性。模版能夠分為兩類。乙個是函式模版。另外乙個是類模版。

函式模板的一般形式例如以下:

template返回型別 函式名(形參表)

當中 template 和 class 是keyword,class 能夠用 typename 取代,在這裡 typename 和 class 沒差別。<> 括號裡的引數叫模板形參。模板形參和函式形參非常相像。模板形參不能為空。

一但宣告了類模板,函式中使用內建型別的地方都能夠使用模板形參名來宣告

模板形參須要呼叫該模板函式時提供的模板實參來初始化模板形參,一旦編譯器確定了實際的模板實參型別就稱他例項化了函式模板的乙個例項。

template void swap(t& a, t& b)

當呼叫這種模板函式時型別 t 就會被被呼叫時的型別所取代,比方 swap(a,b) 當中 a 和 b 是 int  型,這時模板函式 swap 中的形參 t 就會被 int 所取代,模板函式就變為 swap(int &a, int &b)。而當 swap(c,d) 當中 c 和 d 是 double 型別時,模板函式會被替換為swap(double &a, double &b),這樣就實現了函式的實現與型別無關的**。

演示樣例**例如以下:

#include using std::cout;

using std::endl;

//宣告乙個函式模版,用來比較輸入的兩個同樣資料型別的引數的大小,

//class也能夠被typename取代。

//t能夠被不論什麼字母或者數字取代。

//template template t max(t x,t y)

int main()

;一但宣告了類模板就能夠用類模板的形參名宣告類中的成員變數和成員函式,即能夠在類中使用內建型別的地方都能夠使用模板形參名來宣告。比方:

template class a

;

在類 a 中宣告了兩個型別為t的成員變數 a 和 b。還宣告了乙個返回型別為 t 帶兩個引數型別為 t 的函式 hy。

類模板物件的建立:比方乙個模板類 a,則使用類模板建立物件的方法為am;在類 a 後面跟上乙個 <> 尖括號並在裡面填上對應的型別。這種話類 a 中凡是用到模板形參的地方都會被 int  所取代。

當類模板有兩個模板形參時建立物件的方法為am;型別之間用逗號隔開。

在類模板外部定義成員函式的方法為:

template《模板形參列表》 函式返回型別 類名《模板形參名》::函式名(引數列表)

比方有兩個模板形參 t1。t2 的類 a 中含有乙個 void h() 函式。則定義該函式的語法為:

templateclass a

;templatevoid a::h()

注意:模板的宣告或定義僅僅能在全域性,命名空間或類範圍內進行。即不能在區域性範圍,函式內進行,比方不能在 main() 函式中宣告或定義乙個模板。

演示樣例**例如以下:

#include using namespace std;

template class compare //類模板

compare(numtype a,numtype b);

numtype max()

numtype min()

private:

numtype x,y;

};template compare::compare(numtype a,numtype b)

int main( )

{ comparecmp1(3,7); //定義物件cmp1,用於兩個整數的比較

cout << cmp1.max() << " is the maximum" << endl;

cout << cmp1.min() << " is the minimum" << endl << endl;

comparecmp2(45.78,93.6); //定義物件cmp2。用於兩個浮點數的比較

cout << cmp2.max() << " is the maximum"

cout << c***.max() << " is the maximum" <

執行結果例如以下:

參考資料:

c 入門學習 函式模板

1.函式模板 1.1 函式模板的定義 函式模板的定義與類模板的定義型別,如 template type min type a,type b 同樣是使用template,也可以使用template,這裡定義了函式的返回值型別,引數型別,也可以在函式模板中使用關鍵字size定義常量,如 template...

C 入門 模板

模板的介紹 模板是懶人的福音,是提高開發效率和降低維護成本的利器。簡單來說,模板就是一種萬能的型別,我們使用這種型別編寫出來的函式就是模板函式 使用這種型別作為類成員編寫的類就是模板類。在使用模板的時候需要我們傳入實際的型別對模板進行填充 這個步驟由編譯器來完成 這樣對於相同的邏輯我們就不必再去過載...

C 之模板 模板的學習 學習模板

c 之模板 模板學習 學習模板 模板就是建立通用的模具,大大提高復用性 函式模板 c 提供兩種模板機制函式模板和類模板 函式模板語法 函式模板作用 建立乙個通用函式,其函式返回值型別和形參型別可以不具體制定,用乙個虛擬的型別來代表 語法 template typename t 函式宣告或定義解釋 t...