如何将可选参数传递给C ++中的方法?


Answers:


145

这是传递模式作为可选参数的示例

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 2010年

void myfunc(int blah,char mode [] = NULL)
Pramendra Gupta 2010年

2
NULL表示NULL指针,即使它被定义为文字0。它不是常数零的通用名称。对于整数(非指针),应使用数字:int mode = 0
UncleBens

1
如果您使用的是类(源文件和头文件),则应在哪里定义默认值?
AceFunk

2
@AceFunk Super太晚了,但是我看到的代码具有在头文件中定义的默认值。如果您考虑一下,如果源中定义了可选参数,系统将不会知道您可以忽略该值
Mars

50

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

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
因此,如果我正确理解是否有多个可选参数,应该要么全部实现,要么根本不实现?我不能选择使用1个可选参数,而不能选择其余参数?
杰拉德2014年

@杰拉德:“允许”示例显示一个可选参数,而不显示有效的其余用例。
Alok保存

4
我了解,但是如果我int foo(int x, int y = 10, int z = 10)要调用foo(1,2)该函数,该怎么办,所以只给出一个可选参数。我似乎无法自己使用它。
Gerard 2014年

30

对于某些人来说,如果有多个默认参数,可能会很有趣:

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/


1
这就是我想要的。使用一个可以处理不同数量参数的函数。在头文件中声明具有默认值的函数,然后在不使用默认参数的情况下对其进行定义,然后就可以使用它了。无需使函数过载
Teh Sunn Liu

15

使用默认参数

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 )

感谢您提供的通用解决方案,我试图找出如何为任意类型提供默认值的方法。
匿名

13

为了遵循此处给出的示例,但为了通过使用头文件来阐明语法,函数正向声明包含可选参数默认值。

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();
}

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

9

通常,通过为参数设置默认值:

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;
}

6

随着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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.