1)

b) Modalités d'examen, de passage en semestre supérieur et d'obtention du
Master. ..... Liens avec la conception orientée objets (UML, design patterns) dans
le ...

Part of the document


Devoir Surveillé : C++
1h30 sans documents
Patrick Smacchia 2002
L'examen est composé de 2 parties:
V Questions de cour sur 11 points
V Production/Analyse de code sur 9 points. Questions de cour (sur 11 points)
1) [1] Citer une possibilité C++ qui ne peut pas être utilisée dans les
fonctions en lignes (inline).
Réponse : La récursivité ne peut pas être utilisée dans les fonctions
en lignes.
2) [2] Citer au moins 2 mécanismes que la librairie générique standard
(appelée STL) fournie aux développeurs C++.
Réponse :
2 réponses parmi celles ci (en soulignés celles vues explicitement en
cours)
-Des types d'aides à la manipulation des chaînes de caractères. (le
type string)
-Des types numériques, comme les complexes.
-Des utilitaires généraux, comme les objets fonctions et les auto
pointeurs..
-Des types d'aide à la gestion des flux d'entrée sortie.
-Des supports du langage comme le RTTI.
-Des outils d'aide à la gestion des particularité locales
(calendrier...).
-Des conteneurs qui permettent de stocker et de manipuler des
collections d'objets (le type list par ex)
-Des itérateurs qui aident à travailler sur des collections
d'objets.
-Des algorithmes qui aident à consulter et à manipuler des
collections d'objets.
3) [1] Quelle syntaxe spéciale utilise t'on dans le gestionnaire
d'exception pour rattraper toutes les exceptions quel que soit leurs
types?
Réponse : Mettre 3 points dans le catch :
try{ /*...*/}
catch(...){ /*...*/}
4) [1] Citer les contrôles d'accès aux membres d'une classe. Quels sont
les mots clés du C++ associés à ces contrôles d'accès ?
Réponse :
Chaque membre d'une classe peut avoir un des 3 contrôle d'accès
suivant :
Accès publique mot réservé : public
Accès protégé mot réservé : protected
Accès privé mot réservé : private
5) a) [1] Quel est la syntaxe C++ pour définir qu'une classe est
virtuelle pure (on dit aussi classe abstraite) ?
Réponse : Il faut que la classe ait au moins une méthode virtuelle
pure, i.e une méthode sans implémentation, ayant le mot clé 'virtual'
en début de définition et '=0' en fin de définition. Par exemple :
class CFoo
{
virtual void f() =0;
}
b) [1] Quelle particularité présente ce type de classe ?
Réponse : Il ne peut y avoir d'objet instance d'une classe virtuelle
pure. 6) [1] Présenter un cas de figure (vue en cour / TD) ou il est
nécessaire de rendre le(s) constructeur(s) d'une classe privé(s) (ou
protégé(s)).
Réponse : Lorsque l'on veut garantir qu'un classe n'ait qu'un nombre
défini d'instances il est nécessaire que la classe contrôle tous les
accès au constructeur(s). Il faut ainsi le(s) rendre privé. Nous avons
nommé cela le design pattern singleton.
Nous avons aussi vu qu'il est intéressant de rendre un constructeur
protégé afin d'empecher une classe de base non virtuelle pure d'être
instanciée.
7) [1] Citer au moins une différence entre les fonctions globales et
les méthodes statiques.
Réponse : Voici les différences vues en cours.
- Une méthode statique peut avoir un contrôle d'accès privé ou
protégé.
- L'appel à une méthode statique hors de sa classe doit être précédé
du nom de la classe suivit de l'opérateur de résolution de portée, ou
du nom d'une instance de la classe avec l'opérateur '.', ou du nom
d'un pointeur de la classe avec l'opérateur '->' .
- Un autre différence (survolées en cour mais acceptée ici) est que
les fonctions globales peuvent être exportées dans d'autres fichiers
sources avec le mot clés extern.
8) [1] De quoi sont qualifiées les méthodes sur lesquelles on peut
appliquer le polymorphisme ? Comment les déclare t-on ?
Réponse : On les qualifie de méthodes virtuelles. On les déclare avec
le mot clés virtual en préfixe.
9) [1] Citer 3 cas ou la signification du caractère étoile ('*') est
différente en C++ ?
Réponse : Voici les cas vus en cours.
- '*' permet la multiplication de 2 opérandes (nombres).
- '*' permet de déclarer un pointeur sur un type (sur une classe).
- '*' permet de 'récupérer' un objet pointé. On l'appelle dans ce cas
opérateur de déréférencement. Production et Analyse de code (sur 9 points)
10) Voici un programme :
void main()
{
int index = 2;
f(index);
printf("La variable index vaut:%d\n",index);
} a) [1] Quel mécanisme de C++ faut-il utiliser afin que la valeur de
la variable 'index' soit différente de '2' après l'appel de la
fonction 'f'.
Réponse : Le passage de paramètre par référence.
b) [1] Ecrire une fonction 'f' tel que le programme affiche : 'La
variable index vaut 10' Réponse :
void f(int & i)
{
i = 10;
} 11) Voici un programme :
00 #include "iostream.h"
01 struct CBase
02 {
03 virtual void Affiche()=0;
04 };
05 struct CDeriv1 : public CBase
06 {
07 CBase * m_pBase;
08 CDeriv1(CBase * pBase){ m_pBase = pBase; }
09 virtual void Affiche()
10 {
11 cout Affiche();
13 cout