函數模板與類模板

函數模板,顧名思義,是在生成函數時依照的模板。函數

  有時,咱們須要對不一樣的數據類型作一樣的函數操做。spa

  好比:分別對一個int類型數 和 一個double類型數求平方。設計

這時,雖然都是一樣的求平方操做(函數體內代碼同樣),可是咱們必需要編寫兩個不一樣的函數,由於處理int類型的函數的參數和返回值類型都應該是int,而處理double類型的函數的參數和返回值都應該是double。指針

以下:函數體內操做代碼同樣,設計爲重載函數,用相同的函數名,可是參數類型和返回值類型卻都不同,函數須要定義兩次。code

int Square(int a) //求int類型變量的平方值
{
  int b;b=a*a;
return b; } double Square(doublea) //求double類型變量的平方值 {
  double b;b=a*a;
return b; }

此時,若是使用函數模板就能夠省去屢次重複定義函數的麻煩,消除冗餘代碼 ,提高代碼重用性。對象

函數模板的定義形式blog

template<模板參數表>get

類型名 函數名 (參數表)編譯器

{編譯

  函數體定義

}

對於模板參數表:由 「class」或「typename 」加上 「類型說明符」 組成。(模板參數表還能夠爲「template<參數表>class」 加上 「類型說明符」,表示接收一個類模板做爲參數,關於類模板的說明在後面)

模板參數表 用來指定函數模板的形參類型返回值類型以及函數中的局部變量類型

如以上Square函數的函數模板以下:

template<typename T>
T Square(T a)
{
  T b;b=a*a;
return b; }

此時,再分別計算int類型和double類型變量的平方時,咱們再也不須要手動書寫兩個函數,只需按以下方式執行便可。

int main()
{
    int m=2;
    double n= 3.0;
    cout<<Square(m)<<endl;
    couta<<Square(n)<<endl;
    return 0;
}

在上述Square()被調用時,編譯器從實參的類型(如int)推導出函數模板的參數類型(int),而後編譯器將依據函數模板來生成一個以下函數

(在調用Square(m)時,執行的函數其實是int Square(int a)這個函數,同理調用Square(n)時,實際上執行的是double Square(double a)。)

int Square(int a)
{
    int b;b=a*a;
    return b;
}

這一個過程咱們稱之爲,函數模板的實例化。函數模板實例化的過程用戶是不用關心的。

關於函數模板有幾點須要注意

1.函數模板自己在編譯時不會生成任何目標代碼,只有函數模板生成的實例才生成目標代碼。

2.若是函數模板被多個文件引用,函數模板的函數體也應該放在頭文件裏,而不能只放函數模板的聲明。

3.函數指針不能指向函數模板自己,只能指向函數模板的實例。

 

類模板,與函數模板相似,是生成類時依照的模板。

類模板聲明語法格式

template<模板參數表>

class 類名

{

  類成員聲明

}

同理,模板參數表用於影響類成員(函數成員及數據成員)的中的數據類型

例:

template<class T>
class printer{  //一個打印機類模板,能夠接收並打印給定數據類型
private:
    T a;
    bool b; //用來標記是否有可給出內容
public:
    T& prin();   //給出要打印內容
    void get(const T& x);  //得到要打印內容
};

在類模板外定義其函數成員的格式以下:

template<模板參數表>

類型名 類名<模板參數標識符列表>::函數名(參數表)

對應上述類模板有:

template<class T>
T& printer<T>::prin(){
    if(b)
        return a;
}
template<class T>
void printer<T>::get(const T& x){
    a=x;
    b=true;
}

類模板一樣擁有實例化的過程。

使用一個類模板來創建對象方法

模板名<模板參數表>對象名1,對象名2,...,對象名n;

創建對象的過程:首先模板實例化生成具體的類,而後類再實例化出一個個對象

如 printer<int>p1,p2; 創建了兩個能夠得到並給出int類型數據的打印機p1和p2。

int main(){
    printer<int>p1,p2;
    p1.get(1);
    p2.get(2);
    cout<<"p1要打印的是"<<p1.prin()<<endl;
    cout<<"p2要打印的是"<<p2.prin()<<endl;
    return 0;
}

經過模板能夠實現參數化多態性(就是將處理的對象的類型參數化,使得一段程序能夠處理不一樣類型的對象)。

以上。

相關文章
相關標籤/搜索