📜  有关C++中默认参数的一些有趣事实(1)

📅  最后修改于: 2023-12-03 15:10:38.118000             🧑  作者: Mango

有关 C++ 中默认参数的一些有趣事实

在 C++ 中,函数可以有默认参数。默认参数是为了方便调用函数而设置的,如果函数的某个参数没有传入值,那么就会使用该参数的默认值。这篇文章将介绍一些有趣的关于 C++ 中默认参数的事实。

默认参数的声明顺序

在 C++ 中,如果函数有多个参数,并且其中某些参数有默认值,那么默认值参数必须是函数参数列表中最后面的参数。

// 正确的默认参数声明方式:
void foo(int x, int y = 2, int z = 3);

// 错误的默认参数声明方式:
void bar(int x = 1, int y, int z);
默认参数默认为右侧参数

在 C++ 中,默认参数被赋值时会使用右侧的参数值,而不是左侧的参数值。如果右侧的参数是表达式,则该表达式只会在函数被调用时才会被计算。

#include <iostream>

// 只有 x 有默认值,默认值为 y * 2
void foo(int y, int x = y * 2)
{
    std::cout << "x = " << x << std::endl;
}

int main()
{
    foo(10); // 输出:x = 20
    foo(5, 8); // 输出:x = 8
    return 0;
}
对默认参数进行重载

在 C++ 中,可以对一个函数的默认参数进行重载,来避免在多个函数中重复设置相同的默认参数。

#include <iostream>

void foo(int x, int y = 2, int z = 3)
{
    std::cout << "foo(" << x << "," << y << "," << z << ")" << std::endl;
}

// 重载 foo 函数,省略第三个参数,默认为第二个参数的两倍
void foo(int x, int y)
{
    foo(x, y, y * 2);
}

int main()
{
    foo(1, 2); // 输出:foo(1,2,4)
    foo(5, 3, 9); // 输出:foo(5,3,9)
    return 0;
}
默认参数和函数指针

在 C++ 中,函数指针也可以用作函数的默认参数。但是需要注意的是,函数指针的默认值必须是 nullptr。如果默认参数不是 nullptr,那么编译器会报错。

#include <iostream>

void foo(int x, int (*func)(int, int) = nullptr)
{
    if (func != nullptr)
    {
        std::cout << "result = " << func(x, 2) << std::endl;
    }
    else
    {
        std::cout << "no func provided" << std::endl;
    }
}

int add(int x, int y)
{
    return x + y;
}

int main()
{
    foo(10); // 输出:no func provided
    foo(10, add); // 输出:result = 12
    return 0;
}

以上就是关于 C++ 中默认参数的一些有趣事实的介绍。在编写函数时,可以充分利用默认参数来简化函数调用的过程。