2

C++ の静的メソッドに関する情報を探しています。調べてみましたが、正直なところよくわかりませんでした。

静的関数は、静的データ メンバーのみを含む関数ですか?

4

2 に答える 2

2

C++ クラスの静的メソッドは、Java クラスの静的メソッドと同様に、オブジェクトまたはクラスのインスタンスを実際にインスタンス化する必要なく使用できるメソッドです。

クラスの標準の非静的メソッドを使用する唯一の方法は、オブジェクトを作成するか、クラスのインスタンスをインスタンス化することです。次に、メソッドを使用するときに、特定のオブジェクトまたはクラスのインスタンスを操作します。

静的メソッドにはいくつかの制限があります。たとえばthis、静的メソッドではポインターを使用できません。これは、クラスの静的メソッドが特定の特定のオブジェクトに関連付けられていないためです。代わりに、特定のオブジェクトに関連付けられていない一般的なメソッドです。

クラスの静的メソッドについて私が考える方法は、そうするとき、特定の名前空間、クラス名を作成し、その特定の名前空間を使用してのみアクセスできる関数を追加することです。

クラス内の静的変数は、アプリケーションの起動時に作成され、クラスの特定のインスタンスを作成しなくてもアクセスできます。静的変数も、クラスのすべてのインスタンスで共有されます。

したがって、違いの例として(カフから離れているため、コンパイルエラーが発生する可能性があります):

class myAclass {
public:
  myAclass();     // constructor
  void function1 (int iValueSet);   // a standard method
  static void functionStatic (int iValueSet);  // a static method
private:
  int iValue;                // an object specific variable
  static int iValueStatic;   // a class general variable shared by all instances of this class
};

int myAclass::iValueStatic = 0;  // init the class static variable

    myAclass::myAclass () : iValue (0)
{
}

void myAclass::function1 (int iValueSet)
{
   iValue = iValueSet;    // set the iValue for this particular object
   iValueStatic = iValueSet;  // set the shared iValueStatic for all instances
}

void myAclass::functionStatic (int iValueSet)
{
//    iValue = iValueSet;   // ERROR this is not allowed as iValue is not static
    iValueStatic = iValueSet;   // works since iValueStatic is static
}

そして、このクラスの使用方法:

myAclass jj;    // create an object instance

jj.function1(5);   // access the non-static method to change the object data

myAclass::functionStatic(8);  // set the static iValueStatic

そしてもちろん、構造体メンバーがデフォルトでパブリックであることを除いて、構造体はクラスに似ているため、これは構造体でも機能します。

静的関数と変数を使用する理由の 1 つは、ファクトリ パターンを使用してクラスのオブジェクト ファクトリを作成することです。もう 1 つの用途はSingleton Patternです。

于 2013-09-29T13:23:48.960 に答える