2 votes

La liste des initialisateurs de membres est-elle considérée comme faisant partie du corps d'un constructeur ou comme faisant partie du déclarateur ?

J'étudie les listes d'initialisation des membres en C++. Considérons l'exemple suivant :

struct Person
{
    public:
        Person(int pAge): age(pAge)
//                        ^^^^^^^^^ is this member initializer formally part of the constructor body? 
        {
        }
    private:
        int age = 0;
};

Ma première question est la suivante qui est l'initialisateur du membre age(pAge) officiellement dans le corps du constructeur. Je veux dire que j'ai lu que le corps d'une fonction commence à partir de l'ouverture { et se terminent à la fermeture } . D'après ce que je comprends actuellement, il y a quatre choses en jeu ici :

  1. Définition de Ctor : Cela comprend l'ensemble du

    //this whole thing is ctor definition Person(int pAge): age(pAge) { }

  2. Initialisateur de membre : C'est le age(pAge) partie.

  3. Déclaration Ctor : C'est le Person(int pAge) partie.

  4. Le corps de Ctor : C'est la région entre l'ouverture { et la fermeture } .

Ma deuxième question est que la description donnée ci-dessus est correcte ? Si non, quelle devrait être la signification correcte de ces quatre termes selon la norme C++ : Définition de Ctor , Initialisateur de membre , Déclaration Ctor y Le corps de Ctor .

PS : J'ai lu ce post qui ne répond pas à ma question.

1voto

dfri Points 11222

Conformément à [dcl.fct.def.general] ce qui nous indique la grammaire d'une fonction définition , a ctor-initialisateur fait partie de la fonction-corps :

function-definition:
    [...] function-body

function-body:
    ctor-initializer_opt compound-statement

El énoncé composé selon [stmt.block] est, dans ce contexte, ce que le PO appelle "entre accolades" ( bloc ) :

Une instruction composée (également connue sous le nom de bloc) regroupe une séquence de d'instructions en une seule.

compound-statement:
    { statement-seq_opt }

Considérant que ctor-initialisateur selon [class.base.init] n'est autorisé que pour les fonctions spéciales qui sont des constructeurs. accentuation mine] :

Dans le définition d'un constructeur pour une classe, des initialisateurs pour les sous-objets directs et virtuels de la classe de base et les membres de données non statiques. peuvent être spécifiés par un ctor-initialisateur qui a la forme

ctor-initializer:
: mem-initializer-list

Avec cela, nous pouvons répondre aux questions de l'OP.


La liste des initialisateurs de membres est-elle considérée comme faisant partie du corps d'un constructeur ou comme faisant partie du déclarateur ?

Oui, conformément à ce qui précède, l'initialisateur de membre, formellement mem-initializer-list fait partie de l'initiative fonction-corps du constructeur.


Ma deuxième question est la suivante : la description donnée ci-dessus est-elle correcte ?

1. Définition de Ctor : Cela inclut l'ensemble du

//this whole thing is ctor definition
Person(int pAge): age(pAge)
        {
        }

Correct.

2. Initialisateur de membre : C'est le age(pAge) partie.

Correct, formellement le mem-initializer-list (alors que : age(pAge) est le ctor-initialisateur

3. Déclaration Ctor : C'est le Person(int pAge) partie.

Pas tout à fait exact : une définition est aussi une déclaration. [dcl.fct] décrire les règles des déclarations de fonctions, et ce en termes simples, Person(int pAge); est une déclaration qui n'est pas une définition, notamment ici par omission d'un fonction-corps .

4. Le corps de Ctor : C'est la région entre l'ouverture { et la fermeture } .

Incorrect. Le corps d'une fonction, tel que couvert ci-dessus, contient également, de manière facultative, un ctor-initialisateur . Dans l'exemple de l'OP, : age(pAge) {} est le fonction-corps du constructeur.

0voto

Anoop Rana Points 1

est l'initialisateur du membre age(pAge) officiellement une partie du corps du constructeur ?

Oui, à partir de Constructeurs et listes d'initialisation des membres :

El le corps d'une définition de fonction de tout constructeur, avant l'accolade d'ouverture de l'instruction composée, peut inclure la liste des initialisateurs de membre dont la syntaxe est le caractère deux-points :, suivi de la liste, séparée par des virgules, d'un ou plusieurs initialisateurs de membres,...


La description donnée ci-dessus est-elle correcte ?

Au quatrième point de votre deuxième question, le corps du constructeur comprend également la liste des initialisateurs de membres, comme indiqué ci-dessus.

-2voto

gnasher729 Points 5011

Dans votre exemple, age(pAge) fait partie de l'implémentation, pas de la déclaration. Si vous le changiez en age(pAge+1), les appelants ne changeraient pas. L'implémentation du constructeur appellera le constructeur de la classe de base, puis les constructeurs par défaut ou les constructeurs comme age(pAge), je ne me souviens plus de l'ordre, puis le code source compilé du constructeur. Je considérerais la syntaxe comme un peu étrange.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X