std::string struct - Copier/problèmes d'affectation?
Supposons que j'ai une structure contenant un std::string, comme ceci:
struct userdata{
int uid;
std::string username;
}
Dois-je créer une copie ctor ou quoi que ce soit de le renvoyer à partir d'une fonction ou de l'utiliser à l'intérieur d'un conteneur STL? Prenons cette fonction:
userdata SomeClass::GetUserData(unsigned int uid)
{
//do error checking and other stuff...
//m_usermap is std::map<unsigned int, userdata>
return m_usermap[uid];
}
Lorsque j'insère userdata les structures dans le std::map, une copie de la structure est créée, à droite? Un nouveau std::string créés à l'aide de la valeur du champ nom d'utilisateur, ou fait une sorte de copie bit à bit arriver (ce serait mauvais)? De même, quand je retourne un userdata structure de la GetUserData méthode, a-t-elle indépendante chaîne de caractères contenant le nom d'utilisateur ou ai-je besoin de définir une copie ctor et explicitement, de créer une nouvelle chaîne?
En cas de doute, écrire constructeur de copie et l'affectation des opérateurs pour la
struct
ou class
. Je préfère ne pas compter sur hidden activités du compilateur.Je suis complètement en désaccord avec cet avis. Le compilateur génère ne le font parfaitement bien leur travail. Sauf si vous savez ce qu'ils sont en train de faire un novice va faire une erreur, tandis que quelqu'un qui ne les savent ce qu'ils font n'a pas besoin de faire quoi que ce soit. De sorte que si la classe contient un pointeur par défaut méthodes sont tout à fait bien et sans doute mieux qu'un novice pouvait écrire. En outre, moins de code, moins de coûts de maintenance.
OriginalL'auteur alanc10n | 2010-01-05
Vous devez vous connecter pour publier un commentaire.
std::string
de référence-compté, et sonconstructeur de copie. Donc, rien à craindre. Tout est manipulé correctement.Tandis que quelques-uns (surtout les plus âgés) des implémentations de
std::string
sont un décompte de références, la plupart des nouveaux ne le sont pas. Indépendamment de cela, cependant, il doit gérer la copie de la construction, de l'assignation de copie, etc., correctement, donc hors de code n'a pas besoin de s'inquiéter à ce sujet.OriginalL'auteur alemjerus
Vous n'avez pas à faire quelque chose de spécial. C++ (et la mise en œuvre de la STL) définir ce simplement.
OriginalL'auteur bmargulies
std::chaînes par eux-mêmes peut être copié sans problèmes.
Lorsque vous définissez une classe (ou structure), C++ génère un certain nombre de méthodes pour vous par défaut, y compris un constructeur de copie et un opérateur d'affectation. Je crois que le constructeur de copie va appeler le constructeur de copie sur chacun des champs, et l'généré affectation opérateur d'appel de l'opérateur d'affectation sur chacun des champs. Comme votre userdata struct est copié, std::string du constructeur de copie sera appelé pour le champ nom d'utilisateur.
Les conteneurs STL et algorithmes doivent utiliser une combinaison du constructeur de copie et l'opérateur d'affectation, donc ce devrait être bon.
OriginalL'auteur Daniel Yankowsky
Tant que vous n'avez pas de pointeurs en tant que votre datamembers, vous devriez être bien.
OriginalL'auteur Jagannath