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


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM