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.學習性代碼:
template <class T>//結構體模板
struct node
{
T data;
struct node<T> *lchild;
struct node<T> *rchild;
};
template <class T>//類內類模板
class bin
{
private:
node <T> h;
public:
void pri();
};
template <class T>//類外成員函數實現模板
void bin<T>::pri()
{
node<T> *p = new node;
cout<<"qunimade"<<endl;
}
int _tmain(int argc, _TCHAR* argv[])
{
bin<int> abc;
}
2017-03-11 19:16:23 -> 2017-03-22 22:51:24 -> 2017-03-26 22:33:26
總結
以上是生活随笔為你收集整理的C++模板学习:函数模板、结构体模板、类模板的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 什么是非全尺寸备胎?(非全尺寸备胎是什么
- 下一篇: s3c2440移植MQTT