模板的作用我們已經知道了,類模板的作用就是建立乙個可以公用的類,這個類模板裡面的成員及其資料型別不用制定,同樣是由乙個虛擬的型別來表示的。類模板中的資料成員以及成員函式的引數和返回值都可以進行任意資料型別的選擇,乙個類模板定義好之後,可以減少定義宣告符合該模板的類的數量。
類的使用如下:
template類
由此可以看出函式模板和類模板之間的區別很簡單,在template之後跟的是函式就是函式模板,跟的是類就是類模板。
來個簡單的例子來看一下:
templateclass car
nametype c_name;
pricetype c_price;
};
需要多少種型別,就在尖括號<>中寫入多少種型別的定義。在定義好類模板之後,要通過類模板來例項化物件:
carp1("寶馬", 100);
尖括號<>中的string和int代表用到的引數型別嗎,<>代表模板引數列表,就是將string和int等型別作為了引數,而「寶馬」和「100」則是物件例項化後的資料成員,即string---->nametype,寶馬---->name,int---->pricetype,100---->price,這四個和模板中的是一一對應起來的。
下面定義乙個函式將車輛的資訊列印出來:
void car::printcar()
這是在類外定義,注意同樣要加上尖括號<>,在類內定義則不需要,直接定義即可。整個**如下:
#include#includeusing namespace std;
templateclass car
void printcar();
nametype c_name;
pricetype c_price;
};void car::printcar()
void test()
void main()
執行結果為:
類模板和函式模板的定義方式相近,在宣告標識語句之後跟的是函式就是函式模板,跟的是類就是類模板,從上面的例子我們可以看出,類模板是沒有辦法自己推導出資料型別的,但是類模板在模板引數列表中可以有預設引數。
car car1("寶馬", 100); //報錯
這樣的語句是直接報錯的,因為類模板沒有辦法進行資料型別的推導的。
template...
carcar1("賓士", 200);
模板引數列表為預設引數,因此後面的語句不會報錯。整體**如下。
#include using namespace std;
#includetemplateclass car
void printcar()
nametype c_name;
pricetype c_price;
};void test()
void test01()
void main()
在這裡要提到的一點, 就是類模板中的成員函式在呼叫時候才被建立,不同於一般類中的成員函式,在一開始就可以建立。
#include#includeusing namespace std;
class car1
};class car2
};templateclass car
void fun02() };
int main()
上面的**是可以進行編譯的,並且還可以通過,按照邏輯分析一波,在類模板中,我定義了乙個引數m_cart,但是它的型別是t,是乙個未知的資料型別,你並不知道它是car1還是car2的變數,問題就來了,乙個未知型別的變數呼叫其他類中的成員函式為什麼不會報錯?
這是因為類模板中的成員函式只有在被呼叫的時候才會去建立,在未被呼叫的時候並不存在 ,類模板中的兩個成員函式fun01和fun02都沒有被呼叫,因此是沒有被建立出來的,在這裡我們如果加入乙個test函式來對其進行呼叫,看一下是否報錯:
void test()
然後編譯報錯,因為car1是car1型別的物件,再加上乙個car2型別的變數car2執行car2.fun02()即可通過。
類模板可以例項化的物件,如果將物件傳入到函式,就是將類模板物件作為函式引數進行傳參。
提到傳參,我們肯定是比較熟悉的了。類模板物件作為函式引數進行傳入的方式一般有三種:一、指定傳入的型別,直接顯示物件的資料型別;二、引數模板化,將物件中的引數變為模板進行傳遞;三、將整個類模板化,將物件模板化進行傳參。上面的例子就是第三種方式的傳參。
下面是指定傳入的型別進行傳參
//將car1作為乙個實參傳入到函式中,在函式體內呼叫類模板內的函式
void showcar1(car&p) //指定傳入的型別
...void test()
這種方式沒有直接呼叫類模板中的printcar,而是通過乙個新的函式將物件作為乙個實參傳入到乙個顯得函式中,並在新的函式中對類模板中的函式進行呼叫。
然後是第二種方式:
//實現引數模板化
templatevoid showcar2(car&p)
...void test01() //引數模板化的test
引數模板化的重點在於所需要的引數型別變為模板,同樣是通過template來實現的,在尖括號中輸入所需要的引數型別的個數,在具體的函式實現中使用模板來定義例項物件的型別。(我總感覺這一點不就是函式模板嘛!為啥非要這麼寫呢?)
接下來是第三種方式:
//整個類模板化
templatevoid showcar3(t &p)
....
void test02() //整個類模板化的test
這種方式我們應該比較熟悉了,直接將整個類變成乙個模板,需要什麼型別的資料就取什麼型別。
上面三種傳參方式的全部**和執行結果如下:
#include#includeusing namespace std;
templateclass car
void printcar();
nametype c_name;
pricetype c_price;
};void car::printcar()
//將car1作為乙個實參傳入到函式中,在函式體內呼叫類模板內的函式
void showcar1(car&p)
//實現引數模板化
templatevoid showcar2(car&p)
//整個類模板化
templatevoid showcar3(t &p)
void test()//指定傳入型別的test
void test01() //引數模板化的test
void test02() //整個類模板化的test
希望大家可以進行對比並理解他們之間的不同,能夠給大家帶來一些幫助!
另外!!!!!
提到類模板種的類,必有繼承,因此剩下的內容後續更新!溜了溜了~~
類模板 模板類
下面定義的是類模板,用int例項化t後成為模板類。例項化類模板的語法 類名 模板實參表 結合下例即 array就是將類模板array例項化為模板類的語法。類模板 include using namespace std templateclass array array t operator int ...
複製模板類2
問題及 檔名稱 test.cpp 作 者 李盈盈 完成日期 2015年 04 月 15 日 版 本 號 v1.0 問題描述 設計complex,使實部和虛部的型別為定義物件時指定的實際型別,用友員函式實現的加法。輸入描述 無 程式輸出 輸出複數相加的結果。include using namespac...
模板 類模板
類模板 建立乙個通用類,將其資料成員,成員函式的返回型別和形參型別不具體指定,用乙個虛擬的型別來代表,系統會根據實參的型別來定義模板中虛擬型別從而實現不同類的功能。類模板的格式 用類模板定義物件時 類模板名 實際型別名 物件名 實參列表 成員函式定義在類模板體外定義要求 需要在成員函式定義之前進行模...