詳解C++編程中對(duì)于函數(shù)的基本使用
形式參數(shù)和實(shí)際參數(shù)
在調(diào)用函數(shù)時(shí),大多數(shù)情況下,函數(shù)是帶參數(shù)的。主調(diào)函數(shù)和被調(diào)用函數(shù)之間有數(shù)據(jù)傳遞關(guān)系。前面已提到:在定義函數(shù)時(shí)函數(shù)名后面括號(hào)中的變量名稱為形式參數(shù)(formal parameter,簡(jiǎn)稱形參),在主調(diào)函數(shù)中調(diào)用一個(gè)函數(shù)時(shí),函數(shù)名后面括號(hào)中的參數(shù)(可以是一個(gè)表達(dá)式)稱為實(shí)際參數(shù)(actual parameter,簡(jiǎn)稱實(shí)參)。
【例】調(diào)用函數(shù)時(shí)的數(shù)據(jù)傳遞。
#include <iostream> using namespace std; int max(int x,int y) //定義有參函數(shù)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);//調(diào)用max函數(shù),給定實(shí)參為a,b。函數(shù)值賦給c cout<<"max="<<c<<endl; return 0; }
運(yùn)行情況如下:
please enter two integer numbers:2 3↙ max=3
有關(guān)形參與實(shí)參的說(shuō)明:
1) 在定義函數(shù)時(shí)指定的形參,在未出現(xiàn)函數(shù)調(diào)用時(shí),它們并不占內(nèi)存中的存儲(chǔ)單元,因此稱它們是形式參數(shù)或虛擬參數(shù),表示它們并不是實(shí)際存在的數(shù)據(jù),只有在發(fā)生函數(shù)調(diào)用時(shí),函數(shù)max中的形參才被分配內(nèi)存單元,以便接收從實(shí)參傳來(lái)的數(shù)據(jù)。在調(diào)用結(jié)束后,形參所占的內(nèi)存單元也被釋放。
2) 實(shí)參可以是常量、變量或表達(dá)式,如max(3, a+b);但要求a和b有確定的值。以便在調(diào)用函數(shù)時(shí)將實(shí)參的值賦給形參。
3) 在定義函數(shù)時(shí),必須在函數(shù)首部指定形參的類型(見(jiàn)示例程序第3行)。
4) 實(shí)參與形參的類型應(yīng)相同或賦值兼容。例4.2中實(shí)參和形參都是整型,這是合法的、正確的。如果實(shí)參為整型而形參為實(shí)型,或者相反,則按不同類型數(shù)值的賦值規(guī)則進(jìn)行轉(zhuǎn)換。例如實(shí)參a的值為3.5,而形參x為整型,則將3.5轉(zhuǎn)換成整數(shù)3,然后送到形參b。字符型與整型可以互相通用。
5) 實(shí)參變量對(duì)形參變量的數(shù)據(jù)傳遞是“值傳遞”,即單向傳遞,只由實(shí)參傳給形參,而不能由形參傳回來(lái)給實(shí)參。在調(diào)用函數(shù)時(shí),編譯系統(tǒng)臨時(shí)給形參分配存儲(chǔ)單元。
請(qǐng)注意:實(shí)參單元與形參單元是不同的單元。下圖表示將實(shí)參a和b的值2和3傳遞給對(duì)應(yīng)的形參x和y。
調(diào)用結(jié)束后,形參單元被釋放,實(shí)參單元仍保留并維持原值。因此,在執(zhí)行一個(gè)被調(diào)用函數(shù)時(shí),形參的值如果發(fā)生改變,并不會(huì)改變主調(diào)函數(shù)中實(shí)參的值。例如,若在執(zhí)行max函數(shù)過(guò)程中形參x和y的值變?yōu)?0和15,調(diào)用結(jié)束后,實(shí)參a和b仍為2和3,見(jiàn)上圖。
函數(shù)的返回值
1) 函數(shù)的返回值是通過(guò)函數(shù)中的return語(yǔ)句獲得的。return語(yǔ)句將被調(diào)用函數(shù)中的一個(gè)確定值帶回主調(diào)函數(shù)中去。
return語(yǔ)句后面的括號(hào)可以要,也可以不要。return后面的值可以是一個(gè)表達(dá)式。
2) 函數(shù)值的類型。既然函數(shù)有返回值,這個(gè)值當(dāng)然應(yīng)屬于某一個(gè)確定的類型,應(yīng)當(dāng)在定義函數(shù)時(shí)指定函數(shù)值的類型。
3) 如果函數(shù)值的類型和return語(yǔ)句中表達(dá)式的值不一致,則以函數(shù)類型為準(zhǔn),即函數(shù)類型決定返回值的類型。對(duì)數(shù)值型數(shù)據(jù),可以自動(dòng)進(jìn)行類型轉(zhuǎn)換。
函數(shù)調(diào)用的一般形式
函數(shù)調(diào)用的一般形式為:
函數(shù)名([實(shí)參表列]);
如果是調(diào)用無(wú)參函數(shù),則“實(shí)參表列”可以沒(méi)有,但括號(hào)不能省略。如果實(shí)參表列包含多個(gè)實(shí)參,則各參數(shù)間用逗號(hào)隔開(kāi)。實(shí)參與形參的個(gè)數(shù)應(yīng)相等,類型應(yīng)匹配(相同或賦值兼容)。實(shí)參與形參按順序?qū)?yīng),一對(duì)一地傳遞數(shù)據(jù)。但應(yīng)說(shuō)明,如果實(shí)參表列包括多個(gè)實(shí)參,對(duì)實(shí)參求值的順序并不是確定的。
函數(shù)調(diào)用的方式
按函數(shù)在語(yǔ)句中的作用來(lái)分,可以有以下3種函數(shù)調(diào)用方式:
(1)函數(shù)語(yǔ)句
把函數(shù)調(diào)用單獨(dú)作為一個(gè)語(yǔ)句,并不要求函數(shù)帶回一個(gè)值,只是要求函數(shù)完成一定的操作。如例4.1中的printstar( );
(2)函數(shù)表達(dá)式
函數(shù)出現(xiàn)在一個(gè)表達(dá)式中,這時(shí)要求函數(shù)帶回一個(gè)確定的值以參加表達(dá)式的運(yùn)算。如c=2*max(a, b);
(3)函數(shù)參數(shù)
函數(shù)調(diào)用作為一個(gè)函數(shù)的實(shí)參。如:
m=max(a, max(b, c)); //max(b, c)是函數(shù)調(diào)用,其值作為外層max函數(shù)調(diào)用的一個(gè)實(shí)參
對(duì)被調(diào)用函數(shù)的聲明和函數(shù)原型
在一個(gè)函數(shù)中調(diào)用另一個(gè)函數(shù)(即被調(diào)用函數(shù))需要具備以下條件:
首先被調(diào)用的函數(shù)必須是已經(jīng)存在的函數(shù)。
如果使用庫(kù)函數(shù),一般還應(yīng)該在本文件開(kāi)頭用#include命令將有關(guān)頭文件“包含”到本文件中來(lái)。
如果使用用戶自己定義的函數(shù),而該函數(shù)與調(diào)用它的函數(shù)(即主調(diào)函數(shù))在同一個(gè)程序單位中,且位置在主調(diào)函數(shù)之后,則必須在調(diào)用此函數(shù)之前對(duì)被調(diào)用的函數(shù)作聲明。
所謂函數(shù)聲明(declare),就是在函數(shù)尚在未定義的情況下,事先將該函數(shù)的有關(guān)信息通知編譯系統(tǒng),以便使編譯能正常進(jìn)行。
【例】對(duì)被調(diào)用的函數(shù)作聲明。
#include <iostream> using namespace std; int main( ) { float add(float x,float y); //對(duì)add函數(shù)作聲明 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函數(shù) { float z; z=x+y; return (z); }
運(yùn)行情況如下:
please enter a, b: 123.68 456.45↙ sum=580.13
注意:對(duì)函數(shù)的定義和聲明不是同一件事情。定義是指對(duì)函數(shù)功能的確立,包括指定函數(shù)名、函數(shù)類型、形參及其類型、函數(shù)體等,它是一個(gè)完整的、獨(dú)立的函數(shù)單位。而聲明的作用則是把函數(shù)的名字、函數(shù)類型以及形參的個(gè)數(shù)、類型和順序(注意,不包括函數(shù)體)通知編譯系統(tǒng),以便在對(duì)包含函數(shù)調(diào)用的語(yǔ)句進(jìn)行編譯時(shí),據(jù)此對(duì)其進(jìn)行對(duì)照檢查(例如函數(shù)名是否正確,實(shí)參與形參的類型和個(gè)數(shù)是否一致)。
其實(shí),在函數(shù)聲明中也可以不寫(xiě)形參名,而只寫(xiě)形參的類型,如
float add(float, float);
這種函數(shù)聲明稱為函數(shù)原型(function prototype)。使用函數(shù)原型是C和C++的一個(gè)重要特點(diǎn)。它的作用主要是: 根據(jù)函數(shù)原型在程序編譯階段對(duì)調(diào)用函數(shù)的合法性進(jìn)行全面檢查。如果發(fā)現(xiàn)與函數(shù)原型不匹配的函數(shù)調(diào)用就報(bào)告編譯出錯(cuò)。它屬于語(yǔ)法錯(cuò)誤。用戶根據(jù)屏幕顯示的出錯(cuò)信息很容易發(fā)現(xiàn)和糾正錯(cuò)誤。
函數(shù)原型的一般形式為:
函數(shù)類型 函數(shù)名(參數(shù)類型1, 參數(shù)類型2…);
或
函數(shù)類型 函數(shù)名(參數(shù)類型1 參數(shù)名1, 參數(shù)類型2 參數(shù)名2…);
第(1)種形式是基本的形式。為了便于閱讀程序,也允許在函數(shù)原型中加上參數(shù)名,就成了第(2)種形式。但編譯系統(tǒng)并不檢查參數(shù)名。因此參數(shù)名是什么都無(wú)所謂。上面程序中的聲明也可以寫(xiě)成
float add(float a, float b); //參數(shù)名不用x、y,而用a、b
效果完全相同。
應(yīng)當(dāng)保證函數(shù)原型與函數(shù)首部寫(xiě)法上的一致,即函數(shù)類型、函數(shù)名、參數(shù)個(gè)數(shù)、參數(shù)類型和參數(shù)順序必須相同。在函數(shù)調(diào)用時(shí)函數(shù)名、實(shí)參類型和實(shí)參個(gè)數(shù)應(yīng)與函數(shù)原型一致。
兩點(diǎn)說(shuō)明:
1) 前面已說(shuō)明,如果被調(diào)用函數(shù)的定義出現(xiàn)在主調(diào)函數(shù)之前,可以不必加以聲明。因?yàn)榫幾g系統(tǒng)已經(jīng)事先知道了已定義的函數(shù)類型,會(huì)根據(jù)函數(shù)首部提供的信息對(duì)函數(shù)的調(diào)用作正確性檢查。
有經(jīng)驗(yàn)的程序編制人員一般都把main函數(shù)寫(xiě)在最前面,這樣對(duì)整個(gè)程序的結(jié)構(gòu)和作用一目了然,統(tǒng)覽全局,然后再具體了解各函數(shù)的細(xì)節(jié)。此外,用函數(shù)原型來(lái)聲明函數(shù),還能減少編寫(xiě)程序時(shí)可能出現(xiàn)的錯(cuò)誤。由于函數(shù)聲明的位置與函數(shù)調(diào)用語(yǔ)句的位置比較近,因此在寫(xiě)程序時(shí)便于就近參照函數(shù)原型來(lái)書(shū)寫(xiě)函數(shù)調(diào)用,不易出錯(cuò)。所以應(yīng)養(yǎng)成對(duì)所有用到的函數(shù)作聲明的習(xí)慣。這是保證程序正確性和可讀性的重要環(huán)節(jié)。
2) 函數(shù)聲明的位置可以在調(diào)用函數(shù)所在的函數(shù)中,也可以在函數(shù)之外。如果函數(shù)聲明放在函數(shù)的外部,在所有函數(shù)定義之前,則在各個(gè)主調(diào)函數(shù)中不必對(duì)所調(diào)用的函數(shù)再作聲明。例如:
char letter(char, char); //本行和以下兩行函數(shù)聲明在所有函數(shù)之前且在函數(shù)外部 float f(float, float); //因而作用域是整個(gè)文件 int i(float, float); int main( ) {…}//在main函數(shù)中不必對(duì)它所調(diào)用的函數(shù)作聲明 char letter(char c1, char c2) //定義letter函數(shù) {…} float f(float x, float y)//定義f函數(shù) {…} int i(float j, float k) //定義i函數(shù) {…}
如果一個(gè)函數(shù)被多個(gè)函數(shù)所調(diào)用,用這種方法比較好,不必在每個(gè)主調(diào)函數(shù)中重復(fù)聲明。
上一篇:C++中指針的數(shù)據(jù)類型和運(yùn)算相關(guān)知識(shí)小結(jié)
欄 目:C語(yǔ)言
下一篇:C++中的while循環(huán)和for循環(huán)語(yǔ)句學(xué)習(xí)教程
本文標(biāo)題:詳解C++編程中對(duì)于函數(shù)的基本使用
本文地址:http://mengdiqiu.com.cn/a1/Cyuyan/2739.html
您可能感興趣的文章
- 04-02c語(yǔ)言沒(méi)有round函數(shù) round c語(yǔ)言
- 01-10求子數(shù)組最大和的解決方法詳解
- 01-10深入二叉樹(shù)兩個(gè)結(jié)點(diǎn)的最低共同父結(jié)點(diǎn)的詳解
- 01-10數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)- 解析最少換車(chē)次數(shù)的問(wèn)題詳解
- 01-10數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)-用棧實(shí)現(xiàn)表達(dá)式求值的方法詳解
- 01-10HDOJ 1443 約瑟夫環(huán)的最新應(yīng)用分析詳解
- 01-10深入理解C++中常見(jiàn)的關(guān)鍵字含義
- 01-10使用C++實(shí)現(xiàn)全排列算法的方法詳解
- 01-10如何查看進(jìn)程實(shí)際的內(nèi)存占用情況詳解
- 01-10深入Main函數(shù)中的參數(shù)argc,argv的使用詳解


閱讀排行
- 1C語(yǔ)言 while語(yǔ)句的用法詳解
- 2java 實(shí)現(xiàn)簡(jiǎn)單圣誕樹(shù)的示例代碼(圣誕
- 3利用C語(yǔ)言實(shí)現(xiàn)“百馬百擔(dān)”問(wèn)題方法
- 4C語(yǔ)言中計(jì)算正弦的相關(guān)函數(shù)總結(jié)
- 5c語(yǔ)言計(jì)算三角形面積代碼
- 6什么是 WSH(腳本宿主)的詳細(xì)解釋
- 7C++ 中隨機(jī)函數(shù)random函數(shù)的使用方法
- 8正則表達(dá)式匹配各種特殊字符
- 9C語(yǔ)言十進(jìn)制轉(zhuǎn)二進(jìn)制代碼實(shí)例
- 10C語(yǔ)言查找數(shù)組里數(shù)字重復(fù)次數(shù)的方法
本欄相關(guān)
- 04-02c語(yǔ)言函數(shù)調(diào)用后清空內(nèi)存 c語(yǔ)言調(diào)用
- 04-02func函數(shù)+在C語(yǔ)言 func函數(shù)在c語(yǔ)言中
- 04-02c語(yǔ)言的正則匹配函數(shù) c語(yǔ)言正則表達(dá)
- 04-02c語(yǔ)言用函數(shù)寫(xiě)分段 用c語(yǔ)言表示分段
- 04-02c語(yǔ)言中對(duì)數(shù)函數(shù)的表達(dá)式 c語(yǔ)言中對(duì)
- 04-02c語(yǔ)言編寫(xiě)函數(shù)冒泡排序 c語(yǔ)言冒泡排
- 04-02c語(yǔ)言沒(méi)有round函數(shù) round c語(yǔ)言
- 04-02c語(yǔ)言分段函數(shù)怎么求 用c語(yǔ)言求分段
- 04-02C語(yǔ)言中怎么打出三角函數(shù) c語(yǔ)言中怎
- 04-02c語(yǔ)言調(diào)用函數(shù)求fibo C語(yǔ)言調(diào)用函數(shù)求
隨機(jī)閱讀
- 01-10使用C語(yǔ)言求解撲克牌的順子及n個(gè)骰子
- 04-02jquery與jsp,用jquery
- 01-11ajax實(shí)現(xiàn)頁(yè)面的局部加載
- 08-05織夢(mèng)dedecms什么時(shí)候用欄目交叉功能?
- 08-05DEDE織夢(mèng)data目錄下的sessions文件夾有什
- 01-11Mac OSX 打開(kāi)原生自帶讀寫(xiě)NTFS功能(圖文
- 01-10SublimeText編譯C開(kāi)發(fā)環(huán)境設(shè)置
- 01-10delphi制作wav文件的方法
- 08-05dedecms(織夢(mèng))副欄目數(shù)量限制代碼修改
- 01-10C#中split用法實(shí)例總結(jié)