您的位置:

C++默认参数的详细解析

C++中的默认参数是指在函数声明中给某个形参一个默认值,当在调用函数时这个参数没有被传值,那么就会使用默认参数,否则就使用传进来的值。默认参数可以在函数声明的时候指定。

一、默认参数的基本用法

定义一个带有默认参数的函数可以像下面这样:


#include<iostream>

using namespace std;

// 默认值在声明中指定
int add(int x = 0, int y = 0)
{
    return x + y;
}

int main()
{
    cout << add() << endl;       // 输出 0
    cout << add(1) << endl;      // 输出 1
    cout << add(2, 3) << endl;   // 输出 5

    return 0;
}

在上面的代码中,我们定义了一个函数add(),它带有两个参数x和y,其中x和y的默认值均为0。在main函数中,我们分别调用add()函数,第一个调用没有传递任何参数,因此使用x和y的默认值0,第二个调用只传递了一个参数1,因此使用x的值1和y的默认值0,第三个调用传递了两个参数2和3,因此使用了x的值2和y的值3。

二、默认参数的注意事项

下面是一些需要注意的默认参数使用情况:

1. 参数顺序

当函数有多个参数时,以默认参数结尾的函数声明形参列表中的参数可以被省略,但是用户必须以与声明相同的顺序提供非默认实参。


#include<iostream>

using namespace std;

// 不能把y放在x前面
int add(int x, int y = 0)
{
    return x + y;
}

int main()
{
    cout << add(1) << endl;      // 输出 1
    cout << add(2, 3) << endl;   // 输出 5

    return 0;
}

在上面的代码中,我们可以看到,如果在函数声明中把默认参数放在非默认参数之前,编译器将会报错。

2. 多个默认参数的函数

如果一个函数有多个参数需要设置默认值时,我们可以这样来实现:


#include<iostream>

using namespace std;

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

int main()
{
    cout << add() << endl;           // 输出 0
    cout << add(1) << endl;          // 输出 1
    cout << add(2, 3) << endl;       // 输出 5
    cout << add(4, 5, 6) << endl;    // 输出 15

    return 0;
}

上面的代码可看到,我们在函数声明中分别为三个参数设置默认值,当我们调用函数时,可以选择传递一个,两个或者三个参数。如果只传递了一个参数,那么前两个参数将会使用默认值,如果传递了两个参数,那么第三个参数仍然使用默认值。

3. 默认参数可以是常量表达式

默认参数可以是任何完整类型的表达式,包括常量表达式。这意味着您可以使用任何表达式(包括使用常量表达式)来设置默认参数。


#include<iostream>
using namespace std;

#define DEFAULT_Y 10

int add(int x, int y = DEFAULT_Y);

int main()
{
    cout << add(1) << endl;              // 输出 11

    return 0;
}

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

4. 默认参数不能在声明和定义处同时出现

默认参数需要在声明或定义中指定,但不能同时出现。在声明中指定的默认参数不允许出现在函数定义中,并且反之亦然。

下面这段代码是错误的:

// 错误示例,同一参数不能同时在声明和定义中指定默认值
#include<iostream>
using namespace std;

int add(int x = 10, int y = 20);

int main()
{
    cout << add() << endl;

    return 0;
}

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

三、结语

这篇文章详细介绍了C++中默认参数的基本用法,以及需要注意的几个问题。在编写大型程序和代码转换时,这些默认值的灵活性非常有用。同时注意,不要滥用默认参数,以免使代码变得更加难以理解。