C ++でオプションの引数をメソッドに渡す方法は?


112

C ++でメソッドにオプションの引数を渡す方法は?任意のコードスニペット...


9
オプションパラメータを渡しません。オプションの引数を渡します!
チャブスダッド2010

センチネル値を予約することで提供されるよりも明確な制御については、boost :: optional <>を確認してください。
トニーデルロイ、

回答:


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

void myfunc(int blah、char mode [] = NULL)
プラメンドラグプタ

2
NULLそれはリテラルとして定義されますが、NULLポインタを意味します0。定数ゼロの一般的な名前ではありません。整数(非ポインター)の場合は、数値を使用する必要がありますint mode = 0
UncleBens 2010

1
クラス(ソースファイルとヘッダーファイル)を使用している場合、デフォルト値をどこで定義しますか?
AceFunk 2017

2
@AceFunk超遅いですが、私が見たコードにはデフォルト値がヘッダーで定義されています。考えてみれば、ソースでオプションが定義されていれば、値を省略できることがシステムで認識されない
Mars

50

デフォルトパラメータの使用に関する重要なルール:
デフォルトパラメータは右端に指定する必要があります。デフォルト値パラメータを指定すると、デフォルト以外のパラメータを再度指定することはできません。例:

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

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

@Chubsdad-ああ..私のあいまいなあいまいな声明!2番目のステートメントはそれを正しく合計しますか?「デフォルト値パラメーターを指定すると、デフォルト以外のパラメーターを再度指定することはできません」
Alok Save

1
したがって、複数のオプションパラメータがあるかどうかを正しく理解している場合は、それらをすべて実装するか、まったく実装しないかを選択します。1つのオプションパラメーターを使用することはできますが、残りを使用することはできませんか?
ジェラール

@Gerard:「許可」の例は、有効な残りの使用例ではなく、1つのオプションパラメータを示しています。
Alok Save 14

4
私は理解int foo(int x, int y = 10, int z = 10)していますがfoo(1,2)、を呼び出したいと思ったら、オプションのパラメータを1つだけ指定するとどうなるでしょうか。自分で動作させることができなかったようです。
ジェラール

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
これは私が探していたものです。異なる数の引数を処理できる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

ここに示した例に従うが、ヘッダーファイルを使用して構文を明確にするために、関数forward宣言にはオプションのパラメーターのデフォルト値が含まれています。

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を参照してください

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.