1

これはすでにここで回答されていると確信していますが、検索では PHP、C#、および Java が返され続けます。特にC++について質問しています。

5 つの引数を取り、すべてにデフォルト値がある関数があり、3 番目の引数に値を指定して明示的に呼び出したい場合、1 番目と 2 番目の引数に何を渡せばよいでしょうか? (うまくいかないことはわかっfunc(,,"Third")ていますが、どちらもうまくいきませんfunc(thirdArg:"Third")

4

4 に答える 4

4

C++ では、デフォルトまでのすべてのパラメーターを指定する必要があるため、func("First","Second","Third").

C++ では、パラメーター リストの「最後」にデフォルトを設定する必要もあるため、次のようなことはできません。func(defaulted, not-defaulted)

これらの規則は両方とも、C++ オーバーロードの解決規則に関連付けられています。

于 2014-08-15T06:39:29.497 に答える
2

Javaコンストラクターのデフォルトパラメーターのソリューションで同様のものを作成できます。

しかし、C++、特に関数の場合、それは良い習慣ではないと思います。なぜなら、上記で述べたように、デフォルト以外のパラメーターの後に一般的に受け入れられるデフォルトパラメーターの位置だからです。

関数のオーバーロードを使用して達成されるソリューション:

void Foo(int default, int nodefault){
    ...
}

void Foo(int nodefault){
    Foo(10, nodefault); //10 - is default option
}

int main(){
    Foo(3); //calls Foo(10, 3);
}
于 2014-08-15T09:07:42.590 に答える
0

この言語には直接的なサポートはありません。ただし、C++ プログラマーがbash のような位置パラメーターの欠如を置き換えるためによく使用するイディオムは、名前付きパラメーター イディオムです。.

関数がクラスのメンバー メソッドであると仮定すると、このイディオムを簡単に適用できます。

基本的に、オブジェクトの状態を変更するためのメソッド (おそらくアクセサー) があります。各メソッドは への非 const 参照を返し、thisメソッド チェーンを可能にします。

例:

class Person{

public:

    Person& setAge(int agep) { age = agep ; return *this; }

    Person& setWeight(double weightp) { weight = weightp ; return *this; }

    Person& setName(const std::string& namep) { name = namep ; return *this; }

private:
    int age = 0;
    double weight = 0.0;
    std::string name;
};

int main(){
    Person p;

    p.setAge(42).setName("Kurt"); // set age and name, but not weight
}
于 2014-08-15T07:31:06.580 に答える