j'essaye de comprendre quelques bases de C++ dans un QCM, et je me suis bloqué dans 2 questions
Q1/ Déterminez quelle instanciation est correcte dans ce contexte : class A{A(const A&a); public : A(); protected: void* operator new(size_t objsize);};
a) A* a = new A();
b) A b = a;
c) A a;
d) A b(a);
Q2/ Quel doit être le type de retour d'une surcharge de l'opérateur -> pour la classe A
Tu n'arrives pas à trouver les bonnes réponses à ces questions, ou tu n'arrives pas à les comprendre ? Qu'est-ce qui te pose problème ?
@YES,man balance pas de réponse au pif, et si, les questions sont claires, (y'a juste `A b = a` que je trouve pas top parce qu'on ne connait pas le type de a). Le contexte c'est une surcharge d'opérateur, ça a une syntaxe particulière.
- Edité par romantik 22 mars 2019 à 10:44:48
Dream on, Dream on, Dream until your dream comes true
J'ai testé la première question avec mon compilateur Clang et les 4 réponses sont refusées
Donc, pour la première question, je considère que les 4 réponses sont fausses, puisque Clang refuse tout, surtout que le constructeur par copie est private, pas public et que ton opérateur new est protected, pas public.
Pour la deuxième question, j'aurais dit A* à priori (ce n'est pas au pif).
En effet, en corrigeant un peu le code et en l'adaptant, je peux dire que pour la
question 1, c) est correcte car ton constructeur par copie est private et l'opérateur new est acessible uniquement aux classes dérivées (par protected)
question 2, b) est correcte si tu ajoutes du code qui définit ta classe A, car quand j'avais étudié la surcharge de l'opérateur, on nous apprenait que la surcharge renvoie un pointeur, donc c'est A*, mais tu dois ajouter du code.
Parce que la Q2 a plusieurs bonnes réponses ... donc je pensais qu'on pouvait concher plusieurs réponses ... auquel cas la réponse d) de la Q27 n'a aucun sens
Sinon @Truthseeker2, tu n'as pas essayé de répondre aux questions de SpaceIn, elles t'aideront bien
Dream on, Dream on, Dream until your dream comes true
The overload of operator -> must either return a raw
pointer, or return an object (by reference or by value)
for which operator -> is in turn overloaded.
Comme tous les choix proposés utilise la classe A, il ne peut pas s'agir d'une référence. (EDIT: apres reflexion, meme pas sur d'avoir raison ici. Techiquement, A a un operateur -> redefinie donc est valide. Donc A& peut etre une reponse acceptable)
Mais honnêtement, s'il faut lire la doc pour savoir répondre a un QCM, c'est un peu moisi.
Par défaut : toujours retourner un A*.
C'est des questions assez moisies...
Q1 -> règle des big 5 non respectée
Q2 -> osef, on utilise toujours la même signature
Q24 -> un héritage protected ? C'est quoi ce truc ?
Q27 -> un try-catch de fonction ? C'est quoi ce truc ? (Meme si la question porte en fait sur la portée des variables)
A part la question 1, les autres abordent des sujets complètement oubliables en pratique. La Q2 est une syntaxe possible, mais qu'on utilise rarement, donc on vérifiera toujours la syntaxe avant de redéfinir l'opérateur ->. Les 2 dernières (heritage protected, try-catch sur une fonction et pas un constructeur) n'ont pas d'utilisation valides a ma connaissance.
Dans la Q2, je ne vois pas en quoi les const modifiers sont interdit, renvoyer un A* const ne change absolument rien puisqu'il est juste utilisé pour rappeler -> dessus donc il ne va pas être modifié, et const A * c'est également un raw pointer, même s'il ne me paraît pas souhaitable parce qu'on va être très surpris lors de l'utilisation ça ne me paraît pas illégal !
La référence ne me paraît pas illégale non plus mais c'est pour moi la seule réponse qui peut-être considéré vraiment comme fausse car elle se rappelle en boucle, donc deadlock.
Euh je suis assez d'accord que les questions sont moisies par rapport à la pratique, mais les notions de portée, visibilité et accessibilité sont essentielle à mon sens.
Dream on, Dream on, Dream until your dream comes true
Tu as tout a fait raison pour les const. C'est tordu, mais c'est (probablement) effectivement légal.
Bien sur que les notions de portée, visibilité et accessibilité sont fondamentale. Mais les mettre au milieu de notions inutiles, c'est discutable d'un point de vue pédagogique. Ca apporte de la confusion et ca n'apporte rien en termes de connaissances ou d'évaluation des connaissances.
La surcharge de new, c'est quand même pas le truc qu'on fait tous les jours (j'ai du y avoir recours une fois ou deux en 25 ans...), la surcharge de -> pareil, c'est pas tous les jours qu'on implémente un pointeur intelligent, quant à l'héritage protected, je n'ai jamais vu le moindre cas d'usage. Je dirais, que pédagogiquement c'est très contre-productif, on noie les notions fondamentales de portée et d'accessibilité sous des trucs, qui sont compliqués, et franchement accessoires, voire carrément inutiles (l'héritage protected). On voudrait induire des erreurs, on ne s'y prendrait pas autrement...
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
Discord NaN. Mon site.
Discord NaN. Mon site.
Discord NaN. Mon site.