C++默认参数与函数重载
C++默認參數(shù)與函數(shù)重載
一、默認參數(shù)
在C++中,可以為參數(shù)指定默認值。在函數(shù)調(diào)用時沒有指定與形參相對應(yīng)的實參時,?就自動使用默認參數(shù)。
默認參數(shù)的語法與使用:
(1)在函數(shù)聲明或定義時,直接對參數(shù)賦值。這就是默認參數(shù);
(2)在函數(shù)調(diào)用時,省略部分或全部參數(shù)。這時可以用默認參數(shù)來代替。
注意:
(1)默認參數(shù)只可在函數(shù)聲明中設(shè)定一次。只有在無函數(shù)聲明時,才可以在函數(shù)定義中設(shè)定。
(2)默認參數(shù)定義的順序為自右到左。即如果一個參數(shù)設(shè)定了缺省值時,其右邊的參數(shù)都要有缺省值。
如:int?mal(int?a,?int?b=3,?int?c=6,?int?d=8)????正確,按從右到左順序設(shè)定默認值。
????????int?mal(int?a=6,?int?b=3,?int?c=5,?int?d)???錯誤,未按照從右到左設(shè)定默認值。c設(shè)定缺省值了,而其右邊的d沒有缺省值。
(3)默認參數(shù)調(diào)用時,則遵循參數(shù)調(diào)用順序,自左到右逐個調(diào)用。這一點要與第(2)分清楚,不要混淆。
如:void?mal(int?a,?int?b=3,?int?c=5);??????//默認參數(shù)
?????????mal(3,?8,?9?);???????????????????????????????????????//調(diào)用時有指定參數(shù),則不使用默認參數(shù)
????????mal(3,?5);???????????????????//調(diào)用時只指定兩個參數(shù),按從左到右順序調(diào)用,相當于mal(3,5,5);
????????mal(3);???????????????????????//調(diào)用時只指定1個參數(shù),按從左到右順序調(diào)用,相當于mal(5,3,5);
?????????mal(?);??????????????????????//錯誤,因為a沒有默認值
?????????mal(3,?,?9)????????????????//錯誤,應(yīng)按從左到右順序逐個調(diào)用
再如:?void?mal(int?a=8,?int?b=3,?int?c=5);??????//默認參數(shù)
??????????????mal(?);??????????????????????????????????????????????????????//正確,調(diào)用所有默認參數(shù),相當于mal(8,3,5);
(4)默認值可以是全局變量、全局常量,甚至是一個函數(shù)。但不可以是局部變量。因為默認參數(shù)的調(diào)用是在編譯時確定的,而局部變量位置與默認值在編譯時無法確定。
二、函數(shù)重載
在相同的聲明域中,函數(shù)名相同,而參數(shù)表不同。通過函數(shù)的參數(shù)表而唯一標識并且來區(qū)分函數(shù)的一種特殊的函數(shù)用法。
參數(shù)表的不同表現(xiàn)為:
1、參數(shù)類型不同;
2、參數(shù)個數(shù)不同;
特別注意:返回類型不同不可以作為函數(shù)重載的標識。
例:
#include?<iostream>usingnamespace?std;?
int?test(int?a,int?b);?
float?test(float?a,float?b);?
void?main()?
...{?
cout?<<?test(1,2)?<<?endl?<<?test(2.1f,3.14f)?<<?endl;?
cin.get();?
}
int?test(int?a,int?b)?
...{?
return?a+b;?
}
float?test(float?a,float?b)?
...{?
return?a+b;?
}
在上面的程序中,用了兩個名為test的函數(shù)來描述int類型和操作的和float類型和操作,方便對相同或者相似功能函數(shù)的管理!?
那么,計算機該如何來判斷同名稱函數(shù)呢?操作的時候會不會造成選擇錯誤呢??
回答是否定的,c++內(nèi)部利用一種叫做名稱粉碎的機智來內(nèi)部重命名同名函數(shù),上面的例子在計算重命名后可能會是testii和testff?,他們是通過參數(shù)的類型或個數(shù)來內(nèi)部重命名的。
1、參數(shù)類型不同的例子:
(1)
#include<iostream.h>?
void?Add(char?x,char?y)?
{cout<<"字符串是:";?
cout<<x<<y<<endl;?
}?
void?Add(int?x,int?y)?
{cout<<"兩數(shù)的和是:?";?
cout<<x+y<<endl;?
}?
void?main()?
{?
Add('O','k');?
Add(65,100);?
}
(2)重載函數(shù)abs(),求int、float和double類型數(shù)據(jù)的絕對值。
#include?<iostream.h>?
//求int型數(shù)據(jù)的絕對值?
int?abs(int?x)?
{?
if?(x<0)?x=-x;?
return?x;?
}?
//求float型數(shù)據(jù)的絕對值?
float?abs(float?x)?
{?
if?(x<0)?x=-x;?
return?x;?
}?
//求?double型數(shù)據(jù)的絕對值?
//仿照上面的函數(shù)編寫?
//主函數(shù)?
void?main()?
{?
int?a=-357;?
float?b=63.85;?
double?c=-6974.26;?
cout<<abs(a)<<'\t'<<abs(b)<<'\t'<<abs(c)<<endl;
2、參數(shù)個數(shù)不同的例子:求2~4個整數(shù)當中的最大值,根據(jù)參數(shù)個數(shù)的不同調(diào)用不同的max()函數(shù)
#include<iostream.h>?
int?max(int?x,int?y)?
{?
if(x>y)?return?x;?
else?return?y;?
}?
int?max(int?x,int?y,int?z)?
{?
int?a=max(x,y);?
return?max(a,z);?
}?
int?max(int?a,int?b,int?c,int?d)?
{?
//自行編制這部分代碼?
}?
main()?
{?
cout<<max(1,2)<<endl;?
cout<<max(1,2,3)<<endl;?
cout<<max(1,2,3,4)<<endl;?
}?
函數(shù)重載的注意事項
1、函數(shù)的形參必須不同,或者個數(shù)不同,或者類型不同,不能夠只依靠函數(shù)的返回值類型不同或形參變量名不同來實現(xiàn)函數(shù)重載。
2、不要將不同功能的函數(shù)定義為重載函數(shù),以免出現(xiàn)對調(diào)用結(jié)果的誤解。如:
int?add(int?x,int?y){return?x+y;}
float?add(float?x,float?y){return?x-y;}
重載函數(shù)與默認參數(shù)重疊導(dǎo)致的二義性問題:
func(int);???????????????????????????????????????????????????????????????????????????????//重載函數(shù)1,只有1個參數(shù),無默認參數(shù)
func(int,?int?=4);???????????????????????????????????????????????????????????????????//重載函數(shù)2,有2個參數(shù),有1個默認參數(shù)
func(int?a=3,?int?b=4,?int?c=6);????????????????????????????????????????????//重載函數(shù)3,有3個參數(shù),有3個默認參數(shù)
fucn(float?a=3.0,?float?b=4.0?float?c=5.0);?????????????????????????????//重載函數(shù)4,有3個參數(shù),有3個默認參數(shù)
fucn(float?a=3.0,?float?b=4.0?float?c=5.0?float?d=7.9?);??????????//重載函數(shù)5,有4個參數(shù),有4個默認參數(shù)
func(2);??????????????????//可調(diào)用前3個函數(shù),出現(xiàn)二義性
func(2.0);???????????????//可調(diào)用后2個函數(shù),出現(xiàn)二義性
所以當重載函數(shù)與默認參數(shù)共同使用時,要注意出現(xiàn)二義性問題。
?
轉(zhuǎn)載于:https://blog.51cto.com/yaoyong2012/940776
總結(jié)
以上是生活随笔為你收集整理的C++默认参数与函数重载的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Android帧缓冲区(Frame Bu
- 下一篇: qsort函数用法