[ 隨手記 4 ]C/C++ 模板(Template)使用/重載區別

(原創)我的理解:ios

模板,故名思義,就是一個模子;函數

模板分爲:類模板和函數模板(也可叫模板類和模板函數);工具

模板特色:(1)函數名字同樣;spa

                 (2)調用的形參的數據類型不一樣,但形參個數相同;指針

     (3)函數實現的功能同樣,由於實質上就是一個函數;code

模板形式:模板需再類或者函數定義前加上 template<typename T> 或 template<class T>,函數實現中的形參類型也須要是 T ;對象

                 其中,T就是數據類型,int/float/char或者本身定義的結構體類型;blog

好比:資源

template<typename T> 或 template<class T>io

T funName( T parm1,T parm2 )

{

//函數返回類型爲T;

}

或者自定義固定的返回類型:

template<typename T> 或 template<class T>

int funName( T parm1,T parm2 )

{

//函數返回類型爲int;

}

固然上面int也可爲float/void等類型;

===================================================================================

模板與重載的區別:

重載,顧名思義,從新加載/從新載入,也就是重生了一個函數(就如人思想重生,外表同樣,可什麼都和之前不同了);

1 相同點

二者都是一個函數名字;

均可完成不一樣形參類型的參數輸入到相同函數名字的功能;

2 不一樣點

重載的形參個數可不一樣,模板需相同;

重載的函數實現功能可不一樣,模板實現功能相同;

重載需一個一個的列舉出函數定義,模板就一個便可;

================================================================================

下面是轉摘資源:

1. 模板的概念。

咱們已經學過重載(Overloading),對重載函數而言,C++的檢查機制能經過函數參數的不一樣及所屬類的不一樣。正確的調用重載函數。例如,爲求兩個數的最大值,咱們定義MAX()函數須要對不一樣的數據類型分別定義不一樣重載(Overload)版本。

複製代碼
//函數1.

int max(int x,int y);
{return(x>y)?x:y ;}

//函數2.
float max( float x,float y){
return (x>y)? x:y ;}

//函數3.
double max(double x,double y)
{return (c>y)? x:y ;}
複製代碼

但若是在主函數中,咱們分別定義了 char a,b; 那麼在執行max(a,b);時 程序就會出錯,由於咱們沒有定義char類型的重載版本。

如今,咱們再從新審視上述的max()函數,它們都具備一樣的功能,即求兩個數的最大值,可否只寫一套代碼解決這個問題呢?這樣就會避免因重載函數定義不 全面而帶來的調用錯誤。爲解決上述問題C++引入模板機制,模板定義:模板就是實現代碼重用機制的一種工具,它能夠實現類型參數化,即把類型定義爲參數, 從而實現了真正的代碼可重用性。模版能夠分爲兩類,一個是函數模版,另一個是類模版。

2.   函數模板的寫法

函數模板的通常形式以下:

Template <class或者也能夠用typename T>

返回類型 函數名(形參表)
{//函數定義體 }

說明: template是一個聲明模板的關鍵字,表示聲明一個模板關鍵字class不能省略,若是類型形參多餘一個 ,每一個形參前都要加class <類型 形參表>能夠包含基本數據類型能夠包含類類型.

請看如下程序:

複製代碼
//Test.cpp

#include <iostream>

using std::cout;

using std::endl;
複製代碼

//聲明一個函數模版,用來比較輸入的兩個相同數據類型的參數的大小,class也能夠被typename代替,

//T能夠被任何字母或者數字代替。

複製代碼
template <class T>

T min(T x,T y)

{ return(x<y)?x:y;}

 

void main( )

{

     int n1=2,n2=10;

     double d1=1.5,d2=5.6;

     cout<< "較小整數:"<<min(n1,n2)<<endl;

     cout<< "較小實數:"<<min(d1,d2)<<endl;

     system("PAUSE");

}
複製代碼

程序運行結果:

 

程序分析:main()函數中定義了兩個整型變量n1 , n2 兩個雙精度類型變量d1 , d2而後調用min( n1, n2); 即實例化函數模板T min(T x, T y)其中T爲int型,求出n1,n2中的最小值.同理調用min(d1,d2)時,求出d1,d2中的最小值.

3. 類模板的寫法

定義一個類模板:

Template < class或者也能夠用typename T >
class類名{
//類定義......
};

說明:其中,template是聲明各模板的關鍵字,表示聲明一個模板,模板參數能夠是一個,也能夠是多個。

例如:定義一個類模板:

複製代碼
// ClassTemplate.h
#ifndef ClassTemplate_HH
#define ClassTemplate_HH

template<typename T1,typename T2>

class myClass{

private:
     T1 I;
     T2 J;

public:
     myClass(T1 a, T2 b);//Constructor
     void show();
};


//這是構造函數
//注意這些格式

template <typename T1,typename T2>

myClass<T1,T2>::myClass(T1 a,T2 b):I(a),J(b){}

 

//這是void show();

template <typename T1,typename T2>

void myClass<T1,T2>::show()
{
     cout<<"I="<<I<<", J="<<J<<endl;
}
#endif


// Test.cpp

#include <iostream>
#include "ClassTemplate.h"
using std::cout;
using std::endl;

void main()
{
     myClass<int,int> class1(3,5);
     class1.show();

     myClass<int,char> class2(3,'a');
     class2.show();

     myClass<double,int> class3(2.9,10);
     class3.show();

     system("PAUSE");
}
複製代碼

最後結果顯示:

 

4.非類型模版參數

通常來講,非類型模板參數能夠是常整數(包括枚舉)或者指向外部連接對象的指針。

那麼就是說,浮點數是不行的,指向內部連接對象的指針是不行的。

複製代碼
template<typename T, int MAXSIZE>
class Stack{
Private:
       T elems[MAXSIZE];
…
};

Int main()
{

       Stack<int, 20> int20Stack;
       Stack<int, 40> int40Stack;
…

};
複製代碼
相關文章
相關標籤/搜索