C++ 函數參數的擴展

一、函數參數的默認值

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語言中的不規範寫法

相關文章
相關標籤/搜索