普通函數、函數重載、模板函數 認識。node
//學過c的童鞋們必定都寫過函數sum吧,當時是這樣寫的: int sum(int a,int b) { return a+b; } //實現了整數的相加 //若是再想同時實現小數的相加,就再多寫個小數的相加。普通實現我就不寫了,知道函數重載的童鞋們會這樣寫: int sum(int a,int b) {//第一個function return a+b;} double sum(double a,double b) {//第二個function return a+b;} //這樣咱們就能夠只用一個sum函數 就能夠實現整數相加與小數相加。 //可是這樣咱們仍是要定義兩個函數。 //C++考慮了怎麼避免這種重複的操做,代碼以下: 函數模板的聲明。 template <typename T> T sum(T a,T b) {return a+b;} //只須要定義一個函數與只使用一個函數實現兩數相加。
//函數模板---使用體現:調用函數時傳遞的參數類型。
template<class 數據類型參數標識符> <返回類型><函數名>(參數表) { 函數體 }
//結構體模板---使用體現:聲明結構元素時 StackNode<類型> s;
template<class T>
struct StackNode
{
struct T data;
struct StackNode<T> *next;
};
//類模板---使用體現:聲明類對象時 Stack<類型> s;
template<class T>
class Stack
{
public:
T pop();
bool push(T e);
private:
StackNode<T> *p;
}
template<class T>//類模板外的 成員函數實現
T Stack<T>::pop()
{...}
其中,template是定義模板函數的關鍵字;template後面的尖括號不能省略;class(或typename)是聲明數據類型參數標識符的關鍵字,用以說明它後面的標識符是數據類型標識符。這樣,在之後定義的這個函數中,凡但願根據實參數據類型來肯定數據類型的變量,均可以用數據類型參數標識符來講明,從而使這個變量能夠適應不一樣的數據類型。函數
①當你發現一套操做對多個不一樣類型的變量操做時。例.咱們想實現鏈棧這個類,裏面的元素能夠是int char。學習
②實現的時候,那個鏈棧的頭指針的類型就要爲對應的 int節點、char節點...對應的指針類型。spa
③那就要複製粘貼 把int改爲char 這樣就有兩個類 Stack_int Stack_char。指針
④用的時候固然沒問題 可是整個類實現下來行數是不少的。當咱們看着多出那麼多行只是 int char 不一樣重複的代碼,還容易寫錯。code
⑤模板的就是在 類的定義前面和外部類成員函數實現代碼 加上template<class T> ps.沒有分號,只有T能改。對象
⑥接着就是把 int char 的地方 所有改爲 T。。。類名換成Stack就能夠blog
⑦這樣就造出來了 Stack_int與Stack_char 的一個模板io
⑧以前聲明 對象的時候是{Stack_int a;Stack_char b;} 如今是{Stack<int> a;Stack<char> b;}function
完美了!!!感受模板只是把多個重複的代碼化簡成單個。。。。o.o。。。但確實好用。。。
①函數模板容許使用多個類型參數,但在template定義部分的每一個形參前必須有關鍵字typename或class,即:
template<class 數據類型參數標識符1,…,class 數據類型參數標識符n> <返回類型><函數名>(參數表) { 函數體 }
②在template語句與函數模板定義語句<返回類型>之間不容許有別的語句。以下面的聲明是錯誤的:
template<class T> int I; T min(T x,T y) { 函數體 }
③模板函數相似於重載函數,但二者有很大區別:函數重載時,每一個函數體內能夠執行不一樣的動做,但同一個函數模板實例化後的模板函數都必須執行相同的動做。
④思在函數模板與模板函數調用之間 聲明一個模板函數「相似」的函數,這參數會有一個隱式的轉換!
1 template <class T>//結構體模板 2 struct node 3 { 4 T data; 5 struct node<T> *lchild; 6 struct node<T> *rchild; 7 }; 8 template <class T>//類內類模板 9 class bin 10 { 11 private: 12 node <T> h; 13 public: 14 void pri(); 15 }; 16 template <class T>//類外成員函數實現模板 17 void bin<T>::pri() 18 { 19 node<T> *p = new node; 20 cout<<"qunimade"<<endl; 21 } 22 int _tmain(int argc, _TCHAR* argv[]) 23 { 24 bin<int> abc; 25 }
2017-03-11 19:16:23 -> 2017-03-22 22:51:24 -> 2017-03-26 22:33:26