各メンバー関数がクラスごとに 1 回だけ含まれる (すべてのインスタンスで共有される) 場合、メンバー関数を静的に宣言する目的は何ですか? 特定の型のデータ (この場合は静的データ メンバー) を変更するという点で、const と宣言されている関数のようなものですか?
3 に答える
通常のメンバー関数を実行するには、クラス インスタンスが必要です。静的メソッドは、最初にクラスのインスタンスを作成せずに直接呼び出すことができます。
通常の方法:
MyClass myClass;
myClass.NormalMethod();
静的メソッド:
MyClass::StaticMethod();
したがって、通常のメソッドは、クラス データを操作する関数に最適です。メソッドがクラス データを操作する必要がない場合は、静的にする可能性があります。
クラス メソッドは、静的であろうとなかろうと、それ自体のインスタンスだけでなく、そのクラスのオブジェクトのいずれかのプライベート メンバーにアクセスできます。インスタンスを渡さない限り、インスタンスを持たない静的メソッドにも同じことが言えます。
フリー関数を使用してそれをフレンドとして宣言することもできますが、フリー関数は、異なるクラスのオブジェクトを操作できる、より高いレベルの抽象化を意味します。静的クラス メソッドは、「自分のクラスに照らしてのみ意味を成す」と言っています
静的メソッドの 1 つのアプリケーションは、インスタンスを作成してポインターを返すことです。たとえば、呼び出し元が知る必要のない派生クラスが存在する場合があります。「ファクトリ」関数は、どの派生クラスを使用するかを認識しています。
もちろん、オブジェクトを作成する必要がある場合、そのために使用するオブジェクトがまだない可能性があります。また、作成したとしても、他のオブジェクトは関係ありません。
基本的に、一部のアクションはクラスが提供する抽象化の側面である場合がありますが、そのアクションは特定のオブジェクトに関連付けられていないか、少なくとも既存のオブジェクトには関連付けられていません。その場合、アクションを静的関数として実装する必要があります。
同様に、一部のデータは、クラスによって提供される抽象化に関連していますが、そのクラスの特定のインスタンスには関連していません。そのデータは、おそらく静的メンバー変数として実装するのが最適です。