10
votes

Ordre d'exécution dans la liste d'initialisation du constructeur

est l'ordre d'exécution dans la liste d'initialisation du constructeur déterminable? Je sais que les membres commander dans une classe sont l'ordre dans lequel ces membres seront initialisés, mais si j'ai un scénario comme celui-ci: xxx

mais pour que cela soit fiable, cette commande doit être fiable. de gauche à droite. Est-ce que c'est garanti par un excellent livre de std :: ou pas? Si non, je peux toujours déplacer la deuxième ligne dans le corps.


2 commentaires

Utilisez le placement Nouveau pour construire dans un tampon de mémoire que vous avez déjà attribué.


Vous ne pouvez pas initialiser un objet plus d'une fois, cette question est donc un non séquitur. Au-delà de cela, duplicaté évident de

3 Réponses :


23
votes

La norme C ++ garantit une commande pour les listes d'initialisation (norme ISO C ++ Standard 12.6.2 / 5):

... Les membres de données non stacettes doivent être initialisés dans l'ordre dans lequel elles ont été déclarées dans la définition de la classe (à nouveau indépendamment de l'ordre des initialisateurs de MEM). P> blockquote>

(voir Réponse de Wyatt Anderson pour plus d'informations.) p>

Exemple: P>

class XBase
{
protected:
    XBase() : impl_(Allocate(sizeof(X_Implementation))) { }

    ~XBase() {
        if( !impl_) { Deallocate(impl_); } // Or something like this
    }

    X_Implementation* impl_;
};

class X : private XBase // XBase is an implementation detail
{
public:
    X() {
        impl_ = Construct<X_Implementation>(impl_);
    }

    ~X() {
        Destruct<X_Implementation>(impl_); // Or something like this
    }
};


0 commentaires

30
votes

Selon ISO / CEI 14882: 2003 (E) Section 12.6.2:

L'initialisation doit procéder à l'ordre suivant:

  • premier, et uniquement pour le constructeur de la classe la plus dérivée décrite ci-dessous, les classes de base virtuelles doivent être initialisé dans l'ordre dans lequel ils apparaissent sur une traverse de profondeur-gauche à droite du graphique acyclique dirigé des classes de base, où "gauche à droite" est l'ordre d'apparition des noms de classe de base dans le dérivé Classe Spécificateur de base-liste.
  • Ensuite, les classes de base directe doivent être initialisées dans la commande de déclaration, telles qu'elles apparaissent dans la liste des spécifications de base (quel que soit l'ordre des initialiseurs de Mem).
  • Ensuite, les membres de données non statiques doivent être initialisés dans l'ordre de leur déclaration dans la définition de la classe. (Encore une fois, peu importe l'ordre des initialiseurs de Mem).
  • Enfin, le corps du constructeur est exécuté.

    Alors, suivez cet ordre et vous aurez votre commande. En outre, selon la norme, la commande est prescrite en tant que telle afin que les objets puissent être ininitialisés dans l'ordre inverse précisément.


0 commentaires

3
votes

Votre scénario spécifique est basé sur l'idée d'initialiser le même membre plus d'une fois. Ceci est simple illégal en C ++. Votre code ne compilera pas. Donc, la question que vous demandez n'existe pas vraiment.

L'ordre d'initialisation de l'ordre des membres est l'ordre de leur déclaration dans la définition de classe. Dans les contextes de non-héritage qui couvrent tout ce qui concerne l'ordre d'initialisation dans la liste d'initialistes de constructions.


0 commentaires