2015-10-20 1 views
-3

Cela peut être un doute stupide, mais je ne suis pas en mesure de comprendre pourquoi je ne suis pas en mesure d'accéder à un membre privé de données statiques en dehors de la classe lorsque je suis autorisé à le définir.Pourquoi ne sommes-nous pas autorisés à accéder à un membre statique privé en dehors de la classe sans la fonction de membre public?

Ex: dans le code suivant:

class foo 
{ 
    static int A; 
    public: 
     int getA{return A;} 
}; 
//This is allowed 
int foo:A=0; 
int main() 
{ 
    //This gives error 
    cout<<foo:A; 
} 
+3

Pourquoi pensez-vous que vous devriez pouvoir y accéder? C++ c'est assez clair à ce sujet donc je ne suis pas sûr de la confusion. Si un membre est privé mais est toujours capable d'y accéder directement depuis l'extérieur de la classe ce qui rendrait la déclaration privée plutôt inutile maintenant, n'est-ce pas? –

+2

Cela n'a aucun sens et n'est même pas proche de la compilation. S'il vous plaît modifier votre exemple pour montrer réellement ce que vous voulez démontrer. –

+0

C'est ce qui me préoccupe. Si le membre est privé, pourquoi sommes-nous autorisés à le définir en dehors de la classe? Cela ne devrait-il pas enfreindre les règles du spécificateur? –

Répondre

2
int foo::A = 0; 

alloue le stockage pour la variable membre A et initialise avec 0 (en fait statique est par défaut initialisé avec 0, de sorte que l'affectation est superflu). Vous le faites une seule fois dans le fichier .cpp d'implémentation. Ensuite, tout le monde sera capable d'instancier votre classe sans problème de linker. Notez que vous ne pouvez pas le faire à nouveau, c'est-à-dire que l'affectation ultérieure foo::A = 42; ne compilera pas, donc vous ne cassez aucune règle d'accès. Le fait que vous devez explicitement allouer du stockage est une règle de langage qui, à mon avis, crée plus de confusion (je demanderais au compilateur d'allouer automatiquement le stockage lorsque vous déclarez le static). Donc, pour conclure, être autorisé à définir un membre privé n'est de loin pas aussi dangereux que de pouvoir y accéder plus tard/le modifier, et est très différent de ce dernier. L'objet est déjà scellé pour le monde extérieur une fois que le membre a son stockage alloué.