羣體類和羣體數據組織

函數模板

函數模板就是功能類似的函數寫成統一的形式,可是函數的形參類型不一樣。ios

函數模板的定義:數組

template <class T>或者 template<typename T>
類型名 函數名 (參數名)
{
函數體的定義
}

函數模板都是以關鍵字template 開始的,<>中的是類型參數表,每一個類型參數,例如上文的「T「,表明的是類型,能夠是內部類型(?,指的是函數內部嗎?)或者自定義類型,類型參數用來指定函數模板自己的形參類型和返回值類型,以及聲明函數中的局部變量(?,什麼意思?)。模板中的函數體的定義方式以普通函數定義形式相同。ide

函數模板使用實例以下:函數

#include<iostream>
using namespace std;
template<class T>  //聲明函數模板
void outputArray(const *P_array, const int count )//定義函數體
{
   for(int i =0; i<count;i++)
      cout<<P_array[i]<<" ";
      cout<<endl;
}
int main()
{
const int aCount =8,cCount=20;
int aArray[aCount]={1,2,3,4,5,6,7,8};
double bArray[ bCount ]={1.1,2.2,3.3,4.4,5.5,6.6,7.7,8.8};
char  cArray[cCount]="Welcome to see you!";
cout <<"a Array contains:"<<endl;
outputArray(aArray,aCount);
cout <<"b Array contains:"<<endl;
outputArray(bArray,bCount);
cout <<"c Array contains:"<<endl;
outputArray(cArray,cCount);

}
View Code

分析:spa

函數模板中的聲明的類型參數T,表示抽象類型,當編譯器檢測到程序中調用函數模板outputArray時,便用outputArray的第一個實參的類型替換掉真個模板中定義的T,並創建用來輸出指定類型數組的一個完整函數,以後再編譯這個新函數。code

由此可知,模板函數與重載是密切相關的,從函數模板產生的相關函數都是同名的,編譯器用重載的方法調用相應的函數,另外函數模板自己也能夠用多種方式重載(?)。對象

類模板

 類是對一組對象的公共性質的抽象,類模板則是對不一樣類的公共性質的抽象,所以類模板是更高層次的抽象。blog

                        類模板繼承

                          |  <抽象>編譯器

                         類

                          | <抽象>

                        對象

由下到上這是對象,類,類模板三者之間的關係,對象經抽象獲得共同的性質,造成類,多個類又通過抽象獲得共同的性質獲得類模板。

類模板聲明的語法形式:

template <模板參數表>
class 類名
{
類成員聲明
}

若是須要在類模板之外實現成員函數,須要採用如下形式:

template <模板參數表>
類型名 類名 <T>::函數名(參數表)

其中模板參數表能夠包括:

一、class(或者typename)  標識符

二、類型說明符  標識符 指明能夠接受一個由「類型說明符」所規定的類型的常量做爲參數。

當模板參數表同時包括上述多項內容時,個內容之間以逗號分隔,但(模板類的成員函數必須是函數模板,??)

這裏「模板參數表」中的參數與類模板聲明時「模板參數表」中的參數一一對應。系統會根據制定的參數類型和常量值生成一個類,而後創建該類的對象。也就是說,對模板進行實例化生成類,在對類實例化生成對象。可是類模板的實例化過程在程序中是隱藏的,不會出現。

 

使用模板類來創建對象時,形式以下:

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

 

類模板的舉例:

template<class T>//類模板實現對任意類型數據進行存取
class Store 
{
    private:
                 T    item;   //item用於存聽任意類型的數據
                int   haveValue;//標記item是被存入內容
    public:
                Store(void);   //默認形式的構造函數
 
                 T    GetElement();  //提取數據函數
                 void   PuElem(T x); //存入數據函數
};

//各成員函數的實現
template<class T>    //默認形式的構造函數
Store<T>::Store():have Value(0)  //由於是構造函數因此沒有返回值類
//
{}
//提取函數的實現
template<class T>
T  Store<T>::GetElement(void)
{
  //////
} 


template <class T>
void Store<T>::PutElem(T x)
{
haveValue++;
item=x;

}
int main()
{
Store <int>  S1,S2;
Store<double>   D;
S1.PutElem(3);
S2.PutElem(-7);

}

 

這部分主要是爲了練習類繼承的實現形式練習。

相關文章
相關標籤/搜索