先來個例子:
1 #include <iostream> 2 3 using namespace std; 4 5 int sub(int x=8,int y=3){ 6 return x+y; 7 } 8 9 int main(){ 10 //freopen("D:\\input.in","r",stdin); 11 //freopen("D:\\output.out","w",stdout); 12 cout<<sub(20,15)<<endl;//35 13 cout<<sub(10)<<endl;//13 14 cout<<sub()<<endl;//11 15 return 0; 16 }
需要注意的地方:
1.若函數具有多個形參,則默認形參值必須自右向左連續地定義,並且在一個默認形參值的右邊不能有未指定默認值的參數。這是由於c++語言在函數調用時參數是自右向左入棧這一約定決定的。
eg:int f(int a, float b=5.0, char c='c');
2.在調用一個函數時,如果省去了某個實參,則直到最右端的所有實參都得省去(當然,與其對應的形參要有默認值)。
eg:int f(int a, float b=5.0, char c='c', int d=10); f(9,4.5) <=> f(9,4.5,'c',10).
3.默認形參值的說明必須出現在函數調用之前。而且,如果存在函數原型,則形參的默認值應在函數原型中指定;否則在函數定義中指定。另外,若函數原型中已給出了形參的默認值,則在函數定義中不得重復指定,即使所指定的默認值完全相同也不行。
eg:
1 #include <iostream> 2 3 using namespace std; 4 5 int sub(int x=8,int y=3); 6 7 int main(){ 8 //freopen("D:\\input.in","r",stdin); 9 //freopen("D:\\output.out","w",stdout); 10 cout<<sub(20,15)<<endl;//35 11 cout<<sub(10)<<endl;//13 12 cout<<sub()<<endl;//11 13 return 0; 14 } 15 int sub(int x,int y){ 16 return x+y; 17 }
4.在同一個作用域,一旦定義了默認形參值,就不能再定義它。
5.如果幾個函數說明出現在不同的作用域內,則允許分別為它們提供不同的默認形參值。
eg:
1 #include <iostream> 2 3 using namespace std; 4 5 int sub(int x=8,int y=3); 6 7 int main(){ 8 //freopen("D:\\input.in","r",stdin); 9 //freopen("D:\\output.out","w",stdout); 10 int sub(int x=0,int y=0); 11 cout<<sub()<<endl; 12 return 0; 13 }
6.對形參默認值的指定可以是初始化表達式,甚至可以包含函數調用。
eg:int f(int a, float b=5.0, char c='c', int d=sub(20,15));
7. 在函數原型給出了形參的默認值時,形參名可以省略。
eg:int f(int, float=5.0, char='c', int=sub(20,15));