函數參數的擴展(六)
#include <stdio.h> int mul(int x = 0); int main(int argc, char *argv[]) { printf("mul() = %d\n", mul()); printf("mul(-1) = %d\n", mul(-1)); printf("mul(2) = %d\n", mul(2)); return 0; } int mul(int x) { return x * x; }
我們看到在聲明函數 mul 時,我們將參數默認聲明為 0,我們來看看這個程序可以編譯成功嗎?如果可以,在 main 函數中會打印出什麽?
我們發現它沒有報錯,也就是說在 C++ 中支持在函數聲明時,支持參數默認值。那我們試試在 C 語言比那一起中是否也支持這樣的寫法呢?
我們看到這樣的寫法在 C 語言的編譯器中是不支持的,那麽我們試試在定義中給默認值,聲明中不給呢,看 g++ 編譯器是否支持
我們看到它報錯了,所以只能在聲明時給參數默認值。
那麽函數既然支持參數默認值,那它在多個參數設置時有沒有規則呢?有兩條規則:a> 參數的默認值必須從右向左提供;b> 函數調用時使用了默認值,則後續參數必須使用默認值
我們以代碼為例進行分析
#include <stdio.h> int add(int x, int y = 1, int z = 2); int main(int argc, char *argv[]) { printf("add(1) = %d\n", add(1)); // 4 printf("add(1, 2) = %d\n", add(1, 2)); // 5 printf("add(1, 2, 3) = %d\n", add(1, 2, 3));// 6 return 0; } int add(int x, int y, int z) { return x + y + z; }
我們分析下這個代碼,默認參數 y 和 z 的值分別為 1 和 2。那麽 main 函數中的返回值分別為 1 + 1 + 2 = 4; 1 + 2 + 2 = 5; 1 + 2 + 3 = 6;我們來看看結果是否如此呢?
我們看到結果確實是如我們所分析的那樣。那麽我們試試只給 y 默認值,也就是說不遵循從右向左分配,看看會編譯成功嗎?
我們看到編譯報錯了,那麽如果只想給 y 默認值該怎麽做呢?只需把 y 和 z 的位置換下就行,將它放在最右邊。
下來我們來說說函數占位參數,在 C++ 中可以為函數提供占位參數。占位參數只有參數類型聲明,而沒有參數名聲明;在一般情況下,在函數體內部無法使用占位參數。
我們以代碼為例,看看函數占位參數是什麽樣的
#include <stdio.h> int func(int x, int); int main(int argc, char *argv[]) { printf("func(1, 2) = %d\n", func(1, 2)); return 0; } int func(int x, int) { return x; }
我們試試能否編譯通過呢
我們看到編譯是通過的,那麽我們是不是覺得這是多此一舉呢?明明只是個需要一個參數,卻多了一個占位參數。下來我們就來講下函數占位參數的意義,占位參數與默認參數結合起來使用,兼容 C 語言程序中可能出現的不規範寫法。我們還記得之前那麽 void func() 和 void func(void) 等價這個問題嘛,在 C 語言中它是不等價的,因為第一個是代表可接受任意多的參數,而後一個是不接受參數。而在 C++ 中它們兩個表達的意思是一樣的。
通過對函數占位參數的 學習,總結如下:1、C++ 中支持參數的默認值;2、如果函數調用時沒有提供參數值,則使用默認值;3、參數的默認值必須從右向左提供;4、函數調用時使用了默認值,則後續參數必須使用默認值;5、C++ 中支持占位參數,用於兼容 C 語言中的不規範寫法。
歡迎大家一起來學習 C++ 語言,可以加我QQ:243343083。
函數參數的擴展(六)