默认参数的函数
第九節(jié) 默認(rèn)參數(shù)的函數(shù)
1.默認(rèn)參數(shù)的目的
C++可以給函數(shù)定義默認(rèn)參數(shù)值。通常,調(diào)用函數(shù)時(shí),要為函數(shù)的每個(gè)參數(shù)給定對(duì)應(yīng)的實(shí)參。例如:
void delay(int loops); //函數(shù)聲明
void delay(int loops) //函數(shù)定義
{
if(100ps==0)
return;
for(int i=0;i<loops,i++);
}
無(wú)論何時(shí)調(diào)用delay()函數(shù),都必須給loops傳一個(gè)值以確定時(shí)間。但有時(shí)需要用相同的實(shí)參反復(fù)調(diào)用delay()函數(shù)。C++可以給參數(shù)定義默認(rèn)值。如果將delay( )函數(shù)中的loops定義成默認(rèn)值1000, 只需簡(jiǎn)單地把函數(shù)聲明改為:
void delay(int loops=1000);?
這樣,無(wú)論何時(shí)調(diào)用delay()函數(shù),都不用給loops賦值,程序會(huì)自動(dòng)將它當(dāng)作值1000進(jìn)行處理。例如,調(diào)用:
delay(2500); //loops設(shè)置為2500
delay(); //ok:loops采用默認(rèn)值1000
調(diào)用中,若不給出參數(shù),則按指定的默認(rèn)值進(jìn)行工作。
允許函數(shù)默認(rèn)參數(shù)值,是為了讓編程簡(jiǎn)單,讓編譯器做更多的檢查錯(cuò)誤工作。
2.默認(rèn)參數(shù)的聲明
默認(rèn)參數(shù)在函數(shù)聲明中提供,當(dāng)又有聲明又有定義時(shí),定義中不允許默認(rèn)參數(shù)。如果函數(shù)只有定義,則默認(rèn)參數(shù)才可出現(xiàn)在函數(shù)定義中。例如:
void point(int=3,int=4); //聲明中給出默認(rèn)值
void point(intx,inty) //定義中不允許再給出默認(rèn)值
{
cout <<x<<endl;
cout <<y<<endl;
}
3.默認(rèn)參數(shù)的順序規(guī)定
如果一個(gè)函數(shù)中有多個(gè)默認(rèn)參數(shù),則形參分布中,默認(rèn)參數(shù)應(yīng)從右至左逐漸定義。當(dāng)調(diào)用函數(shù)時(shí),只能向左匹配參數(shù)。例如:
void func(int a=1,int b,int c=3, int d=4); //error
void func(int a, int b=2,int c=3,int d=4); //ok
對(duì)于第2個(gè)函數(shù)聲明,其調(diào)用的方法規(guī)定為:
func(10,15,20,30); //ok:調(diào)用時(shí)給出所有實(shí)參
func(); //error:參數(shù)a沒(méi)有默認(rèn)值
func(i2,12); //ok:參數(shù)c和d默認(rèn)
func(2,15,20); //error:只能從右到左順序匹配默認(rèn)
4.默認(rèn)參數(shù)與函數(shù)重載
默認(rèn)參數(shù)可將一系列簡(jiǎn)單的重載函數(shù)合成為一個(gè)。例如, 下面3個(gè)重載函數(shù):
void point(int,int){//...}
void point(int a){return point(a,4);}
void point(){return point(3,4);}
可以用下面的默認(rèn)參數(shù)的函數(shù)來(lái)替代:
void point(int=3,int=4);
當(dāng)調(diào)用“point();”時(shí),即調(diào)用“point(3,4);” 它是第3個(gè)聲明的重載函數(shù)。
當(dāng)調(diào)用“point(6);”時(shí),即調(diào)用“point(6,4);”,它是第2個(gè)聲明的重載函數(shù)。
當(dāng)調(diào)用“point(7,8);”時(shí),即調(diào)用第1個(gè)聲明的重載函數(shù)
如果一組重載函數(shù)(可能帶有默認(rèn)參數(shù))都允許相同實(shí)參個(gè)數(shù)的調(diào)用,將會(huì)引起調(diào)用的二義性。例如:
void func(int); //重載函數(shù)之一
void func(int,int=4); //重載函數(shù)之二,帶有默認(rèn)參數(shù)
void func(int=3,int=4); //重載函數(shù)之三,帶有默認(rèn)參數(shù)
func(7); //error: 到底調(diào)用3個(gè)重載函數(shù)中的哪個(gè)?
func(20,30) //error:到底調(diào)用后面2個(gè)重載函數(shù)的哪個(gè)?
5.默認(rèn)值的限定
默認(rèn)值可以是全局變量、全局常量,甚至是一個(gè)函數(shù)。例如:
int a=1;
int fun(int);
int g(int x;fun(a)); //ok:允許默認(rèn)值為函數(shù)
默認(rèn)值不可以是局部變量,因?yàn)槟J(rèn)參數(shù)的函數(shù)調(diào)用是在編譯時(shí)確定的,而局部變量的位置與值在編譯時(shí)均無(wú)法確定。例如:
void fun()
{
int i;
void g(int x=i); //error:處理g()函數(shù)聲明時(shí),i不可見(jiàn)
}
本章小結(jié)
隨著程序量和程序復(fù)雜度的不斷增加,最好的辦法是把程序分成更小,更容易管理的模塊,這種模塊就是函數(shù)。
函數(shù)名最好能反映出所要完成的任務(wù)。
函數(shù)可以把數(shù)據(jù)返回給調(diào)用者,若函數(shù)要返回一個(gè)值,必須在函數(shù)名前規(guī)定返回值的類(lèi)型,若函數(shù)沒(méi)有返回值,則類(lèi)型為void。
程序通過(guò)參數(shù)把信息傳遞給函數(shù),若函數(shù)需要接受參數(shù),就必須給參數(shù)指定名稱(chēng)及類(lèi)型。
C++必須知道函數(shù)的返回類(lèi)型以及接受的參數(shù)個(gè)數(shù)和類(lèi)型, 如果函數(shù)的定義出現(xiàn)在函數(shù)調(diào)用之后,就必須在程序的開(kāi)始部分用函數(shù)原型進(jìn)行聲明。
局部變量是在函數(shù)內(nèi)部定義的,只能被定義該變量的函數(shù)訪問(wèn)。全局變量是指其作用域貫穿程序始終的變量。定義全局變量要在程序開(kāi)始時(shí)進(jìn)行,并且放在所有函數(shù)的外面。
靜態(tài)局部變量是在函數(shù)內(nèi)部定義,但生命期卻隨函數(shù)的第一次被調(diào)用而產(chǎn)生, 隨程序的結(jié)束而結(jié)束, 靜態(tài)局部變量只能在定義該變量的函數(shù)中可見(jiàn)。
函數(shù)調(diào)用機(jī)制是由棧操作的過(guò)程實(shí)現(xiàn)的。函數(shù)可以遞歸調(diào)用。函數(shù)定義不能放在任何函數(shù)定義的里面。
內(nèi)聯(lián)函數(shù)是為了提高編程效率而實(shí)現(xiàn)的, 它克服了用#define宏定義所帶來(lái)的弊病。
函數(shù)重載允許用同一個(gè)函數(shù)名定義多個(gè)函數(shù)。連接程序會(huì)根據(jù)傳遞給函數(shù)的參數(shù)數(shù)目、類(lèi)型和順序調(diào)用相應(yīng)的函數(shù)。函數(shù)重載使程序設(shè)計(jì)簡(jiǎn)單化,程序員只要記住一個(gè)函數(shù)名,就可以完成一系列相關(guān)的任務(wù)。
在函數(shù)定義中通過(guò)賦值運(yùn)算,即可指定默認(rèn)參數(shù)值。一旦程序在調(diào)用函數(shù)時(shí)默認(rèn)了參數(shù)值, 函數(shù)就使用默認(rèn)參數(shù)值。 不允許在參數(shù)中間使用默認(rèn)值。指定默認(rèn)參數(shù)值可以使函數(shù)的使用更為簡(jiǎn)單,同時(shí)也增強(qiáng)了函數(shù)的可重用性。
轉(zhuǎn)載于:https://www.cnblogs.com/bigbigtree/archive/2012/10/01/2709557.html
總結(jié)
- 上一篇: hdu 4417 Super Mario
- 下一篇: 金融系列4《基本指令》