1. 程式人生 > >函數參數的擴展(六)

函數參數的擴展(六)

C++ 占位參數

在 C++ 中可以在函數聲明時為參數提供一個默認值,當函數調用時沒有提供參數的值時,則使用默認值。函數的默認值必須在函數聲明中指定,那麽在函數定義中是否可以出現參數的默認值呢當函數聲明和定義中的參數默認值不同時會發生什麽呢?我們通過實例代碼進行分析

#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

函數參數的擴展(六)