函數默認參數和函數調用傳參匹配原則

C++中允許爲函數提供默認參數,又名缺省參數。
  • 使用默認參數時的注意事項:

① 有函數聲明(原型)時,默認參數可以放在函數聲明或者定義中,但只能放在二者之一。建議放在函數聲明中。

double sqrt(double f = 1.0); //函數聲明

double sqrt(double f)  //函數定義
{
  // ....  
} 

② 沒有函數(原型)時,默認參數在函數定義時指定.

//沒有 函數聲明

double sqrt(double f = 1.0)  //函數定義

③ 在具有多個參數的函數中指定默認值時,默認參數都必須出現在不默認參數的右邊,一旦某個參數開始指定默認值,它右邊的所有參數都必須指定默認值.

int f (int i1, int i2 = 2, int i3 = 3);     // 正確
int g (int i1, int i2 = 2, int i3);         // 錯誤, i3未指定默認值
int h (int i1 = 1, int i2, int i3 = 3);     // 錯誤, i2未指定默認值

④ 在調用具有默認參數的函數時, 若某個實參默認,其右邊的所有實參都應該默認。

//例如, 一個函數聲明如下
int f(int i1 = 1, int i2 =2, int i3 = 3);


//調用函數 f()
f();             //正確, i1=1, i2=2, i3=3
f(3);            //正確, i1=3, i2=2, i3=3
f(2, 3);         //正確, i1=2, i2=3, i3=3
f(4, 5, 6);      //正確, i1=4, i2=5, i3=6
f(, 2, 3);       //錯誤, i1默認,其右邊的i2和i3沒有默認

注意的是:
帶缺省值的參數必須放在參數列表的最後面。因爲傳參是從右向左的。
缺省參數不能同時在函數聲明和定義中出現,只能二者留其一。
缺省值必須是常量或者全局變量。
C語言並不支持缺省。


函數傳參順序和匹配原則:

假設一個函數頭是void show(int a,int b,int c)
1、因爲傳參時,是按形參列表從左向右賦值的(即先賦給a,再賦給b,最後賦給c)。故如果設默認值的話,應該從最右端開始,才能保證傳進來的值能正確對應地賦給所想的參數,也不會覆蓋掉預先設好的默認值

2、上例中,如果要定義默認參數,則首先應該定義c的默認參數值,只有在c的默認值定義好的情況下才能繼續定義b爲默認參數。滿足從右向左順序。例如,void show(int a,int b =1,int c=2)

3、如果不按順序來,比如定義成了void show(int a,int b=1,int c),首先,vs2010會報錯。不過,先假設比較早的版本不報錯。
若想讓b使用默認值,則在調用函數時無法成功
1)比如,寫成show(2,3),這樣寫是錯誤的
2)比如,寫成show(2,3),系統肯定會認爲這是給a、b傳的值。而c沒被傳值,又沒有默認值,因此還是錯的

總結:
設置函數默認參數(缺省實參)是從右往左;調用函數傳入實參時,實參和函數的形參的匹配順序是從左往右

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章