默认参数就是给函数的形参一个缺省值,在调用的时候,可以根据实际情况省略实参。

注意

  1. C++有默认参数,C是没有的。

  2. 如果函数同时有声明、实现,默认参数只能放在函数声明中。

  3. 默认参数的值可以的常量、全局符号(全局变量、函数名)。

    int f(int a, int b)
    {
        return a + b;
    }
    
    int test(int a, int b = 10, int (*func)(int, int) = f)
    {
        return func(a, b);
    }
  4. 只能从右往左给。

    这样是正确的。

    int test(int a, int b = 10, int c = 20)
    {
        return a + b + c;
    }

    这样是不正确的。

    int test(int a, int b = 10, int c)
    {
        return a + b +c;
    }
  5. 调用函数的时候,是无法像Python一样指定某个参数的值的,只能从左往右赋值。

  6. 默认参数和函数重载一起使用时,可能会产生二义性。解决方案就是二选一,删掉一个。

    void func(int a);
    void func(int a, int b = 3);
    
    int main()
    {
        func(10);
        return 0;
    }

本质

int test(int a, int b = 10, int c = 20)
{
    return a + b + c;
}

int main()
{
    test(10);		// 编译过后,在调用函数的时候,与调用test(10, 20, 30);过程一致。
    test(10, 20);	// 编译过后,在调用函数的时候,与调用test(10, 20, 30);过程一致。
    test(10, 20, 30);
    // test(10, 20, 30)调用过程如下
    // push 30
    // push 20
    // push 10
    // call 0FA1424h
    // ...
    return 0;
}