0

オブジェクトが作成された後にのみ、クラス内の変数にメモリが割り当てられます..そうですか?では、別のクラスのオブジェクトである変数がクラスに含まれていて、その変数にコンストラクターがある場合はどうなるでしょうか。

class Wand
{
    mouse mouseEmu(0,0);
    QCursor pt;
};

mouseEmuQCursor2つのクラスです...

いつ呼び出されたコンストラクタになりmouseEmu、いつ呼び出されたデフォルトのコンストラクタになりますptか?

指定した場合、パラメーター化されたコンストラクターを呼び出す必要がありますか?

4

3 に答える 3

2

新しい質問(または到着した時期によっては古い質問)

class Wand
{
    mouse mouseEmu(0,0);
             //   ^^^^^^  This bit is illegal.
             //           Remove it here. You specify the parameters
             //           Passed to members in the constructor.
    QCursor pt;
};

あなたが欲しいものは:

class Wand
{
    Ward(): mouseEmu(0,0) {}
    mouse mouseEmu;
    QCursor pt;
};

編集:

違法に変更される前の質問に基づいて回答してください。

コンストラクターを指定しない場合、コンパイラーは暗黙のデフォルトコンストラクターを作成します。

Wand::Wand()
  : mouseEmu()
  , pt()
{}

ワンドのオブジェクトを作成するときは千。Wandオブジェクトの構築の一部として、そのメンバー(mouseEmuおよびpt)を自動的に作成して初期化します。コンストラクターを(クラスで宣言された順序で)呼び出します。

注:独自のコンストラクターを定義する場合。ただし、メンバーのコンストラクターを明示的に呼び出さないでください。そうすると、メンバーのデフォルトコンストラクターが暗黙的に呼び出されます(メンバーの構築の順序は常に宣言の順序です。

 // Example:
 // If you did:

 class Wand
 {
      Wand(int x) : mouseEmu(0,x) {}

      // The above will generate this logical code.
      Wand(int x) : mouseEmu(0,x), pt() {}
 }
于 2012-04-21T16:08:56.113 に答える
2

mouseEmu のコンストラクターが呼び出されるのはいつで、pt のデフォルトのコンストラクターが呼び出されるのはいつですか?

現在構築されているオブジェクトのすべてのデータ メンバーおよび基本クラス サブオブジェクトは、現在のオブジェクトのコンストラクタの本体が入力される前にすべて完全に構築されます。したがって、クラスにユーザー定義のコンストラクターがある場合、ユーザー定義のコンストラクター内のコードが実行されるまでに、クラスの他のすべてのサブオブジェクトのコンストラクターが完了しています。

何らかの理由でサブオブジェクトにユーザー定義の初期化値を設定する必要があり、そのサブオブジェクトにデフォルト以外のコンストラクターがある場合は、現在のオブジェクトのコンストラクターで初期化リストを使用して値を渡すことができます。サブオブジェクトのコンストラクター。例えば:

class Wand
{
    mouse mouseEmu;
    QCursor pt;

    Wand(): mouseEmu(0,0) {} //empty constructor body with initialization list
};
于 2012-04-21T16:00:40.963 に答える
1

これは正当な C++ 構文ではありません。関数を宣言しているようですが0、有効な型識別子ではありません。

サブオブジェクト (ベースおよびメンバー変数) のコンストラクターは、コンパイラーによって生成されたコンストラクターを含む、クラスのコンストラクターから呼び出されます。

ctor -initializer-listを使用すると、サブオブジェクト コンストラクターにパラメーターを指定できます。次のようになります。

class Wand
{
    mouse mouseEmu;

    QCursor pt;
public:
    Wand() : mouseEmu(0,0) {}
};

このように、mouseEmuサブオブジェクトは 2 つのパラメーターのコンストラクターでpt初期化され、既定の (パラメーターがゼロの) コンストラクターで初期化されます。

コンパイラによって生成されたコピー コンストラクターは、コピー コンストラクターを呼び出し、コピーされるWandオブジェクトのメンバーを渡すことによって、両方のサブオブジェクトを初期化します。

于 2012-04-21T16:00:02.100 に答える