C++函數(shù)模版與重載的區(qū)別
C++函數(shù)模版與重載的區(qū)別
微信公眾號(hào):楊源鑫
如果你覺得本文對(duì)你有幫助,歡迎留言探討!
首先,先來看一個(gè)例子:
#include <iostream>
using namespace std ;
//C++函數(shù)模版兩種定義方式
//template < typename T> 或 template <class T>
template <typename T1>
T1 check_max(T1 x, T1 y);
template <class T>
T print_value(T x, T y);
//C++重載
int add(int x,int y);
int add(int x,int y,int z);
string add(string str , string str1 , string str2);
int main(void)
{
int x = 33;
int y = 44;
long l1 = 333, l2 = 444;
float f1 = 3.14, f2 = 3.15926;
//系統(tǒng)會(huì)自動(dòng)識(shí)別類型 T1為int類型
cout << "max(x, y) = " << check_max(x, y) << endl;
//系統(tǒng)會(huì)自動(dòng)識(shí)別類型 T1為long類型
cout << "max(x, y) = " << check_max(l1, l2) << endl;
//系統(tǒng)會(huì)自動(dòng)識(shí)別類型 T1為float類型
cout << "max(x, y) = " << check_max(f1, f2) << endl;
cout << "==========================================" << endl ;
print_value(x,y);
print_value(l1,l2);
print_value(f1,f2);
//重載的使用
cout << "==========================================" << endl ;
cout << add(x,y) << endl ;
cout << add(x,y,x) << endl ;
cout << add("hello"," ","world") << endl ;
return 0;
}
template <typename T1>
T1 check_max(T1 x, T1 y)
{
return x > y ? x : y;
}
template <typename T>
T print_value(T x, T y)
{
cout <<"x:"<< x << endl ;
cout <<"y:"<< y << endl ;
}
int add(int x,int y)
{
return x+y ;
}
int add(int x,int y,int z)
{
return x+y+z ;
}
string add(string str , string str1 , string str2)
{
return str+str1+str2 ;
}
運(yùn)行結(jié)果:
從代碼中我們可以學(xué)習(xí)到,模板的定義方式一般有兩種,分別為:template < typename T> 或 template
所謂的函數(shù)模板,實(shí)際上是建立一個(gè)通用的函數(shù),其函數(shù)的類型和形參的類型不具體指定,用一個(gè)虛擬的類型來代表,這個(gè)通用的函數(shù)就成為函數(shù)模板。凡是函數(shù)體相同的函數(shù)都可以用這個(gè)模板來代替,而不必定義多個(gè)函數(shù),只需在模板中定義一次就行了,在調(diào)用函數(shù)的時(shí)候系統(tǒng)會(huì)根據(jù)實(shí)參的類型來取代模板中的虛擬類型,從而實(shí)現(xiàn)了不同函數(shù)的功能。
如例程所示,定義了checkmax和printvalue這兩個(gè)函數(shù)模板,但我這里并沒有定義相關(guān)的類,調(diào)用函數(shù)的時(shí)候也能輸出正確的數(shù)值,這就說明不管是聲明為typename還是class,本質(zhì)都是一樣的,只是我們可以人為進(jìn)行區(qū)分。checkmax就是我們定義的模板函數(shù),用來判斷大小,而printvalue就是用來打印變量的數(shù)據(jù),僅此而已。
相對(duì)于函數(shù)重載而言,模板具有得天獨(dú)厚的優(yōu)勢(shì),它不需要重復(fù)定義,所以使用起來比函數(shù)重載更簡(jiǎn)潔,但應(yīng)注意的一點(diǎn),函數(shù)模板只適用于函數(shù)的參數(shù)個(gè)數(shù)相同而類型不同,且函數(shù)體相同的情況,如果參數(shù)的個(gè)數(shù)不同,則不能用函數(shù)模板,這就是函數(shù)模板相對(duì)于函數(shù)重載的缺陷。
我們?cè)賹?duì)上面的程序加以修改,我們?cè)俣x一個(gè)與模板函數(shù)check_max名稱一模一樣的函數(shù)名字,實(shí)際上就是函數(shù)重載了,看看下面這個(gè)例子:
#include <iostream>
using namespace std ;
//C++函數(shù)模版兩種定義方式
//template < typename T> 或 template <class T>
template <typename T1>
T1 check_max(T1 x, T1 y);
//C++重載
int check_max(int x,int y);
int main(void)
{
int x = 33;
int y = 44;
long l1 = 333, l2 = 444;
float f1 = 3.14, f2 = 3.15926;
//系統(tǒng)會(huì)優(yōu)先調(diào)用重載函數(shù),而不是模板函數(shù)
cout << "max(x, y) = " << check_max(x, y) << endl;
//系統(tǒng)會(huì)自動(dòng)識(shí)別類型 T1為long類型
cout << "max(x, y) = " << check_max(l1, l2) << endl;
//系統(tǒng)會(huì)自動(dòng)識(shí)別類型 T1為float類型
cout << "max(x, y) = " << check_max(f1, f2) << endl;
cout << "==========================================" << endl ;
return 0;
}
template <typename T1>
T1 check_max(T1 x, T1 y)
{
cout << "調(diào)用模板函數(shù)打印" << endl ;
return x > y ? x : y;
}
int check_max(int x,int y)
{
cout << "調(diào)用重載函數(shù)打印" << endl ;
return x > y ? x : y ;
}
運(yùn)行結(jié)果:
如例程所示,我們定義了一個(gè)重載函數(shù),形參和返回值都為int類型的check_max函數(shù),當(dāng)我們?cè)趍ain函數(shù)里調(diào)用這個(gè)函數(shù),如果傳入為int的形參的時(shí)候,此時(shí)和模板發(fā)生了沖突,調(diào)用了重載函數(shù)來打印,而不是調(diào)用模板。 由此我們得出結(jié)論:當(dāng)模板和重載沖突的時(shí)候 ,就優(yōu)先調(diào)用重載。
免責(zé)聲明:本文內(nèi)容由21ic獲得授權(quán)后發(fā)布,版權(quán)歸原作者所有,本平臺(tái)僅提供信息存儲(chǔ)服務(wù)。文章僅代表作者個(gè)人觀點(diǎn),不代表本平臺(tái)立場(chǎng),如有問題,請(qǐng)聯(lián)系我們,謝謝!