C++函數(shù)的定義、什么是函數(shù)
2020-05-23 14:28:02
供稿:網(wǎng)友
在日常生活中,我們經(jīng)常會(huì)用到工具。比如我們畫一個(gè)表格需要用到直尺,它可以告訴我們線段的長度;我們開瓶子的時(shí)候需要用開瓶器,它可以把瓶子打開;我們?cè)谧鲇?jì)算題的時(shí)候需要用到計(jì)算器,它能夠告訴我們計(jì)算結(jié)果。
使用工具有些什么好處呢?首先,如果這個(gè)工具是現(xiàn)成的,我們就可以不必要自己去做一個(gè)這樣的工具,直接拿來就能用(比如開瓶器、計(jì)算器)。其次,不管是現(xiàn)成的工具,還是自己做的工具(比如自己做的直尺),一定是能夠多次反復(fù)使用的(比如直尺不是用完一次就不能再用的),而且是能夠在各種合適的情況下使用的。(直尺在量程范圍內(nèi)能量這條線段的長度,也能夠量那條線段的長度。)
在程序設(shè)計(jì)中,我們也會(huì)有各種各樣的“工具”。你告訴比較大小的“工具”兩個(gè)不相等的數(shù),這個(gè)“工具”能夠告訴你哪個(gè)數(shù)大;你告訴求正弦值的“工具”一個(gè)弧度,這個(gè)工具能夠求出這個(gè)弧度對(duì)應(yīng)的正弦值等等……這些工具的名字就是函數(shù)(Function)。要注意,在程序設(shè)計(jì)中的函數(shù)和數(shù)學(xué)中的函數(shù)有相似的地方,但是它們卻完全是兩碼事,請(qǐng)不要將兩者等同起來。
函數(shù)和工具的性質(zhì)是一樣的。如果有一個(gè)現(xiàn)成求正弦值的函數(shù),我們就不必自己去“造”一個(gè)這樣的函數(shù)。求正弦值的函數(shù)是可以多次使用的,并且可以求出任意實(shí)數(shù)的正弦值(合適的情況下),但是它卻求不出一個(gè)虛數(shù)的正弦值(不合適的情況下)。
如何定義和使用函數(shù)
有時(shí)候我們會(huì)知道一個(gè)工具有什么功能,但是卻因?yàn)閷?duì)其陌生而不會(huì)使用,這時(shí)候要使用它可能會(huì)發(fā)生一些困難。除了自己有空去摸索一下以外,最有效的辦法就是去看說明書了。說明書里會(huì)告訴你什么東西放在什么位置上,使用了以后會(huì)產(chǎn)生什么效果之類的。
同工具一樣,每個(gè)函數(shù)也有其自己的說明書,告訴用戶如何調(diào)用(就是使用的意思)這個(gè)函數(shù)。這份說明書就稱為這個(gè)函數(shù)的原型。它的格式為:
產(chǎn)生結(jié)果類型 函數(shù)名(參數(shù)1,參數(shù)2,……參數(shù)n);
函數(shù)名相當(dāng)于工具的名字,比如直尺、計(jì)算器等等。產(chǎn)生效果類型相當(dāng)于使用該工具產(chǎn)生的效果,比如直尺能夠讀出一個(gè)長度,計(jì)算器能夠顯示一個(gè)結(jié)果等等。而參數(shù)(Parameter)則是表示合適的使用情況,比如直尺應(yīng)該去量長度而不能去量角度,計(jì)算器能計(jì)算數(shù)值而不能去畫圖等等。
那么我們?nèi)绾蝸黹喿x函數(shù)的“說明書”呢?我們先來看兩個(gè)例子:
⑴int max(int a,int b);
這個(gè)函數(shù)名稱為max,即求出最大的值。運(yùn)行該函數(shù)以后,產(chǎn)生的結(jié)果是一個(gè)整數(shù)。在數(shù)學(xué)中,我們會(huì)有一元函數(shù)比如f(x)=2*x+3,也會(huì)有多元函數(shù)比如g(x,y)=x/4+y等等。我們?cè)谑褂胒(x)或g(x,y)的時(shí)候括號(hào)內(nèi)數(shù)的位置必須和自變量的字母對(duì)應(yīng),比如g(4,1)=4/4+1=2,此時(shí)x=4并且y=1。我們既不能將其顛倒,也不能寫出g(4)或者g(4,2,1,5)之類的表達(dá)式,否則就是錯(cuò)誤的。程序設(shè)計(jì)中參數(shù)的作用和自變量x,y的作用是類似的。在函數(shù)“說明書”中,也交待了哪個(gè)位置應(yīng)該放置什么類型的參數(shù),我們?cè)谡{(diào)用函數(shù)的時(shí)候要注意參數(shù)的類型、順序、個(gè)數(shù)都要一一對(duì)應(yīng)。
具體使用請(qǐng)看以下的程序:(程序6.1.1)
#include "iostream.h"
int max(int a,int b);//函數(shù)原型,假設(shè)函數(shù)已經(jīng)定義
int main()
{
int r=3,s=5,t;
t=max(r,s);//使用函數(shù),并記錄產(chǎn)生的結(jié)果
cout<<t <<endl;
return 0;
}
運(yùn)行結(jié)果:
5
對(duì)于上面這段程序,有兩點(diǎn)要說明。首先,調(diào)用函數(shù)時(shí)放入括號(hào)內(nèi)的變量名r和s與函數(shù)原型里a和b的名字是可以不一樣的。就像我可以用尺量各種各樣的紙。但是,它們的數(shù)據(jù)類型必須相同,如果把一個(gè)字符型變量放在這個(gè)位置上,就如同用尺去量角度一樣,無法成功的。其次,調(diào)用函數(shù)后的結(jié)果可以認(rèn)為是一個(gè)表達(dá)式的值。我們可以把這個(gè)結(jié)果賦值給一個(gè)變量或者將其輸出。當(dāng)然,我們也可以不保存不輸出這個(gè)結(jié)果,但是那樣的話,就像是量了長度卻沒有把結(jié)果記錄下來。
⑵void output(char c);
這個(gè)函數(shù)名為output,即輸出。void表示空類型,它同整型、實(shí)型一樣,也是一種數(shù)據(jù)類型。它表示調(diào)用該函數(shù)后,不會(huì)產(chǎn)生任何定量的結(jié)果。這是什么意思呢?我們知道,例如榔頭這種工具,它只能產(chǎn)生一些效果,如把釘子砸進(jìn)木頭里,但是它不會(huì)給使用者一個(gè)定量的結(jié)果。不過我們大可不必?fù)?dān)心它是否完成了我們要它完成的工作。如果榔頭沒把釘子砸進(jìn)木頭里,要么是榔頭本身質(zhì)量有問題,要么就是使用者沒有按照要求去使用。若這把榔頭不是用戶自己造的,那么用戶沒有任何責(zé)任。
下面我們就來嘗試一下使用這個(gè)函數(shù):(程序6.1.2)
#include "iostream.h"
void output(char c); //函數(shù)原型,假設(shè)函數(shù)已經(jīng)定義
int main()
{
char temp;
cin >>temp;
output(temp);
return 0;
}
運(yùn)行效果:
T
T
雖然函數(shù)沒有產(chǎn)生什么定量的結(jié)果,但是其在屏幕上輸出的功能還是達(dá)到了。對(duì)于產(chǎn)生void(空類型)的函數(shù),我們不必去保存結(jié)果了。
程序6.1.1和6.1.2的代碼是不完善的,如果僅用這些代碼去編譯會(huì)被告知函數(shù)未定義。由于涉及更多的知識(shí),這些代碼將在下一節(jié)得到完善。