程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> 沒有躲過的坑

沒有躲過的坑

編輯:關於C++

默認參數指的是當函數調用中省略了實參時,自動使用一個值。

這裡首先需要注意的是:
對於帶參數列表的函數,必須從右向左添加默認值。
也就是說,要為某個參數設置默認值,則必須為它右邊的所有參數提供默認值。

今天遇到的坑兒,就是函數使用默認參數,並且函數的聲明和定義是分開的。

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個重載函數的哪個?
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved