程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> C++函數重載的深刻解析

C++函數重載的深刻解析

編輯:關於C++

C++函數重載的深刻解析。本站提示廣大學習愛好者:(C++函數重載的深刻解析)文章只能為提供參考,不一定能成為您想要的結果。以下是C++函數重載的深刻解析正文


我們在開瓶瓶罐罐的時刻,常常會遭受因各類瓶口規格分歧而找不到適合的對象的為難。所以有時刻就為了開個瓶,家裡要備多種規格的開瓶器。異樣是開個瓶子嘛,何須這麼費事?因而有人創造了多功效開瓶器,不論啤酒瓶汽水瓶照樣軟木塞的紅酒瓶都能輕松翻開。

但是開瓶器的成績也會產生到法式設計中。好比我們要編寫一個函數來求一個數的相對值,但是整數、浮點型數、雙精度型數都有相對值,但為它們編寫的函數前往值類型倒是各不雷同的。好比:

int iabs(int a);
float fabs(float a);
double dabs(double a);

如許是否是有點備了多種開瓶器的感到?我們能不克不及在法式設計中也做一個多功效的開瓶器,把一切數據類型的求相對值都交給abs這一個函數呢?

在C++中,我們也可以或許把具有雷同功效的函數整合到一個函數上,而不用去寫很多多少個函數名分歧的函數,這叫做函數的重(音chóng)載(Overload)。重載的實質是多個函數共用統一個函數名。

我們先來看一個函數重載的實例:(法式6.3)

#include "iostream.h"
int abs(int a);//當參數為整型數據時的函數原型
float abs(float a);//當參數為浮點型數據時的函數原型
double abs(double a);//當參數為雙精度型數據時的函數原型
int main()
{
   int a=-5,b=3;
   float c=-2.4f,d=8.4f;
   double e=-3e-9,f=3e6;
   cout <<"a=" <<abs(a) <<endl <<"b=" <<abs(b) <<endl;//輸入函數前往的成果
   cout <<"c=" <<abs(c) <<endl <<"d=" <<abs(d) <<endl;
   cout <<"e=" <<abs(e) <<endl <<"f=" <<abs(f) <<endl;
   return 0;
}
int abs(int a)//函數界說
{
   cout <<"int abs" <<endl;//顯示運轉了哪一個函數
   return (a>=0?a:-a);//假如a年夜於等於零則前往a,不然前往-a。
}
float abs(float a)
{
   cout <<"float abs" <<endl;
   return (a>=0?a:-a);
}
double abs(double a)
{
   cout <<"double abs" <<endl;
   return (a>=0?a:-a);
}
運轉成果:
int abs
int abs
a=5
b=3
float abs
float abs
c=2.4
d=8.4
double abs
double abs
e=3e-009
f=3e+006

運轉成果注解,abs函數果真可以或許處置三種分歧數據類型的數據了。那末我們如何能力本身造一個“多功效對象”呢?

其實要編寫一個重載函數其實不是很費事。起首,我們要告知電腦,統一個函數名存在了多種界說,所以,我們要給統一個函數名寫上多種函數原型(如法式6.3的第二到第四行);其次,我們要對應這些函數原型,分離寫上這些函數的界說(如法式6.3的主函數體以後,對三個abs函數的界說)。

但是電腦又是若何來辨認這些應用在分歧情況下的“對象”的呢?
在平常生涯中應用到多功效對象,假如我們不曉得詳細應當應用哪一個對象,我們會把每一個對象放上去試一試,假如只要獨一一個對象合適,那末我們就毫無疑問地可以或許肯定就是應用它了。然則假如湧現了兩個或許兩個以上對象都能合適,我們就分不清究竟應當應用哪一個是准確的了。

電腦的做法和我們是相似的。電腦是依附函數聲明時參數表中參數個數、各參數的數據類型溫柔序來斷定究竟要運轉哪一個函數的。是以,當重載函數參數表完整雷同的時刻,電腦便沒法斷定應當運轉哪一個函數,因而法式就失足了。

我們懂得了電腦是若何辨認重載函數今後,發明要編寫一個重載函數照樣須要留意一些處所的,那就是:在重載函數中,隨意率性兩個函數的參數表中的參數個數、各參數的數據類型溫柔序不克不及完整一樣。例如int func(int a,char b)和float func(int c,char d)就不克不及重載,由於它們的參數個數、各參數的類型溫柔序完整一樣,即便形參名分歧、前往值類型分歧也是杯水車薪的。

在挪用一個重載函數時,能夠會產生找不到一個完整適合的函數。這時候候,就須要停止數據類型的轉換。因為這類辦法能夠招致數據喪失或數據類型不嚴厲相符,且在充足斟酌成績後,這類情形是可以盡可能防止的,所以這裡不再就這個成績睜開闡述。有興致的讀者可以查閱其他C++的參考材料。

算法時光:重載函數
從某種意義上說,重載函數是便利了函數的應用者。在前一節我們曉得,假如完成了一切函數的編寫,那末完成一個法式就像搭積木一樣簡略了。但是假如功效類似名字卻分歧的函數太多,那末多“積木”搭起來也未必簡略。當函數的編寫者充足斟酌了分歧情形下應當運轉稍有分歧的函數,函數的應用者就不用為這些小細節而懊惱了。不外重載函數的函數名照樣應當相符其功效,假如把功效完整分歧的函數重載,那末就年夜年夜影響了法式的可讀性。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved