如何在C++中向方法传递可选参数?

162
如何在 C++ 中向方法传递可选参数? 任何代码片段...

15
你没有传递选项参数。你传递的是可选参数! - Chubsdad
如果需要比保留哨兵值提供更明确的控制,请查看boost::optional<>。 - Tony Delroy
9个回答

199

这是一个将 mode 作为可选参数传递的示例

void myfunc(int blah, int mode = 0)
{
    if (mode == 0)
        do_something();
     else
        do_something_else();
}

你可以以两种方式调用myfunc,而且两种方式都是有效的。

myfunc(10);     // Mode will be set to default 0
myfunc(10, 1);  // Mode will be set to 1

请问您能否提供一些关于字符串的示例? - Swapnil Gupta
void myfunc(int blah, char mode[] = NULL): - Pramendra Gupta
2
NULL 表示空指针,即使它被定义为字面量 0。它不是常量零的通用名称。对于整数类型(非指针),您应该使用数字: int mode = 0 - UncleBens
1
如果你正在使用一个类(源文件和头文件),你会在哪里定义默认值? - AceFunk
3
@AceFunk 很晚了,但我看到的代码在头文件中定义了默认值。如果您仔细想想,如果可选项在源代码中定义,系统将不知道您可以省略该值。 - Mars
如果我不知道用户想传递0还是其他任何数字怎么办?我需要一个不是int类型的东西。 - ניר

72

关于默认参数使用的一个重要规则:
默认参数应该在最右端指定,一旦您指定了默认值参数,您就不能再次指定非默认参数。 例如:

int DoSomething(int x, int y = 10, int z) -----------> Not Allowed

int DoSomething(int x, int z, int y = 10) -----------> Allowed 

@Chubsdad - 啊..我的表述有歧义!第二个语句是否正确概括了它?“一旦您指定了默认值参数,就不能再次指定非默认参数”。 - Alok Save
1
那么如果我理解正确,如果我有多个可选参数,我应该要么全部实现,要么完全不实现?我不能选择只使用一个可选参数而不使用其他的吗? - Gerard
@Gerard:「Allowed」示例只显示了一个可选参数,而没有显示其他有效的用例。 - Alok Save
6
我了解,但是如果我想要调用 int foo(int x, int y = 10, int z = 10) 并且只给一个可选参数 foo(1,2),应该怎么做呢? 我自己似乎无法让它工作。 - Gerard

43

对于多个默认参数的情况,可能会让一些人感兴趣:

void printValues(int x=10, int y=20, int z=30)
{
    std::cout << "Values: " << x << " " << y << " " << z << '\n';
}

给定以下函数调用:

printValues(1, 2, 3);
printValues(1, 2);
printValues(1);
printValues();

生成如下输出:

Values: 1 2 3
Values: 1 2 30
Values: 1 20 30
Values: 10 20 30

参考资料:http://www.learncpp.com/cpp-tutorial/77-default-parameters/


4
这就是我在寻找的东西。使用一个函数可以处理不同数量的参数。在头文件中声明有默认值的函数,然后在没有默认参数的情况下定义它,然后您可以使用它。无需制作函数重载。 - Teh Sunn Liu

43
为了遵循这里给出的示例,但通过使用头文件来澄清语法,函数的前向声明包含了可选参数的默认值。

myfile.h

void myfunc(int blah, int mode = 0);

myfile.cpp

void myfunc(int blah, int mode) /* mode = 0 */
{
    if (mode == 0)
        do_something();
     else
        do_something_else();
}

27

自从C++17引入了std::optional,你现在可以传递可选参数:

#include <iostream>
#include <string>
#include <optional>

void myfunc(const std::string& id, const std::optional<std::string>& param = std::nullopt)
{
    std::cout << "id=" << id << ", param=";

    if (param)
        std::cout << *param << std::endl;
    else
        std::cout << "<parameter not set>" << std::endl;
}

int main() 
{
    myfunc("first");
    myfunc("second" , "something");
}

输出:

id=first param=<parameter not set>
id=second param=something

请参见https://en.cppreference.com/w/cpp/utility/optional


17

使用默认参数

template <typename T>
void func(T a, T b = T()) {

   std::cout << a << b;

}

int main()
{
    func(1,4); // a = 1, b = 4
    func(1);   // a = 1, b = 0

    std::string x = "Hello";
    std::string y = "World";

    func(x,y);  // a = "Hello", b ="World"
    func(x);    // a = "Hello", b = "" 

}

注意:以下内容格式不正确。
template <typename T>
void func(T a = T(), T b )

template <typename T>
void func(T a, T b = a )

感谢提供通用解决方案,我一直在尝试找出如何为任意类型提供默认值。 - pretzlstyle

10

就像没有默认值的参数一样,用逗号将它们分隔开。

int func( int x = 0, int y = 0 );

func(); // doesn't pass optional parameters, defaults are used, x = 0 and y = 0

func(1, 2); // provides optional parameters, x = 1 and y = 2

8
通常通过为参数设置默认值来实现:
int func(int a, int b = -1) { 
    std::cout << "a = " << a;
    if (b != -1)        
        std::cout << ", b = " << b;
    std::cout << "\n";
}

int main() { 
    func(1, 2);  // prints "a=1, b=2\n"
    func(3);     // prints "a=3\n"
    return 0;
}

0

补充一下@Pramendra的答案,如果你有函数的声明和定义,在声明中需要指定默认参数。


这并没有回答问题。一旦您拥有足够的声望,您将能够评论任何帖子;相反,提供不需要询问者澄清的答案。- 来自审核 - Ryan Pendleton

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接