重载函数与函数模板(转)
原文地址:http://www.jizhuomi.com/software/45.html
????? hello,everyone,雞啄米上一節(jié)講到的是函數(shù)的參數(shù)傳遞和內(nèi)聯(lián)函數(shù),這一講雞啄米會給大家講點(diǎn)稍微有點(diǎn)難度的函數(shù)重載和函數(shù)模板,如果大家把之前的編程入門課程都掌握了,這一講的內(nèi)容自己上機(jī)試下就很容易理解了。
??????一.重載函數(shù)
???? ?現(xiàn)實(shí)生活中的一個(gè)詞可能有多種含義,比如,洗衣服、洗頭、洗車,都有一個(gè)洗字,但是他們的操作方式是不一樣的。函數(shù)也一樣,有時(shí)候它們的操作不完全一樣但是名字一樣,這就是重載函數(shù)。
????? 重載函數(shù)就是,兩個(gè)以上的函數(shù)取相同的函數(shù)名,但是函數(shù)形參的個(gè)數(shù)或者類型不同,編譯器會根據(jù)實(shí)參與形參的類型和個(gè)數(shù)進(jìn)行最佳匹配,自動確定調(diào)用哪一個(gè)函數(shù)。
????? 為什么要有重載函數(shù)呢?因?yàn)槿绻麤]有重載函數(shù),那么對不同類型的數(shù)據(jù)進(jìn)行類似的操作也要定義不同名稱的函數(shù),比如加法函數(shù),就必須對整數(shù)加法和浮點(diǎn)數(shù)加法分別定義不同的函數(shù)名:
int nadd(int a, int b); float fadd(float a, float b);????? 這樣調(diào)用需要記住的函數(shù)名太多,而且功能類似,很不方便。雞啄米給大家舉幾個(gè)重載函數(shù)的例子:形參類型不同的例子:
int add(int x,int y); float add(float x,float y);????? 形參個(gè)數(shù)不同的例子:
int add(int x,int y); int add(int x,int y,int z);????? 1.重載函數(shù)的形參不管是類型還是個(gè)數(shù)必須有一樣是不同的。因?yàn)榫幾g器就是看實(shí)參和哪個(gè)函數(shù)的形參的類型及個(gè)數(shù)匹配,來判斷調(diào)用哪個(gè)函數(shù),如果函數(shù)名、 形參類型和個(gè)數(shù)相同,即使函數(shù)返回值類型不同,編譯器也會認(rèn)為是函數(shù)重復(fù)定義的語法錯(cuò)誤,就是說它認(rèn)為是一個(gè)函數(shù)。以下兩種是錯(cuò)誤的重載函數(shù):
int add(int x,int y);int add(int a,int b);????? 上面兩個(gè)函數(shù)雖然形參名不同,但是編譯器不會以形參名來區(qū)分函數(shù),它會認(rèn)為這是一個(gè)函數(shù)。我們以后也要記住,若只改變形參名則函數(shù)不會變,調(diào)用的地方也不必變。
int add(int x,int y); void add(int x,int y);???? ?上面這兩個(gè)函數(shù)返回值不同,確實(shí)是兩個(gè)函數(shù),但是編譯器也不會以返回值來區(qū)分函數(shù),也會認(rèn)為是重復(fù)定義。
????? 2.重載函數(shù)都是進(jìn)行類似的操作,不要把不同的功能定義成重載函數(shù),否則會讓人對調(diào)用有誤解,比如:
int add(int x,int y) { return x+y; }float add(float x,float y) { return x-y; }????? 這兩個(gè)函數(shù)一個(gè)是實(shí)現(xiàn)的兩個(gè)數(shù)的加法,一個(gè)是實(shí)現(xiàn)減法,在語法上并沒有問題。但是功能不一樣但是都叫add,我們調(diào)用的時(shí)候是不是會混淆?????? ?雞啄米給大家一個(gè)重載函數(shù)的例子,大家仔細(xì)研究下代碼,上機(jī)試下,通過上面的講解,很容易理解:
#include<iostream> using namespace std; int add(int m,int n); // 函數(shù)調(diào)用前必須先聲明函數(shù)原型 float add(float x,float y);int main() {int m, n;float x, y;cout<<"Enter two integer: ";cin>>m>>n;cout<<"integer <<m<<'+'<<n<<"="<<add(m,n)<<endl;cout<<"Enter two float: ";cin>>x>>y;cout<<"float "<<x<<'+'<<y<<"= "<<add(x,y)<<endl;return 0; } int add(int m,int n) { return m+n; } float add(float x,float y) { return x+y; }????? 屏幕先輸出Enter two integer:,我們輸入2 3,則屏幕會接著顯示integer 2+3=5,然后繼續(xù)提示Enter two float:,我們繼續(xù)輸入2.1 3.4,最后屏幕會出現(xiàn)float 2.1+3.4=5.5。
二.函數(shù)模板
??????? 有時(shí)候我們使用重載函數(shù)還不能達(dá)到最優(yōu)的效果,比如,兩個(gè)求絕對值的函數(shù):
int abs(int x) {return x<0 ? -x:x; } double abs(double x) {return x<0 ? -x:x; }????? 大家觀察下這兩個(gè)函數(shù),這兩個(gè)函數(shù)只是返回值類型和參數(shù)類型不同,功能完全一樣,如果能有辦法寫一段通用的代碼適用于多種不同的數(shù)據(jù)類型,就是不用 像上面那樣寫兩個(gè)函數(shù)而只是一段代碼就能實(shí)現(xiàn)兩個(gè)函數(shù)的功能,那代碼的復(fù)用性不是更高了嗎?開發(fā)效率也會提高的。這就要函數(shù)模板來實(shí)現(xiàn)了。
????? 模板是有可以使用和操作任何數(shù)據(jù)類型的通用代碼構(gòu)成,這種程序設(shè)計(jì)叫做參數(shù)化程序設(shè)計(jì),因?yàn)樗褦?shù)據(jù)類型當(dāng)成了參數(shù),可以用來創(chuàng)建一個(gè)通用功能的函數(shù),支持多種不同類型的形參和返回值。函數(shù)模板的定義形式是:
template <typename 標(biāo)識符>函數(shù)定義?????? 雞啄米給大家一個(gè)上面那樣求絕對值的函數(shù)模板示例:
#include<iostream> using namespace std;template <typename T> T abs(T x) {return x<0 ? -x:x; }int main() {int n = 5;double d = -2.3;cout << abs(n) << endl;cout << abs(d) << endl;return 0; }????? 雞啄米給大家分析下這個(gè)程序,編譯器會根據(jù)調(diào)用abs函數(shù)時(shí)傳入實(shí)參的類型來確定函數(shù)模板的類型參數(shù)是什么類型。上面使用調(diào)用表達(dá)式abs(n)時(shí),因?yàn)閚是int類型,所以模板中類型參數(shù)T就是int,然后編譯器會以函數(shù)模板為樣板生成一個(gè)函數(shù):
int abs(int x) {return x<0 ? -x:x; }????? 同樣,對于調(diào)用表達(dá)式abs(d),因?yàn)閐是double類型,所以類型參數(shù)T就是double,編譯器會根據(jù)函數(shù)模板生成下面的函數(shù):
double abs(double x) {return x<0 ? -x:x; }????? 所以,abs(n)實(shí)際上調(diào)用的是函數(shù)模板生成的函數(shù):int abs(int x)。而abs(d)調(diào)用的是由函數(shù)模板生成的函數(shù):double abs(double x)。
???????最后,雞啄米跟大家簡單說下C++系統(tǒng)函數(shù)。C++系統(tǒng)庫中提供了幾百個(gè)函數(shù)供我們使用,我們只要用include指令包含相應(yīng)的頭文件就可以使用了。比 如,包含了math.h文件我們就可以使用abs、sqrt、sin等函數(shù)。如果需要用到一些庫函數(shù)可以msdn上查也可以上網(wǎng)查。
轉(zhuǎn)載于:https://www.cnblogs.com/fuxianfeng1988/p/3273141.html
總結(jié)
以上是生活随笔為你收集整理的重载函数与函数模板(转)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: javascript经典广告代码.rar
- 下一篇: 算法函数:得到一个字符串中的最大长度的数