" le deux fonctions permettent la meme chose"
non.
seulement un compilo intelligent transforme un :
Foo foo1;
Foo foo2 = foo1;
en :
Foo foo1;
Foo foo2(foo1);
du coup si tu affectes un objet au moment où tu le construit, le compilofait directement une copie ( ctor par copy) et non pas une affectation ( =).
l´operator = s´applique à un objet DEJA existant, ce qui veut dire que si on considère l´exemple précédent, en ométtant les optims du compilo, on doit avoir ça :
Foo foo1;
Foo foo2;
foo2 = foo1;
là au total on a deux ctos et un opérateur d´appelés ( 3 " methodes").
alors qu´en écrivant:
Foo foo1;
Foo foo2(foo1);
on n´a qu´un default ctor et un copy ctor d´appelés.
Pour les objets couteux à construire c´est TRES important de savoir ce qui se passe...
Petit conseil pour expérimenter, écrire la forme canonique pour une classe bison, foutre des breakpoints partout, compiler en debug, et voire ce qui se passe quand on construit, on affecte, etc. des instances.
Quant au Foo & =(const Foo &), si tu ne revois pas une référence ça veut dire que tu vas dupliquer l´objet en cours ( via le return *this; ) à chaque affectation ( copy ctor appelé) ; la encore ça peut etre TRES couteux. D´autant plus que des fois tu veux que l´opération appelle le = travaille sur l´objet meme, pas sur une copie.