天天看點

【C++深度解析】5、函數參數的擴充

文章目錄

    • 1 函數參數的預設值
      • 1.1 函數預設參數的規則
    • 2 函數占位參數
    • 3 小結

  • C++ 中可以在函數聲明時為參數提供一個預設值,當函數調用時沒有提供參數的值,則使用預設值
  • 參數的預設值必須在函數聲明中指定

問題:函數定義中是否可以出現參數的預設值?當聲明和定義中的參數預設值不同會發生什麼?

執行個體分析:預設參數值初探

// 5-1.c
#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)
{
    return x * x;
}
           

函數 mul() 在聲明時指定了參數的預設值,當沒有指定參數時使用預設值,指定參數時,使用指定值。

編譯運作結果如下:

$ g++ 5-1.c -o 5-1
$ ./5-1
0
1
4
           

當聲明時沒有提供預設參數,定義中提供預設參數時,會有編譯錯誤,提示。也就是第 3 行改為 int mul(int x); 第 11 行改為 int mul(int x = 0),重新編譯:

【C++深度解析】5、函數參數的擴充

當聲明和定義中的參數預設值不同時,這裡将 5-1.c 的第 11 行改為 int mul(int x = 5),重新編譯:

【C++深度解析】5、函數參數的擴充

是以,參數的預設值必須在函數聲明中指定

  • 參數的預設值必須從右向左提供
  • 函數調用時使用了預設值,則後續參數必須使用預設值
【C++深度解析】5、函數參數的擴充

在 C++ 中可以為函數提供占位參數

  • 占位參數隻有參數類型聲明,而沒有參數名聲明
  • 一般情況下,在函數體内部無法使用占位參數
【C++深度解析】5、函數參數的擴充

占位參數就是一個隻有參數類型沒有參數名的參數,那麼占位參數好像沒有什麼用呀,我們繼續向下看:

函數占位參數的意義

  • 占位參數與預設參數結合起來使用
  • 相容 C 語言程式中可能出現的不規範寫法

先看一個之前講過的問題,下面兩種聲明方式等價嗎?

【C++深度解析】5、函數參數的擴充

在 C 語言中二者是不等價的,void func() 表示可以有任意多各參數,void func(void) 表示沒有參數

在 C++ 中,二者是等價的,C++ 類型檢查更嚴格,都表示函數沒有參數

在 C++ 中,為了相容 C 語言不規範的代碼(參數數量改變),将占位參數和預設參數結合使用,下面看一下案例,更加直覺:

// 5-2.c
#include<stdio.h>
int func(int x, int = 0);
int main(int argc, char* argv[])
{
    printf("%d\n", func(1));
    printf("%d\n", func(2, 3));
    return 0;
}
int func(int x, int)
{
    return x;
}