我在Sequitur G2P的代码中徘徊,发现了一段非常奇怪的代码:
public:
...
const Node *childrenEnd() const { return (this+1)->finalized.firstChild_; }
我知道this
是指向当前对象的指针,因为它是一个指针,操作完全合法,但this+1
实际上指的是什么?
答案 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”甚至进行重构。