this
- это просто указатель на «текущий» объект;это параметр, который передается каждой функции-члену "за кулисами".
Давайте перепишем это в более "C-подобной" форме, без классов и магии.
Вот упрощенныйtree:
struct Node
{
int value;
Node* left;
Node* right;
};
, а вот remove
, который явно берет указатель на «текущий узел» и возвращает его вызывающей стороне:
Node* remove(Node* self, int val, Node* parent)
{
if (val < self->value)
{
if (self->left != NULL)
{
remove(self->left, val, self);
}
// ...
}
return self;
}
Обратите внимание, что рекурсивныйвызов remove
получает self->left
этого вызова в качестве аргумента self
, а self
этого вызова - parent
.
Результат рекурсии игнорируется;функция всегда возвращает свой self
аргумент без изменений.
Способ "цепочки" этой функции заключается в передаче ее результата следующему вызову функции:
Node *tree = ...;
remove(remove(remove(tree, 10), 20), 30);
Версия класса C ++работает так же.
Разница в том, что this
является неявным параметром функции в этом случае, и возвращая ссылку, вы можете использовать обычный синтаксис вызова функции-члена, но базовая механика точно такая же.