Comment initialiser un constructeur qui prend les Chaînes de caractères comme paramètres?
Je ne suis pas sûr que je suis en utilisant la terminologie appropriée, mais la question est comment puis-je bien faire d'un constructeur qui prend une chaîne de caractères comme paramètre?
Je suis habitué à avoir un const char *
dans le constructeur au lieu de chaînes de caractères.
Normalement, je devrais faire quelque chose comme ceci:
Name(const char* fName, const char* lName)
: firstName(0), lastName(0)
{
char * temp = new char [strlen(fName) + 1];
strcpy_s(temp, strlen(fName) + 1, fName);
firstName = temp;
char * temp2 = new char [strlen(lName) + 1];
strcpy_s(temp2, strlen(lName) + 1, lName);
lastName = temp2;
}
Que si le constructeur est: est-ce
Name(const string fName, const string lName) { }
Dois-je encore faire la base de l'initialisation de membre? dois-je encore besoin d'utiliser la chaîne de copie dans la base du constructeur?
OriginalL'auteur Sarah | 2013-11-05
Vous devez vous connecter pour publier un commentaire.
Utilisation
std::string
et d'initialiseur de listes:Dans ce cas, vous n'avez pas besoin d'utiliser terriblement nue pointeurs, vous n'avez pas besoin d'allouer de la mémoire, copier des caractères et, enfin, de lui allouer. En outre, ce nouveau code a toutes les chances de profiter des avantages de se déplacer plutôt que de copier depuis
std::string
est mobile. Aussi, il est utile de lire cette.Et ainsi de suite....
Parce que std::string objets ne sont pas censés être 0, car il y a des objets (pas de pointeurs). Ils sont vides, comme dans le sens de
""
.En plus de Martijn de commentaire, le code ci-dessus est en cours d'initialisation et de copier simultanément. Vous n'avez besoin de rien d'autre.
Merci c'est exactement ce que je voulait savoir
Le code ci-dessus pourrait en fait encourir au moins 2 copies, sauf si vous spécifiez explicitement
std::move
dans la liste d'initialiseur. Aussi, ce n'est pas un bon exemple de la sémantique de déplacement, car vous n'aurez qu'1 exemplaire; exactement le même que si vous aviez utilisé une référence.OriginalL'auteur deepmax
Je vois que vous avez déjà accepté une réponse, mais je souhaite compléter les réponses.
Comme deepmax dit, si vous passez par la valeur que vous pouvez écrire votre constructeur de profiter de "la sémantique de déplacement". Cela signifie plutôt que de copier les données, il peut être déplacé d'une variable à l'autre.
Écrit comme suit:
Qui semble être une bonne idée, mais, en réalité, n'est pas plus efficace que le constructeur de copie
La raison que c'est, c'est parce que les cas qui ressemble à ceci:
une seule copie aurai jamais fait (voir copie élision), et dans l'autre cas de
2 copies seront faites dans le "efficace" par la valeur sémantique de déplacement!
C'est un bon exemple de cas où le constructeur de copie (ou par référence) devrait être utilisé, pas un exemple contre elle.
Au contraire...
Si vous écrivez explicitement un constructeur qui rend l'utilisation de la sémantique de déplacement, vous pourriez obtenir une solution efficace peu importe les circonstances.
Ici est de savoir comment je serait d'écrire la définition de la classe:
Puis lorsque vous utilisez cette classe vous puissiez décider quand l'un des deux est plus efficace.
Si nous revenons à nos exemples, nous pouvons réécrire à faire usage de la meilleure ou la plus efficace constructeur:
Jamais prendre pour acquis qu'une solution est meilleure que toutes les autres!
OriginalL'auteur CoffeeandCode
J'ai l'habitude de le faire:
À l'aide des références sauve le travail de copier les chaînes de caractères à un nouvel objet sur la pile, il suffit de passer la référence de la chaîne existante. Une fois que vous êtes en les assignant à des membres de la classe, ils seront copiés.
mais si je ne suis pas en utilisant des références à des chaînes dans mes paramètres?
J'ai écrit dans ma réponse: parce qu'ils ne soient pas copiés en les passant au constructeur. Le constructeur aura à les copier en tant que bien, dans tous les cas (avec ou sans les références).
Eh bien, alors vous restez avec votre situation actuelle ou la modifier à const références.
La sémantique de déplacement (C++11) dire quelque chose d'autre, de lire cet article.
OriginalL'auteur Martijn Courteaux
si vous voulez garder const char * comme votre constructeur de types d'entrée ce faire.
Vous pouvez construire une std::string à partir d'un const char.
OriginalL'auteur Mark Hendrickson