Fonctions membres statiques
Après la lecture de sbi et Eli Bendersky réponses dans cette question j'ai commencé à me demander ce que fonctions membres statiques sont pour.
Une classe' ami gratuit fonction ne devrait pas être en mesure de faire rien une fonction membre statique peut faire? Si oui, pourquoi/quand dois-je préfère une fonction membre statique à un ami gratuit un?
source d'informationauteur peoro
Vous devez vous connecter pour publier un commentaire.
En général:
Besoin d'accéder aux membres privés
fonctions membres statiques ont accès aux membres privés de la classe. Si vous avez besoin, vous pouvez utiliser une fonction membre statique. Vous devez le déclarer dans l'en-tête de toute façon à donner l'accès, de sorte que vous pouvez ainsi faire un membre plutôt qu'à un ami. Il est couramment fait de cette façon pour les singletons qui ont une méthode getInstance() en tant que singleton, et les classes qui utilisent un statique usine méthode createInstance() pour s'assurer qu'ils sont créés sur le tas. Ces deux ont besoin de l'accès à l'constructeur privé.
De la méta-programmation
fonctions membres statiques sont très bons pour le modèle de méta-programmation où vous pouvez passer dans une classe et appeler sa méthode sans le savoir au moment de l'appel de la fonction qui sera effectivement appelée. Ce qui est communément appelé "moment de la compilation polymorphisme" et est une partie importante de la méta-programmation. std::char_traits est basée sur ce principe.
Accès restreint
L'utilisation commune d'un privé fonction membre statique, juste de sorte qu'il peut être accessible uniquement par la classe, et n'a pas même besoin d'accéder aux membres privés, n'est pas une bonne utilisation de fonctions membres statiques parce que c'est une partie du détail de l'implémentation de la classe, et il vaut mieux le faire dans l'anonymat de l'espace de noms de l'unité de compilation.
Cependant, si la fonction membre statique est protégé il a utiliser car il peut être appelé par les classes dérivées, mais pas par des classes externes.
ami des fonctions
operator<<
)Méthodes statiques:
Animal
et la méthode statique estCreate
il faut l'appeler avecAnimal::Create
. C'est mieux que des fonctions globales, et de permettre la mise en œuvre des Usines et des "constructeurs virtuels" avec relativement naturel de la syntaxe.Souvent, franchement, vous ne devriez pas. Gratuit fonctions sont très sous-estimé.
L'implicite "namespacing", vous obtenez de l'aide d'un membre statique (en prétendant que la classe n'est rien de plus qu'un espace de noms pour le membre statique, qui est un peu vrai) est le seul avantage que je peux penser.
Si la fonction statique membre besoins persistants variables, la capacité d'avoir des données membres statiques avec, il pourrait également être utile.
Certaines personnes hésitent à l'aide de fonctions statiques, car il est souvent utilisé par ceux qui viennent d'un contexte procédural et ne comprends pas OO.
Cependant, il existe de nombreux modèles de conception qui ont du sens pour être mis en œuvre à l'aide de fonctions membres statiques
Par exemple. Singleton et Fabrique des modèles de nommer un couple de la du haut de ma tête, en fait, la plupart des tendances structurelles qui nécessitent la création d'un objet nécessiterait des fonctions membres statiques.
Il n'y a aucune valeur ajoutée à
static
fonctions de membre, comme vous l'avez correctement identifié. Pire, lorsqu'il est utilisé pour les détails de mise en œuvre de cette introduire davantage de dépendances (en terme de compilation).La seulement utilisation qui pourrait ne pas être émulé avec un anonyme gratuit-fonction, est le
protected
d'accès, c'est une classe dérivée de l'accès à un parent fonction statique. Cependant, ce n'est jamais nécessaire: vous pouvez simplement faire un membre régulier de la fonction à la place (je suppose que vous n'avez pas d'état global, sinon la statique/ami distinction n'est pas une préoccupation immédiate).L'utilisation de
static
fonctions dans le modèle de méta-programmation a été évoquée... mais il est très similaire à l'intérieur de la types de problème: il est difficile de fournir une version par défaut. D'autre part, un convenablement défini la fonction libre (qui prend le type d'un pointeur), de proposer une version du modèle:Et bien sûr, il y a toujours la question de savoir pourquoi cela devrait être une fonction statique, lorsqu'un membre de la fonction serait de donner plus de souplesse à l'utilisateur. À cet effet, je citerai le passage du Comité de la Norme fait avec le
Allocator
concept: stateful allocateurs sont désormais autorisés, ce qui nous donne la possibilité d'emballer les nœuds d'unmap
dans une même page, plutôt que de se répandre partout dans le tas.Enfin, il y a le interface question. Toutefois, il a été un long moment déjà, depuis Sutter plaidé en faveur d'une classe et de la gratuit des fonctions définies dans le même en-tête à la fois constitué l'interface publique de cette classe => c'est ce que l'ADL est pour! C'est donc quelque chose de plus pour le confort antique OO-programmeurs qu'une "bonne pratique".
Vraiment, je ne vois pas de bénéficier de l'aide de
static
fonctions de membre. J'aimerais que les gens pensent le contraire de proposer des cas réels.