C++程序函數(shù)的重載和函數(shù)模板示例代碼
在C++中,函數(shù)也可以重載。C++允許在同一作用域中用同一函數(shù)名定義多個(gè)函數(shù),這些函數(shù)的參數(shù)個(gè)數(shù)和參數(shù)類型不相同,這些同名的函數(shù)用來(lái)實(shí)現(xiàn)不同的功能,這就是函數(shù)的重載。
函數(shù)的重載的函數(shù)體是完全相同的,只是形參和類型不同,也要分別定義。為了解決這個(gè)問(wèn)題,C++提供了函數(shù)模板(function template)。函數(shù)模板,實(shí)際上是建立一個(gè)通用函數(shù)類型和形參類型不具體指定,用一個(gè)虛擬的類型來(lái)代表,這個(gè)通用函數(shù)就稱為函數(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ù)體是完全相同的,只是形參的類型不同。很多人自然會(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ò)誤寫法
將結(jié)束位置分號(hào)去掉即可,代碼如下:
template <typename T> // 正確寫法
或者后面緊跟獨(dú)立語(yǔ)句,可添加分號(hào),代碼如下:
// 模板聲明 template <typename T> // 定義通用函數(shù),用T作虛擬類型名 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作虛擬類型名 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作虛擬類型名 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-07C語(yǔ)言超詳細(xì)講解指針與結(jié)構(gòu)體
指針提供了對(duì)地址操作的一種方法,因此,使用指針可使得C語(yǔ)言能夠更高效地實(shí)現(xiàn)對(duì)計(jì)算機(jī)底層硬件的操作。另外,通過(guò)指針可以更便捷地操作數(shù)組。C數(shù)組允許定義可存儲(chǔ)相同類型數(shù)據(jù)項(xiàng)的變量,結(jié)構(gòu)是C編程中另一種用戶自定義的可用的數(shù)據(jù)類型,它允許您存儲(chǔ)不同類型的數(shù)據(jù)項(xiàng)2022-05-05C++ COM編程之QueryInterface函數(shù)(二)
這篇文章主要介紹了C++ COM編程之QueryInterface函數(shù)(二),本文是第二篇,第一篇請(qǐng)參閱相關(guān)文檔,需要的朋友可以參考下2014-10-10Qt信號(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è)和追蹤車輛
這篇文章主要為大家詳細(xì)介紹了使用OpenCV實(shí)現(xiàn)檢測(cè)和追蹤車輛,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-01-01C++字符數(shù)組的輸入輸出和字符串結(jié)束標(biāo)志使用講解
這篇文章主要介紹了C++字符數(shù)組的輸入輸出和符串結(jié)束標(biāo)志使用講解,是C++入門學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下2015-09-09C++實(shí)現(xiàn)查找二叉樹(shù)中和為某一值的所有路徑的示例
這篇文章主要介紹了C++實(shí)現(xiàn)查找二叉樹(shù)中和為某一值的所有路徑的示例,文中的方法是根據(jù)數(shù)組生成二叉排序樹(shù)并進(jìn)行遍歷,需要的朋友可以參考下2016-02-02