引数の数が合わない? C++ デフォルト引数

投稿日時: 2014/06/06 S Nakagawa
OpenFOAM学習中の人からの質問と回答をメモします。

(質問) クラスからオブジェクトを作成するときに使う引数の数が,クラス(コンストラクタ)の定義で指定している数より多いのはなぜ?

(回答)
 デフォルト引数という仕組みが使われているからです。関数やコンストラクタの定義において,引数にデフォルト値を与えている場合があります。定義中の引数部分で,変数名の後に「=」を付けて値を与えているものです。
 このようにデフォルト値を与えておくと,呼びだし時にその引数を省略することが可能となります。

 例えば,pimpleFoamのcreateFields.Hを見ます。この中で,乱流モデルを選択するために下記のコードが書かれています。
    incompressible::turbulenceModel::New(U, phi, laminarTransport)
 これは,turbulenceModelクラスのNew関数を,3つの引数を付けて呼び出しています。
 
 ところが,turbulenceModelクラスのNew関数の定義を見ると,4つの引数が書かれたものしかありません。先ほどの3つの引数の場合はどうなってしまうのでしょう?
        static autoPtr<turbulenceModel> New
        (
            const volVectorField& U,
            const surfaceScalarField& phi,
            transportModel& transport,
            const word& turbulenceModelName = typeName
        );

 ここで,デフォルト引数が使われています。上記の定義の中で,最後の引数「const word& turbulenceModelName = typeName」に注目してください。
 これは,wordクラスの引数をturbulenceModelNameという名前で受取るということですが,「= typeName」というものが負荷されています。これは,turbulenceModelNameのデフォルト値として,typeNameの値を与えるものです。 このようにデフォルト値が指定された引数は,実行時に省略することが可能となります。
 よって,turbulenceModelクラスのNew関数を,3つの引数を付けて呼び出すことが許されます。

参考
http://wisdom.sakura.ne.jp/programming/cpp/cpp18.html