柚子快報邀請碼778899分享:java C++——模版
柚子快報邀請碼778899分享:java C++——模版
當我們要書寫一個交換函數(shù)的時候,我要考慮到存在多種類型的情況
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;
}
void Swap(char& left, char& right)
{
char temp = left;
left = right;
right = temp;
}
還有很多,我只列舉這些,那么這樣我想完成交換,就會變得非常的麻煩,所以C++出現(xiàn)了模版。
一.模版的類型
? ? 1.函數(shù)模版
? ? 2.類模板
二 . 函數(shù)模板
1 函數(shù)模板概念
? ? 函數(shù)模板代表了一個函數(shù)家族,該函數(shù)模板與類型無關(guān),在使用時被參數(shù)化,根據(jù)實參類型產(chǎn)生 函數(shù)的特定類型版本。
2. 函數(shù)模板格式
? ? template
? ? 返回值類型 函數(shù)名(參數(shù)列表){}
template
void Swap(T& left, T& right)
{
T temp = left;
left = right;
right = temp;
}
?注意:class是用來定義模板參數(shù)關(guān)鍵字,也可以使用typename切記:不能使用struct代替 class
3.函數(shù)模板的原理
? ? 函數(shù)模板是一個藍圖,它本身并不是函數(shù),是編譯器用使用方式產(chǎn)生特定具體類型函數(shù)的模具。 所以其實模板就是將本來應該我們做的重復的事情交給了編譯器
? ? ?在編譯器編譯階段,對于模板函數(shù)的使用,編譯器需要根據(jù)傳入的實參類型來推演生成對應類型的函數(shù)以供調(diào)用。比如:當用double類型使用函數(shù)模板時,編譯器通過對實參類型的推演, 將T確定為double類型,然后產(chǎn)生一份專門處理double類型的代碼,對于字符類型也是如此。?
4.函數(shù)模板的實例化
? ? ?用不同類型的參數(shù)使用函數(shù)模板時,稱為函數(shù)模板的實例化。模板參數(shù)實例化分為:隱式實例化 和顯式實例化。?
? ? 1. 隱式實例化:讓編譯器根據(jù)實參推演模板參數(shù)的實際類型
template
T Add(const T& left, const T& right)
{
return left + right;
}
int main()
{
int a1 = 10, a2 = 20;
double d1 = 10.0, d2 = 20.0;
Add(a1, a2);
Add(d1, d2);
return 0;
}
當我們傳遞兩個不同類型的值的時候,就會出現(xiàn)報錯的情況,所以有兩種解決的方案:
? 1.使用強轉(zhuǎn)? ?
? ?2.使用顯示實例化
Add(a1, (int)d1);//強轉(zhuǎn)
2.?顯式實例化:在函數(shù)名后的<>中指定模板參數(shù)的實際類型
Add
5.模板參數(shù)的匹配原則?
? ? 1. 一個非模板函數(shù)可以和一個同名的函數(shù)模板同時存在,而且該函數(shù)模板還可以被實例化為這 個非模板函數(shù)
int Add(int left, int right)
{
return left + right;
}
template
T Add(const T& left, const T& right)
{
return left * right;
}
int main()
{
int a = 10, b = 5;
cout << Add(a, b) << endl;
return 0;
}
那么我調(diào)用Add函數(shù)的時候,會調(diào)用哪一個呢?
由此看見,都存在的情況下,會先執(zhí)行已經(jīng)編好的函數(shù),而不是模版函數(shù)。?
? ?2. 對于非模板函數(shù)和同名函數(shù)模板,如果其他條件都相同,在調(diào)動時會優(yōu)先調(diào)用非模板函數(shù)而 不會從該模板產(chǎn)生出一個實例。如果模板可以產(chǎn)生一個具有更好匹配的函數(shù), 那么將選擇模板?
?
三.類模板
1 類模板的定義格式
template
class 類模板名
{
// 類內(nèi)成員定義
};
例子:?
#include
using namespace std;
// 類模版
template
class ST
{
public:
ST(size_t capacity = 4)
{
_array = new T[capacity];
_capacity = capacity;
_size = 0;
}
void Push(const T& data);
private:
T* _array;
int _capacity;
int _size;
};
template
void ST
{
// 擴容
_array[_size] = data;
++_size;
}
int main()
{
ST
ST
return 0;
}
因為編譯器不好確定棧的類型,所以這里用顯示實例化來進行,使得編譯器可以確定其類型。
2 類模板的實例化?
? ?類模板實例化與函數(shù)模板實例化不同,類模板實例化需要在類模板名字后跟<>,然后將實例化的 類型放在<>中即可,類模板名字不是真正的類,而實例化的結(jié)果才是真正的類。
// ST是類名,ST
ST
ST
?
柚子快報邀請碼778899分享:java C++——模版
文章鏈接
本文內(nèi)容根據(jù)網(wǎng)絡資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點和立場。
轉(zhuǎn)載請注明,如有侵權(quán),聯(lián)系刪除。