L'Initialisation et affectation
Quelle est EXACTEMENT la différence entre l'INITIALISATION et AFFECTATION ?
PS : Si possible, veuillez donner des exemples en C et C++ , en particulier .
En fait , j'ai été confondu par ces déclarations ...
C++ fournit une autre façon d'initialiser les variables membres qui nous permet d'initialiser les variables de membre lorsqu'ils sont créés plutôt que par la suite. Ceci est fait grâce à l'utilisation d'une liste d'initialisation.
À l'aide d'une liste d'initialisation est très similaire à ce implicite des affectations.
Quel est le problème avec informit.com/articles/article.aspx?p=376876 ?
Une variable qui n'a jamais, au cours de sa vie, avait une valeur d'ordures doit habe été initialisé; une variable avec une valeur d'ordures est probablement non initialisée (et la valeur d'ordures disparaît lorsque la variable get assigné une valeur)
Une variable qui n'a jamais, au cours de sa vie, avait une valeur d'ordures doit habe été initialisé; une variable avec une valeur d'ordures est probablement non initialisée (et la valeur d'ordures disparaît lorsque la variable get assigné une valeur)
OriginalL'auteur jsp99 | 2011-09-08
Vous devez vous connecter pour publier un commentaire.
Oh mon. Initialisation et affectation. Eh bien, c'est la confusion, c'est sûr!
À initialiser est de rendre prêt à l'emploi. Et quand nous parlons d'une variable, ce qui signifie donnant à la variable une première valeur d'utilité. Et une façon de le faire est par l'utilisation d'une assignation.
Donc c'est assez subtil: l'affectation est une manière de faire de l'initialisation.
Affectation fonctionne bien pour l'initialisation, par exemple, une
int
, mais il ne fonctionne pas bien pour l'initialisation par exemple, unstd::string
. Pourquoi? Parce que lestd::string
objet contient au moins un pointeur vers la mémoire allouée dynamiquement, etsi l'objet n'a pas encore été initialisé, le pointeur doit être mis au point dans un tampon alloué (bloc de mémoire pour stocker le contenu de la chaîne), mais
si l'objet a déjà été initialisé, puis une cession peut avoir à libérer les vieux de la mémoire tampon et d'allouer un nouveau.
De sorte que le
std::string
objet de l'opérateur d'affectation de toute évidence à se comporter de deux manières différentes, selon que l'objet a déjà été initialisée ou non!Bien sûr, il ne veut pas se comporter de deux manières différentes. Au lieu de cela, pour une
std::string
objet l'initialisation est pris en charge par un constructeur. Vous pouvez dire qu'un constructeur de travail est de prendre le domaine de la mémoire qui va représenter l'objet, et de changer l'arbitraire des bits à quelque chose de convenable pour le type d'objet, quelque chose qui représente un objet valide de l'état.Que l'initialisation de de la mémoire brute devrait idéalement être fait une fois pour chaque objet, avant toutes les autres opérations sur les objets.
Et le C++ règles de garantir de manière effective. Au moins tant que vous n'utilisez pas de très faible niveau des installations. On pourrait appeler que la C++ construction garantie.
Donc, cela signifie que lorsque vous ne
alors que vous êtes en train de faire simple construction de la mémoire brute, mais quand vous le faites
alors vous êtes d'abord la construction de
s
(avec un état de l'objet représentant une chaîne vide), puis en attribuant à ce déjà initialisés
.Et qui, finalement, permet-moi de répondre à votre question. Du point de vue de la langue de programmation indépendant de la première valeur d'utilité est sans doute celui qui est affecté, et donc, dans cette optique, l'on pense de la cession à l'initialisation. Pourtant, à la technique C++ niveau de l'initialisation a déjà été fait, par un appel de
std::string
's de constructeur par défaut, de sorte à ce niveau, on pense à la déclaration d'initialisation, et la cession est juste une modification ultérieure de la valeur.Donc, en particulier, le terme "initialisation" dépend du contexte!
Il suffit d'appliquer un peu de bon sens pour trier ce que Quelqu'un d'Autre veut probablement dire.
Cheers & hth.,
Pas tout à fait.
C obj = f();
est un C++ initialisation, une déclaration qui, en dépit de l'aide de l'=
symbole. Affectation n'est pas en cause ici. Autre que, historiquement, dans les origines de la notation.L'effet est si une copie parfaite constructeur sans effets secondaires, qui avait été appelé. Cependant, le compilateur est autorisé à éluder cet appel (l'optimiser loin). Dans la pratique, il n'y aura pas de constructeur de copie d'appel pour
C obj = f()
, mais plutôtf
va construire son résultat directement dans le stockage fourni par l'appelant, à savoirobj
(ce qui est appelé la valeur de retour d'optimisation, ou de RVO).Euh, "ou constructeur de déplacement". Désolé. Il dépend de la classe
C
. 😉Cette dernière explication de la mine, et de la correction, est ungood et trompeuse, je suis désolé. C'est une question complexe. Le court de celui-ci: le
=
notation pour l'initialisation est appelé copier l'initialisation, pour des raisons historiques. Copie d'initialisation pouvez utiliser un constructeur de copie ou d'un constructeur de déplacement, qui doit être accessible. Le supplément de copier ou de déplacer appel du constructeur peut être optimisé à l'écart, élidés, même si le constructeur en question a des effets secondaires. Et c'est souvent optimisé loin.OriginalL'auteur Cheers and hth. - Alf
En termes plus simples:
Pour les construit dans ses types relativement simple. Pour les types définis par l'utilisateur, il peut obtenir plus complexe. Jetez un oeil à le présent article.
Par exemple:
OriginalL'auteur Chad
Initialisation est la création d'une instance(de type) avec certaine valeur.
Affectation est de donner de la valeur à une instance déjà créée(de type).
Pour Répondre à vos édité Question:
Quelle est la différence entre l'Initialisation Et Affectation à l'intérieur de constructeur? &
Quel est l'avantage?
Il y a une différence entre l'Initialisation d'un membre à l'aide d'initialiseur de liste et de lui affecter une valeur à l'intérieur du corps du constructeur.
Lors de l'initialisation des champs via la liste des initialiseurs les constructeurs sera appelé une fois.
Si vous utilisez la mission, les champs seront d'abord initialisé avec les constructeurs par défaut et puis réaffectés (via l'opérateur d'affectation) avec des valeurs réelles.
Comme vous le voyez il y a une surcharge supplémentaire de création & affectation dans le second, ce qui pourrait être considérable pour l'utilisateur défini par les classes.
Pour un type de données entier ou POD membres de la classe il n'est pas pratique de surcharge.
Un Exemple De Code:
Dans l'exemple ci-dessus:
Cette construction est appelée un Membre de la Liste d'Initialiseur en C++.
Il initialise un membre
param_
à une valeurparam
.Quand pensez-vous
HAVE TO
utilisation Initialiseur de membre de la liste?Vous avez(un peu forcé) pour utiliser un Initialiseur de Membre de la liste si:
Votre classe a un membre de référence
Votre classe a un const membre ou
Votre classe n'a pas de constructeur par défaut
Les Types ont souvent un de valeurs.
void
est l'exception, cependant.Le terme "initialisation" a plusieurs significations. La signification de base, à partir de laquelle les autres sont dérivés, est incompatible avec cette tentative de différenciation de l'initialisation et de l'affectation. Et donc, je pense que cette réponse, car c'est au moment de la rédaction de ce commentaire, peut facilement induire en erreur le maintenant malheureusement trop commun irréfléchie orientée vers le groupe associatif novices.
OriginalL'auteur Alok Save
Initialisation: donner un objet à une valeur initiale:
Affectation: l'affectation d'une valeur à un objet:
Non, il est appelé une phase d'initialisation.
OriginalL'auteur Mankarse
C dans la syntaxe générale pour l'initialisation est avec
{}
:L'un pour
S
est appelé "désigné initialiseurs" et n'est disponible que depuis le C99 à partir.corriger
0
pour le type correspondant.double r = { 1.0
};
0
, à savoir{ 0 }
.initialiseur doivent être des expressions constantes
Ce
{}
syntaxe ne peut pas être utilisé directement pour l'affectation, mais en C99, vous pouvez utiliser des littéraux composés commeD'abord la création d'un objet temporaire sur les RHS et de l'affectation de cette de votre objet.
OriginalL'auteur Jens Gustedt
Une chose que personne n'a encore mentionné est la différence entre l'initialisation et affectation des champs de la classe dans le constructeur.
Considérons la classe:
Ce que nous avons ici est un constructeur qui initialise
Thing::num
à la valeur de 5, et attribue 'a' àThing::c
. Dans ce cas, la différence est mineure, mais comme l'a dit avant, si vous avez été de substituerint
etchar
dans cet exemple, pour certains arbitraire des classes, nous parler de la différence entre l'appel d'un constructeur paramétré par rapport à un constructeur par défaut suivie paroperator=
fonction.OriginalL'auteur v010dya