Generalites sur le C++

EXERCICE CORRIGE C++ / GENERALITE  : 

  1. Définir : encapsulation, classe mère, polymorphisme, classe abstraite, fonction amie, Héritage
  2. Quelle est la différence fondamentale entre une méthode d'instance, une méthode de classe et une fonction amie ?
  3. Quelle est la différence fondamentale entre une instance, une classe et les méthodes ?
  4. Quelle est la différence  entre les attributs de visibilité public, private et protected ?
  5. Une fonction amie est-elle un membre de la classe ? Quelles sont les droits d'une fonction amie dans une classe ?
  6. Quelle est la différence fondamentale entre la surcharge par sélection et la surcharge fonctionnelle ?
  7. Quelle est la signification du mot clé this dans une méthode d'instance ? Ce mot cle a t'il un sens dans une fonction amie ?
  8. Qu'est ce qu'une méthode abstraite ? Qu'est ce qu’une classe abstraite ?
  9. Une classe abstraite est-elle instanciable ?
  10. La principale différence entre le passage par pointeur et le passage par reference.
  11. Quel est l’intérêt du constructeur par défaut ?
  12. Qu'est ce qu'un constructeur ?
  13. Quel est le contenue de l'interface de classe (fichier d’entête).
  14. Donner la signification de mot clé "const" lorsqu'il précède un argument d'une méthode.
  15. Quel est l’intérêt du codage en ligne (fonction inline)
  16. Ennoncer comment se déroule la résolution des champs.
  17. Ennoncer comment se déroule la résolution des méthodes.
  18. Donner la signification du mot polymorphisme en illustrant sur un exemple simple.

Corretion :

1) Définitions :

  • Encapsulation : mécanisme qui permet de regrouper des données et les méthodes qui les manipulent dans une même entité (la classe) en cachant les détails de l'implémentation aux utilisateurs de la classe.
  • Classe mère : une classe à partir de laquelle une ou plusieurs classes dérivées sont créées. La classe mère fournit les attributs et les méthodes de base que les classes dérivées peuvent réutiliser et/ou modifier.
  • Polymorphisme :  consite a choisir dynamiquement (a l'execution) la version de la methode qui sera executee. ou c'est la capacité pour un objet de prendre plusieurs formes. En C++, cela se traduit par la possibilité de définir plusieurs méthodes avec le même nom mais des signatures différentes, et le choix de la méthode à appeler se fait en fonction du type de l'objet à l'exécution.
  • Classe abstraite : une classe qui ne peut pas être instanciée, mais qui peut être utilisée comme base pour d'autres classes. Elle peut contenir des méthodes abstraites qui doivent être implémentées dans les classes dérivées.
  • Fonction amie : une fonction qui a accès aux membres privés et protégés d'une classe, même si elle n'est pas membre de cette classe.
  • Héritage : est un concpet de la POO qui consiste a cree une classe fille dite derivee a partir d'une classe mere deja existate dite de base.

2) Différences :

  • Méthode d'instance : une méthode qui agit sur une instance de la classe. Elle peut accéder aux membres de l'objet via le mot-clé "this".
  • Méthode de classe : une méthode qui agit sur la classe elle-même et non sur une instance particulière. Elle peut accéder uniquement aux membres statiques de la classe.
  • Fonction amie : une fonction qui n'est pas membre de la classe, mais qui peut accéder aux membres privés et protégés de la classe.

3) Différences :

  • Instance : un objet créé à partir d'une classe.
  • Classe : un modèle à partir duquel des objets peuvent être créés.
  • Méthode : une fonction qui agit sur une instance ou sur une classe.

4) Différences :

  • Public : les membres publics sont accessibles de l'extérieur de la classe.
  • Private : les membres privés ne sont accessibles que de l'intérieur de la classe.
  • Protected : les membres protégés sont accessibles de l'intérieur de la classe et de ses classes dérivées.

5) Fonction amie :

Non, une fonction amie n'est pas membre de la classe.

Une fonction amie peut accéder aux membres privés et protégés de la classe, mais elle ne peut pas les modifier directement.

(Resume du cours :

En C++, une fonction amie est une fonction qui n'est pas membre d'une classe, mais qui peut accéder aux membres privés et protégés de cette classe. Pour déclarer une fonction amie d'une classe, on utilise le mot clé "friend" suivi de la signature de la fonction.

Contrairement aux membres d'une classe, une fonction amie n'est pas appelée sur un objet de cette classe, mais peut y accéder comme si elle était membre de la classe. Cela signifie qu'une fonction amie peut accéder aux champs privés et protégés de la classe, ainsi qu'à ses méthodes privées et protégées.

Cependant, les fonctions amies n'ont pas accès aux membres d'une classe par défaut, et doivent être déclarées explicitement comme amies dans la classe. De plus, les fonctions amies ne sont pas héritées par les classes dérivées et ne peuvent pas être virtuelles.

En résumé, une fonction amie est une fonction externe à une classe qui peut accéder aux membres privés et protégés de cette classe, mais n'est pas considérée comme membre de la classe. )

6) Surchage :

La surcharge fonctionnelle  est la redifinition par la classe fille d'une methode heritee.

La surcharge par sélection est la consideration de methodes de meme nom et ayant des nombres d'arguments distincts ou des types des arguments disctincts.

La surcharge fonctionnelle  est ce qui permet de lever l'ambiguite c'est la nature du recepteur.

La surcharge par sélection est ce qui permet de lever l'ambiguite c'est le nombre d'arguments et leur nature.

7) Dans une méthode d'instance en C++, le mot clé "this" désigne un pointeur vers l'objet qui appelle la méthode. Il permet d'accéder aux membres de l'objet à partir de la méthode. En revanche, dans une fonction amie, le mot clé "this" n'a pas de sens car les fonctions amies n'appartiennent pas à la classe.

8) Une méthode abstraite est une méthode déclarée dans une classe de manière virtuelle pure. Elle n'a pas de définition dans la classe de base, mais doit être redéfinie dans toutes les classes dérivées qui l'utilisent. Une classe abstraite est une classe qui contient au moins une méthode abstraite et qui ne peut donc pas être instanciée directement. Elle sert de classe de base pour d'autres classes qui en héritent et implémentent ses méthodes abstraites.

9) Non, une classe abstraite n'est pas instanciable car elle contient des méthodes abstraites qui n'ont pas de définition dans la classe de base.

10) La principale différence entre le passage par pointeur et le passage par référence est que le passage par pointeur nécessite la création d'un pointeur vers l'objet, tandis que le passage par référence ne nécessite qu'une référence vers l'objet. De plus, le passage par référence est souvent préféré car il est plus sûr, évite les problèmes de pointeurs nuls et est plus facile à lire.

11) Le constructeur par défaut est utile car il permet de créer des objets sans avoir à fournir d'arguments pour initialiser leurs membres. Il est souvent utilisé lorsque les valeurs des membres sont inconnues ou ne sont pas importantes au moment de la création de l'objet.

12) Un constructeur est une méthode spéciale d'une classe qui est appelée lorsqu'un objet de cette classe est créé. Il est utilisé pour initialiser les membres de la classe et peut prendre des paramètres pour leur attribuer des valeurs spécifiques.

13) Le contenu de l'interface de classe (fichier d'entête) contient les déclarations de toutes les méthodes et de tous les membres publics de la classe. Cela permet aux utilisateurs de la classe de connaître les méthodes et les membres auxquels ils peuvent accéder.

14) Lorsqu'il précède un argument d'une méthode en C++, le mot clé "const" indique que cet argument ne sera pas modifié par la méthode. Il est souvent utilisé pour garantir que la méthode ne modifie pas l'état de l'objet.

15) L'intérêt du codage en ligne (fonction inline) est d'améliorer les performances du programme en évitant les appels de fonction inutiles. Les fonctions inline sont copiées directement dans le code lors de la compilation, plutôt que d'être appelées, ce qui permet d'économiser du temps d'exécution.

16) Lorsqu'un champ est appelé dans une méthode d'une classe, la résolution se fait en suivant l'ordre suivant :

  • Les champs déclarés dans la classe courante sont considérés en premier
  • Si le champ n'est pas trouvé, la recherche se poursuit dans la classe parente
  • Si le champ n'est pas trouvé dans la classe parente, la recherche se poursuit dans la classe parente de la classe parente, et ainsi de suite jusqu'à ce que la classe racine de la hiérarchie soit atteinte (classe Object).

17) Lorsqu'une méthode est appelée dans une classe, la résolution se fait en suivant l'ordre suivant :

  1. Les méthodes définies dans la classe courante sont considérées en premier
  2. Si la méthode n'est pas trouvée, la recherche se poursuit dans la classe parente
  3. Si la méthode n'est pas trouvée dans la classe parente, la recherche se poursuit dans la classe parente de la classe parente, et ainsi de suite jusqu'à ce que la classe racine de la hiérarchie soit atteinte (classe Object).
  4. Si une méthode est trouvée, mais qu'elle est définie dans une classe parente, elle peut être remplacée par une méthode redéfinie dans la classe courante, en utilisant la même signature.

18) Le polymorphisme en C++ permet de définir des classes qui peuvent être utilisées de manière interchangeable, mais qui ont des implémentations différentes pour les mêmes méthodes ou fonctions. Un exemple simple de polymorphisme en C++ est l'utilisation de la fonction virtuelle. Par exemple, supposons que nous avons une classe de base "Forme" qui a une méthode virtuelle "aire". Les sous-classes "Cercle" et "Rectangle" redéfinissent la méthode "aire" avec des implémentations différentes pour calculer l'aire de ces formes géométriques spécifiques. Si nous avons une collection de formes qui contient à la fois des cercles et des rectangles, nous pouvons itérer sur la collection et appeler la méthode "aire" pour chaque forme. La méthode appelée dépendra du type réel de chaque objet dans la collection. C'est ce qu'on appelle la liaison dynamique, et c'est un exemple de polymorphisme en C++.

  • 5 votes. Moyenne 3.2 sur 5.

Ajouter un commentaire

Anti-spam