====================C++中引出模板的原因====================
我們大家都知道,C++給我們提供了眾多的數(shù)據(jù)類型,比如說(shuō)整型、浮點(diǎn)型、雙精度型、布爾型等等。而且C++還為我們提供了一種函數(shù)重載的方式,即函數(shù)名相同,但是類型不同,那么也可以被C++編譯器所認(rèn)識(shí)到,進(jìn)而可以輸出不同的結(jié)果。下面,我們以一個(gè)程序?yàn)槔齺?lái)說(shuō)明:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | #include <iostream> using namespace std; int sum( int a, int b); //兩個(gè)整型變量相加 double sum( double a, double b); //兩個(gè)雙精度型變量相加 float sum( float a, float b); ///兩個(gè)浮點(diǎn)型型變量相加 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<< "相加的結(jié)果為:" <<sum(x,y)<<endl; double l=1.11111f,m=2.22222f; cout<< "雙精度型變量的值為:" <<l<< " " <<m<<endl; cout<< "相加的結(jié)果為:" <<sum(l,m)<<endl; float p=1.2,q=2.3; cout<< "浮點(diǎn)型變量的值為:" <<p<< " " <<q<<endl; cout<< "相加的結(jié)果為:" <<sum(p,q)<<endl; return 0; } |
在上面這個(gè)程序的第4、5和6行,我們分別重載了sum()函數(shù),這三個(gè)sum()函數(shù)的功能是完全一樣的,都是返回一個(gè)兩數(shù)之和。但是我們注意到,每個(gè)sum()函數(shù)的類型不一樣,這樣,在主程序中輸入不同的參數(shù)時(shí),編譯器會(huì)自動(dòng)調(diào)用與之類型匹配的sum()函數(shù)輸出結(jié)果。程序運(yùn)行的結(jié)果如下:
上面這個(gè)程序雖然實(shí)現(xiàn)重載sum()函數(shù)達(dá)到對(duì)每種不同類型的參數(shù)的響應(yīng),但是,程序十分臃腫,一個(gè)小小的相加程序居然用了35行!這是不被接受的。那么我們不禁要想一想了,有沒有什么辦法能夠替代這種冗長(zhǎng)的程序呢?
答案其實(shí)就是運(yùn)用模板!有了模板,我們就不需要重載了,接下來(lái)我們同樣以這個(gè)相加的程序來(lái)作為例子說(shuō)明下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | #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<< "相加的結(jié)果為:" <<sum(x,y)<<endl; double l=1.11111f,m=2.22222f; cout<< "雙精度型變量的值為:" <<l<< " " <<m<<endl; cout<< "相加的結(jié)果為:" <<sum(l,m)<<endl; float p=1.2,q=2.3; cout<< "浮點(diǎn)型變量的值為:" <<p<< " " <<q<<endl; cout<< "相加的結(jié)果為:" <<sum(p,q)<<endl; return 0; } |
呵呵,直觀上這個(gè)程序就比剛剛那個(gè)簡(jiǎn)潔,只有22行。下面我們來(lái)認(rèn)真分析一下這個(gè)程序到底說(shuō)了什么。首先我們可以看到,在程序的第3行,我們就聲明了一個(gè)模板類型ElementType。這就是模板的聲明格式,如下:
template < class Type1, class Type2> |
template是聲明模板的關(guān)鍵字,尖括號(hào)中的class表示后面跟著的參數(shù)為自定義的模板類型,上面我們定義的類型為Type1和Type2。應(yīng)該特別注意的是,模板聲明之后不加;號(hào)?。。?/p>
之后在程序的5到8行我們用自定義的類型ElementType創(chuàng)建了一個(gè)模板函數(shù)。函數(shù)模板說(shuō)白了就是一個(gè)模子,用這個(gè)模子我們就可以創(chuàng)建出許多功能相同、參數(shù)類型和返回值不同的函數(shù),從而這樣就實(shí)現(xiàn)了代碼的重用~~~在這個(gè)函數(shù)中,我們并沒有為sum()函數(shù)提供具體的參數(shù)類型,只用ElementType來(lái)代替。這樣編譯器就會(huì)根據(jù)實(shí)際傳遞進(jìn)來(lái)的類型和我們自定義的函數(shù)模板來(lái)創(chuàng)建sum()函數(shù)。由于這種工作分別在程序的第14行、17行和20行被執(zhí)行了3次,所以說(shuō)sum()函數(shù)被重載了3次,以適應(yīng)不同的類型的數(shù)據(jù)。
聯(lián)系客服