日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

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

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

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

????? hello,everyone,雞啄米上一節(jié)講到的是函數(shù)的參數(shù)傳遞和內聯(lián)函數(shù),這一講雞啄米會給大家講點稍微有點難度的函數(shù)重載和函數(shù)模板,如果大家把之前的編程入門課程都掌握了,這一講的內容自己上機試下就很容易理解了。

??????一.重載函數(shù)

???? ?現(xiàn)實生活中的一個詞可能有多種含義,比如,洗衣服、洗頭、洗車,都有一個洗字,但是他們的操作方式是不一樣的。函數(shù)也一樣,有時候它們的操作不完全一樣但是名字一樣,這就是重載函數(shù)。

????? 重載函數(shù)就是,兩個以上的函數(shù)取相同的函數(shù)名,但是函數(shù)形參的個數(shù)或者類型不同,編譯器會根據(jù)實參與形參的類型和個數(shù)進行最佳匹配,自動確定調用哪一個函數(shù)。

????? 為什么要有重載函數(shù)呢?因為如果沒有重載函數(shù),那么對不同類型的數(shù)據(jù)進行類似的操作也要定義不同名稱的函數(shù),比如加法函數(shù),就必須對整數(shù)加法和浮點數(shù)加法分別定義不同的函數(shù)名:

int nadd(int a, int b); float fadd(float a, float b);

????? 這樣調用需要記住的函數(shù)名太多,而且功能類似,很不方便。雞啄米給大家舉幾個重載函數(shù)的例子:形參類型不同的例子:

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

????? 形參個數(shù)不同的例子:

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

????? 1.重載函數(shù)的形參不管是類型還是個數(shù)必須有一樣是不同的。因為編譯器就是看實參和哪個函數(shù)的形參的類型及個數(shù)匹配,來判斷調用哪個函數(shù),如果函數(shù)名、 形參類型和個數(shù)相同,即使函數(shù)返回值類型不同,編譯器也會認為是函數(shù)重復定義的語法錯誤,就是說它認為是一個函數(shù)。以下兩種是錯誤的重載函數(shù):

int add(int x,int y);int add(int a,int b);

????? 上面兩個函數(shù)雖然形參名不同,但是編譯器不會以形參名來區(qū)分函數(shù),它會認為這是一個函數(shù)。我們以后也要記住,若只改變形參名則函數(shù)不會變,調用的地方也不必變。

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

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

????? 2.重載函數(shù)都是進行類似的操作,不要把不同的功能定義成重載函數(shù),否則會讓人對調用有誤解,比如:

int add(int x,int y) { return x+y; }float add(float x,float y) { return x-y; }

????? 這兩個函數(shù)一個是實現(xiàn)的兩個數(shù)的加法,一個是實現(xiàn)減法,在語法上并沒有問題。但是功能不一樣但是都叫add,我們調用的時候是不是會混淆?????? ?雞啄米給大家一個重載函數(shù)的例子,大家仔細研究下代碼,上機試下,通過上面的講解,很容易理解:

#include<iostream> using namespace std; int add(int m,int n); // 函數(shù)調用前必須先聲明函數(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ù)還不能達到最優(yōu)的效果,比如,兩個求絕對值的函數(shù):

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

????? 大家觀察下這兩個函數(shù),這兩個函數(shù)只是返回值類型和參數(shù)類型不同,功能完全一樣,如果能有辦法寫一段通用的代碼適用于多種不同的數(shù)據(jù)類型,就是不用 像上面那樣寫兩個函數(shù)而只是一段代碼就能實現(xiàn)兩個函數(shù)的功能,那代碼的復用性不是更高了嗎?開發(fā)效率也會提高的。這就要函數(shù)模板來實現(xiàn)了。

????? 模板是有可以使用和操作任何數(shù)據(jù)類型的通用代碼構成,這種程序設計叫做參數(shù)化程序設計,因為它把數(shù)據(jù)類型當成了參數(shù),可以用來創(chuàng)建一個通用功能的函數(shù),支持多種不同類型的形參和返回值。函數(shù)模板的定義形式是:

template <typename 標識符>函數(shù)定義

?????? 雞啄米給大家一個上面那樣求絕對值的函數(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; }

????? 雞啄米給大家分析下這個程序,編譯器會根據(jù)調用abs函數(shù)時傳入實參的類型來確定函數(shù)模板的類型參數(shù)是什么類型。上面使用調用表達式abs(n)時,因為n是int類型,所以模板中類型參數(shù)T就是int,然后編譯器會以函數(shù)模板為樣板生成一個函數(shù):

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

????? 同樣,對于調用表達式abs(d),因為d是double類型,所以類型參數(shù)T就是double,編譯器會根據(jù)函數(shù)模板生成下面的函數(shù):

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

????? 所以,abs(n)實際上調用的是函數(shù)模板生成的函數(shù):int abs(int x)。而abs(d)調用的是由函數(shù)模板生成的函數(shù):double abs(double x)。

???????最后,雞啄米跟大家簡單說下C++系統(tǒng)函數(shù)。C++系統(tǒng)庫中提供了幾百個函數(shù)供我們使用,我們只要用include指令包含相應的頭文件就可以使用了。比 如,包含了math.h文件我們就可以使用abs、sqrt、sin等函數(shù)。如果需要用到一些庫函數(shù)可以msdn上查也可以上網(wǎng)查。

轉載于:https://www.cnblogs.com/fuxianfeng1988/p/3273141.html

總結

以上是生活随笔為你收集整理的重载函数与函数模板(转)的全部內容,希望文章能夠幫你解決所遇到的問題。

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