C++程序函數(shù)的重載和函數(shù)模板示例代碼
在C++中,函數(shù)也可以重載。C++允許在同一作用域中用同一函數(shù)名定義多個(gè)函數(shù),這些函數(shù)的參數(shù)個(gè)數(shù)和參數(shù)類(lèi)型不相同,這些同名的函數(shù)用來(lái)實(shí)現(xiàn)不同的功能,這就是函數(shù)的重載。
函數(shù)的重載的函數(shù)體是完全相同的,只是形參和類(lèi)型不同,也要分別定義。為了解決這個(gè)問(wèn)題,C++提供了函數(shù)模板(function template)。函數(shù)模板,實(shí)際上是建立一個(gè)通用函數(shù)類(lèi)型和形參類(lèi)型不具體指定,用一個(gè)虛擬的類(lèi)型來(lái)代表,這個(gè)通用函數(shù)就稱(chēng)為函數(shù)模板。
一、函數(shù)的重載
求兩個(gè)數(shù)中最大的值(分別考慮整數(shù)、浮點(diǎn)數(shù)、長(zhǎng)整數(shù)的情況)。代碼如下:
#include <iostream>
using namespace std;
// 求最大值 - 整數(shù)
int max(int x, int y){
int z;
if(x > y) z = x;
else z = y;
return z;
}
// 求最大值 - 浮點(diǎn)數(shù)
float max(float x, float y){
float z;
if(x > y) z = x;
else z = y;
return z;
}
// 求最大值 - 長(zhǎng)整數(shù)
long max(long x, long y){
long z;
if(x > y) z = x;
else z = y;
return z;
}
int main(){
int a, b;
float c, d;
long e, f;
// 輸入流
cin >> a >> b;
cin >> c >> d;
cin >> e >> f;
// 計(jì)算大小
int max_int = max(a, b);
float max_float = max(c, d);
long max_long = max(e, f);
//輸出內(nèi)容
cout << "int max value:" << max_int << endl;
cout << "float max value:" << max_float << endl;
cout << "long max value:" << max_long << endl;
}編譯結(jié)果如下:

運(yùn)行結(jié)果如下:

二、函數(shù)模板
通過(guò)上面例子可以看出,函數(shù)重置的函數(shù)體是完全相同的,只是形參的類(lèi)型不同。很多人自然會(huì)想到,對(duì)此是否能簡(jiǎn)化。剛好C++提供了函數(shù)模板,可以解決這個(gè)問(wèn)題。
2.1 分號(hào)錯(cuò)誤
在定義函數(shù)模板時(shí),需要注意的是結(jié)束位置是不需要加分號(hào)的,除非是在模板聲明之后緊跟著另一個(gè)獨(dú)立的語(yǔ)句。如果在函數(shù)模板聲明結(jié)束位置添加分號(hào)后,編譯器在處理這額外的分號(hào)會(huì)報(bào)錯(cuò):“[Error] expected unqualified-id before ';' token”和“[Error] 'T' does not name a type”。代碼如下:
template <typename T>; // 錯(cuò)誤寫(xiě)法
將結(jié)束位置分號(hào)去掉即可,代碼如下:
template <typename T> // 正確寫(xiě)法
或者后面緊跟獨(dú)立語(yǔ)句,可添加分號(hào),代碼如下:
// 模板聲明
template <typename T>
// 定義通用函數(shù),用T作虛擬類(lèi)型名
T get_max(T a, T b){
T c;
if(a > b) c = a;
else c = b;
return c;
};2.2 重載命名錯(cuò)誤
可能是自己的代碼中定義了額外的 max 重載版本,這些版本與標(biāo)準(zhǔn)庫(kù)中的 max 函數(shù)產(chǎn)生了沖突,或者其他原因,導(dǎo)致繼續(xù)使用max命名函數(shù)時(shí),編譯時(shí)程序報(bào)錯(cuò):“[Error] call of overloaded 'max(int&, int&)' is ambiguous”。
編譯器在嘗試調(diào)用名為 max 的重載函數(shù)時(shí),發(fā)現(xiàn)了多個(gè)匹配的重載版本,但它無(wú)法確定應(yīng)該使用哪一個(gè),因此調(diào)用是模棱兩可的(ambiguous)。導(dǎo)致錯(cuò)誤代碼如下:
#include <iostream>
using namespace std;
// 模板聲明
template <typename T>
// 定義通用函數(shù),用T作虛擬類(lèi)型名
T max(T a, T b){
T c;
if(a > b) c = a;
else c = b;
return c;
}
int main(){
int a = 10, b = 15, max_int;
float c = 23.2, d = 32.22, max_float;
long e = 63425, f = -232, max_long;
// 計(jì)算最大值
max_int = max(a, b);
max_float = max(c, d);
max_long = max(e, f);
// 輸出數(shù)據(jù)
cout << "int max value:" << max_int << endl;
cout << "float max value:" << max_float << endl;
cout << "long max value:" << max_long << endl;
return 0;
} 因此,這邊將max修改為get_max后,錯(cuò)誤即可解決了。
2.3 函數(shù)模板實(shí)現(xiàn)
這里將上面例子通過(guò)函數(shù)模板重新實(shí)現(xiàn)一遍,前面已將函數(shù)模板定義分號(hào)問(wèn)題和函數(shù)命名問(wèn)題解決后,正確代碼如下:
#include <iostream>
using namespace std;
// 模板聲明
template <typename T>
// 定義通用函數(shù),用T作虛擬類(lèi)型名
T get_max(T a, T b){
T c;
if(a > b) c = a;
else c = b;
return c;
}
int main(){
int a = 10, b = 15, max_int;
float c = 23.2, d = 32.22, max_float;
long e = 63425, f = -232, max_long;
// 計(jì)算最大值
max_int = get_max(a, b);
max_float = get_max(c, d);
max_long = get_max(e, f);
// 輸出數(shù)據(jù)
cout << "int max value:" << max_int << endl;
cout << "float max value:" << max_float << endl;
cout << "long max value:" << max_long << endl;
return 0;
} 編譯結(jié)果如下:

運(yùn)行結(jié)果如下:

到此這篇關(guān)于C++程序函數(shù)的重載和函數(shù)模板的文章就介紹到這了,更多相關(guān)C++函數(shù)重載內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
利用C語(yǔ)言實(shí)現(xiàn)http服務(wù)器(Linux)
本文將利用C語(yǔ)言實(shí)現(xiàn)一個(gè)輕量級(jí)的http服務(wù)器,使用Reactor模式,即主線程只負(fù)責(zé)監(jiān)聽(tīng)文件描述符上是否有事件發(fā)生,有的話立即將該事件通知工作線程,感興趣的可以了解一下2022-07-07
C語(yǔ)言超詳細(xì)講解指針與結(jié)構(gòu)體
指針提供了對(duì)地址操作的一種方法,因此,使用指針可使得C語(yǔ)言能夠更高效地實(shí)現(xiàn)對(duì)計(jì)算機(jī)底層硬件的操作。另外,通過(guò)指針可以更便捷地操作數(shù)組。C數(shù)組允許定義可存儲(chǔ)相同類(lèi)型數(shù)據(jù)項(xiàng)的變量,結(jié)構(gòu)是C編程中另一種用戶自定義的可用的數(shù)據(jù)類(lèi)型,它允許您存儲(chǔ)不同類(lèi)型的數(shù)據(jù)項(xiàng)2022-05-05
C++ COM編程之QueryInterface函數(shù)(二)
這篇文章主要介紹了C++ COM編程之QueryInterface函數(shù)(二),本文是第二篇,第一篇請(qǐng)參閱相關(guān)文檔,需要的朋友可以參考下2014-10-10
Qt信號(hào)與槽知識(shí)點(diǎn)總結(jié)歸納
信號(hào)和槽是一種高級(jí)接口,應(yīng)用于對(duì)象之間的通信,它是QT的核心特性,下面這篇文章主要給大家介紹了關(guān)于Qt信號(hào)與槽知識(shí)點(diǎn)總結(jié)歸納的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-12-12
使用OpenCV實(shí)現(xiàn)檢測(cè)和追蹤車(chē)輛
這篇文章主要為大家詳細(xì)介紹了使用OpenCV實(shí)現(xiàn)檢測(cè)和追蹤車(chē)輛,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-01-01
C++字符數(shù)組的輸入輸出和字符串結(jié)束標(biāo)志使用講解
這篇文章主要介紹了C++字符數(shù)組的輸入輸出和符串結(jié)束標(biāo)志使用講解,是C++入門(mén)學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下2015-09-09
C++實(shí)現(xiàn)查找二叉樹(shù)中和為某一值的所有路徑的示例
這篇文章主要介紹了C++實(shí)現(xiàn)查找二叉樹(shù)中和為某一值的所有路徑的示例,文中的方法是根據(jù)數(shù)組生成二叉排序樹(shù)并進(jìn)行遍歷,需要的朋友可以參考下2016-02-02

