19 Jan2017
Surcharge des opérateurs de la classe Complexe
Objectifs:
- Surcharger les opérateurs arithmétiques
- Définir un opérateur sur deux opérandes de types différents
Énoncé:
L'objectif de cet exercice est de définir les opérateurs arithmétiques en C++ d'une classe Complexe en utilisant les fonctions membres et les fonctions amies.
- Soit la classe complexe pour gérer les nombres complexes:
Attributs:
- Re la partie réelle de type double
- Img la partie imaginaire de type double
Méthodes:
- Constructeur avec arguments (valeurs d’initialisation par default)
- Fonction d’affichage
- Fonction qui retourne le module sachant que :
- Fonction qui retourne le conjugué sachant que :
- Surcharge des opérateurs suivants :
- "+" : (complexe + complexe) sachant que :
- "+" pour (complexe + double) et "+" pour (double + complexe)
- De même pour "*", "-" sachant que :
- Créer un programme de test main ().
Exemple d’exécution :
Complexe A = 1 + 3i
Le module de A est : 2.64575
Le conjugue de A est : 1 - 3i
A = 1 + 3i
B = 2 + 7i
A + B = 3 + 10i
A + 12 = 13 + 3i
8 + A = 9 + 3i
A * B = -19 + 13i
B - A = 1 + 4i
//Chapitre : Surcharge des opérateurs en C++ //Programme : Classe Complexe //Auteur : IDMAMSOUR //Copyright : Exelib.net #include <iostream> #include <cmath> using namespace std; class complexe { double Re; double Img; public: complexe(double a = 0, double b = 0) { Re = a; Img = b; } void afficher() { cout << Re; //Pour ne pas afficher 4 + -6i (si Img est negatif) if (Img >= 0) cout << " + "; cout << Img << "i" << endl; } double module() { return sqrt(Re * Re + Img + Img); } complexe conjugue() { complexe c; c.Re = Re; c.Img = -Img; return c; } //Opérateur : complexe + complexe complexe operator+(complexe a) { complexe s; s.Re = Re + a.Re; s.Img = Img + a.Img; return s; } //Opérateur : complexe + double complexe operator+(double x) { complexe s; s.Re = Re + x; s.Img = Img; return s; } //Opérateur : complexe - complexe complexe operator-(complexe a) { complexe s; s.Re = Re - a.Re; s.Img = Img - a.Img; return s; } //Opérateur : complexe * complexe complexe operator*(complexe a) { complexe p; p.Re = Re * a.Re - Img * a.Img; p.Img = Re * a.Img + Img * a.Re; return p; } //Même principe pour la division (utiliser le conjugé) //Opérateur : double + complexe friend complexe operator+(double, complexe); }; complexe operator+(double x, complexe a) { complexe s; s.Re = a.Re + x; s.Img = a.Img; return s; /* 2ème Méthode On peut utiliser l'operateur complexe + double return a + x; */ } int main() { complexe a(1, 3), b(2, 7), c; cout << "Complexe A = "; a.afficher(); cout << "Le module de A est : " << a.module() << endl; cout << "Le conjugue de A est : "; a.conjugue().afficher(); cout << "A = "; a.afficher(); cout << "B = "; b.afficher(); cout << "A + B = "; c = (a + b); c.afficher(); cout << "A + 12 = "; c = (a + 12); c.afficher(); cout << "8 + A = "; c = (8 + a); c.afficher(); cout << "A * B = "; c = (a * b); c.afficher(); cout << "B - A = "; c = (b - a); c.afficher(); }
Notes
- L’opérateur double + complexe doit être une fonction amie puisque le premier opérande n'est pas de type complexe.
- L'instruction a.conjuge().afficher(); est équivalent aux deux instructions:
- complexe c = a.conjuge();
- c.afficher();