默認參數指的是當函數調用中省略了實參時,自動使用一個值。
這裡首先需要注意的是:
對於帶參數列表的函數,必須從右向左添加默認值。
也就是說,要為某個參數設置默認值,則必須為它右邊的所有參數提供默認值。
今天遇到的坑兒,就是函數使用默認參數,並且函數的聲明和定義是分開的。
char* left(const char* str, int n=1);
int main()
{
}
char* left(const char* str, int n = 1)//錯誤
{
}
上面代碼可以有兩種修改:
1聲明時帶有默認參數,實現時沒有默認值
char* left(const char* str, int n=1);
int main()
{
}
char* left(const char* str, int n )
{
}
2實現時帶有默認參數,聲明時沒有默認值
char* left(const char* str, int n);
int main()
{
}
char* left(const char* str, int n = 1)
{
}
還有一個我們經常犯的錯誤。
很多情況,我們可以使用默認參數來替代函數重載:
void point(int,int){//...}
void point(int a){return point(a,4);}
void point(){return point(3,4);}
可以用下面的默認參數的函數來替代:
void point(int=3,int=4);
當調用“point();”時,即調用“point(3,4);” 它是第3個聲明的重載函數。
當調用“point(6);”時,即調用“point(6,4);”,它是第2個聲明的重載函數。
當調用“point(7,8);”時,即調用第1個聲明的重載函數
當你竊喜的時候,如果一組重載函數(可能帶有默認參數)都允許相同實參個數的調用,將會引起調用的二義性。
void func(int); //重載函數之一
void func(int,int=4); //重載函數之二,帶有默認參數
void func(int=3,int=4); //重載函數之三,帶有默認參數
func(7); //error: 到底調用3個重載函數中的哪個?
func(20,30) //error:到底調用後面2個重載函數的哪個?