Bonjour a tous, me revoila a la charge pour de nouvelles questions de type theorique sur la surcharge d'operateurs en C++.
C'est pas passionnant mais bon c'est un passage oblige pour bien comprendre la logique des programmes complexes!
Ci-dessous des extraits de questions recommandees par l'universite pour une etude autonome du C++:
1/ Nous avons une classe Complex qui represente des nombres complexes (x+iy) et on surcharge l'operateur "-" de la facon suivante:
const Complex operator-()const{
return Complex(-_re , -_im);
}
On me propose deux autres implementations, et on me demande leurs defauts par rapport a la 1ere:
const Complex& operator-()const{
_re = -_re;
_im = -_im;
return *this;
}
const Complex& operator-()const{
Complex* c_ptr = new Complex(-_re, -_im);
return *c_ptr;
}
2/ On implemente l'operateur + comme une fonction friend :
Pourquoi la definition de cette fonction comme fonction membre (et non pas friend) aurait echoue? (
const Complex operator+(const Complex &c);
Si possible donner un exemple...
3/ On propose une autre implementation de l'operateur "-" comme fonction globale friend:
friend const Complex operator-(const Complex &c)
Est-ce que ce code passera sans probleme?
4/ Expliquer pourquoi il est preferable d'utiliser : c1 *= c2 au lieu de c1 = c1*c2; (c1, c2 de type Complex).
=====================================================================
On decide maintenant d'implementer notre propre classe d'objets string (MyString) qui comprend
- pointeur vers char (char*)
- size
- memoire pour le tableau de char est alloue dynamiquement.
Les questions sont les suivantes:
1/ Doit on obligatoirement implementer par nous meme un operateur de copie (operator=) ou peut on se contenter de l'operateur par defaut?
2/ Supposons que l'on veuille implementer l'operator= de la facon suivante:
MyString& operator=(const MyString &n1)
Cet operateur effectue un delete de la memoire deja alloue et alloue de la memoire pour le nouveau tableau de chars, met a jour le size.
Expliquez quel est le probleme pose par le code suivant:
MyString n1("my string");
n1 = n1;
Proposez un moyen de corriger ce probleme.
<HS>Cela reste un exo, et le minimum qu'il puisse faire c'est de proposer des réponses. Histoire qu'on lui propose une correction (il y avait 2 phrases dans mon message)
Qu'il ne soit pas étonné s'il n'a aucune réponse, que cela soit ici, sur developpez (multipost), ou un quelconque autre endroit.</HS>
Une personne tres devouee m'a beaucoup aide pour repondre aux questions...
Cependant je bloque tres serieusement sur les questions 2 et 3 de la premiere partie de l'exo.
Mes idees sont les suivantes mais pouvez vous me corriger svp:
2/ La definition en tant que friend permet d'acceder a tous les fields private des deux objets tandis qu'en tant que fonction membre on ne pourra pas faire cela (je doute fortement que ce soit la bonne reponse).
/3 : (je suis pas sur, donc pardon si c'est faux) Comme tu n'est pas dans ta classe Complex quand tu appelles cette fonction, tu ne possède qu'un objet Complex : celui passé en paramètre. Et pour une soustraction il faut toujours deux "objets" pour que ça soit "effectuable".
/2 : tu dis qu'un fonction membre ne peux pas accéder à sa partie private (soit très souvent ses attributs). C'est pas très pratique si c'était vrai .
Mais je ne vois pas le problème... Faut avouer que je ne suis ni calé avec les opérateurs et les "friends", je ne fais que débuter dans le domaine.
Surcharge d'operateurs et theorie
× 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.
Ancien validateur du SdZ.