C++深入了解模板的使用
一.泛型編程
泛型編程:不再是針對某種類型,能適應廣泛的類型,跟具體的類型無關的代碼
如何實現(xiàn)一個通用的交換函數呢?
void Swap(int& left, int& right)
{
int temp = left;
left = right;
right = temp;
}
void Swap(double& left, double& right)
{
double temp = left;
left = right;
right = temp;
}使用函數重載雖然可以實現(xiàn),但是有一下幾個不好的地方: 1. 重載的函數僅僅是類型不同,代碼復用率比較低,只要有新類型出現(xiàn)時,就需要用戶自己增 加對應的函數 2. 代碼的可維護性比較低,一個出錯可能所有的重載均出錯
因此我們需要告訴編譯器一個模子,讓編譯器根據不同的類型利用該模子來生成代碼
二.函數模板

模板分為:函數模板,類模板
1.函數模板概念
函數模板代表了一個函數家族,該函數模板與類型無關,在使用時被參數化,根據實參類型產生 函數的特定類型版本。
2.函數模板格式
template<typename T>
返回值類型 函數名(參數列表){}
說明:
1.template<class T> 和 template<typename T>在此暫時認為一樣,template<struct T>是 錯誤的 ,沒有這種寫法
2.T是type的縮寫,T不一定寫T,可以寫任意字母,比如X,t ……但是習慣寫為T
舉例:
template<typename T> //或template<class T>
void Swap(T& left, T& right)
{
T tmp = left;
left = right;
right = tmp;
}
int main()
{
int a = 0, b = 1;
double c = 2.2, d = 3.3;
swap(a, b);
swap(c, d);
return 0;
}swap(a, b); 和swap(c, d); 調用的是同一個函數嗎?
答:不是同一個。底層匯編可以看出不是同一個,如果調試時發(fā)現(xiàn)走的是同一個函數,其實是編譯器的優(yōu)化導致。

實際上以后swap函數都不用自己寫了,庫中有模板,直接用就行

3.函數模板的原理
在編譯器編譯階段 ,對于模板函數的使用, 編譯器需要根據傳入的實參類型來推演生成對應類型 的函數 以供調用。比如: 當用 double 類型使用函數模板時,編譯器通過對實參類型的推演,將 T 確定為 double 類型,然后產生一份專門處理 double 類型的代碼 ,對于字符類型也是如此。 模板的實例化:

三.類模板
類模板的定義格式
template < class T1 , class T2 , ..., class Tn >
class 類模板名
{
// 類內成員定義
};
舉例:調用 Stack<int> st1; 時,用int替換模板中的T。調用 Stack<double> st1; 時,用double替換模板中的T
// 類模板
template<class T>
class Stack
{
public:
Stack(int capacity = 0)
{
_a = new T[capacity];
_capacity = capacity;
_top = 0;
}
~Stack()
{
cout << "~Stack()" << endl;
delete[] _a;
_capacity = 0;
_top = 0;
}
void Push(const T& x)
{}
private:
T* _a;
int _top;
int _capacity;
};
int main()
{
Stack<int> st1; // int
st1.Push(1);
Stack<double> st2; // double
st2.Push(2.2);
return 0;
}到此這篇關于C++深入了解模板的使用的文章就介紹到這了,更多相關C++模板內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

