Copier le constructeur ou l’opérateur =?

class Foo { }; Foo f; Foo g = f; // (*) 

Ma question est la suivante: comment s’appelle la ligne marquée d’un (*)? Est-ce la copie par défaut ctr ou l’opérateur ‘=’?

Ma question est la suivante: comment s’appelle la ligne marquée d’un (*)? Est-ce la copie par défaut ctr ou l’opérateur ‘=’?

Le constructeur de copie sera appelé.

Même si le signe = est utilisé, il s’agit d’un cas d’ initialisation , où l’object du côté gauche est construit en fournissant l’expression du côté droit en tant qu’argument à son constructeur.

En particulier, cette forme d’initialisation est appelée initialisation par copie . Notez que lorsque le type de l’expression d’initialiseur est identique à celui de l’object de classe initialisé ( Foo , dans ce cas), l’initialisation de copie est fondamentalement équivalente à l’initialisation directe , c’est à dire:

 Foo g(f); // or even Foo g{f} in C++11 

La seule différence subtile est que si le constructeur de copie de Foo est marqué comme explicit (difficile d’imaginer pourquoi), la résolution de la surcharge échouera dans le cas de l’initialisation de la copie.

g est en réalité créé en tant que copie de f .

Un moyen simple de se rappeler ce que = signifie réellement, est juste de répondre à la question: est-ce que g existe déjà?

 { Foo g; //g construction ends here (at ';') g = f; // assignment (the g previous value is replaced) } { Foo g = f; //copy (same as Foo g(f): there is no "previous g" here) } 
  Foo g = f; // (*) 

Le constructeur de copie est appelé .Il est appelé l’initialisation de la copie de l’object.

Si vous n’avez pas écrit le constructeur de copie dans la classe Foo, le constructeur de copie généré par le compilateur est appelé.