35 votes

Une méthode statique peut-elle accéder à une méthode privée de la même classe ?

J'ai cette question à cause du constructeur singleton/nom. Dans les deux cas, les véritables constructeurs sont protégés ou privés, et aucun d'entre eux n'est accessible de l'extérieur.

Par exemple, un constructeur court nommé est le suivant :

 class A
{
  public:
    static A createA() { return A(0); } // named constructor
  private:
    A (int x);
};
int main(void)
{
   A a = A::createA(); 
}

Je pensais que les méthodes statiques ne pouvaient accéder qu'à des membres de données statiques, ou accéder à des données/méthodes privées via un objet existant. Cependant, dans le code ci-dessus, le constructeur privé A() n'est pas statique, et au moment où elle est appelée, aucun objet n'existe non plus. La seule explication à laquelle je peux penser est que la méthode statique peut accéder à une méthode privée non statique de la même classe. Quelqu'un peut-il affirmer ou infirmer ma pensée, éventuellement avec quelques lignes d'explications ?

Je m'excuse si c'est trop banal mais les mots clés sont trop communs et je n'ai pas pu trouver de réponse dans des dizaines de pages de google. Merci d'avance.

28voto

NathanOliver Points 10062

Une fonction membre statique a les mêmes droits d'accès qu'une fonction membre non statique. Donc oui, elle peut accéder à toutes les variables publiques, protégées et privées de la classe. Cependant, vous devez passer une instance de la classe à la fonction pour que celle-ci puisse accéder au membre. Sinon, une fonction statique ne peut accéder directement qu'à tout autre membre statique de la classe.

13voto

40two Points 8224

Selon la norme §11/p2 Contrôle d'accès des membres [class.access]. (C'est moi qui souligne) :

Un membre d'une classe peut également accéder à tous les noms auxquels la classe a accès. Une classe locale d'une fonction membre peut accéder à la même noms auxquels la fonction membre elle-même peut accéder. 113

113) Les autorisations d'accès sont donc transitives et cumulatives aux classes imbriquées et locales. .

Comme une fonction membre statique est membre d'une classe, elle a accès à tous les noms auxquels la classe a accès et par conséquent au constructeur de la classe elle-même.

Par conséquent, dans votre exemple :

class A {
  A(int x);  
public:
  static A createA() { return A(0); } // named constructor  
};

Fonction membre statique A::createA() a accès à l'appel private Constructeur A::A(int) .

3voto

Dans le cadre d'une fonction d'une classe (y compris static fonctions), tous el private Les données et les fonctions des membres sont accessibles, même si vous avez affaire à un autre système de gestion de l'information. instance de cette classe au sein de cette fonction.

Vous exploitez souvent cela en écrivant constructeurs de copie y opérateurs d'affectation .

(Mon patron parle souvent du fait qu'il aimerait pouvoir désactiver ce comportement à l'aide d'une sorte d'outil de contrôle de la qualité. friend = delete; syntaxe.)

2voto

rainer Points 3137

Oui, c'est possible. La fonction statique peut accéder aux membres privés, mais à part cela, elle est comme n'importe quelle fonction définie en dehors de la classe. D'autant plus qu'elle n'a pas de this (c'est-à-dire qu'il n'est pas "lié" à une instance spécifique), vous ne pourrez pas accéder directement aux membres (qui sont toujours "liés" à une instance) : si vous voulez faire cela, vous avez besoin d'une instance de quelque part :

#include <iostream>
using namespace std;

class A
{
  public:
    static A createA() { return A(0); }
    static void dosomething(A *a) { return a->something(); }
  private:
    A (int x) { cout << "ctor" << endl; }
    void something() { cout << "something" << endl; }
};

int main(void)
{
   A a = A::createA(); 
   A::dosomething(&a); 
   return 0;
}

0voto

Robert Kock Points 3317

Votre méthode statique n'accède à aucun membre statique ni à aucun membre non statique d'une instance existante.
Il s'agit juste de créer une nouvelle instance.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X