Введение в язык Си++

         

Ссылки на Себя


В функции члене на члены объекта, для которого она была вызвана, можно ссылаться непосредственно. Например:

class x { int m; public: int readm() { return m; } };

x aa; x bb;

void f() { int a = aa.readm(); int b = bb.readm(); // ... }

В первом вызове члена member() m относится к aa.m, а во втором - к bb.m.

Указатель на объект, для которого вызвана функция член, является скрытым параметром функции. На этот неявный параметр можно ссылаться явно как на this. В каждой функции класса x указатель this неявно описан как

x* this;

и инициализирован так, что он указывает на объект, для которого была вызвана функция член. this не может быть описан явно, так как это ключевое слово. Класс x можно эквивалентным образом описать так:

class x { int m; public: int readm() { return this-m; } };

При ссылке на члены использование this излишне. Главным образом this используется при написании функций членов, которые манипулируют непосредственно указателями. Типичный пример этого - функция, вставляющая звено в дважды связанный список:

class dlink { dlink* pre; // предшествующий dlink* suc; // следующий public: void append(dlink*); // ... };

void dlink::append(dlink* p) { p-suc = suc; // то есть, p-suc = this-suc p-pre = this; // явное использование this suc-pre = p; // то есть, this-suc-pre = p suc = p; // то есть, this-suc = p }

dlink* list_head;

void f(dlink*a, dlink *b) { // ... list_head-append(a); list_head-append(b); }

Цепочки такой общей природы являются основой для списковых классов, которые описываются в Главе 7. Чтобы присоединить звено к списку необходимо обновить объекты, на которые указывают указатели this, pre и suc (текущий, предыдущий и последующий). Все они типа dlink, поэтому функция член dlink::append() имеет к ним доступ. Единицей защиты в C++ является class, а не отдельный объект класса.



Содержание раздела