1

著書 C++ Primer by Stanley B. Lippman* , * Josée Lajoie

クラスコンストラクターの第14.2章では、次のように述べています。

期首残高を指定するがクライアント名を指定しないサポートも提供する必要がありますか? たまたま、クラス仕様はこれを明示的に禁止しています。デフォルトの 2 番目の引数を持つ 2 つのパラメーターのコンストラクターは、ユーザーが設定できるクラス Account のデータ メンバーの初期値を受け入れるための完全なインターフェイスを提供します

class Account {
public:
       // default constructor ...
       Account();

       // parameter names are not necessary in declaration
       Account( const char*, double=0.0 ); 

       const char* name() { return _name; } // What is this for??
       // ...
private:
       // ...
};

以下は、1 つまたは 2 つの引数をコンストラクターに渡す正当な Account クラス オブジェクト定義です。

int main()
{
        // ok: both invoke two-parameter constructor
        Account acct( "Ethan Stern" ); 

単一の引数で宣言されていない場合、これはどのように2パラメーターコンストラクターを呼び出しますか??

        Account *pact = new Account( "Michael Lieberman", 5000 );

そして、上記の行はどのようにデフォルト引数でコンストラクターを呼び出しますか

        if ( strcmp( acct.name(), pact->name() ))
             // ...
}

この本は不完全なコードで非常に不明確なようです。コンストラクターに関する適切な説明が必要です。どうか明らかにしてください。

4

1 に答える 1

8

これはコンストラクタに関するものではなく、デフォルト引数に関するものです。

void f(int x, int y = 5)
{
   //blah
}

より少ない引数を指定して呼び出すと、デフォルトの引数の値が使用されます。例えば

f(3); //equivalent to f(3, 5);

関数パラメータの 1 つにデフォルト値がある場合、後続のすべてのパラメータにもデフォルト値が必要です。

void f(int x, int y = 3, int z = 4)
{
    //blah
}

f(0);    // f(0, 3, 4)
f(1, 2); //f(1, 2, 4)
f(10, 30, 20); //explicitly specifying arguments

HTH

于 2011-03-27T11:32:21.377 に答える