この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)
呼ばれていますか?そして、いつこのタイプの変数初期化を使用するのですか?
ありがとう。
この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)
呼ばれていますか?そして、いつこのタイプの変数初期化を使用するのですか?
ありがとう。
1 つ目は を使用して初期化initialization-list
を行っており、2 つ目は代入演算子を使用して代入を行っています。
1枚目がオススメ!
BasePoint(int px, int py) : x(px), y(py) {}
^^^^^^^^^^^^^ this is called initialization-list!
この FAQ を読んでください:コンストラクターは「初期化リスト」または「代入」を使用する必要がありますか?
FAQ の回答は次のように始まります。
初期化リスト。実際、コンストラクターは、原則として、初期化リスト内のすべてのメンバー オブジェクトを初期化する必要があります。1 つの例外については、後で説明します [...]
完全な答えを読んでください。
x(px)、y(py)は何と呼ばれますか?
これらは初期化子リストと呼ばれます。実際に行っているのは、px
tox
およびpy
toの値をコピーすること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.
}
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){}