Bonjour à tous.
Je suis à la recherche d'un job, et donc, je me retrouve confronté aux tests techniques, dont certaines questions feraient hurler nos compilateurs adorés.

L'une d'entre elles me tracasse particulièrement:

supposant une classe Complexe représentant un nombre complexe.
Choisissez la meilleur implémentation de l'addition:
  1. Complexe& operator+(Complexe const & a, Complexe const & b) {return Complexe(a.re+b.re, a.im+b.im);}
  2. Complexe& operator+(Complexe const * a, Complexe const * b) {return Complexe(a->re+b->re, a->im+b->im);}
  3. Complexe* operator+(Complexe const & a, Complexe const & b) {return new Complexe(a.re+b.re, a.im+b.im);}
  4. Complexe* operator+(Complexe const * a, Complexe const * b) {return new Complexe(a->re+b->re, a->im+b->im);}

J'aurai personnellement définit:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
Complexe operator+(Complexe const & a, Complexe const & b) {Complexe c(a); return c+=b;}
Complexe& Complexe::operator+=(Complexe const& other) {re+=other.re; im+=other.im;}
ou encore, si on veut rester concis (mais il faut être friend...)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
Complexe operator+(Complexe const & a, Complexe const & b) {return Complexe(a.re+b.re, a.im+b.im);}
Dans le même genre, une autre fois je trouve int& f(int a, int b) {return a+b;}Je croyais qu'on ne devait jamais retourner une référence sur une constante ou une temporaire…

Qu'en pensez-vous? Suis-je dans l'erreur?