1

この2つのコンストラクターの違いは何ですか?

int x, y; //position 

BasePoint(int px, int py) : x(px), y(py) {} 

int x, y; //position 

BasePoint(int px, int py)
{
    x = px;
    y = py;
}

何とx(px), y(py)呼ばれていますか?そして、いつこのタイプの変数初期化を使用するのですか?

ありがとう。

4

3 に答える 3

6

1 つ目は を使用して初期化initialization-listを行っており、2 つ目は代入演算子を使用して代入を行っています。

1枚目がオススメ!

BasePoint(int px, int py) : x(px), y(py) {}
                          ^^^^^^^^^^^^^ this is called initialization-list!

この FAQ を読んでください:コンストラクターは「初期化リスト」または「代入」を使用する必要がありますか?

FAQ の回答は次のように始まります。

初期化リスト。実際、コンストラクターは、原則として、初期化リスト内のすべてのメンバー オブジェクトを初期化する必要があります。1 つの例外については、後で説明します [...]

完全な答えを読んでください。

于 2011-03-10T06:40:16.800 に答える
3

x(px)、y(py)は何と呼ばれますか?

これらは初期化子リストと呼ばれます。実際に行っているのは、pxtoxおよびpytoの値をコピーすることyです。

用途:

class foo
{
    private:
    int numOne ;

    public:
    foo(int x):numOne(x){}
};

class bar : public foo
{
     private:
     int numTwo;

     public:
     bar(int numTwo): foo( numTwo ), // 1
                      numTwo(numTwo) // 2
     {}
 };

 bar obj(10);

1.派生コンストラクターの引数を基本クラス コンストラクターに渡すことができることに注意してください。

2.この場合、コンパイラはどちらが引数で、どちらがメンバー変数であるかを解決できます。もし、これをコンストラクターで行う必要がある場合、-

 bar::bar(int numTwo) : foo( numTwo)
 {
     this->numTwo = numTwo; // `this` needs to be used. And the operation is called assignment. There is difference between initialization and assignment.
 }
于 2011-03-10T06:43:21.620 に答える
0
BasePoint(int px, int py) : x(px), y(py) {} 

ここでは、初期化リストを使用しているため、構築時にオブジェクトが本体内に入り、それらの値を開始しません。コンストラクターの本体に入らないことで時間を節約できます。

これの別の使用法は、派生クラスコンストラクターを呼び出す場合です。

ここで、次のようなステートメントを使用する場合

new derivedclass(a,b,c)

そしてあなたはこれを書くことができます

derivedclass(int x,int y,int z):baseclass(a,b),h(z){}
于 2011-03-10T06:56:06.790 に答える