C++中能夠在函數聲明時爲參數提供一個默認值,當函數調用時沒有提供參數的址,則使用默認值c++
int mul(int x = 0); int main(int argc, char * argv[]) { printf("%d\n", mul()); // mul(0) return 0; } int mul(int x) { return x * x; }
參數的默認值必須在函數聲明中指定
安全
問題:函數定義中是否能夠出現參數的默認值?函數
當函數聲明和定義中的參數默認值不一樣時會發生什麼?設計
#include <stdio.h> int mul(int x = 0); // 函數聲明的時候提供了默認值 int main(int argc, char *argv[]) { printf("%d\n", mul()); // 沒有傳參,使用默認值 printf("%d\n", mul(-1)); printf("%d\n", mul(2)); return 0; } //int mul(int x = 5) // 定義的時候再提供一個默認值 int mul(int x) { return x * x; }
// 一、函數聲明的時候提供了默認值 ok int mul(int x = 0); int mul(int x) { return x * x; } // 二、函數聲明和定義都提供了默認值,err int mul(int x = 0); int mul(int x = 5) { return x * x; } // 三、函數定義時提供默認值,err int mul(int x); int mul(int x = 5) { return x * x; }
故函數只能在聲明的時候提供默認值,不能在定義的時候提供默認值code
函數默認參數的規則io
- 函數參數默認值必須從右向左提供
- 函數調用時使用了默認值,則後續參數參數必須使用默認值
add(0); // x = 0, y使用默認值,則後續參數z必須使用默認值 add(2,3); // x = 2, y = 3,
從右向左考慮,這是針對函數設計來講編譯
從左向右匹配是指函數調用來講class
#include <stdio.h> int add(int x, int y = 0, int z = 0); // int add(int x, int y = 0, int z); // err // int add(int x, int z, int y = 0); // ok int main(int argc, char *argv[]) { printf("%d\n", add(1)); printf("%d\n", add(1, 2)); printf("%d\n", add(1, 2, 3)); return 0; } int add(int x, int y, int z) { return x + y + z; }
在C++中能夠爲函數提供佔位參數,佔位參數只有參數類型聲明,而沒有參數名聲明,通常狀況下函數體內部沒法使用佔位參數bug
int func(int x, int) { return x; } func(1, 2); // ok
佔位參數沒有名字,在函數體內部沒法使用gc
函數佔位參數存在的意義
- 佔位參數於默認參數結合起來使用
- 兼容C語言程序中可能出現的不規範的寫法
考慮這兩種寫法是否等價?
void func(); void func(void);
// C 不等價 void func(); // 無返回值,參數爲任意參數 void func(void); // 無返回值,不接收任何參數 // C++ 等價 void func(); void func(void); // 無返回值,無參數
C++爲了兼容C語言
// C void func() { } // 在C語言中能夠編譯經過 int main(int argc, char * argv[]) { func(1,2); func(); } // c++中編譯確定不行,爲了快速修改代碼,不出bug,就用了佔位參數 void func(int, int) { } int main(int argc, char * argv[]) { func(1,2); // ok func(); // 可是這樣調用又掛掉了,由於沒提供沒有佔位參數 } // C++, 佔位參數和默認參數值結合起來 void func(int = 0, int = 0) { } int main(int argc, char * argv[]) { func(1,2); // ok func(); // ok }
這樣,將C語言移植到C++,代碼修改很是小,並且安全。
C++中支持函數參數的默認值若是函數調用時沒有提供參數值,則使用默認值
參數的默認值必須從右向左提供
函數調用時使用了默認值,則後續參數必須使用默認值
C++中支持佔位參數,用於兼容C語言中的不規範寫法