0

この問題に関する投稿をいくつか読みましたが、何かわかりません。静的メソッドがあり、それが属するクラスのオブジェクトを設定せずに呼び出すと、次のようになります。

クラス:

コード:

class Fruit {
    static int colour;
    Fruit();
    static int getColour();
    static void setColour();
    virtual ~Fruit();
}

関数の呼び出し:

コード:

Fruit:getcolour();

静的関数の実装:

int Fruit::setColour() {
    return colour;
}

静的関数を実行するためにコンストラクターが呼び出されますか?

したがって、コンストラクターにオブジェクトの初期化のようなことをさせる場合 (コンストラクターを setColour() を呼び出すように設定する)、それは関数の前に実行されますgetColourか?

4

3 に答える 3

2

いいえ、これをコンパイルするにはコンストラクタをFruit::color 定義する必要があるため、コンストラクタは呼び出されません。また、呼び出す必要もありません。

したがって、これは完全なコードではありません。実装ファイルには次のようなものがあります

int Fruit::colour = 42;

getcolour事前に値を変更しない限り、これが返されます。

于 2013-02-27T12:06:06.403 に答える
1

OPで言及するのを忘れた詳細として staticメンバー(プログラムがコンパイルに失敗する)の定義を想定すると、

静的関数を実行するためにコンストラクターが呼び出されますか?

いいえ、そうではありません。

staticメソッドはクラスの特定のインスタンスで動作しないため、メソッドを呼び出すためにインスタンス (したがってコンストラクターへの呼び出し) は必要ありませんstatic
また、メソッドは、オブジェクト インスタンスが明示的に渡されない限り、クラス メンバーstaticに対してのみ動作します。staticメンバーがインスタンスごとではなくクラスごとであることを考えるとstatic、コンストラクターが呼び出されないことは理にかなっています。

于 2013-02-27T12:06:25.113 に答える
0

静的メンバー関数または静的メンバー変数は、グローバルのような LOT と考えてください。メンバー情報にアクセスするために静的関数が必要な場合は、グローバル インスタンスを作成するか、シングルトン パターンの 1 つを使用する必要があります (複数のスレッドから使​​用している場合は、遅延シングルトン パターンに注意してください)。

于 2013-02-27T12:11:36.673 に答える