0

問題は、何を使用するのが最善か、あるいはより良い方法かということです。あるクラスに属する関数があり、この関数が静的変数を使用する必要があるとします。2つの可能なアプローチがあります-この変数をクラスのメンバーとして宣言するには:

class SomeClass
{
public:
    ....
    void someMethod();
private:
    static int m_someVar;
};

SomeClass::someMethod()
{
    // Do some things here
    ....
    ++m_someVar;
}

または、関数内で宣言します。

class SomeClass
{
public:
    ....
    void someMethod();
};

SomeClass::someMethod()
{
    static int var = 0;
    ++m_someVar;
    // Do some things here
    ....
}

2番目のバリアントにはいくつかの利点があります。これにより、カプセル化が改善され、実装の詳細がより適切に分離されます。したがって、おそらく他のクラスでこの関数を使用する方が簡単でしょう。また、この変数を1つの関数だけで変更する必要がある場合は、他のメソッドによる誤ったデータ破損を防ぐことができます。

静的変数を複数のメソッド(クラス関数)間で共有する必要がある場合に使用するのは最初のバリアントだけであることは明らかですが、質問は静的変数を単一の関数にのみ使用する必要がある場合に関係します。その場合、最初のバリアントに利点はありますか?私はいくつかのマルチスレッド関連のものについてのみ考えることができます...

4

3 に答える 3

1

簡単staticです。論理的にはクラス(のようなものinstanceCounter)に属している場合はメンバーを使用し、static論理的に関数()に属している場合はローカルを使用しnumberOfTimesThisMethodWasCalledます。

于 2012-10-10T10:25:04.883 に答える
1

選択するstaticかどうかは、コンテキストに完全に依存します。特定の変数をクラスのすべてのインスタンス間で共通にする必要がある場合は、それを作成しstaticます。

ただし、変数を関数内でのみ表示する必要があり、関数のすべての呼び出しで共通にする必要がある場合は、それをローカルstatic変数にするだけです。

于 2012-10-10T10:25:47.297 に答える
1

関数内の静的データメンバーと静的変数の違いは、最初は起動時に初期化され、2番目は関数が最初に呼び出されたとき(レイジー初期化)です。

レイジー初期化は、関数がマルチスレッドアプリケーションで使用されている場合に問題を引き起こす可能性があります。これが設計で必要とされていない場合、静的メンバーを使用することを好みます。

于 2012-10-10T10:26:15.807 に答える