C++模板:函數、結構體、類 模板實現
1.前言:(知道有模板這回事的童鞋請忽視)
普通函數、函數重載、模板函數 認識。
//學過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;} //只需要定義一個函數與只使用一個函數實現兩數相加。
2.函數、結構體、類 模板的 定義樣例:
//函數模板---使用體現:調用函數時傳遞的參數類型。
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)是聲明數據類型參數標識符的關鍵字,用以說明它后面的標識符是數據類型標識符。這樣,在以后定義的這個函數中,凡希望根據實參數據類型來確定數據類型的變量,都可以用數據類型參數標識符來說明,從而使這個變量可以適應不同的數據類型。
3.● 模板的基本思想 ●●●●●●
①當你發現一套操作對多個不同類型的變量操作時。例.我們想實現鏈棧這個類,里面的元素可以是int char。
②實現的時候,那個鏈棧的頭指針的類型就要為對應的 int節點、char節點...對應的指針類型。
③那就要復制粘貼 把int改成char 這樣就有兩個類 Stack_int Stack_char。
④用的時候當然沒問題 但是整個類實現下來行數是很多的。當我們看着多出那么多行只是 int char 不同重復的代碼,還容易寫錯。
⑤模板的就是在 類的定義前面和外部類成員函數實現代碼 加上template<class T> ps.沒有分號,只有T能改。
⑥接着就是把 int char 的地方 全部改成 T。。。類名換成Stack就可以
⑦這樣就造出來了 Stack_int與Stack_char 的一個模板
⑧之前聲明 對象的時候是{Stack_int a;Stack_char b;} 現在是{Stack<int> a;Stack<char> b;}
完美了!!!感覺模板只是把多個重復的代碼化簡成單個。。。。o.o。。。但確實好用。。。
4.使用中應該注意的問題:
①函數模板允許使用多個類型參數,但在template定義部分的每個形參前必須有關鍵字typename或class,即:
template<class 數據類型參數標識符1,…,class 數據類型參數標識符n> <返回類型><函數名>(參數表) { 函數體 }
②在template語句與函數模板定義語句<返回類型>之間不允許有別的語句。如下面的聲明是錯誤的:
template<class T> int I; T min(T x,T y) { 函數體 }
③模板函數類似於重載函數,但兩者有很大區別:函數重載時,每個函數體內可以執行不同的動作,但同一個函數模板實例化后的模板函數都必須執行相同的動作。
④思在函數模板與模板函數調用之間 聲明一個模板函數“類似”的函數,這參數會有一個隱式的轉換!
5.學習性代碼:
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