C++

Spécificateurs d'accès C++

Spécificateurs d'accès C++
En C++, une classe est un ensemble de variables et de fonctions qui ont été configurées pour fonctionner ensemble. Lorsque les variables de la classe sont valorisées, un objet est obtenu. Un objet a les mêmes variables et fonctions qu'une classe, mais cette fois, les variables ont des valeurs. De nombreux objets peuvent être créés à partir d'une classe. Un objet diffère d'un autre objet en fonction de l'ensemble différent de valeurs attribuées aux variables de l'autre objet. La création d'un objet à partir d'une classe est dite instancier l'objet. Même si deux objets différents ont les mêmes valeurs pour leurs variables, ces objets sont des entités différentes, identifiées par des noms différents dans le programme. Les variables d'un objet et de sa classe correspondante sont appelées membres de données. Les fonctions d'un objet et de sa classe correspondante sont appelées fonctions membres. Les membres de données et les fonctions membres sont appelés membres.

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

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 :

#inclure
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<//int no1 = obj.nombre1 ;
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 :

classe TheCla

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 :

#inclure
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<int no2 = childObj.méthode2();
cout<renvoie 0 ;

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 TheCla

Dé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 :

classe ChildCla : protégé TheCla

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 :

classe ChildCla : privé TheCla

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 :

#inclure
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</*int no2 = childObj.méthode2();
cout<renvoie 0 ;

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 :

classe ChildCla : protégé TheCla

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 :

classe ChildCla : privé TheCla

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 :

classe ChildCla : public TheCla

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 :

classe ChildCla : protégé TheCla

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 :

classe ChildCla : privé TheCla

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
Trackpad et pointeur de souris à l'écran AppyMouse pour tablettes Windows
Les utilisateurs de tablettes ratent souvent le pointeur de la souris, surtout lorsqu'ils ont l'habitude d'utiliser les ordinateurs portables. Les sma...
Le bouton central de la souris ne fonctionne pas sous Windows 10
le bouton central de la souris vous aide à faire défiler de longues pages Web et des écrans contenant beaucoup de données. Si cela s'arrête, et bien v...
Comment changer les boutons gauche et droit de la souris sur un PC Windows 10
Il est tout à fait normal que tous les appareils de souris d'ordinateur soient conçus de manière ergonomique pour les droitiers. Mais il existe des so...