Quelles sont les différences d’initialisation de chaîne en C ++?

Y a-t-il une différence entre

std::ssortingng s1("foo"); 

et

 std::ssortingng s2 = "foo"; 

?

Oui et non.

Le premier est explicitement initialisé et le second est initialisé en copie. Les standards permettent de remplacer le second par le premier. En pratique, le code produit est le même.

Voici ce qui se passe en quelques mots:

 std::ssortingng s1("foo"); 

Le constructeur de chaîne de la forme:

 ssortingng ( const char * s ); 

est appelé pour s1 .

Dans le second cas. Un temporaire est créé et le constructeur de Earler mentionné est appelé pour ce temporaire. Ensuite, le constructeur de copie est appelé. par exemple:

 ssortingng s1 = ssortingng("foo"); 

En pratique, la seconde forme est optimisée pour être de la forme de la première. Je n’ai pas vu de compilateur qui n’optimise pas le second cas.

A première vue, le premier appelle le constructeur const char* pour initialiser s1 . La seconde utilise le constructeur const char* pour initialiser une valeur temporaire, puis utilise le constructeur de copie en transmettant une référence à cette valeur temporaire pour initialiser s2 .

Cependant, la norme autorise explicitement ce qu’on appelle “élimination de la copie”, ce qui signifie que, comme le dit AraK, le second peut légalement être remplacé par le premier, même si le constructeur de la copie a des effets secondaires observables , de sorte que le changement affecte le résultat du programme. .

Cependant, lorsque ce remplacement est terminé, le compilateur doit toujours vérifier que la classe a un constructeur de copie accessible. Une différence potentielle réside donc dans le fait que le second formulaire nécessite qu’un constructeur de copie soit appelable, même si le compilateur n’est pas obligé de l’appeler. De toute évidence, std::ssortingng a un, donc dans ce cas, cela ne fait aucune différence, mais cela pourrait l’être pour d’autres classes.

il n’y a pas de différence

Le premier est meilleur.

Le second créera l’instance et assignera la valeur par défaut (“”). Ensuite, il y aura une deuxième assignation: “foo”. Donc, 2 missions au lieu de 1 …