Je suis tombé sur une déclaration dans mon livre qui a déclaré: p>
Vous n'avez pas à initialiser un membre statique lorsque vous le déclarez; C ++ invoquera le constructeur par défaut si vous ne le faites pas. P> blockQuote>
Cela m'a vraiment confondu de savoir ce que cela signifie. Parlons-ils des membres de l'objet seulement? Si oui, à quel moment serait-il appelé le constructeur par défaut? De plus, comment allieriez-vous initialiser un objet membre statique sans le constructeur par défaut? P>
4 Réponses :
en C ++, de nouveaux objets sont toujours initialisés en quelque sorte. Il y a une initialisation par défaut, une initialisation de copie, une initialisation de la valeur et une initialisation directe, la seule question est celle que votre code utilise.
Je suppose qu'ils signifient: p> vs Le constructeur de copie est nécessaire, il y a éventuellement une conversion de Si vous ne souhaitez pas appeler le constructeur par défaut ou Copier, utilisez la syntaxe d'initialisation directe: P> bla code> à un
temporaire code> avant d'appeler le constructeur de copie , et parfois, l'appel au constructeur de copie est ignoré, mais il doit être accessible. P>
SomeObject SomeClass::x(blah); // direct initialization
Il a dit «déclarer», ne pas «définir», ce qui rend la question si déroutante.
@ildjarn: une définition est une sorte de déclaration. Mais le livre est clairement inexact.
Dans le cas des membres statiques de données statiques d'ODR, la définition doit toujours être séparée de la déclaration, donc je ne pense pas que cela est pertinent dans ce cas. Mais oui, j'ai hâte de voir quel livre c'est qui répandait cette désinformation.
Le livre est C ++ pour les nuls, je suis heureux de ne pas avoir de sens à qui que ce soit, car il ne me faisait certainement pas de moi: - /
@RUBIXIBUC: «Les livres de Dummies» ont tendance à être écrits par des mannequins, il semble. ; -] Je recommanderais de le jeter et d'obtenir un (ou plus) des livres énumérés dans cette FAQ à la place.
Merci :-) Je vais regarder la liste sur
Érablez-la. Supposons qu'il y ait un classe foo; code> quelque part. Maintenant, nous faisons cela un membre statique de notre classe,
// again in star.cpp
Foo Star::z('a', 1.5);
Et si l'élément statique est par exemple un int code> et j'écris seulement
int star :: z; code> dans le CPP? Est-il initialisé par défaut à 0?
@ TOBI303: Oui, les objets avec une durée de stockage statique sont initialisés par zéro si elles ne sont pas autrement constantes (même si elles sont initialisées par la suite de manière dynamique).
membre em> est par définition toujours un membre objet em> car cela signifie une variable déclarée un membre d'un objet. Cela dit que les membres statiques doivent être déclarés déclarés et il est généralement une bonne pratique pour initialiser explicitement les variables. Quel livre est-ce? P>
Y a-t-il un terme pour quand vous initialisez l'int comme donc "int A (45)"; ou est juste un autre moyen? Verset int a = 5
Ben Vittight l'a appelé initialisation directe i> dans sa réponse. C'est juste l'option que je préfère habituellement.
@AJG: C'est la terminologie utilisée dans la norme.
@Ben Vitight: Je sais, je l'ai dirigé pour votre réponse pour les détails.
Dans cette déclaration:
"Vous n'avez pas besoin d'initialiser un membre statique lorsque vous le déclarez; C ++ convoquera le constructeur par défaut si vous ne le faites pas."
"Le membre statique" désigne le "membre statique" de certains types primitifs variable des membres, dans un autre mot, les types de données du "Membre statique" ne doivent être que: int, flotter ou caractère .....
Donc, pour ces types primitifs, le compilateur connaît leur "constructeur par défaut", par exemple Pour le type "INT", le compilateur vient de définir 0.
Mais si ces types de membres statiques sont des classes spécifiques, pas ces types primitifs intégrés C ++, vous devez appeler la fonction de constructeur spécifique explicitement, il est exactement comme la 1ère réponse fournie par "Kerrek SB"
Mais rappelez-vous une chose, même votre type de membre statique est un type primitif, vous avez toujours besoin de déclarer sa mise en œuvre dans le fichier * .C.
Supposons dans l'exemple fourni par "Kerrek SB", si nous changeons le: à p> dans le fichier étoile.h,
Nous devons encore ajouter une ligne en étoile.c comme: p> Ça sera initialisé comme 0 par compilateur; Je crois donc que le "membre statique" dans
Dans "Vous n'êtes pas obligé d'initialiser un membre statique" seulement signifie "membre statique" dont le type est de type primitif C ++. Si son type est des classes, vous devez appeler leur fonction de constructeur spécifique identique à tout autre objet de classes. P> p>
Vous impliquez que le compilateur ne peut pas appeler automatiquement le constructeur par défaut des objets de types définis par l'utilisateur, qui est faux. Cela peut certainement, et cela fait très souvent. Le constructeur par défaut d'un UDT peut être invoqué implicitement en définissant comme personnellement mon obj; code> ou explicitement avec
ToNObject MyOBJ {}; // ou () code>.
Underscore_d, je n'ai pas dit. Ce sujet parle du type de membre statique dans une autre classe, au lieu d'une initialisation de type de variable générale. Si vous croyez que «Static SomeObject MyOBJ» pourrait être définie dans votre autre classe, veuillez concevoir un petit test pour le prouver. Je l'ai fait, cela ne pouvait pas fonctionner et signaler des erreurs de compilation.
Cela semble très incorrect. Dans quel livre l'avez-vous lu?