C++?類模板與成員函數(shù)模板示例解析
類模板
前面以函數(shù)模板為例,介紹了具體化與實(shí)例化。那么對(duì)于類模板,有什么不同呢?
類包括成員變量和成員函數(shù),他們都可以包含類模板的模板參數(shù)。而成員函數(shù)本身也可以是函數(shù)模板??聪旅娴膬蓚€(gè)類:
// 類模板
template <typename T>
class A {
private:
T t;
public:
void funcA(T t);
};
template <typename T>
void A<T>::funcA(T t) {
cout << t;
}
// 成員函數(shù)模板
class B {
private:
int t;
public:
template <typename T>
void funcB(T t);
};
template <typename T>
void B::funcB(T t) {
cout << t;
}
int main()
{
A<int> a1;
a1.funcA(1);
A<char*> a2;
a2.funcA("2");
B b;
b.funcB(1);
b.funcB("2");
}
類模板A中包含成員函數(shù)funcA;類B包含一個(gè)成員函數(shù)模板funcB。我們仔細(xì)看下二者的區(qū)別。
類模板與成員函數(shù)模板的區(qū)別
首先,類模版A中的成員函數(shù)的類型可以用類模板參數(shù)T,而成員函數(shù)模板做不到。
其次,在調(diào)用成員函數(shù)時(shí),類模板A需要先指定一種類型創(chuàng)建一個(gè)實(shí)例對(duì)象(如代碼中的a1),然后才能調(diào)用成員函數(shù),a1.funcA只能傳入int類型參數(shù)。如果想傳char*類型參數(shù),必須用char*創(chuàng)建一個(gè)實(shí)例(代碼中的a2)。
而對(duì)于類B,則創(chuàng)建一個(gè)實(shí)例對(duì)象(b)之后,可以任何類型作為參數(shù)來(lái)調(diào)用funcB。
只要明白了前面講的模板實(shí)例化,這里面的原因也很好理解。對(duì)于A來(lái)說(shuō),整個(gè)類是一個(gè)模版,當(dāng)使用int類型生成對(duì)象a1時(shí),也會(huì)對(duì)類模板A進(jìn)行實(shí)例化,生成A類,其中所有的T都會(huì)替換為int,因此生成的類只有一個(gè)成員函數(shù) void funcA(int)。如果想傳入char*,則必須實(shí)例化A<char*>這個(gè)類。
而對(duì)于類B,它本身只是一個(gè)普通類,只不過(guò)它包含一個(gè)成員函數(shù)模板。當(dāng)編譯器發(fā)現(xiàn)代碼中有調(diào)用這個(gè)成員函數(shù)funcB(int),編譯時(shí)會(huì)為funcB實(shí)例化;如果也有調(diào)用funcB(char*),則會(huì)為B生成funcB<char*>成員函數(shù)。也就是說(shuō),類B的成員函數(shù)的數(shù)量不是確定的,是根據(jù)funcB被調(diào)用的情況來(lái)決定到底實(shí)例化出多少個(gè)成員函數(shù)。
以上就是C++ 類模板與成員函數(shù)模板示例解析的詳細(xì)內(nèi)容,更多關(guān)于C++ 類模板成員函數(shù)模板的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
基于Matlab制作一個(gè)不良圖片檢測(cè)系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了如何基于Matlab制作一個(gè)不良圖片檢測(cè)系統(tǒng),文中的示例代碼講解詳細(xì),感興趣的可以跟隨小編一起了解一下2022-07-07
VS報(bào)錯(cuò)C1189及MSB3721解決方法
在使用VS進(jìn)行CUDA編譯時(shí)出現(xiàn)錯(cuò)誤,本文主要介紹了VS報(bào)錯(cuò)C1189及MSB3721解決方法,具有一定的參考價(jià)值,感興趣的可以了解一下2024-06-06
數(shù)據(jù)結(jié)構(gòu) C語(yǔ)言實(shí)現(xiàn)循環(huán)單鏈表的實(shí)例
這篇文章主要介紹了數(shù)據(jù)結(jié)構(gòu) C語(yǔ)言實(shí)現(xiàn)循環(huán)單鏈表的實(shí)例的相關(guān)資料,需要的朋友可以參考下2017-05-05
為什么要學(xué)習(xí)C語(yǔ)言 C語(yǔ)言優(yōu)勢(shì)分析
不止一個(gè)學(xué)生問(wèn)到我:“老師,為什么我們的應(yīng)用程序設(shè)計(jì)要學(xué)C語(yǔ)言而不是別的?C語(yǔ)言不是已經(jīng)過(guò)時(shí)了嗎?如果現(xiàn)在要寫(xiě)一個(gè)Windows程序,用VB或Dephi開(kāi)發(fā)多快呀,用C行嗎?退一萬(wàn)步,為什么選擇C而不是C++呢?”2013-07-07
Qt creator中項(xiàng)目的構(gòu)建配置和運(yùn)行設(shè)置的步驟
使用 Qt Creator 集成開(kāi)發(fā)環(huán)境構(gòu)建和運(yùn)行程序是一件非常簡(jiǎn)單的事情,一個(gè)按鈕或者一個(gè)快捷鍵搞定全部,本文主要介紹了Qt creator中項(xiàng)目的構(gòu)建配置和運(yùn)行設(shè)置的步驟,感興趣的小伙伴們可以參考一下2021-11-11
C語(yǔ)言函數(shù)棧幀的創(chuàng)建和銷毀詳解
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言函數(shù)棧幀的創(chuàng)建和銷毀,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助2022-02-02

