But d’une fonction membre statique en C ++?

Si chaque fonction membre n’est contenue qu’une seule fois par classe (pour être partagée par toutes les instances), quel est exactement le but de déclarer une fonction membre statique? Est-ce comme une fonction déclarée const, en ce sens qu’elle modifie un type de données particulier (dans ce cas, les membres de données statiques)?

Les fonctions membres normales nécessitent une instance de classe pour s’exécuter. Les méthodes statiques peuvent être appelées directement sans créer au préalable une instance de la classe.

Méthode normale:

MyClass myClass; myClass.NormalMethod(); 

Méthode statique:

 MyClass::StaticMethod(); 

Les méthodes normales sont donc parfaites pour les fonctions utilisant les données de classe. Si une méthode n’a pas besoin de travailler avec les données de classe, elle pourrait être éventuellement transformée en statique.

Les méthodes de classe, qu’elles soient statiques ou non, peuvent accéder aux membres privés de n’importe quel object de cette classe, pas seulement à sa propre instance. Il en va de même pour les méthodes statiques, qui n’ont pas d’instance à moins que vous ne leur en donniez une.

Vous pouvez également utiliser une fonction libre et le déclarer ami, mais une fonction libre implique un niveau d’abstraction plus élevé pouvant fonctionner sur des objects de classes différentes. Une méthode de classe statique dit “je ne fais de sens qu’à la lumière de ma classe”

Une application des méthodes statiques consiste à créer des instances et à renvoyer des pointeurs. Par exemple, il peut y avoir des classes dérivées que l’appelant n’est pas censé connaître – la fonction “factory” sait quelle classe dérivée utiliser.

Bien sûr, lorsque vous devez créer un object, vous n’avez probablement pas déjà d’object à utiliser pour cela, et même si vous faites cela, cet autre object n’est pas pertinent.

Fondamentalement, parfois, une action est un aspect de l’abstraction qu’une classe fournit, mais cette action n’est pas associée à un object spécifique – ou du moins, à un object qui existe déjà. Dans ce cas, vous devez implémenter l’action en tant que fonction statique.

De même, certaines données sont liées à l’abstraction fournie par une classe mais pas à une instance particulière de cette classe. Ces données sont probablement mieux implémentées en tant que variables membres statiques.