Pourquoi ne l'opérateur = de travail sur les structures sans avoir été défini?
Prenons un exemple simple:
struct some_struct {
std::string str;
int a, b, c;
}
some_struct abc, abc_copy;
abc.str = "some text";
abc.a = 1;
abc.b = 2;
abc.c = 3;
abc_copy = abc;
Puis abc_copy est exacte copie de abc
.. comment est-il possible sans définition l'opérateur=?
(Ce qui m'a pris par surprise lorsque l'on travaille sur un code..)
Vous devez vous connecter pour publier un commentaire.
Si vous ne définissez pas de ces quatre méthodes (six en C++11) le compilateur va générer pour vous:
Si vous voulez savoir pourquoi?
C'est pour assurer la compatibilité descendante avec C (car C les structures sont copiable à l'aide de = et dans la déclaration). Mais il fait aussi l'écriture de simples classes plus faciles. Certains diront qu'il ajoute des problèmes à cause de la "copie" du problème. Mon argument contre c'est que vous ne devriez pas avoir une classe avec des détenus BRUTE des pointeurs en elle. En utilisant l'une des pointeurs intelligents de ce problème disparaît.
Constructeur par défaut (Si pas d'autres constructeurs sont définis)
Destructeur (Si aucun destructeur défini)
Constructeur de copie (Si pas de constructeur de copie est défini)
Opérateur D'Affectation
Constructeur de déplacement (Si aucun constructeur de déplacement est défini)
Opérateur D'Assignation De Déplacement
Si vous définissez une classe comme ceci:
Ce que le compilateur va construire est:
En C++, les structures sont équivalentes à des classes où les membres par défaut public plutôt que privé d'accès.
Compilateurs C++ permettra également de générer les membres d'une classe automatiquement si elles ne sont pas fournies:
Ce comportement est nécessaire pour maintenir la compatibilité avec C.
C ne pas vous donner la possibilité de définir/surcharger les opérateurs, les structures sont copiés normalement avec l'opérateur=.
=
à tous, et je ne suis pas sûr C89. Si elle a été introduite en C99, alors je dirais que c'était en raison de C++ influence.Mais elle est définie. Dans la norme. Si vous ne fournissez pas l'opérateur =, l'un est fourni pour vous. Et l'opérateur par défaut juste des copies de chacune des variables membres. Et comment sait-il de quelle façon la copie de chaque membre? il appelle leur opérateur = (qui, s'il n'est pas défini, est fourni par défaut...).
La opérateur d'affectation (
operator=
) est l'un des implicitement généré fonctions pour une structure ou une classe en C++.Ici est une référence décrivant les 4 implicitement généré membres:
http://www.cs.ucf.edu/~ferments/larchc++manual/lcpp_136.html
En bref, le générées implicitement membre effectue un memberwise copie superficielle. Voici la version longue de la page du lien:
std::string::operator=(const std::string&)
pouvez jeter.Le compilateur va synthétiser certains membres pour vous si vous ne définissez pas explicitement de vous-même. L'opérateur d'affectation est l'un d'entre eux. Un constructeur de copie en est une autre, et vous obtenez un destructeur aussi. Vous bénéficiez également d'un constructeur par défaut si vous ne fournissez pas tous les constructeurs de votre propre. Au-delà de que je ne suis pas sûr de ce que d'autre, mais je crois qu'il peut y en avoir d'autres (le lien dans la réponse donnée par 280Z28 suggère le contraire et si je ne me souviens pas où je l'ai lu maintenant, alors peut-être que c'est seulement quatre).
les structures sont en fait une concaténation de ses composantes dans la mémoire (avec quelques rembourrage intégré pour un alignement). Lorsque vous affectez une struct la valeur de l'autre, les valeurs sont juste sortis sur.