Les notations d'operateur en C++ sont un peu complique parce qu'il y a plusieurs facon de faire la meme chose.
Basiquement quand tu ecris "x*y" dans le code. Le compilateur interprete ca comme "operator*(x,y)" ou x.operator*(y)"
Dans les deux cas, c'est un appel de fonction, et donc c'est resolu comme un appel de fonction. Note que les type de x et y peuvent etre different. Et que le type de l'expression "x*y" est celui qui est retourne par la foncction operator* avec les parametres qui vont bien.
Du fait, tu peux definir la fonction comme une fonction globale "void operator*(MyObject const & x, MyObject const & y)" ou "MyObject operator*(MyObject & x, MyObject y)", ou comme "Tartenpion operator*(MyObject const & x, MyObject const & y)". Le compilateur prendra le type de retour que tu veux.
En pratique, il est fortement conseiller de n'utiliser que des prototypes qui vont faire ce qu'un utilisateur attend d'un operateur. Pour les operateurs +, -, *, &, &&, etc., le programeur s'attend a ce que les operandes ne changent pas et que l'operateur soit equivalent a un nouvel objet temporaire; donc probablement un prototype:
MyObject operator* (MyObject const& x, MyObject const& y) { /*processing*/ return temp;}
Pour les operateurs qui modifient la valeure du premier argument, comme +=, -= et cie, on s'attend plutot a ce que la valeure de retour soit une reference vers le premier objet
MyObject & operator*= (MyObject & x, MyObject const& y) { /*processing*/ return x;}
Note en passant que le premier parametre est une reference et plus une reference vers un const.
Tu peux faire que les operateurs soit des fonctions membres de l'objet qui est a gauche de l'operateur. Typiquement, les gens utilisent ca pour pouvoir utiliser facilement les variables qui sont encapsuler dans l'objet. Et les prototype sont typiquement:
MyObject MyObject::operator*(MyObject const& y) const {/*processing*/ return temp;}
ou
MyObject& MyObject::operator*= (MyObject const& y) const {/*processing*/ return *this;}
Donc tu peux faire plein d'autre truc. Tu pourrais ecrire un operateur * qui va changer le contenu des deux operandes. Mais ca a l'encontre de toutes les conventions, donc c'est probablement une mauvaise idee.