3

完全なコード。後で指定する行。

#include <iostream>
#include <string>

using namespace std;

class X
{
    private:

    int i;
    float f;
    char c;

    public:

    X(int first=1, float second=2.0, char third='a') : i(first) , f(second) , c(third) { } 
    void print() { cout << i << " " << f << " " << c << endl;}

};


int main()
{
    X var1;
    var1.print();

    return 0;
}

この行で正確に何が起こっているのですか:

X(int first=1, float second=2.0, char third='a') : i(first) , f(second) , c(third) { }

私が理解できる限り (間違っている可能性があります)、型 (クラス) X の 1 番目、2 番目、3 番目のオブジェクトを宣言しています。宣言中にそれらを初期化しています。結腸の後に何が起こっているのですか?一体何が起こっているのですか?

4

4 に答える 4

3

この行で正確に何が起こっているのですか:

X(int first=1, float second=2.0, char third='a') 
: i(first) , f(second) , c(third) { 
}

これは、デフォルト値を持つ 3 つのパラメーターを取るコンストラクターです。

この部分: i(first) , f(second) , c(third)は と呼ばれmember initializer listます。メンバー初期化子リストは、コロンで始まる初期化子のコンマ区切りリストで構成されます。引数リストの閉じ括弧の後、関数本体の開き括弧の前に配置されます。

この初期化子リスト構文を使用できるのは、コンストラクターだけです。const クラスのメンバーは、メンバー初期化子で初期化する必要があります。

于 2012-11-28T22:25:17.547 に答える
2

i、f、c の 3 つのフィールドを持つクラス X があります。3 つのデフォルト パラメーターを使用してコンストラクターを定義しました。このコンストラクターによって呼び出されたフィールドがパラメーターで初期化されるとき (コンストラクターまたはデフォルトに渡されます)。それは次のようなものです:

X (int first=1, float second=2.0, char third='a')
{
   i = first;
   f = second;
   c = third;
}

あなたの行は、フィールドを初期化する別の方法にすぎません。通常、それらは等しいです(継承にはいくつかの違いがあります)。

var1メイン コードでは、X 型のローカル変数を作成しているため、コンストラクターが呼び出されます。パラメータを渡さないため、デフォルト値が使用されます。

その結果、コンストラクターにリストされたデフォルト値で初期化されたタイプ X の1 つのローカル オブジェクトが作成されます。

于 2012-11-28T21:52:05.647 に答える
2

括弧内のものはコンストラクターへの引数のデフォルト値であり、コロンの後のものはコロンの後のそれらの項目を初期化します。

コロン表記は、クラスが使用する他のオブジェクトのコンストラクターを呼び出すために最も一般的に使用されます。

于 2012-11-28T21:38:05.390 に答える
1
X(int first=1, float second=2.0, char third='a') : i(first) , f(second) , c(third) { }

これは X のコンストラクターです。3 つの引数があり、それぞれにデフォルト値があり、さまざまな方法で呼び出すことができます。

X myX;
X myX(first);
X myX(first, second);
X myX(first, second, third);

引数の後のセクション

: i(first) , f(second) , c(third)

ifおよびcメンバーの初期化子です。可能であれば、関数本体での初期化よりもこのスタイルの初期化が優先されます。メンバーが定数型の場合は、このスタイルが必要です。

次に、コンストラクターの空の本体があります{}

于 2012-11-28T21:46:24.627 に答える