?? c++5.dat
字號:
第五章 函數(shù)
第一節(jié) 函數(shù)的定義
語句是構(gòu)造程序的最基本單位.當(dāng)我們用程序語句編寫的程序越來越大,越來越復(fù)雜的時候,為了使程序更簡潔、可讀性更好、更便于復(fù)用,以及更便于維護(hù),就有必要將把它分成若干個模塊,每個模塊完成一項任務(wù).在C++中,這些模塊就是一個個的函數(shù).函數(shù)也是C++語言構(gòu)造程序的重要的基本單位.
函數(shù)定義的一般形式如下:
返回類型 函數(shù)名(參數(shù)表列)
{
語句系列
return 合適類型數(shù)值
}
函數(shù)的定義包括以下幾個部分:
1. 函數(shù)名
2. 參數(shù)表列
3. 返回類型
4. 函數(shù)體
1. 函數(shù)名: 一個符合C++語法要求的標(biāo)識符,定義函數(shù)名與定義變量名的規(guī)則是一樣的,但應(yīng)盡量避免用下劃線開頭,因為編譯器常常定義一些下劃線開頭的變量或函數(shù).函數(shù)名應(yīng)盡可能反映函數(shù)的功能,它常常由幾個單詞組成.
如VC中的按下鼠標(biāo)左鍵的響應(yīng)函數(shù)為:OnLButtonDown,這樣就較好的反映了函數(shù)的功能.在上例中,我們可以將"買票"和"訂旅館"作為函數(shù)名.
2. 參數(shù)表列:0個或多個變量,用于向函數(shù)傳送數(shù)值或從函數(shù)帶回數(shù)值,每一個參數(shù)都有自己的類型,它不同于變量定義,因為幾個變量可以定義在一起,例如?quot;int i,j,k;".如果參數(shù)表列中參數(shù)個數(shù)為0,我們稱之為無參函數(shù),無參函數(shù)可以定義為:
"返回類型 函數(shù)名( ){…}"或"返回類型 函數(shù)名(void){…}"
旅行日程和目的地就是我們傳送給上例中的函數(shù)的數(shù)值,當(dāng)然如果你對日程和目的地都沒有什么特殊的要求,那也可以完全交給旅行社一手包辦,這樣便相當(dāng)于一個無參函數(shù)了.
3. 返回類型:指定函數(shù)用return返回的函數(shù)值的類型,如果函數(shù)沒有返回值,返回類型應(yīng)為void.
上例中返回值就是旅行社將要交給你的票和單據(jù),而返回值的類型則可以看成是票和單據(jù)的類別.
4. 函數(shù)體:花括號中的語句稱為函數(shù)體,一個函數(shù)的功能,通過函數(shù)體中的語句來完成.
上例中的函數(shù)體即為旅行社為買票和訂旅館進(jìn)行的具體操作.
下面我們看一個具體的函數(shù)定義的例子:
例
int GetIntegerInRange(int low, int high)
{
int res;
do {
cout << "Enter an integer in the range " << low
<< " ... " << high << " :";
cin >> res;
} while (! ((res >= low) && (res <= high)));
return res;
}
int GetIntegerInRange(int low, int high)行定義函數(shù)名為GetIntegerInRange,返回類型為int,且指定函數(shù)需要兩個整型值,并通過low和high引用.在函數(shù)體內(nèi)定義了整型變量res,并通過return語句返回該變康鬧怠?注意)變量res的類型必須與函數(shù)的返回類型一致,否則,系統(tǒng)以函數(shù)返回類型為準(zhǔn),而對res的數(shù)值進(jìn)行強(qiáng)制類型轉(zhuǎn)換,使其與函數(shù)的返回類型保持一致.
return語句的返回值通常是一個表達(dá)式,例如5-2:
一個函數(shù)也可以有多個return語句,在函數(shù)的執(zhí)行過程中,遇到任一個return語句,將立即停止執(zhí)行,并返回到調(diào)用函數(shù).
例:
return res;
return n % MAXSIZE;
return 3.5 + x*(6.1 + x*(9.7 + 19.2*x));
上面的return語句也可以寫成下面的形式:
return (res);
return (n % MAXSIZE);
return (3.5 + x*(6.1 + x*(9.7 + 19.2*x)));
即對返回值的表達(dá)式加一對圓括號.不過,這圓括號是多余的,可以省略掉.
這里我們用一個很簡單的函數(shù)定義的例子5-4來進(jìn)一步加以說明:
int Inc(int a)
{
a++;
return a;
}
這個函數(shù)的功能為增1,其中,int Inc(int a)行定義了:函數(shù)名-Inc,參數(shù)-整型數(shù)a,返回類型-整型,這說明該函數(shù)中用return語句返回的值應(yīng)該是整型值.在花括號中的即為函數(shù)體,這個函數(shù)比較短,其函數(shù)體只有兩行語句:
a++;
return a;
這兩行語句完成a自增1的功能,返回的是a增1后的值,返回值與返回類型是匹配的.下面是一個不帶有參數(shù)和返回值的函數(shù).
第二節(jié) 函數(shù)的說明
如果一個函數(shù)調(diào)用另一個函數(shù),在調(diào)用函數(shù)中必須對被調(diào)用函數(shù)進(jìn)行說明,函數(shù)說明類似于函數(shù)定義,不過沒有實現(xiàn)代碼,函數(shù)說明的一般形式如下:
返回類型 函數(shù)名(參數(shù)表列);
函數(shù)說明是一個語句,所以要以分號結(jié)束.C++中,函數(shù)說明也稱為函數(shù)原型,下面是函數(shù)說明的例子:
void PrintStats(int num, double ave, double std_dev);
int GetIntegerInRange(int low, int high);
一些函數(shù)的說明,我們放在頭文件中,也有一些函數(shù)的說明放在文件的頭部,而函數(shù)的定義放在該文件后面.我們知道,C++應(yīng)用程序是從main函數(shù)開始執(zhí)行,main函數(shù)在文件中的位置并沒有特別的要求,它可以在文件的頭部、中部或尾部.
第三節(jié) 函數(shù)的定義
我們定義了一個函數(shù),完成某種功能,就要涉及到調(diào)用這個函數(shù),調(diào)用一個函數(shù)之前必須對該函數(shù)進(jìn)行說明.函數(shù)調(diào)用由函數(shù)名和函數(shù)調(diào)用運算符()組成,()內(nèi)有0個或多個逗號分隔的參數(shù)(稱為實參).每一個參數(shù)是一個表達(dá)式,且參數(shù)的個數(shù)與參數(shù)的類型要與被調(diào)函數(shù)定義的參數(shù)(稱為形參)個數(shù)和類型匹配.
當(dāng)被調(diào)函數(shù)執(zhí)行時,首先計算實參表達(dá)式,并將結(jié)果值傳送給形參,然后執(zhí)行函數(shù)體,返回的返回值被傳送到調(diào)用函數(shù).
如果函數(shù)調(diào)用后有返回值,調(diào)用表達(dá)式可以用在表達(dá)式中,而無參函數(shù)的調(diào)用是一個單獨的語句.
我們定義了一個函數(shù),完成某種功能,就要涉及到調(diào)用這個函數(shù),調(diào)用一個函數(shù)之前必須對該函數(shù)進(jìn)行說明.函數(shù)調(diào)用由函數(shù)名和函數(shù)調(diào)用運算符()組成,()內(nèi)有0個或多個逗號分隔的參數(shù)(稱為實參).每一個參數(shù)是一個表達(dá)式,且參數(shù)的個數(shù)與參數(shù)的類型要與被調(diào)函數(shù)定義的參數(shù)(稱為形參)個數(shù)和類型匹配.
當(dāng)被調(diào)函數(shù)執(zhí)行時,首先計算實參表達(dá)式,并將結(jié)果值傳送給形參,然后執(zhí)行函數(shù)體,返回的返回值被傳送到調(diào)用函數(shù).
如果函數(shù)調(diào)用后有返回值,調(diào)用表達(dá)式可以用在表達(dá)式中,而無參函數(shù)的調(diào)用是一個單獨的語句.
例如:
#include<iostream.h> //C++庫函數(shù)說明
int area(int length, int width); // area函數(shù)說明
void main() //主函數(shù),程序從該函數(shù)開始執(zhí)行
{
int this_length, this_width;
cout << "Enter the length: "; //調(diào)用cout和cin庫函數(shù)
cin >> this_length;
cout << "Enter the width: ";
cin >> this_width;
cout << "\n";
cout << "The area of a " << this_length << "x" << this_width;
cout << " rectangle is " << area(this_length, this_width); //調(diào)用area函數(shù)
}
int area(int length, int width) // area函數(shù)定義
{
int number;
number = length * width;
return number;
}
3.1 對于無參函數(shù)的調(diào)用形式應(yīng)該是:
函數(shù)名( )
例如,對于函數(shù):
int TPSOKTSNK();
可以這樣調(diào)用:
if(TPSOKTSNW()) {
語句系列
}
如果調(diào)用形式寫成:
if(TPSOKTSNW) {
語句系列
}
它仍然符合C++語法,但意義發(fā)生了變化.它是檢查函數(shù)TPSOKTNSW()是否有地址,有關(guān)地址的概念,我們在后面要講到.如果該程序連接成功,則TPSOKTNSW()有地址,if語句的條件為真.
例如:
#include <iostream.h>
int max(int a,int b)
{
if(a>b)return a;
else return b;
}
void main()
{
int max(int a,int b);
int x,y,z;
cout<<"input two numbers"<<endl;
cin>>x>>y;
z=max(x,y);
cout<<"maxmum="<<z;
}
程序的第2行至第6行為max函數(shù)定義.進(jìn)入主函數(shù)后,因為準(zhǔn)備調(diào)用max函數(shù),故先對max函數(shù)進(jìn)行說明(程序第9行).可以看出函數(shù)說明與函數(shù)定義中的函數(shù)頭部分相同,但是末尾要加分號.程序第13行為調(diào)用max函數(shù),并把實參x、y傳送給max的形參a、b.max函數(shù)執(zhí)行的結(jié)果 (a或b),返回給調(diào)用函數(shù)main中的變量z,且main函數(shù)將z值輸出.
3.2參數(shù)傳遞
我們已經(jīng)知道:函數(shù)調(diào)用時,要將調(diào)用函數(shù)中實參傳送給被調(diào)函數(shù)中的形參.在C++中,有兩種參數(shù)傳遞方式,即值傳遞和地址傳遞(或稱引用傳遞).地址傳遞我們在后面介紹,這里介紹值傳遞的方法.
函數(shù)在被調(diào)用以前,形參變量并不占內(nèi)存單元,當(dāng)函數(shù)被調(diào)用時,形參變量分配有存儲單元,并將相應(yīng)的實參變量存儲單元的值復(fù)制到形參變量單元.所以,被調(diào)函數(shù)在執(zhí)行過程中,如果形參變量的值發(fā)生了變化,并不影響實參變量的值.例如:
#include <iostream.h>
void Foo (int num)
{
num = 0;
cout << "num = " << num << '\n';
}
int main (void)
{
int x = 10;
Foo(x);
cout << "x = " << x << '\n';
return 0;
}
函數(shù)Foo有一個形參變量num,當(dāng)它在main函數(shù)中被調(diào)用時,實參變量x的值傳送到num,且x和num在不同的內(nèi)存單元中.在函數(shù)Foo中,雖然num被設(shè)置為0,但并不影響x的值,程序運行結(jié)果如下:
num = 0;
x = 10;
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -