web-dev-qa-db-fra.com

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

J'ai cette question à cause du singleton/constructeur nommé. Dans les deux cas, les constructeurs réels sont protégés ou privés, et aucun d'entre eux ne peut être accédé de l'extérieur. 

Par exemple, un constructeur nommé court est ceci:

 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 la méthode statique ne peut accéder qu'aux membres de données statiques, ou aux 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 de l'appel, non objet existe aussi ... .. Donc, la seule explication à laquelle je puisse 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 s'il vous plaît affirmer ou infirmer ma pensée, éventuellement avec quelques explications? 

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

15
Flowing Cloud

Une fonction membre statique a les mêmes droits d'accès qu'une fonction membre non statique. Donc, oui, il 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 peut uniquement accéder directement à tout autre membre statique de la classe.

10
NathanOliver

Selon la norme §11/p2 Contrôle d'accès des membres [class.access] (Mine Emphasis):

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.

Une fonction membre statique étant 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  
};

static member function A::createA() a accès à l'appel private constructeur A::A(int).

5
101010

Dans une fonction d'une classe (y compris les fonctions static), all, les données et fonctions membres private sont accessibles, même si vous utilisez un autre instance de cette classe au sein de cette fonction.

Vous l'exploitez souvent lors de l'écriture des constructeurs copy et assignation.

(Mon patron explique souvent comment il aimerait pouvoir désactiver ce comportement en utilisant une sorte de syntaxe friend = delete;.)

1

Oui il peut. La fonction statique peut accéder aux membres privés, mais à part cela, c'est comme toute fonction définie en dehors de la classe. En particulier, étant donné qu’il n’a pas de pointeur this (c’est-à-dire qu’il n’est "lié" à aucune instance spécifique), vous ne pourrez pas accéder directement aux membres (qui sont toujours "liés" à une instance): voulait 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;
}
1
rainer

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

0
Robert Kock