詳解C++中的內聯函數和函數重載。本站提示廣大學習愛好者:(詳解C++中的內聯函數和函數重載)文章只能為提供參考,不一定能成為您想要的結果。以下是詳解C++中的內聯函數和函數重載正文
內聯函數(內嵌函數,內置函數)
挪用函數時須要必定的時光和空間的開支。C++供給一種進步效力的辦法,即在編譯時將函數挪用處用函數體調換,相似於C說話中的宏睜開。這類在函數挪用處直接嵌入函數體的函數稱為內聯函數(inline function),又稱內嵌函數或內嵌函數。
指定內聯函數的辦法很簡略,只須要在界說函數時增長 inline 症結字。
留意:是在函數界說時增長 inline 症結字,而不是在函數聲明時。在函數聲明時增長 inline 症結固然沒有毛病,然則也沒有任何後果
inline 症結字放在函數聲明處不會起感化:
inline void swap(int &a, int &b); void swap(int &a, int &b) { int temp = a; a = b; b = temp; } inline 症結字應當與函數體放在一路: void swap(int &a, int &b); inline void swap(int &a, int &b) { int temp = a; a = b; b = temp; }
采取內聯函數可以有用防止函數挪用的開支,法式履行效力更高。應用內聯函數的缺陷就是,假如被聲明為內聯函數的函數體異常年夜,則編譯器編譯後法式的可履行碼將會變得很年夜。
別的,假如函數體內湧現輪回或許其它龐雜的掌握構造的時刻,這個時刻處置這些龐雜掌握構造所消費的時光弘遠於函數挪用所花的時光,是以假如將這類函數聲明為內聯函數意義不年夜,反而會使得編譯後可履行代碼變長。
平日在法式設計進程中,我們會將一些頻仍被挪用的短小函數聲明為內聯函數。
應該解釋:對函數作inline聲明,只是法式員對編譯體系提出的一個建議,也就是說它是建議性的,而不是指令性的。並不是一經指定為inline,編譯體系就必需如許做。編譯體系會依據詳細情形決議能否如許做。
一個完全的示例:
#include <iostream> using namespace std; int max(int, int, int); //函數聲明,左端也能夠加inline int main( ) { int i=10, j=20, k=30, m; m = max(i, j, k); cout<<"max="<<m<<endl; return 0; } inline int max(int a, int b, int c) //界說max為內聯函數 { if(b>a) a=b; if(c>a) a=c; return a; }
運轉成果:
max=30
因為在界說函數時指定它為內置函數,是以編譯體系在碰到函數挪用“max(i, j, k)”時,就用max函數體的代碼取代“max(i,j, k)”,同時將實參取代形參。如許,法式第6行 “m=max(i, j, k);”就被置換成:
if (j>i) i=j; if(k>i) i=k; m=i;
函數重載
在編程時,有時我們要完成的是統一類的功效,只是有些細節分歧。例如願望從3個數中找出個中的最年夜者,而每次求最年夜數時數據的類型分歧,能夠是3個整數、3個雙精度數或3個長整數。法式設計者常常會分離設計出3個分歧名的函數,其函數原型為:
int max1(int a, int b, int c); //求3個整數中的最年夜者 double max2(double a, double b, double c); //求3個雙精度數中最年夜者 long max3(long a, long b, long c); //求3個長整數中的最年夜者
C++許可用統一函數名界說多個函數,這些函數的參數個數和參數類型分歧。這就是函數的重載(function overloading)。即對一個函數名從新付與它新的寄義,使一個函數名可以多用。
對下面求最年夜數的成績可以編寫以下的C++法式。
【例】求3個數中最年夜的數(分離斟酌整數、雙精度數、長整數的情形)。
#include <iostream> using namespace std; int main( ) { int max(int a,int b,int c); //函數聲明 double max(double a,double b,double c); //函數聲明 long max(long a,long b,long c);//函數聲明 int i1,i2,i3,i; cin>>i1>>i2>>i3; //輸出3個整數 i=max(i1,i2,i3); //求3個整數中的最年夜者 cout<<"i_max="<<i<<endl; double d1,d2,d3,d; cin>>d1>>d2>>d3; //輸出3個雙精度數 d=max(d1,d2,d3); //求3個雙精度數中的最年夜者 cout<<"d_max="<<d<<endl; long g1,g2,g3,g; cin>>g1>>g2>>g3; //輸出3個長整數 g=max(g1,g2,g3); //求3個長整數中的最年夜者 cout<<"g_max="<<g<<endl; } int max(int a,int b,int c) //界說求3個整數中的最年夜者的函數 { if(b>a) a=b; if(c>a) a=c; return a; } double max(double a,double b,double c)//界說求3個雙精度數中的最年夜者的函數 { if(b>a) a=b; if(c>a) a=c; return a; } long max(long a,long b,long c) //界說求3個長整數中的最年夜者的函數 { if(b>a) a=b; if(c>a) a=c; return a; }
運轉情形以下:
185-76567↙ (輸出3個整數) 56.87 90.23 -3214.78↙ (輸出3個實數) 67854 -912456 673456↙ (輸出3個長整數) i_max=567 (輸入3個整數的最年夜值) d_max=90.23 (輸入3個雙精度數的最年夜值) g_max=673456 (輸入3個長整數的最年夜值)
上例3個max函數的函數體是雷同的。
其實重載函數其實不請求函數體雷同;除許可參數類型分歧之外,還許可參數的個數分歧。
【例】編寫一個法式,用來求兩個整數或3個整數中的最年夜數。假如輸出兩個整數,法式就輸入這兩個整數中的最年夜數,假如輸出3個整數,法式就輸入這3個整數中的最年夜數。
#include <iostream> using namespace std; int main( ) { int max(int a,int b,int c); //函數聲明 int max(int a,int b); //函數聲明 int a=8,b=-12,c=27; cout<<"max(a,b,c)="<<max(a,b,c)<<endl;//輸入3個整數中的最年夜者 cout<<"max(a,b)="<<max(a,b)<<endl; //輸入兩個整數中的最年夜者 } int max(int a,int b,int c)//此max函數的感化是求3個整數中的最年夜者 { if(b>a) a=b; if(c>a) a=c; return a; } int max(int a,int b)//此max函數的感化是求兩個整數中的最年夜者 { if(a>b) return a; else return b; }
運轉情形以下:
max(a, b, c)=27 max(a, b)=8
兩次挪用max函數的參數個數分歧,體系就依據參數的個數找到與之婚配的函數並挪用它。
參數的個數和類型可以都分歧。但不克不及只要函數的類型分歧而參數的個數和類型雷同。例如:
int f(int); //函數前往值為整型 long f(int); //函數前往值為長整型 void f(int); //函數無前往值
在函數挪用時都是統一情勢,如“f(10)”。編譯體系沒法辨別應當挪用哪個函數。重載函數的參數個數、參數類型或參數次序3者中必需至多有一種分歧,函數前往值類型可以雷同也能夠分歧。
在應用重載函數時,同名函數的功效應該雷同或鄰近,不要用統一函數名去完成完整不相關的功效,固然法式也能運轉,但可讀性欠好,令人莫明其妙。