On a donc trois fonctions de même nom (*) avec trois signatures différentes : pour deux vecteurs (retourne un float) et pour un vecteur et un float (retourne un vecteur). Il a fallu lui donner les deux cas, pour le produit avec un float, car le compilateur accepte aussi les fonctions non commutatives.
Par contre je ne peux pas utiliser le même opérateur pour définir le produit vectoriel (il prend aussi deux vecteurs en argument, et bien qu’il retourne un vecteur, il aurait la même signature que le produit scalaire).
Mais rien ne m’empêche d’utiliser un autre opérateur, par exemple ^
10.7) constructeur, destructeur, opérateur de copie Par défaut à chaque fois que l’on crée un objet (on dit aussi « instancie »), le compilateur réserve la quantité de mémoire nécessaire et l’alloue à cet objet. Mais il ne fait rien d’autre. En particulier il n’initialise pas les attributs. On peut vouloir une création d’objet plus sophistiquée (initialisation par défaut, empêcher que certains attributs (surtout les pointeurs) soient vides…). C’est pour cela que vous pouvez réécrire le constructeur. Son entête est nom de la classe(liste arguments)
On peut remarquer qu’il ne retourne rien, même pas void. Les arguments (s’il y en a) serviront à l’initialisation. Pour le vecteur, il n’y a rien de spécial à faire à l’instanciation, mais je propose néanmoins un constructeur pour initialiser le vecteur :
vecteur(float a=0,float b=0,float c=0) {x=a;y=b;z=c;}
Le constructeur sera appelé lors de l’instanciation simple d’un objet (vecteur V1(1,1,2); ecteur V2;), là où l’on a besoin d’un vecteur constant (V2=vecteur(1,0,0);) ou lors d’une création dynamique (vecteur *p; p=new vecteur;). Vous pouvez par exemple prévoir un constructeur qui interroge au clavier au cas où des attributs ne sont pas initialisés, qui vérifie que les valeurs initiales proposées sont cohérentes, qui ouvre un fichier pour y chercher les valeurs des attributs,…
Dans certains cas on peut également redéfinir le destructeur (appelé lors de la destruction de l’objet). Son entête est ~nom de la classe (void) (il n’accepte aucun argument). Il ne sera nécessaire que pour désalouer des attributs dynamiques ou fermer des fichiers (ce ne sera pas notre cas).
Dernier point : la copie. Lors d’une affectation (signe =), le compilateur copie tous les attributs, et ça devrait suffire dans tous les cas simples. Dans certains cas (pointeurs, tableaux) où un attribut comporte une référence sur un autre objet, il ne recopie que cette référence, pas l’objet. On peut dans ce cas là redéfinir l’opérateur =, qui doit obligatoirement être une méthode (pas une fonction). Par exemple si l’on veut pouvoir écrire V=0; (copie d’un entier sur un vecteur, impossible par défaut)
Langage C++ le processus de compilation (384 KO) (Cours PDF)