Pourquoi Copy Constructor est appelé ici au lieu de constructeur normal et d’opérateur d’affectation surchargé?

Dupliquer possible:
Existe-t-il une différence en C ++ entre l’initialisation de copie et l’initialisation directe?
Copier les constructeurs et les opérateurs d’assignation

J’ai une classe C dans laquelle j’ai surchargé Normal, un constructeur de copie et un opérateur d’affectation pour imprimer une trace de ce qui est appelé.

J’ai écrit les morceaux de code suivants pour tester comment s’appelle quand?

C c1; --> Normal Constuctor .. // understood Fine C c2; c2 = c1; --> Normal constructor + assignment operator .. //understood Fine C * c3 = new C(C1) --> Copy constructor // Understood Fine C c4 = c1 --> copy constructor // Not Able to understand 

Cela semble me dérouter puisque dans ce code, bien que j’initialise au moment de la déclaration, c’est par l’opérateur d’affectation et non par le constructeur de la copie.

Parce que C c4 = c1; est sémantiquement équivalent à:

 C c4(c1); 

Les deux invoqueraient le constructeur de copie dans ce cas particulier. Cependant, il existe une différence subtile entre “initialisation de copie” (1ère syntaxe) et “initialisation directe” (2ème syntaxe). Regardez cette réponse.

Remarque : En “termes simples”, une variable (ici c4 ) est construite jusqu’au premier ; (ou ‘pour plusieurs objects) est rencontré; Jusque-là, tout est l’un ou l’autre type de constructeur.

En cas de C c4 = c1; , le compilateur n’a pas à rechercher la plupart des parsings vexantes .
Cependant on peut désactiver C c4 = c1; type de syntaxe en déclarant le constructeur de copie explicit . D’ailleurs, n’importe quel constructeur peut être explicite et vous pouvez empêcher le signe = dans la construction.

 C c4 = c1; 

est l’ initialisation de la copie .

Il essaie de convertir c1 en un type C s’il ne correspond pas déjà à ce type en trouvant une fonction de conversion appropriée, puis utilise l’instance C créée pour copier en créant une nouvelle instance C

Notez cependant que

 C c4(c1); 

est l’initialisation directe

Et il est important de noter qu’il existe une différence entre l’ initialisation de copie et l’initialisation directe: elles ne sont pas identiques!

Pourquoi C c4 = c1; est syntaxiquement équivalent à C c4(C1) et non à C C4; c4 = c1; C C4; c4 = c1; Pourquoi a-t-il été fabriqué de cette façon?
Tout d’abord, l’initialisation de copie et l’initialisation directe ne sont pas identiques.
En ce qui concerne la raison pour laquelle aucun opérateur d’assignation n’est appelé, l’assignation ne se produit que lorsque l’on assigne deux objects complètement formés.

En cas de:

 C c4 = c1; 

c1 est un object complètement construit alors que c4 n’existe pas encore, Quand un tel scénario se présente et que = est présent, cela ne signifie pas vraiment Affectation, mais signifie Initialisation.
Donc, fondamentalement, ce qui se passe ici est l’initialisation et non l’assignation et la norme C ++ définit des règles spécifiques sur la manière dont cette initialisation doit être effectuée.

Parce qu’il n’y a pas d’opérateur d’affectation dans:

 C c4 = c1; 

Comme la virgule, le signe égal peut être un opérateur ou une ponctuation. Dans une expression, il s’agit toujours d’un opérateur, mais dans ce qui précède, l’expression d’initialisation est simplement c1 ; le signe = est une ponctuation, indiquant que l’initialisation de la copie doit être utilisée plutôt que l’initialisation directe. (L’initialisation directe serait

 C c4( c1 ); 

et est, à mon humble avis, généralement préférable. Dans le cas où l’expression d’initialisation a le même type que le nouvel object, il n’y a pas de différence.)