Je ne comprends pas la différence entre le constructeur d'affectation et le constructeur de copie en C ++. C'est comme ça:
class A {
public:
A() {
cout << "A::A()" << endl;
}
};
// The copy constructor
A a = b;
// The assignment constructor
A c;
c = a;
// Is it right?
Je veux savoir comment allouer la mémoire du constructeur d'affectation et du constructeur de copie?
Réponses:
Un constructeur de copie est utilisé pour initialiser un objet précédemment non initialisé à partir des données d'un autre objet.
Par exemple:
Un opérateur d'affectation est utilisé pour remplacer les données d'un objet précédemment initialisé par les données d'un autre objet.
Par exemple:
Vous pouvez remplacer la construction de la copie par la construction par défaut plus l'affectation, mais ce serait moins efficace.
(En remarque: mes implémentations ci-dessus sont exactement celles que le compilateur vous accorde gratuitement, il ne serait donc pas très judicieux de les implémenter manuellement. Si vous en avez une, il est probable que vous gériez manuellement certaines ressources. Dans ce cas, selon la règle de trois , vous aurez très probablement besoin de l'autre plus un destructeur.)
la source
=default;
.= default
les utiliser là où un cteur par défaut est nécessaire: simplement implémenter un corps vide par nous-mêmes compte toujours comme un ctor défini par l'utilisateur et donc (au niveau Standardese ) n'est pas trivial et disqualifie le type des classifications qui nécessitent un ctor trivial.:)
Essaierez-vous à nouveau d'expliquer de quoi vous parlez?La différence entre le constructeur de copie et l'opérateur d'affectation crée beaucoup de confusion pour les nouveaux programmeurs, mais ce n'est vraiment pas si difficile. En résumé:
Exemple d'opérateur d'affectation:
Exemple de constructeur de copie:
la source
vector <A> v3
et alorsv3 = v2
(oùv2
est un élément précédemment déclaré et contenantvector<A>
) appelle leA
constructeur de copie de mon explicite à la place leoperator=
? Je m'attendaisoperator=
à être appelé à la place ducopy constructor
car monv3
objet était déjà déclaré au moment où j'ai effectué la missionLe premier est l'initialisation de la copie, le second n'est que l'affectation. Il n'y a pas de constructeur d'affectation.
utilise le constructeur de copie généré par le compilateur.
utilise le constructeur par défaut pour construire
cc
, puis l'opérateur d'affectation * ** (operator =
) sur un objet déjà existant.IDK ce que vous entendez par allouer de la mémoire dans ce cas, mais si vous voulez voir ce qui se passe, vous pouvez:
Je vous recommande également de jeter un œil à:
Pourquoi le constructeur de copie est-il appelé au lieu du constructeur de conversion?
Quelle est la règle de trois?
la source
En quelques mots,
Le constructeur de copie est appelé lorsqu'un nouvel objet est créé à partir d'un objet existant, en tant que copie de l'objet existant. Et l'opérateur d'affectation est appelé lorsqu'un objet déjà initialisé reçoit une nouvelle valeur d'un autre objet existant.
Exemple-
la source
Ce que @Luchian Grigore Said est implémenté comme ceci
PRODUCTION
constructeur par défaut
constructeur de copie
constructeur par défaut
opérateur d'assignation
la source
la différence entre un constructeur de copie et un constructeur d'affectation est:
<classname> <o1>=<o2>
)<o1>=<o2>
).Et les fonctionnalités de base dans les deux sont les mêmes, ils copieront les données de o2 vers o1 membre par membre.
la source
Je veux ajouter un autre point sur ce sujet. "La fonction d'opérateur de l'opérateur d'affectation doit être écrite uniquement en tant que fonction membre de la classe." Nous ne pouvons pas en faire une fonction amie contrairement à d'autres opérateurs binaires ou unaires.
la source
Quelque chose à ajouter à propos du constructeur de copie:
Lors du passage d'un objet par valeur, il utilisera le constructeur de copie
Lorsqu'un objet est renvoyé d'une fonction par valeur, il utilisera le constructeur de copie
Lors de l'initialisation d'un objet en utilisant les valeurs d'un autre objet (comme l'exemple que vous donnez).
la source