Mémoire : la classe !
Exercice 1 : durée de vie
Ecrivez un fichier test qui utilise la classe Complexe et qui met en évidence (via des messages affichés par les constructeurs et le destructeur) les différentes durées de vie de plusieurs instances de cette classe, en fonction de leur utilisation (variable globale, variable locale à un fichier, variable locale à une fonction, variable locale au main(), paramètre passé par valeur, paramètre passé par référence, valeur retournée par une fonction et référence retournée par une fonction).
Exercice 2 : allocation dynamique
Soit la classe Polynome comportant comme attribut un vecteur de coefficients dans \(R\) (en langage profane, un attribut de type float*). Chaque polynôme sera donc définit par le nombre et la valeur de ses coefficients. Quels problèmes vont se poser au niveau des constructeurs et plus particulièrement du constructeur par recopie ? Quel rôle décisif va donc jouer le destructeur ? Implantez constructeurs et destructeur en conséquence.
Dans ce contexte, l'affectation pose des problèmes particuliers, lesquels ? Surcharger l'opérateur d'affectation en conséquence.
Exercice 3 : vecteurs d'instances de classe et agrégation
Soit la classe VecteurComplexe comportant comme attribut un vecteur d'instances de la classe Complexe. Implantez cette classe avec au minimum la définition des constructeurs, dont les deux constructeurs ci-dessous, et du destructeur.
// construction a partir d'un tableau de complexes
VecteurComplexe (const Complexe*, unsigned short);
// construction a partir du contenu d'un fichier
VecteurComplexe (ifstream&);
Exercice 4 : la classe "définitive" Complexe
Redéfinissez la classe Complexe afin de rendre naturelle une algèbre sur ce corps. Pour cela, on redéfinira les opérateurs arithmétiques +, -, * et / (qui avaient pour noms : Sum, Identical, ... dans la précédente version) grâce à la surcharge des opérateurs qui prend la forme de surcharge fonctionnelle en C++. Rappel : inverse d'un complexe \((a, b) \neq (0,0)\) (donc a² + b² > 0)
(a, b) x (c, d) = (1, 0) <=> ac - bd = 1 et ad + bc = 0 soit c = a / (a² + b²) et d = -b / (a² + b²)
Quelle solution adopter pour définir la multiplication commutative d'un complexe par un scalaire (par exemple) ? Implantez-là. Exemple :
Complexe c0(1, 2);
...
c1 = c0 * 3; // OK
c1 = 3 * c0; // KO
Surchargez l'opérateur << afin de rendre transparente l'utilisation de cet opérateur lors de l'affichage d'un complexe sur le fichier standard de sortie.