指针'this + 1'在C ++中引用了什么?

时间:2017-07-27 03:30:41

标签: c++

我在Sequitur G2P的代码中徘徊,发现了一段非常奇怪的代码:

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

我知道this是指向当前对象的指针,因为它是一个指针,操作完全合法,但this+1实际上指的是什么?

5 个答案:

答案 0 :(得分:60)

据推测,this是数组的一部分,因此this+1将引用该数组中的下一个对象。

答案 1 :(得分:34)

this只是一个引用 this 对象的指针。由于它是一个指针,因此您可以应用指针算法甚至数组索引。

如果对象是数组中的元素,this+1将指向数组中的下一个对象。

如果不是,那么它只是将这个对象处理内存中的任何东西都处理掉,除非它是相同的类型,否则这将是未定义的行为

答案 2 :(得分:5)

因为它是NLP,所以优化内存管理是有意义的。我假设您也发现了重载的新/删除方法。

this + 1构造假设所有对象都驻留在数组中。名字' childrenEnd'该方法指示它返回指向当前节点的子节点的地址的指针。

因此,您正在研究树结构的实现。所有兄弟姐妹都和他们的孩子相邻。

答案 3 :(得分:0)

C ++类中的“ this + 1”表示:

如果“ this”对象是另一个对象的成员,它将指向在“ this”对象变量之后声明的父对象的下一个变量的地址:

示例:

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等于'H'。

长话短说,它允许访问父级的类数据而无需将父级的指针传递给子类。在此示例中,此+ 1指向类A的m_test成员。

答案 4 :(得分:0)

实际上,在某些情况下可以使用此东西。我不建议使用此方法,但肯定可以。

我相信,在NLP代码中,它的用法如下:

当您希望对象表现为集合(数组等)的行为以类似于具有基于范围的对象的数组的方式使用它时,您可以执行以下操作:

struct Obj {
...
Obj* begin() { return this; }
Obj* end() { return this+1; }
...
}

现在,您可以在基于范围的for循环中使用此对象... 有时,所有这些都是必要的……但是,即使在那儿,与使用此技巧相比,您最好还是使用“ nullptr”甚至进行重构。