Bonjour,
J'ai des question pour la question 3 - déroulement du programme de l'examen 2018:
J'ai des problèmes à comprendre les cout L) jusqu'à S):
Désolé, évidament quelque chose n'a pas marché parfaitement quand j'étais en train de décrire mon problème.
Voilà encore une fois ma question:
Bonjour,
J'ai une question pour l'exercice 3 - déroulement du programme de l'examen 2018:
Aprés avoir faire l'exercice, j'ai écrit le code dans un fichier geany pour controller mes résultats.
Maintenant, j'ai des problèmes à comprendre les cout L) jusqu'à S):
Surtout les lignes qui m'affiche que le programme a appelé un déstructeur me font des problèmes.
Pourriez quelqu'un m'expliquer la fonctionnement du programme étape par étap à partir de la ligne L) jusqu'à la fin, s'il vous plaît?
Mercie en avance,
Regarde les commentaires mises à côté du main() ci-dessous.
int main() {
cout << "A) ";
Y c; // A) X() Y()
cout << endl << "B) ";
Z* b = new W; // B) X() Y() Z() W()
cout << endl << "C) ";
b->g(); // C) W::g
cout << endl << "D) ";
b->f(); // D) Z::f
cout << endl << "E) ";
X a = X(0); // E) X(double)
cout << endl << "F) ";
f1(a); // F) ~X()
cout << endl << "G) ";
a.print(); // G) 0
cout << endl << "H) ";
g1(a); // H)
cout << endl << "I) ";
a.print(); // I) 2.2
cout << endl << "J) ";
h1(&a); // J)
cout << endl << "K) ";
a.print(); // K) 5.5
cout << endl << "L) ";
a = f2(a); // L) ~X()~X() [Appel du destructeur de la variable locale 'X x' dans f2(), puis copie dans la variable 'a', puis destructeur du variable de retour du fonction 'f2(a)'. {Usage avancé, avec output sujet au options de compilation, donc la réponse n'est pas nécessairement unique.}]
cout << endl << "M) ";
a.print(); // M) 9.9 [Valeur 9.9 écrite par 'a = f2(a)']
cout << endl << "N) ";
a = g2(a); // N) ~X() [Modification de 9.9 à 15.4 dans 'g2(a)', car passage par référence, puis déstruction du copie 'x' en retour de fonction. {Usage avancé, avec output sujet au options de compilation, donc la réponse n'est pas nécessairement unique.}]
cout << endl << "O) ";
a.print(); // O) 15.4
cout << endl << "P) ";
a = h2(&a); // P) ~X() [Bien que changement de 15.4 à 22 (car passage par référence via pointeur), 'a' reste sur 15.4 car l'output de h2() est 'x1', i.e. la valeur de 'a' avant l'écrasement. Ensuite appel au destructeur de l'objet copié hors de la fonction, comme dans L) et N). {Usage avancé, avec output sujet au options de compilation, donc la réponse n'est pas nécessairement unique.}]
cout << endl << "Q) ";
a.print(); // Q) 15.4
cout << endl << "R) ";
delete b; // R) ~W() ~Z() ~Y() ~X() [Appel aux destructeurs de W() dans l'ordre contraire de l'appel des constructeurs. L'ordre des constructeurs était: X(), Y(), Z(), W() {point B)}, donc on affiche la même chose dans le sens contraire.]
cout << endl << "S) "; // S) ~X()~Y() ~X() [Destruction des variable 'X a' et 'Y c', également dans le sens contraire de construction. {Avancé: l'ordre de destruction des variables peux changer.}]
}
Merci beaucoup pour les explications détaillées! Maintenant, c'est beaucoup plus clair!
Bonjour, j'ai toujours une question pour le même problème, partie P) :
X h2(X* x) {
X x1 = *x;
x->set( x->get() + 6.6 );
return x1;}
À mon avis, la deuxième ligne de cette fonction doit donner un X() car un nouveau objet de type X est construit. Donc comme solution X() ~X() (Le destructeur fait du sens pour moi). Pourquoi cela n'est-il pas le cas?'X x1 = *x' fait appel au constructeur de copie implicite. Ce dernier n'appelle pas le constructeur par défaut 'X()', raison pour laquelle un 'X() ' n'est pas affiché sur 'stdout'.
Ah oui super! Merci beaucoup :)
Bonjour,
J'aurais encore une question pour le même point P), plus précisément au niveau du nombre de destructions réalisées. En effet, j'ai l'impression qu'on devrait obtenir la même sortie qu'au point L). Je m'explique :
Au point L), le passage par valeur dans la fonction f2() crée une copie X x, qui est détruite à la fin de cette fonction. De plus, la sortie return x ne se fait pas par référence, donc entraine une nouvelle copie pour le retour, qui est détruite une fois la copie dans a effectuée.
Au point P), on crée un objet X x1 = *x; cet objet doit être détruit à la fin de la fonction h2() car le retour se fait par valeur. Comme le retour se fait par valeur, une nouvelle copie est créée pour le retour, celle-ci est détruite une fois la copie dans a effectuée.
Selon ce raisonnement, l'affichage de P) devrait être ~X() ~X(), ce qui n'est pas le cas.
Merci d'avance pour m'éclairer sur ce point
ok merci :)
Follow the pulses of EPFL on social networks
© 2023 EPFL, all rights reserved