Les membres statiques et le constructeur par défaut en C++
Je suis tombé sur une déclaration dans mon livre dit:
Vous n'avez pas à initialiser un membre statique lorsque vous déclarez; C++ appeler le constructeur par défaut si vous n'en avez pas.
Cela m'a vraiment confus quant à ce qu'il signifie. Sont-ils parler les membres de l'objet seulement? Si oui, à quel point serait-il appeler le constructeur par défaut? Aussi, comment voulez-vous initialiser un membre statique de l'objet sans le constructeur par défaut?
Ça a l'air très incorrect. Quel livre avez-vous lu?
OriginalL'auteur rubixibuc | 2011-09-09
Vous devez vous connecter pour publier un commentaire.
Nous allons le décomposer. Supposons qu'il y a quelques
class Foo;
quelque part. Maintenant, nous faisons ce un membre statique de notre classe,Maintenant, en substance, que déclare un objet global
Foo Star::z
-- alors, comment cela s'est instancié? Le standard vous dit: il obtient par défaut-construit. Mais n'oubliez pas que vous devez fournir à l'objet réel de l'instance dans l'une de vos unités de traduction:Supposons maintenant que
Foo
ne possède pas de constructeur par défaut:Maintenant il y a un problème: Comment pouvons-nous construire
Star::z
? La réponse est tout simplement "comme ci-dessus", mais maintenant, nous devons appeler un constructeur:Le standard a en fait deux notions distinctes de "initialisation" (grammaticale de concept) et "construction" (l'appel de la fonction), mais je ne pense pas que nous avons besoin d'aller en ce moment.
int
et j'écris seulementint Star::z;
dans le rpc? Il est initialisé par défaut à 0?Oui, les objets statiques durée de stockage sont initialisé à zéro d'abord si elles ne sont pas autrement constante-initialisé (même si ils sont initialisés de façon dynamique).
OriginalL'auteur Kerrek SB
En C++, les nouveaux objets sont toujours initialisés en quelque sorte. Il y a d'initialisation par défaut, copie de l'initialisation, la valeur d'initialisation, et de diriger l'initialisation, la seule question est qui une votre code à l'aide.
Je suppose qu'ils signifient:
vs
Le constructeur de copie est nécessaire, éventuellement, il y a également une conversion de
blah
temporaireSomeObject
avant d'appeler le constructeur de copie, et parfois, l'appel au constructeur de copie est ignorée, mais elle doit être accessible.Si vous ne souhaitez pas appeler le défaut ou le constructeur de copie, l'utilisation directe de la syntaxe d'initialisation:
Une définition est une sorte de déclaration. Mais le livre est manifestement inexacte.
Dans le cas de l'ODR-utilisé les données membres statiques, la définition doit toujours être séparée de la déclaration, donc je ne pense pas que c'est pertinent dans ce cas. Mais oui, je suis impatient de voir ce livre, c'est que la diffusion de cette désinformation.
Le livre est le c++ pour les nuls, je heureux que ça n'a pas de sens pour quelqu'un d'autre, parce qu'il n'a pas pour moi :-/
Des mannequins, des " livres ont tendance à être écrit par des mannequins, il me semble. ;-] Je vous recommande de le jeter et d'en obtenir un (ou plusieurs) des ouvrages répertoriés dans FAQ à la place.
OriginalL'auteur Ben Voigt
Edit: Déplaçant le commentaire de réponse.
membre est par définition toujours un membre de l'objet que cela signifie une variable déclarée en tant que membre d'un objet. Cela dit statique des membres doivent être des avant-déclaré et il est généralement une bonne pratique explicitement initialiser des variables. Quel livre est-ce?
Ben Voight appelé direct initialisation dans sa réponse. C'est juste l'option que je préfère habituellement.
C'est la terminologie utilisée dans la norme.
Voight: je sais, j'ai été lui ordonnant de votre réponse pour les détails.
OriginalL'auteur AJG85
Dans cette déclaration:
"Vous n'avez pas à initialiser un membre statique lorsque vous déclarez; C++ appeler le constructeur par défaut si vous n'en avez pas."
"Le membre statique" signifie "membre statique" de certains types primitifs variable membre, en un mot, les types de données de "membre statique" ne devrait être: int, float, ou char.....
Donc, pour ces types de primitives, compilateur connaître leurs "constructeur par défaut", par exemple pour le "int" type, le compilateur juste 0.
Mais si ces membres statiques sont les types de classes spécifiques, et non pas ceux de C++ intégré dans les types primitifs, vous devez appeler spécifiques à la fonction constructeur explicitement, c'est exactement le même que le 1er réponse à "Kerrek SB"
Mais n'oubliez pas une chose, même votre membre statique est de type type primitif, vous avez encore besoin de déclarer sa mise en œuvre dans le *.c fichier.
Supposons que dans l'exemple fourni par "Kerrek SB", si l'on change l':
à
dans les étoiles.h fichier,
nous avons encore besoin d'ajouter une ligne dans les étoiles.c:
Il sera automatiquement initialisé à 0 par le compilateur; je crois Donc que le "membre statique" dans
"Vous n'avez pas à initialiser un membre statique" signifie seulement "membre statique" dont le type est le C++, type de primitive. Si son type sont certaines classes, vous devez appeler leur fonction constructeur comme même que toutes les autres classes d'objets.
SomeObject my Obj;
ou explicitement avecSomeObject myObj{}; // or ()
.underscore_d, je n'ai pas dit. Cette rubrique est de parler du membre statique de type dans une autre classe, à la place d'un général type de la variable d'initialisation. Si vous croyez que "statique SomeObject myObj" pourrait être défini dans votre autre classe, s'il vous plaît juste concevoir un petit test pour le prouver. Je l'ai fait, il ne pouvait pas travailler et rapport d'erreurs de compilation.
OriginalL'auteur Clock ZHONG