TD1
25 février 2022 et 7 mars 2022
-
- Ne compile pas à la ligne 6, la fonction
main
tente d’accéder àatr
qui est un membre privé de la classeA
.
Par défaut tout membre d’une classe définie avecClass
est privé. - Le code compile à la différence du 1 car il y a l’instruction
public
en début de classe doncatr
est un membre publique donc pas d’erreur.
N’affiche rien.
- Ne compile pas à la ligne 6, la fonction
-
- Le code compile, il affiche :
Le constructeurBonjour Au revoir
A(void)
est appellé à la construction de l’objetob
. Le destructeur~A(void)
est appelé lorsque l’objetob
détruit à la fin de la fonctionmain()
.
2. Le code compile, il affiche :
Dans ce cas, fuite de mémoire, l’objet créer manuellement ligne 16 n’a pas été détruit par unBonjour Bonjour Bonjour Au revoir Bonjour Au revoir Bonjour Au revoir Au revoir
delete
.
3. Ce code compile, il affiche :
Si on décommente la ligne 10, pour le compilateur, c’est une déclaration de fonction.Construction A1 Construction A2 Construction A3 Construction A3 (grâce au cast int en float)
\Rightarrow il faut donc penser à mettre desvoid
pour bien faire la distinction, et il faut utiliser
les accolades car avec il n’y a aucune ambiguïté.
Si on décommente la ligne 15, le programme ne compile pas car erreur car il n’y a pas de constructeur défini pour un seulint
, il sait pas s’il doit cast enlong
ou enfloat
.
4. Ce code compile, il affiche :
Lors de la construction d’un objet A, les constructeurs des attriuts sont avant (et dans l’ordre) le constructeur de l’objet A. Pour choisir explicitement ces constructeurs on peut les indiquer dans la liste d’initalisation, exemple :Construction A1 Construction B Construction C2 Construction A2 Construction C1
C(int a) : atrA(a) {
atrA(a)
est la liste d’initalisation.- Ce code ne compile pas.
La ligne 5 devrait faire appel au constructeur sans paramètre de la classe A car la classe A ne possède pas de constructeur sans paramètre, donc erreur.Remarque : Le constructeur sans paramètre implicite n’est pas automatiquement généré car la classe A possède un constructeur explicite :
A(int)
ligne 3. - Ce code ne compile pas.
new A[20];
doit réserver de la place et appelé un constructeur pour chaque case, mais il n’y a pas de constructeur adéquat (il a besoin d’un constructeur sans paramètre) \Rightarrow ça revient au même problème que dans la question 5. - Ce code compile, il n’affiche rien mais il y a une fuite de mémoire car on ne
delete[]
paspoint
. Il faudrait écrire une déstruction qui libère la mémoire.Exemple :
~A(void) { delete[] point; }
- Ce code compile, il affiche :
Il y a appel du constructeur de recopie car on donneAppel du constructeur Appel du constructeur de copie Appel de f Appel de g
a
à la fonction f.
La fonction g fonctionne différement et n’appelle pas le constructeur de recopie car on demande la référénce dea
(modification de l’objet original à travers la fonction). -
- Ce code ne compile pas.
f()
n’est pasconst
, alors que l’objetobj
l’est, cet objet ne peux que lancer des méthodes avec le mot-cléconst
. Leconst
fait parti de la signature de la méthode. Pour faire fonctionner le programme il faudrait soitvoid f(void) const { ... }
(l. 3), soitA obj;
(l. 5). - Ce code ne compile pas car une fonction
const
(f) modifie la valeur d’un attribut (a
) de lastruct
. - Ce code compile, il n’affiche rien car il n’y a rien dans le
main
, la variable modifié dans la méthodeconst
est déclaré commemutable
, alors ça fonctionne. - Ce code compile, il affiche :
Si on décommente la ligne 14, on aurait la fonctionJe suis la methode f const Je suis la methode f Je suis la fonction g(A)
g(&A)
qui serait appelée. - Ce code ne compile pas.