C++模板學習:函數模板、結構體模板、類模板

C++模板:函數、結構體、類 模板實現

1.前言:(知道有模板這回事的童鞋請忽視)

  普通函數、函數重載、模板函數 認識。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;}
//只須要定義一個函數與只使用一個函數實現兩數相加。

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節點...對應的指針類型。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。。。但確實好用。。。

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

相關文章
相關標籤/搜索