8
votes

Membres statiques et constructeur par défaut C ++

Je suis tombé sur une déclaration dans mon livre qui a déclaré:

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.

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?


1 commentaires

Cela semble très incorrect. Dans quel livre l'avez-vous lu?


4 Réponses :


2
votes

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> xxx pré>

vs xxx pré>

Le constructeur de copie est nécessaire, il y a éventuellement une conversion de 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>

Si vous ne souhaitez pas appeler le constructeur par défaut ou Copier, utilisez la syntaxe d'initialisation directe: P>

SomeObject SomeClass::x(blah); // direct initialization


6 commentaires

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



16
votes

É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);


2 commentaires

Et si l'élément statique est par exemple un int et j'écris seulement int star :: z; 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).



1
votes

edit: déplaçant le commentaire pour répondre.

membre est par définition toujours un membre objet 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? xxx


4 commentaires

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 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.



1
votes

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: xxx

à xxx

dans le fichier étoile.h, Nous devons encore ajouter une ligne en étoile.c comme: xxx

Ç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.


2 commentaires

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; ou explicitement avec ToNObject MyOBJ {}; // ou () .


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.