用于添加默认参数的C ++特定语法

时间:2011-12-13 21:01:00

标签: c++ function arguments default-value

想象一下,你的代码库中有一个函数X()。它需要三个参数。原型看起来像这样:

在头文件中:

void X(string a, int b, string c);

在.cpp文件中:

void myclass::X(string a, int b, string c) {
...
}

假设您要添加到代码库中,并且特别需要传递第4个参数 到X只在一个地方。 3个参数调用都需要保持不变。您希望避免破坏对X的所有3参数版本的调用。

我已尝试使用建议here,但这不起作用。答案一仍然产生没有找到匹配功能的错误。尝试做出回答2个建议的答案会产生错误,我无法重载该功能。具体来说,我尝试这个,基于该链接中的答案2:

在头文件中:

void X(string a, int b, string c, string d);    
void X(string a, int b, string c, string d="default_value");

非常感谢有关如何正确添加单个4参数调用而不破坏所有3参数调用的任何建议 - 谢谢!

4 个答案:

答案 0 :(得分:3)

只需添加一个新原型,保留前一个原型:

string X(string a, int b, string c);    
string X(string a, int b, string c, string d);

您无法为新参数指定默认值,因为这会导致歧义:编译器无法知道您要调用哪种方法。

或者您可以用新的定义替换旧定义,获取一个额外参数,并为其设置默认值。但在这种情况下,您必须删除以前的函数声明。

提示:

根据您的语法,我认为您正在使用

using namespace std;
在标题中

。这是不好的做法。这样做会在包含此标头的任何位置使用std命名空间填充全局命名空间。您应该删除此指令,然后对您的类型进行限定:std::string而不是string

答案 1 :(得分:1)

在头文件中,您需要有两个函数

void string X(string a, int b, string c);
void string X(string a, int b, string c, string d);

这样,使用三个参数调用X的所有代码段都不会中断,并且调用带有四个参数调用X的单个位置(即调用适当的重载函数)。

答案 2 :(得分:0)

您只需要头文件中的第二个定义。拥有它们都是造成重载错误的原因。

void string X(string a, int b, string c, string d="default_value");

表示当给出4个值时,使用提供的d,当只给出3时,将d设置为“default_value”。

答案 3 :(得分:0)

此示例使用最大警告级别编译:

#include <iostream>
#include <string>

void foo(std::string , int , std::string , std::string d="default_value")
{
    std::cout<<"d="<<d<<std::endl;
}


int main() {
    foo("param1",55,"param2");
}

foo函数的最后一个参数有一个默认值。