41 votes

À quoi le pointeur 'this +1' fait-il référence en C ++?

Je parcourais le code de Sequitur G2P et ai trouvé une ligne de code vraiment étrange:

 public:
    ...
    const Node *childrenEnd() const { return (this+1)->finalized.firstChild_; }
 

Je sais que this est un pointeur sur l'objet actuel, et puisqu'il s'agit d'un pointeur, l'opération est parfaitement légale, mais à quoi correspondent réellement this+1 ?

60voto

Jonathan Olson Points 942

Vraisemblablement, this fait partie d'un tableau, donc this+1 ferait référence au prochain objet de ce tableau.

34voto

Tas Points 5201

this est simplement un pointeur qui fait référence à cet objet. Puisqu'il s'agit d'un pointeur, vous pouvez appliquer l'arithmétique de pointeur et même l'indexation de tableaux.

Si cet objet est un élément d'un tableau, this+1 indiquerait le prochain objet du tableau.

Si ce n'est pas le cas, il va simplement traiter ce qui se trouve dans cette mémoire de la même manière que cet objet, ce qui constituera un comportement indéfini, à moins que ce ne soit du même type.

5voto

Thomas G. Points 122

Comme il s'agit de la PNL, il est logique d'optimiser la gestion de la mémoire. Je suppose que vous trouvez également des méthodes surchargées nouvelles / supprimées.

La construction this + 1 suppose que tous les objets résident dans un tableau. Le nom 'childrenEnd' de la méthode indique qu'elle renvoie un pointeur sur une adresse de la fin des enfants du nœud actuel.

Ainsi, vous regardez une implémentation d'une arborescence. Tous les frères et soeurs sont adjacents et leurs enfants aussi.

0voto

sbryndin Points 1

"this + 1" en classe C ++ signifie:

si l'objet "this" est membre d'un autre objet, il pointera sur l'adresse de la variable suivante de l'objet parent, déclarée juste après la variable d'objet "this":

Exemple:

 class B
{
public:
    void* data()
    {
        return this + 1;
    }
};

class A
{
public:
    B m_b;
    char m_test;
};

int main(int argc, char* argv[])
{
    A a;
    a.m_test = 'H';

    void* p = a.m_b.data();
    char c;

    memcpy(&c, p, sizeof(char));
    return 0;
}
 

c est égal à 'H'.

Le récit long permet d'accéder aux données de la classe du parent sans passer le pointeur du parent à la classe enfant. Dans cet exemple, ce + 1 point sur le membre m_test de la classe A.

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