Je comprends qu'un des avantages d'avoir des fonctions membres statiques n'est pas d'initialiser une classe pour les utiliser. Il me semble qu'un autre avantage d'eux pourrait ne pas avoir un accès direct aux trucs non statiques de la classe. Par exemple, une pratique courante est que si vous savez qu'une fonction aura des arguments qui ne doivent pas être modifiés, marquez simplement ces constantes. par exemple:Utilisation du mot-clé "statique" pour limiter l'accès aux fonctions membres C++
bool My_Class::do_stuff(const int not_to_be_changed_1,
std::vector<int> const * const not_to_be_changed_2)
{
//I can't change my int var, my vector pointer, or the ints inside it.
}
Il est donc correct d'utiliser des fonctions membres statiques pour limiter l'accès. Par exemple, disons que vous avez une fonction
void My_Class::print_error(const unsigned int error_no) {
switch (error_no) {
case 1:
std::cout << "Bad read on..." << std::endl;
break;
//...
default:
break;
}
}
Eh bien ici, on ne va pas à accéder à toutes les variables membres de la classe. Donc, si je l'ai changé la fonction:
static void My_Class::print_error(const unsigned int error_no) {
switch (error_no) {
case 1:
std::cout << "Bad read on..." << std::endl;
break;
//...
default:
break;
}
}
Je voudrais maintenant obtenir une erreur, si j'ai essayé, par inadvertance, d'accéder à l'un de mes var privé, etc. (à moins que je me faire passer une instance de ma classe, qui serait être utile^_ ^!)
Est-ce une technique valide, similaire à la création proactive d'arguments qui ne devraient pas être modifiés constantes? Quels inconvénients peut-il avoir en termes d'efficacité ou d'utilisation? Ma principale raison de demander est que la plupart des tutoriels "statiques" que j'ai lus ne mentionnaient pas l'utilisation de cette façon, donc je me demandais s'il y avait une bonne raison de ne pas le faire, considérant qu'il me semble utile outil.
Edit 1: Une autre justification logique de cette utilisation:
I ont une print_error de fonction, tel que décrit ci-dessus. Je pourrais utiliser un espace de noms:
namespace MY_SPACE {
static void print_error(...) {
...
}
class My_Class {
....
void a(void)
}
}
Mais c'est une douleur, parce que je dois maintenant allonger TOUTES mes déclarations var, à savoir
MY_SPACE::My_Class class_1;
tous supprimer une fonction de ma classe, que l'essentiel est un membre de ma classe.
Bien sûr, il y a plusieurs niveaux de contrôle d'accès pour les fonctions:
//can't change pointer to list directly
void My_Class::print_error(std::vector<int> const * error_code_list) {...}
//can't change pointer to list or list members directly
void My_Class::print_error(std::vector<int> const * const error_code_list) {...}
//can't change pointer to list or list members directly, access
//non-const member vars/functions
void My_Class::print_error(std::vector<int> const * const error_code_list) const {...}
//can't change pointer to list or list members directly, access
//non-static member vars/functions
static void My_Class::print_error(std::vector<int> const * const error_code_list) {...}
//can't change pointer to list or list members directly, access
//member vars/functions that are not BOTH static and const
static void My_Class::print_error(std::vector<int> const * const error_code_list) const {...}
Bien sûr, cela est un peu atypique, mais la diminution des degrés sont donc en utilisant les fonctions const et les variables const. J'ai vu beaucoup d'exemples où les gens auraient pu utiliser une fonction const, mais ne l'ont pas fait. Pourtant, certaines personnes pensent que c'est une bonne idée. Je connais beaucoup de programmeurs C++ débutants qui ne comprendraient pas les implications d'une fonction const ou statique. De même, beaucoup comprendrait les deux. Pourquoi certaines personnes s'opposent-elles si catégoriquement à l'utilisation de ce mécanisme de contrôle d'accès si la langue/spécification le prévoit comme tel, comme c'est le cas avec les fonctions const, etc.? Toutes les fonctions membres doivent avoir accès aux autres membres de l'objet
Il semble étrange d'avoir une fonction en tant que membre d'une classe si vous allez lui refuser des droits d'accès aux membres. – JoshD
Une meilleure façon de limiter l'accès consisterait simplement à utiliser une fonction non-membre. Cependant, je ne comprends pas vraiment ce que vous essayez de protéger. –
Dites que vous avez une fonction membre que vous SAVEZ n'a pas besoin d'accéder aux variables/fonctions membres à l'heure actuelle, mais est liée au travail/fonction de la classe. Conceptuellement, son inclusion dans la classe est logique, mais vous voulez vous assurer qu'il n'y a pas d'accès des membres de la classe. Vous pourriez donc en faire une fonction statique, tout comme vous feriez une variable que vous voulez empêcher l'accès à une variable 'const'. Bien sûr, vous pourriez juste délibérément ne pas toucher la variable/membres, et donc ne pas utiliser 'const' /' static', mais beaucoup choisissent de pécher par excès de prudence, au moins dans leur utilisation de 'const'. –