2010-10-01 5 views
0

Qu'est-ce que cela signifie réellement lorsque vous déclarez une variable ou une fonction membre comme privée dans une classe C++? Outre le fait évident que, ceux-ci ne sont accessibles que par les fonctions membres, Comment sont-ils mappés différemment sur la mémoire, que leurs homologues publics?Types de données privés et fonctions membres

+0

Je serais très intéressé de savoir pourquoi vous avez besoin de cette information et comment cela affecte-t-il le code (compilation/liaison/exécution) que vous écrivez? – DumbCoder

+1

Je pensais aux moyens d'accéder aux membres privés de données en utilisant leurs adresses de mémoire. – tsudot

+0

J'avais aussi peur de cette réponse! Si vous avez besoin d'y accéder, fournissez des getters/setters ou pourquoi les rendre privés? Perhapse protégé est meilleur! –

Répondre

2

Imaginez qu'ils ont été seulement acessible des fonctions membres, puis le code comme ceci romprait:

class Foo { 
    int x; // this is private 

public: 
    int& X() { return x; } // this is public, but returns a reference to a private variable 
}; 

Foo foo; 
foo.X() = 42; // look, I can set the value of a private member without being inside a member function 

en bref, l'une des façons les plus communes pour définir obtenir/setters en C++ se briser s'il y avait un certain sor t de magie imposant qu'une variable privée ne doit être accessible que par les fonctions membres. Ce n'est évidemment pas bon.

public et private sont là pour aider le programmeur à structurer son code, et rien de plus. Ils n'offrent absolument aucune sécurité, et aucune protection d'exécution contre le code accédant à un membre "privé". Les variables sont uniquement privées dans le code source. Dans le code compilé, il n'y a pas de différence.

+0

Merci pour la clarification. J'ai juste supposé que déclarer une variable privée le rendrait sûr. – tsudot

0

En dehors de l'accessibilité, il n'y a aucune différence!

0

public et private sont là seulement jusqu'à la compilation du code. Ils n'ont rien à voir avec la gestion de l'exécution ou de la mémoire.

3

De documents standards, 02/09/12,

membres de données non statiques d'une de classe (non-union) avec le (clause 11) contrôle même d'accès sont attribuées de telle sorte que ultérieures membres avoir des adresses plus élevées dans un objet de classe. L'ordre d'allocation des membres de données non statiques avec un contrôle d'accès différent n'est pas spécifié (11). Les exigences d'alignement de mise en œuvre peuvent entraîner l'allocation immédiate de deux membres adjacents non l'un après l'autre; les besoins en espace pour la gestion des fonctions virtuelles (10.3) et classes de base virtuelles (10.1) peuvent également être requis.

Les normes a spécifications de l'ordre d'attribution de la mémoire, mais il n'y a pas beaucoup de différence dans la mémoire qui est allouée à un membre de données public et son homologue private ..

1
class priva 
{ 
int x=10; 
public: 
int pub; 
}; 
main() 
{ 
priva a; 
int *ptr; 
ptr=&a.pub; 
--ptr;//4 bite be4 there will be private data 
cout<<"Private data having value of 10 is "<<endl; 
cout<<*ptr; 
} 
Questions connexes