柚子快報(bào)邀請碼778899分享:java C++——模版
柚子快報(bào)邀請碼778899分享:java C++——模版
當(dāng)我們要書寫一個(gè)交換函數(shù)的時(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ù)模板代表了一個(gè)函數(shù)家族,該函數(shù)模板與類型無關(guān),在使用時(shí)被參數(shù)化,根據(jù)實(shí)參類型產(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ù)模板是一個(gè)藍(lán)圖,它本身并不是函數(shù),是編譯器用使用方式產(chǎn)生特定具體類型函數(shù)的模具。 所以其實(shí)模板就是將本來應(yīng)該我們做的重復(fù)的事情交給了編譯器
? ? ?在編譯器編譯階段,對于模板函數(shù)的使用,編譯器需要根據(jù)傳入的實(shí)參類型來推演生成對應(yīng)類型的函數(shù)以供調(diào)用。比如:當(dāng)用double類型使用函數(shù)模板時(shí),編譯器通過對實(shí)參類型的推演, 將T確定為double類型,然后產(chǎn)生一份專門處理double類型的代碼,對于字符類型也是如此。?
4.函數(shù)模板的實(shí)例化
? ? ?用不同類型的參數(shù)使用函數(shù)模板時(shí),稱為函數(shù)模板的實(shí)例化。模板參數(shù)實(shí)例化分為:隱式實(shí)例化 和顯式實(shí)例化。?
? ? 1. 隱式實(shí)例化:讓編譯器根據(jù)實(shí)參推演模板參數(shù)的實(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;
}
當(dāng)我們傳遞兩個(gè)不同類型的值的時(shí)候,就會出現(xiàn)報(bào)錯(cuò)的情況,所以有兩種解決的方案:
? 1.使用強(qiáng)轉(zhuǎn)? ?
? ?2.使用顯示實(shí)例化
Add(a1, (int)d1);//強(qiáng)轉(zhuǎn)
2.?顯式實(shí)例化:在函數(shù)名后的<>中指定模板參數(shù)的實(shí)際類型
Add
5.模板參數(shù)的匹配原則?
? ? 1. 一個(gè)非模板函數(shù)可以和一個(gè)同名的函數(shù)模板同時(shí)存在,而且該函數(shù)模板還可以被實(shí)例化為這 個(gè)非模板函數(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ù)的時(shí)候,會調(diào)用哪一個(gè)呢?
由此看見,都存在的情況下,會先執(zhí)行已經(jīng)編好的函數(shù),而不是模版函數(shù)。?
? ?2. 對于非模板函數(shù)和同名函數(shù)模板,如果其他條件都相同,在調(diào)動(dòng)時(shí)會優(yōu)先調(diào)用非模板函數(shù)而 不會從該模板產(chǎn)生出一個(gè)實(shí)例。如果模板可以產(chǎn)生一個(gè)具有更好匹配的函數(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
{
// 擴(kuò)容
_array[_size] = data;
++_size;
}
int main()
{
ST
ST
return 0;
}
因?yàn)榫幾g器不好確定棧的類型,所以這里用顯示實(shí)例化來進(jìn)行,使得編譯器可以確定其類型。
2 類模板的實(shí)例化?
? ?類模板實(shí)例化與函數(shù)模板實(shí)例化不同,類模板實(shí)例化需要在類模板名字后跟<>,然后將實(shí)例化的 類型放在<>中即可,類模板名字不是真正的類,而實(shí)例化的結(jié)果才是真正的類。
// ST是類名,ST
ST
ST
?
柚子快報(bào)邀請碼778899分享:java C++——模版
文章鏈接
本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點(diǎn)和立場。
轉(zhuǎn)載請注明,如有侵權(quán),聯(lián)系刪除。