詳解C++編程中關於函數的根本應用。本站提示廣大學習愛好者:(詳解C++編程中關於函數的根本應用)文章只能為提供參考,不一定能成為您想要的結果。以下是詳解C++編程中關於函數的根本應用正文
情勢參數和現實參數
在挪用函數時,年夜多半情形下,函數是帶參數的。主調函數和被挪用函數之間稀有據傳遞關系。後面已提到:在界說函數時函數名前面括號中的變量稱號為情勢參數(formal parameter,簡稱形參),在主調函數中挪用一個函數時,函數名前面括號中的參數(可所以一個表達式)稱為現實參數(actual parameter,簡稱實參)。
【例】挪用函數時的數據傳遞。
#include <iostream> using namespace std; int max(int x,int y) //界說有參函數max { int z; z=x>y?x:y; return(z); } int main( ) { int a,b,c; cout<<"please enter two integer numbers:"; cin>>a>>b; c=max(a,b);//挪用max函數,給定實參為a,b。函數值賦給c cout<<"max="<<c<<endl; return 0; }
運轉情形以下:
please enter two integer numbers:2 3↙ max=3
有關形介入實參的解釋:
1) 在界說函數時指定的形參,在未湧現函數挪用時,它們其實不占內存中的存儲單位,是以稱它們是情勢參數或虛擬參數,表現它們其實不是現實存在的數據,只要在產生函數挪用時,函數max中的形參才被分派內存單位,以便吸收從實參傳來的數據。在挪用停止後,形參所占的內存單位也被釋放。
2) 實參可所以常量、變量或表達式,如max(3, a+b);但請求a和b有肯定的值。以便在挪用函數時將實參的值賦給形參。
3) 在界說函數時,必需在函數首部指定形參的類型(見教例法式第3行)。
4) 實介入形參的類型應雷同或賦值兼容。例4.2中實參和形參都是整型,這是正當的、准確的。假如實參為整型而形參為實型,或許相反,則按分歧類型數值的賦值規矩停止轉換。例照實參a的值為3.5,而形參x為整型,則將3.5轉換成整數3,然後送到形參b。字符型與整型可以相互通用。
5) 實參變量對形參變量的數據傳遞是“值傳遞”,即單向傳遞,只由實參傳給形參,而不克不及由形參傳回來給實參。在挪用函數時,編譯體系暫時給形參分派存儲單位。
請留意:實參單位與形參單位是分歧的單位。下圖表現將實參a和b的值2和3傳遞給對應的形參x和y。
挪用停止後,形參單位被釋放,實參單位仍保存並保持原值。是以,在履行一個被挪用函數時,形參的值假如產生轉變,其實不會轉變主調函數中實參的值。例如,若在履行max函數進程中形參x和y的值變成10和15,挪用停止後,實參a和b仍為2和3,見上圖。
函數的前往值
1) 函數的前往值是經由過程函數中的return語句取得的。return語句將被挪用函數中的一個肯定值帶回主調函數中去。
return語句前面的括號可以要,也能夠不要。return前面的值可所以一個表達式。
2) 函數值的類型。既然函數有前往值,這個值固然應屬於某一個肯定的類型,應該在界說函數時指定函數值的類型。
3) 假如函數值的類型和return語句中表達式的值紛歧致,則以函數類型為准,即函數類型決議前往值的類型。對數值型數據,可以主動停止類型轉換。
函數挪用的普通情勢
函數挪用的普通情勢為:
函數名([實參表列]);
假如是挪用無參函數,則“實參表列”可以沒有,但括號不克不及省略。假如實參表列包括多個實參,則各參數間用逗號離隔。實介入形參的個數應相等,類型應婚配(雷同或賦值兼容)。實介入形參按次序對應,一對一地傳遞數據。但應解釋,假如實參表列包含多個實參,對實參求值的次序其實不是肯定的。
函數挪用的方法
按函數在語句中的感化來分,可以有以下3種函數挪用方法:
(1)函數語句
把函數挪用零丁作為一個語句,其實不請求函數帶回一個值,只是請求函數完成必定的操作。如例4.1中的printstar( );
(2)函數表達式
函數湧現在一個表達式中,這時候請求函數帶回一個肯定的值以加入表達式的運算。如c=2*max(a, b);
(3)函數參數
函數挪用作為一個函數的實參。如:
m=max(a, max(b, c)); //max(b, c)是函數挪用,其值作為外層max函數挪用的一個實參
對被挪用函數的聲明和函數原型
在一個函數中挪用另外一個函數(即被挪用函數)須要具有以下前提:
起首被挪用的函數必需是曾經存在的函數。
假如應用庫函數,普通還應當在本文件開首用#include敕令將有關頭文件“包括”到本文件中來。
假如應用用戶本身界說的函數,而該函數與挪用它的函數(即主調函數)在統一個法式單元中,且地位在主調函數以後,則必需在挪用此函數之前對被挪用的函數出聲明。
所謂函數聲明(declare),就是在函數尚在不決義的情形下,事前將該函數的有關信息告訴編譯體系,以便使編譯能正常停止。
【例】對被挪用的函數出聲明。
#include <iostream> using namespace std; int main( ) { float add(float x,float y); //對add函數出聲明 float a,b,c; cout<<"please enter a,b:"; cin>>a>>b; c=add(a,b); cout<<"sum="<<c<<endl; return 0; } float add(float x,float y)//界說add函數 { float z; z=x+y; return (z); }
運轉情形以下:
please enter a, b: 123.68 456.45↙ sum=580.13
留意:對函數的界說和聲明不是統一件工作。界說是指對函數功效切實其實立,包含指定函數名、函數類型、形參及其類型、函數體等,它是一個完全的、自力的函數單元。而聲明的感化則是把函數的名字、函數類型和形參的個數、類型溫柔序(留意,不包含函數體)告訴編譯體系,以便在對包括函數挪用的語句停止編譯時,據此對其停止對比檢討(例如函數名能否准確,實介入形參的類型和個數能否分歧)。
其實,在函數聲明中也能夠不寫形參名,而只寫形參的類型,如
float add(float, float);
這類函數聲明稱為函數原型(function prototype)。應用函數原型是C和C++的一個主要特色。它的感化重要是: 依據函數原型在法式編譯階段對換用函數的正當性停止周全檢討。假如發明與函數原型不婚配的函數挪用就申報編譯失足。它屬於語法毛病。用戶依據屏幕顯示的失足信息很輕易發明和改正毛病。
函數原型的普通情勢為:
函數類型 函數名(參數類型1, 參數類型2…);
或
函數類型 函數名(參數類型1 參數名1, 參數類型2 參數名2…);
第(1)種情勢是根本的情勢。為了便於浏覽法式,也許可在函數原型中加上參數名,就成了第(2)種情勢。但編譯體系其實不檢討參數名。是以參數名是甚麼都無所謂。下面法式中的聲明也能夠寫成
float add(float a, float b); //參數名不消x、y,而用a、b
後果完整雷同。
應該包管函數原型與函數首部寫法上的分歧,即函數類型、函數名、參數個數、參數類型和參數次序必需雷同。在函數挪用時函數名、實參類型和實參個數應與函數原型分歧。
兩點解釋:
1) 後面已解釋,假如被挪用函數的界說湧現在主調函數之前,可以不用加以聲明。由於編譯體系曾經事前曉得了已界說的函數類型,會依據函數首部供給的信息對函數的挪用作准確性檢討。
有經歷的法式編制人員普通都把main函數寫在最後面,如許對全部法式的構造和感化了如指掌,統覽全局,然後再詳細懂得各函數的細節。另外,用函數原型來聲明函數,還能削減編寫法式時能夠湧現的毛病。因為函數聲明的地位與函數挪用語句的地位比擬近,是以在寫法式時便於就近參照函數原型來書寫函數挪用,不容易失足。所以應養成對一切用到的函數出聲明的習氣。這是包管法式准確性和可讀性的主要環節。
2) 函數聲明的地位可以在挪用函數地點的函數中,也能夠在函數以外。假如函數聲明放在函數的內部,在一切函數界說之前,則在各個主調函數中不用對所挪用的函數再出聲明。例如:
char letter(char, char); //本行和以下兩行函數聲明在一切函數之前且在函數內部 float f(float, float); //因此感化域是全部文件 int i(float, float); int main( ) {…}//在main函數中不用對它所挪用的函數出聲明 char letter(char c1, char c2) //界說letter函數 {…} float f(float x, float y)//界說f函數 {…} int i(float j, float k) //界說i函數 {…}
假如一個函數被多個函數所挪用,用這類辦法比擬好,不用在每一個主調函數中反復聲明。