「模板」學習筆記(1)
====================C++中引出模板的原因====================
我們大家都知道,C++給我們提供了眾多的數據類型,比如說整型、浮點型、雙精度型、布爾型等等。而且C++還為我們提供了一種函數重載的方式,即函數名相同,但是類型不同,那麼也可以被C++編譯器所認識到,進而可以輸出不同的結果。下面,我們以一個程序為例來說明:
1234567891011121314151617181920212223242526272829303132333435 | #include <iostream> using namespace std; int sum( int a, int b); //兩個整型變數相加 double sum( double a, double b); //兩個雙精度型變數相加 float sum( float a, float b); ///兩個浮點型型變數相加 int sum( int a, int b) {
return a+b; } double sum( double a, double b) {
return a+b; } float sum( float a, float b) {
return a+b; } int main() {
int x=1,y=2;
cout<< "整型變數的值為:" <<x<< " " <<y<<endl;
cout<< "相加的結果為:" <<sum(x,y)<<endl;
double l=1.11111f,m=2.22222f;
cout<< "雙精度型變數的值為:" <<l<< " " <<m<<endl;
cout<< "相加的結果為:" <<sum(l,m)<<endl;
float p=1.2,q=2.3;
cout<< "浮點型變數的值為:" <<p<< " " <<q<<endl;
cout<< "相加的結果為:" <<sum(p,q)<<endl;
return 0; } |
在上面這個程序的第4、5和6行,我們分別重載了sum()函數,這三個sum()函數的功能是完全一樣的,都是返回一個兩數之和。但是我們注意到,每個sum()函數的類型不一樣,這樣,在主程序中輸入不同的參數時,編譯器會自動調用與之類型匹配的sum()函數輸出結果。程序運行的結果如下:
上面這個程序雖然實現重載sum()函數達到對每種不同類型的參數的響應,但是,程序十分臃腫,一個小小的相加程序居然用了35行!這是不被接受的。那麼我們不禁要想一想了,有沒有什麼辦法能夠替代這種冗長的程序呢?
答案其實就是運用模板!有了模板,我們就不需要重載了,接下來我們同樣以這個相加的程序來作為例子說明下:
12345678910111213141516171819202122 | #include <iostream> using namespace std; template < class ElementType> //聲明模板類型 ElementType sum(ElementType a,ElementType b) {
return a+b; } int main() {
int x=1,y=2;
cout<< "整型變數的值為:" <<x<< " " <<y<<endl;
cout<< "相加的結果為:" <<sum(x,y)<<endl;
double l=1.11111f,m=2.22222f;
cout<< "雙精度型變數的值為:" <<l<< " " <<m<<endl;
cout<< "相加的結果為:" <<sum(l,m)<<endl;
float p=1.2,q=2.3;
cout<< "浮點型變數的值為:" <<p<< " " <<q<<endl;
cout<< "相加的結果為:" <<sum(p,q)<<endl;
return 0; } |
呵呵,直觀上這個程序就比剛剛那個簡潔,只有22行。下面我們來認真分析一下這個程序到底說了什麼。首先我們可以看到,在程序的第3行,我們就聲明了一個模板類型ElementType。這就是模板的聲明格式,如下:
template < class Type1, class Type2> |
template是聲明模板的關鍵字,尖括弧中的class表示後面跟著的參數為自定義的模板類型,上面我們定義的類型為Type1和Type2。應該特別注意的是,模板聲明之後不加;號!!!
之後在程序的5到8行我們用自定義的類型ElementType創建了一個模板函數。函數模板說白了就是一個模子,用這個模子我們就可以創建出許多功能相同、參數類型和返回值不同的函數,從而這樣就實現了代碼的重用~~~在這個函數中,我們並沒有為sum()函數提供具體的參數類型,只用ElementType來代替。這樣編譯器就會根據實際傳遞進來的類型和我們自定義的函數模板來創建sum()函數。由於這種工作分別在程序的第14行、17行和20行被執行了3次,所以說sum()函數被重載了3次,以適應不同的類型的數據。
推薦閱讀:
※調研筆記 | 恐襲頻發,歐洲真已束手無策了嗎?
※華德福培訓筆記之
※【中華文化筆記第四章】百家爭鳴(三),儒家概述
※紀昀《閱微草堂筆記》卷十四·槐西雜誌四
※【筆記】遁甲滴雲錄--聶芒種 撰