C では、通常、静的メンバー メソッドは、クラスのインスタンスではなくクラス名自体を使用して呼び出されます。ただし、次のような疑問が生じます: 静的メンバー メソッドはクラス インスタンスで呼び出すことができますか?
指定されたコード スニペットは興味深い動作を示しています:
class Test { public: static void DoCrash(){ std::cout << "TEST IT!" << std::endl; } }; int main() { Test k; k.DoCrash(); // calling a static method like a member method... }
Visual Studio 2008 SP1 では、このコードは正常に動作します。 「TEST IT!」をコンパイルして出力します。通常の予想に反して、静的メソッドがクラスのインスタンスで呼び出されているようです。
1.間違っていますか?コードは正しいですか?
C 標準に基づくと、インスタンスで静的メンバー メソッドを呼び出すことは間違っていません。標準では、9.4 (静的メンバー) で次のように明示的に規定されています:
「クラス X の静的メンバーは、修飾 ID 式 X::s を使用して参照できます。クラス メンバーのアクセス構文を使用する必要はありません」 (5.2.5) 静的メンバーを参照します。
言い換えると、静的メンバーにアクセスするためにクラス名を使用する必要はありません。クラス メンバーのアクセス構文は許可されますが、その場合は object-expression が評価されます。
2.これが許可される理由
標準では、テンプレートでの「静的か否か」メソッドの使用を容易にするために、インスタンスで静的メンバーを呼び出すことが許可されています。多くの場合、テンプレートでは、関数が静的かどうかを知らずに関数を呼び出す機能が必要になります。インスタンスで静的メンバーの呼び出しを許可することにより、コンパイラーは、静的ステータスに関係なく、呼び出す正しい関数を常に決定できます。
以上がC のクラス インスタンスで静的メンバー メソッドを呼び出すことはできますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。