En C, les méthodes membres statiques sont généralement appelées en utilisant le nom de classe lui-même, plutôt qu'une instance de la classe. Cependant, une question se pose : les méthodes membres statiques peuvent-elles être invoquées sur des instances de classe ?
L'extrait de code donné démontre un comportement intrigant :
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... }
Sur Visual Studio 2008 SP1, ce code a réussi compile et affiche "TEST IT!". Contrairement aux attentes habituelles, une méthode statique est apparemment invoquée sur une instance de la classe.
1. Avez-vous tort ? Le code est-il correct ?
Basé sur la norme C, appeler une méthode membre statique sur une instance n'est pas incorrect. La norme indique explicitement en 9.4 (Membres statiques) :
"Un membre statique de la classe X peut être référencé à l'aide de l'expression d'identifiant qualifié X::s ; il n'est pas nécessaire d'utiliser la syntaxe d'accès aux membres de la classe. (5.2.5) pour faire référence à un membre statique."
En d'autres termes, il n'est pas obligatoire d'utiliser le nom de la classe pour accéder aux membres statiques. La syntaxe d'accès aux membres de la classe est autorisée, mais l'expression objet est évaluée dans ce cas.
2. Pourquoi est-ce autorisé ?
La norme permet d'invoquer des membres statiques sur des instances pour faciliter l'utilisation de méthodes « statiques ou non » dans les modèles. Les modèles nécessitent souvent la possibilité d'appeler une fonction sans savoir si elle est statique ou non. En autorisant l'invocation de membres statiques sur les instances, le compilateur peut toujours déterminer la fonction correcte à appeler, quel que soit son statut statique.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!