Le mot accès signifie lire ou modifier la valeur d'une variable, et cela signifie également utiliser une fonction. Les spécificateurs d'accès C++ sont les mots « privé », « protégé » et « public.” Ils décident si un membre peut accéder à d'autres membres de sa classe, ou si une fonction ou un opérateur extérieur à la classe et n'appartenant pas à la classe peut accéder à n'importe quel membre de la classe. Ils décident également si un membre d'une classe dérivée (enfant) peut accéder à un membre d'une classe parent.
Des connaissances de base en C++ sont nécessaires pour comprendre cet article et tester le code fourni.
Contenu de l'article
- Les prescripteurs publics et privés
- Le spécificateur protégé
- Spécificateurs de classe dérivée et spécificateurs de membre
- Conclusion
Les prescripteurs publics et privés
Classer
Tout membre d'une classe peut accéder à tout autre membre de cette même classe, indépendant de celui qui est étiqueté « public » ou « privé.« Considérez le programme suivant :
en utilisant l'espace de noms std ;
classe TheCla
privé:
int num1;
int num2;
Publique:
LaCla(int n1, int n2)
nombre1 = n1 ; nombre2 = n2 ;
méthode int()
renvoie num1 ;
;
int main()
TheCla obj(10, 20);
int no2 = obj.méthode();
cout<
renvoie 0 ;
La sortie est de 10. Les membres privés sont num1 et num2. Les membres publics sont TheCla() et méthode(). Notez que TheCla() est la fonction constructeur qui initialise les variables d'intérêt. La région d'un spécificateur d'accès commence de son étiquette à la fin de la description de classe (définition) ou au début d'un autre spécificateur d'accès.
Dans la fonction main(), la première instruction est l'instanciation impliquant la fonction constructeur, qui initialise num1 et num2. L'instruction suivante appelle le membre public method() de la classe.
Maintenant, dans la description de la classe (définition), la fonction membre publique, TheCla(), accède aux membres privés, num1 et num2. De plus, la fonction de membre public, method(), accède au membre privé, num1. Tout membre dans une description de classe peut accéder à tout autre membre dans la même description de classe ; peu importe quel membre est privé ou public.
Cependant, une fonction ou un opérateur non déclaré dans la description de classe et en dehors de la description de classe ne peut accéder qu'aux membres publics de la classe. La fonction main(), par exemple, est une fonction déclarée en dehors de la description de la classe. Il n'a pu accéder qu'aux membres publics method() et TheCla(). Dans la fonction main(), la fonction TheCla() est obj(10, 20).
Une fonction externe ou un opérateur externe, tel que la fonction main(), ne peut accéder à aucun des membres privés de la classe, tels que num1 ou num2. Supprimez l'indicateur de commentaire, //, de l'avant-dernière instruction dans main(). Si vous essayez de compiler le programme, notez que le programme ne compilera pas, donnant un message d'erreur.
Spécificateur par défaut
Le spécificateur par défaut d'une classe est « private.» Ainsi, la description de classe ci-dessus est la même que la description suivante, private, mais sans le spécificateur :
int num1;
int num2;
Publique:
LaCla(int n1, int n2)
nombre1 = n1 ; nombre2 = n2 ;
méthode int()
renvoie num1 ;
;
Noter: l'étiquette du spécificateur d'accès commence par le spécificateur, puis est suivie de deux-points.
Le spécificateur protégé
Dans une description de classe, et à partir d'une fonction externe ou d'un opérateur externe, le spécificateur protected est le même que le spécificateur private. Maintenant, remplacez le spécificateur privé dans le programme ci-dessus par le spécificateur, protégez et supprimez l'indicateur de commentaire, //, de l'avant-dernière instruction de la fonction main(). Si vous essayez de compiler le programme, notez que le programme ne compilera pas, donnant un message d'erreur.
Le problème du spécificateur protégé se pose lorsque les membres de la classe dérivée (héritée) doivent accéder aux membres de la classe de base (parente).
Classe dérivée publique avec les membres publics
Considérez le programme suivant :
en utilisant l'espace de noms std ;
classe TheCla
Publique:
entier num1 = 10 ;
protégé:
entier num2 = 20 ;
privé:
entier num3 = 30 ;
;
classe ChildCla : public TheCla
Publique:
int méthode1()
renvoie num1 ;
int method2()
renvoie num2 ;
/*int method3()
renvoie num3;
*/
;
int main()
ChildCla childObj;
int no1 = childObj.méthode1();
cout<
cout<
La sortie est :
dix
20
Dans la classe de base, num1 est public, num2 est protégé et num3 est privé. Dans la classe dérivée, toutes les fonctions membres sont publiques. La première fonction, method1(), accède au membre de données public, num1. La deuxième fonction, method2(), accède au membre de données protégé, num2. La troisième fonction, method3(), bien que actuellement commentée, devrait accéder au membre de données privé, num3.
Une classe dérivée n'est pas déclarée sans un spécificateur d'accès (public, protected ou private). Ci-dessus, la classe dérivée est déclarée avec le spécificateur public, c'est-à-dire :
classe ChildCla : public TheClaDécommentez maintenant la troisième définition de fonction membre dans la classe dérivée. Si vous essayez de compiler le programme, notez qu'il ne sera pas compilé, ce qui affichera un message d'erreur.
Noter: Lorsque toute la classe dérivée est déclarée publique, ses membres ne peuvent pas accéder aux membres privés de la classe de base. Ses membres peuvent cependant accéder aux membres publics et protégés de la classe de base. Le programme ci-dessus illustre ce.
Cependant, notez qu'un membre public de la classe dérivée publique peut accéder à un membre protégé de la classe de base.
Spécificateurs de classe dérivée et spécificateurs de membre
Classe dérivée protégée avec des membres publics
Remplacez le spécificateur « public » par « protected » dans la déclaration de la classe dérivée ci-dessus, comme suit :
Compilez et exécutez le programme et notez que le résultat est le même qu'avant.
Ainsi, lorsque toute la classe dérivée est déclarée protégée, ses membres ne peuvent pas accéder aux membres privés de la classe de base. Ses membres peuvent cependant accéder aux membres publics et protégés de la classe de base. C'est la même chose que lorsque la classe dérivée est déclarée publique.
Noter: un membre protégé de la classe dérivée publique peut accéder à un membre protégé de la classe de base.
Classe dérivée privée avec des membres publics
Remplacez le spécificateur « protected » par « private » dans la déclaration de la classe dérivée ci-dessus, comme suit :
Compilez et exécutez le programme et notez que le résultat est le même qu'avant.
Ainsi, lorsque toute la classe dérivée est déclarée privée, ses membres ne peuvent pas accéder aux membres privés de la classe de base. Ses membres peuvent cependant accéder aux membres publics et protégés de la classe de base. C'est la même chose que lorsque la classe dérivée est déclarée protégée ou publique.
Classe dérivée publique avec membres protégés
Tapez, compilez et exécutez le programme suivant, dans lequel toute la classe dérivée est protégée et ses membres sont également protégés. Certains segments de code sont les suivants :
en utilisant l'espace de noms std ;
classe TheCla
Publique:
entier num1 = 10;
protégé:
entier num2 = 20 ;
privé:
entier num3 = 30 ;
;
classe ChildCla : public TheCla
protégé:
int méthode1()
renvoie num1 ;
int method2()
renvoie num2 ;
/*int method3()
renvoie num3;
*/
;
int main()
/*ChildCla childObj;
int no1 = childObj.méthode1();
cout<
cout<
Le programme fonctionne tel quel. Il n'y a pas de sortie, et il n'est pas censé y avoir de sortie, en fonction de la façon dont le programme a été tapé.
Maintenant, dé-commentez la définition de la fonction, method3(), dans la classe dérivée. Si vous essayez de compiler le programme, notez qu'il ne sera pas compilé, donnant un message d'erreur. Cela signifie qu'un membre privé n'est pas accessible à partir d'une fonction externe, d'un opérateur externe ou d'une classe dérivée. Il s'agit de la même conclusion que celle conclue ci-dessus, concernant l'accès à un simple membre.
Noter: un membre protégé de la classe dérivée protégée peut accéder à un membre protégé de la classe de base.
Maintenant, remettez les commentaires dans la classe dérivée et décommentez le premier segment de code dans la fonction main(). Si vous essayez de compiler le programme, notez que le programme ne sera pas compilé à cause du premier segment de code dans la fonction main(). Cet effet n'est pas nouveau. En dehors de la classe dérivée, des fonctions externes et des opérateurs externes, les membres protégés et privés d'une classe (de base ou dérivée) sont du même spécificateur, private. La fonction main() voit le membre protégé de toute classe, qu'elle soit de base ou dérivée, comme du même spécificateur, private, et il lui est interdit d'y accéder.
Si le deuxième segment de code de la fonction main() n'est pas commenté, la même explication s'appliquera. C'est-à-dire que la fonction main() ne pourra pas accéder à un membre protégé ou privé de la classe dérivée ou de la classe de base. Ceci est indépendant du fait qu'un membre protégé de la classe dérivée puisse accéder à un membre protégé de la classe de base.
Classe dérivée protégée avec membres protégés
Remplacez le spécificateur « public » par « protected » dans la déclaration de la classe dérivée ci-dessus, comme suit :
Remettez le commentaire des segments de code dans la fonction main(), si cela n'a pas déjà été fait. Compilez et exécutez le programme et notez que le résultat est comme avant.
Classe dérivée privée avec membres protégés
Remplacez le spécificateur « protected » par « private » dans la déclaration de la classe dérivée ci-dessus, comme suit :
Compilez et exécutez le programme et notez que le résultat sera comme avant.
Classe dérivée publique avec des membres privés
Remplacez le spécificateur « private » par « public » dans la déclaration de la classe dérivée ci-dessus, comme suit :
Rendre les membres de la classe dérivée privés. Compile et éxecute le programe. Le résultat n'est pas différent du cas « Classe publique dérivée avec des membres protégés ».
Classe dérivée protégée avec des membres privés
Remplacez le spécificateur « public » par « protected » dans la déclaration de la classe dérivée ci-dessus, comme suit :
Compile et éxecute le programe. Ce résultat n'est pas différent du cas « Classe dérivée protégée avec des membres protégés ».
Classe dérivée privée avec des membres privés
Remplacez le spécificateur « protected » par « private » dans la déclaration de la classe dérivée ci-dessus, comme suit :
Compile et éxecute le programe. Ce résultat n'est pas différent du cas « Classe dérivée privée avec membres protégés ».
Conclusion
Les spécificateurs d'accès C++ sont les mots « privé », « protégé » et « public.” Ils décident de l'accès pour les membres d'une classe. La région d'un spécificateur d'accès commence à partir de son étiquette, jusqu'à la fin de la description de classe (définition) ou au début d'un autre spécificateur d'accès. Tout membre d'une classe peut accéder à tout autre membre de cette même classe. Un membre privé d'une classe ne peut être accédé par aucune fonction extérieure, aucun opérateur extérieur ou une classe dérivée.
Le membre de la classe de base doit être protégé afin qu'un membre privé de la classe de base puisse être accessible par un membre de la classe dérivée. Ce membre protégé de la classe de base est considéré comme un membre privé de la classe de base par une fonction externe ou un opérateur externe.
Un membre public d'une classe est accessible par n'importe quelle fonction externe, n'importe quel opérateur externe ou une classe dérivée.
En l'absence de tout spécificateur d'accès dans une classe, le spécificateur privé est supposé. Autrement dit, le spécificateur d'accès par défaut est private.
Références utilisées dans ce travail
- Alireza Ebrahimi, HÉRITAGE : RÉUTILISABILITÉ ET ÉVOLUTIVITÉ
- S. Malik, Structures de données à l'aide de C++ 2e édition