日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

重载函数与函数模板(转)

發(fā)布時(shí)間:2025/7/14 编程问答 13 豆豆
生活随笔 收集整理的這篇文章主要介紹了 重载函数与函数模板(转) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

原文地址:http://www.jizhuomi.com/software/45.html

????? hello,everyone,雞啄米上一節(jié)講到的是函數(shù)的參數(shù)傳遞和內(nèi)聯(lián)函數(shù),這一講雞啄米會(huì)給大家講點(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ù)或者類型不同,編譯器會(huì)根據(jù)實(shí)參與形參的類型和個(gè)數(shù)進(jìn)行最佳匹配,自動(dòng)確定調(diào)用哪一個(gè)函數(shù)。

????? 為什么要有重載函數(shù)呢?因?yàn)槿绻麤]有重載函數(shù),那么對(duì)不同類型的數(shù)據(jù)進(jìn)行類似的操作也要定義不同名稱的函數(shù),比如加法函數(shù),就必須對(duì)整數(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ù)返回值類型不同,編譯器也會(huì)認(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ù)雖然形參名不同,但是編譯器不會(huì)以形參名來區(qū)分函數(shù),它會(huì)認(rèn)為這是一個(gè)函數(shù)。我們以后也要記住,若只改變形參名則函數(shù)不會(huì)變,調(diào)用的地方也不必變。

int add(int x,int y); void add(int x,int y);

???? ?上面這兩個(gè)函數(shù)返回值不同,確實(shí)是兩個(gè)函數(shù),但是編譯器也不會(huì)以返回值來區(qū)分函數(shù),也會(huì)認(rèn)為是重復(fù)定義。

????? 2.重載函數(shù)都是進(jìn)行類似的操作,不要把不同的功能定義成重載函數(shù),否則會(huì)讓人對(duì)調(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í)候是不是會(huì)混淆?????? ?雞啄米給大家一個(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,則屏幕會(huì)接著顯示integer 2+3=5,然后繼續(xù)提示Enter two float:,我們繼續(xù)輸入2.1 3.4,最后屏幕會(huì)出現(xiàn)float 2.1+3.4=5.5。

二.函數(shù)模板

??????? 有時(shí)候我們使用重載函數(shù)還不能達(dá)到最優(yōu)的效果,比如,兩個(gè)求絕對(duì)值的函數(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ā)效率也會(huì)提高的。這就要函數(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í)符>函數(shù)定義

?????? 雞啄米給大家一個(gè)上面那樣求絕對(duì)值的函數(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è)程序,編譯器會(huì)根據(jù)調(diào)用abs函數(shù)時(shí)傳入實(shí)參的類型來確定函數(shù)模板的類型參數(shù)是什么類型。上面使用調(diào)用表達(dá)式abs(n)時(shí),因?yàn)閚是int類型,所以模板中類型參數(shù)T就是int,然后編譯器會(huì)以函數(shù)模板為樣板生成一個(gè)函數(shù):

int abs(int x) {return x<0 ? -x:x; }

????? 同樣,對(duì)于調(diào)用表達(dá)式abs(d),因?yàn)閐是double類型,所以類型參數(shù)T就是double,編譯器會(huì)根據(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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。