typedef struct : Initialisation par Défaut
typedef struct foo
{
bool my_bool;
int my_int;
} foo;
Dans l'exemple ci-dessus, je comprends que my_bool sera initialisé aléatoirement soit vrai ou faux, mais qu'en est my_int? Je suppose que my_int serait initialisé par défaut à 0, mais cela ne semble pas être le cas.
La définition des structures dans cette voie semble être incompatible avec l'initialisation des listes quelle est la meilleure façon d'initialiser my_bool et my_int pour faux et 0 respectivement?
Êtes-vous sûr que c'est le C++?
Pas de
"my_bool sera initialisé aléatoirement soit vrai ou faux" - peut-être, mais pas nécessairement. Non initialisée signifie pas initialisé. En fonction de ce que l'application que vous utilisez, la mémoire de l'objet est autorisé par exemple contenir un piège ou autre valeur non valide. La différence est que si vous prenez un "hasard" valeur booléenne
En plus de ce que Steve a dit, une initialisé la variable n'est même pas garanti pour contenir une valeur stable. Jusqu'à ce que vous l'initialiser ou de lui affecter une valeur, la variable peut facilement avoir une instable de la valeur, c'est à dire répété lit permettra d'obtenir une valeur différente à chaque fois.
bonne question, en fait je suis de passage cette structure Objective-C frontale pour une C++ back-end (et l'inverse)
Pas de
bool
en C. Mais vous avez un point de toute façon."my_bool sera initialisé aléatoirement soit vrai ou faux" - peut-être, mais pas nécessairement. Non initialisée signifie pas initialisé. En fonction de ce que l'application que vous utilisez, la mémoire de l'objet est autorisé par exemple contenir un piège ou autre valeur non valide. La différence est que si vous prenez un "hasard" valeur booléenne
x
(vrai ou faux), alors le résultat de x || !x
est garanti vrai par la norme. Si vous prenez un non initialisée valeur booléenne y
que la norme ne dit rien sur le résultat de y || !y
. Cela pourrait être vrai, faux, ou de provoquer un accident ou de tout autre comportement.En plus de ce que Steve a dit, une initialisé la variable n'est même pas garanti pour contenir une valeur stable. Jusqu'à ce que vous l'initialiser ou de lui affecter une valeur, la variable peut facilement avoir une instable de la valeur, c'est à dire répété lit permettra d'obtenir une valeur différente à chaque fois.
bonne question, en fait je suis de passage cette structure Objective-C frontale pour une C++ back-end (et l'inverse)
OriginalL'auteur Stephen Blinkhorn | 2010-06-30
Vous devez vous connecter pour publier un commentaire.
Types n'obtenez pas "initialisé". Seulement objets d'un certain type de l'initialisation. Comment et quand ils l'initialisation dépend de la manière dont l'objet correspondant est défini. Vous avez fourni aucune définition de n'importe quel objet de votre question, si votre question en elle-même n'a pas vraiment beaucoup de sens - il manque le contexte nécessaire.
Par exemple, si vous définissez un objet statique de type
foo
il sera automatiquement initialisé à zéro parce que tous les objets avec la durée statique sont toujours automatiquement initialisé à zéro.
Si vous définir automatiquement un objet de type
foo
sans un initialiseur, il restera non initialiséeSi vous définir automatiquement un objet de type
foo
avec un total d'initialiseur, il sera initialisé selon que l'initialiseurSi vous allouer de l'objet avec
new
et n'offrent pas d'initialiseur, il restera non initialiséeMais si vous utilisez la
()
initialiseur, ce sera zéro-initialzedSi vous créez un objet temporaire de type
foo
à l'aide de lafoo()
expression, le résultat de cette expression est initialisé à zéroDonc, une fois de plus, dans votre cas spécifique de l'initialisation de détails dépendent maintenant, vous créez l'objet de votre type, pas sur votre type lui-même. Votre type lui-même n'a pas inhérent à l'initialisation des installations et n'interfère pas avec l'initialisation d'une quelconque manière.
OriginalL'auteur AnT
Tout d'abord, la façon dont cette structure est déclarée est dans le style de C. En C++, vous devriez simplement faire:
En C et en C++, l'initialisation est distincte de l'étape de l'attribution. Si vous souhaitez toujours initialiser les membres de votre structure, l'utilisation d'initialisation par défaut de la syntaxe ressemble à ceci:
Dans les anciennes versions de C++, vous devez écrire manuellement un défaut constructeur qui initialise tous les membres (la nouvelle syntaxe ci-dessus est juste un peu de sucre pour cela):
@Sbi notes, si vous voulez initialiser manuellement la structure, même sans le constructeur par défaut, vous pouvez le faire
foo myFoo = foo();
OriginalL'auteur Cogwheel
Mettre en œuvre un constructeur par défaut:
OriginalL'auteur rturrado
Avoir un constructeur par défaut:
OriginalL'auteur tjm
Vous n'êtes pas de la création d' tout objet dans le code. L'initialisation est effectuée lorsque vous créez des objets, et n'est pas particulièrement rentrée par la façon dont vous déclarer la structure.
Par exemple le suivant initialise le booléen à
false
et l'entier de0
Avis que vous venez de typdefed votre structure. Vous n'avez pas créé un objet. Comme d'autres ont dit, vous pouvez omettre le typedef en C++ et il suffit de déclarer la structure, et que vous êtes toujours en mesure de vous référer à la type en disant tout simplement
foo
.Si vous omettez l'initialisation explicite lorsque vous définissez un objet, puis pour assurer de l'absence d'initialisation est effectuée, sauf si l'objet est défini à l'espace de noms de champ ou définis comme
static
localement (dans ce cas, tous les membres sont initialisé à zéro) ou la classe d'un utilisateur défini dans le constructeur par défaut qui ne l'initialisation en conséquence.OriginalL'auteur Johannes Schaub - litb
Tant que vous êtes en déclarant les structs dans un C-façon, vous pouvez utiliser
zeromemory
null exactementsizeof(foo)
octets, donc en défaut toutes les valeurs de0
.En C++, vous pouvez définir votre structure avec un constructeur qui permettrait de définir vos valeurs à certaines valeurs par défaut si nécessaire.
double my_fpn;
, alors ce pourrait échouer sur une application où undouble
avec tous les bits à zéro n'est pas valide d'un nombre à virgule flottante.OriginalL'auteur Costantino Rupert
le c et le c++ ne pas initialiser les variables. Ils contiennent tout ce qui est arrivé à être dans l'emplacement de mémoire, qu'ils avaient auparavant. Ceci s'applique également pour les variables de membre dans les classes et les structures, sauf si vous précisément les initialiser à une valeur.
std::string s;
sera certainement initialisers
.std::string crée un objet et appelle son constructeur et l'initialise explicitement. Il est peut-être une différence technique, mais ma déclaration reste correcte. Dans ce cas, il pourrait créer un constrictor pour sa structure et d'obtenir le même comportement. Est-ce à dire qu'il est initialisé automatiquement? Non, pas vraiment.
vous n'avez pas de l'initialiser à une valeur, par exemple
int i = int();
appelle le constructeur par défaut" de type int, et donc initialise i à la valeur par défaut de 0OriginalL'auteur Donnie