C++程序函數(shù)的重載和函數(shù)模板示例代碼
在C++中,函數(shù)也可以重載。C++允許在同一作用域中用同一函數(shù)名定義多個函數(shù),這些函數(shù)的參數(shù)個數(shù)和參數(shù)類型不相同,這些同名的函數(shù)用來實現(xiàn)不同的功能,這就是函數(shù)的重載。
函數(shù)的重載的函數(shù)體是完全相同的,只是形參和類型不同,也要分別定義。為了解決這個問題,C++提供了函數(shù)模板(function template)。函數(shù)模板,實際上是建立一個通用函數(shù)類型和形參類型不具體指定,用一個虛擬的類型來代表,這個通用函數(shù)就稱為函數(shù)模板。
一、函數(shù)的重載
求兩個數(shù)中最大的值(分別考慮整數(shù)、浮點數(shù)、長整數(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;
}
// 求最大值 - 浮點數(shù)
float max(float x, float y){
float z;
if(x > y) z = x;
else z = y;
return z;
}
// 求最大值 - 長整數(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;
// 計算大小
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é)果如下:

運行結(jié)果如下:

二、函數(shù)模板
通過上面例子可以看出,函數(shù)重置的函數(shù)體是完全相同的,只是形參的類型不同。很多人自然會想到,對此是否能簡化。剛好C++提供了函數(shù)模板,可以解決這個問題。
2.1 分號錯誤
在定義函數(shù)模板時,需要注意的是結(jié)束位置是不需要加分號的,除非是在模板聲明之后緊跟著另一個獨立的語句。如果在函數(shù)模板聲明結(jié)束位置添加分號后,編譯器在處理這額外的分號會報錯:“[Error] expected unqualified-id before ';' token”和“[Error] 'T' does not name a type”。代碼如下:
template <typename T>; // 錯誤寫法
將結(jié)束位置分號去掉即可,代碼如下:
template <typename T> // 正確寫法
或者后面緊跟獨立語句,可添加分號,代碼如下:
// 模板聲明
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 重載命名錯誤
可能是自己的代碼中定義了額外的 max 重載版本,這些版本與標準庫中的 max 函數(shù)產(chǎn)生了沖突,或者其他原因,導致繼續(xù)使用max命名函數(shù)時,編譯時程序報錯:“[Error] call of overloaded 'max(int&, int&)' is ambiguous”。
編譯器在嘗試調(diào)用名為 max 的重載函數(shù)時,發(fā)現(xiàn)了多個匹配的重載版本,但它無法確定應該使用哪一個,因此調(diào)用是模棱兩可的(ambiguous)。導致錯誤代碼如下:
#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;
// 計算最大值
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后,錯誤即可解決了。
2.3 函數(shù)模板實現(xiàn)
這里將上面例子通過函數(shù)模板重新實現(xiàn)一遍,前面已將函數(shù)模板定義分號問題和函數(shù)命名問題解決后,正確代碼如下:
#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;
// 計算最大值
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é)果如下:

運行結(jié)果如下:

到此這篇關(guān)于C++程序函數(shù)的重載和函數(shù)模板的文章就介紹到這了,更多相關(guān)C++函數(shù)重載內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++ COM編程之QueryInterface函數(shù)(二)
這篇文章主要介紹了C++ COM編程之QueryInterface函數(shù)(二),本文是第二篇,第一篇請參閱相關(guān)文檔,需要的朋友可以參考下2014-10-10
C++字符數(shù)組的輸入輸出和字符串結(jié)束標志使用講解
這篇文章主要介紹了C++字符數(shù)組的輸入輸出和符串結(jié)束標志使用講解,是C++入門學習中的基礎(chǔ)知識,需要的朋友可以參考下2015-09-09
C++實現(xiàn)查找二叉樹中和為某一值的所有路徑的示例
這篇文章主要介紹了C++實現(xiàn)查找二叉樹中和為某一值的所有路徑的示例,文中的方法是根據(jù)數(shù)組生成二叉排序樹并進行遍歷,需要的朋友可以參考下2016-02-02

