Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Ответы на вопросы ООП.docx
Скачиваний:
2
Добавлен:
01.07.2025
Размер:
203 Кб
Скачать
☆
  1. Указатель this

В классах С++ неявно введен специальный указатель this – указатель на текущий объект. Каждый метод класса при обращении к нему получает данный указатель в качестве неявного параметра. Через него методы класса могут по-лучить доступ к другим членам класса.

Указатель this можно рассматривать как локальную константу, имеющую тип X*, если X – имя описываемого класса. Нет необходимости использовать его явно. Он используется явно, например, в том случае, когда выходным значением для метода является текущий объект.

Данный указатель, как и другие указатели, может быть разыменован.

При передаче возвращаемого значения метода класса в виде ссылки на те-кущий объект используется разыменованный указатель this, так как ссылка, как уже было указано, инициализируется непосредственным значением.

Пример:

class x {

. . .

public:

x& f(. . .){

. . .

return *this;

}

};

  1. Указатель на член класса

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

class X {

int i; public:

Х(){i = 1;} int f1(int j){

cout << "print i" << i << "\n"; return j;

}

int f2(int j){

cout << "reset i \n"; i = 1; return j;

}

int f3(int j){

cout << "set i \n"; i = j; return j;

}

};

typedef int (Х::* pf)(int); // см. комментарий 1)

int main(){

int k, sw, par;

x b;

// см. комментарий 2)

pf ff;

. . .

switch (sw){

// см. комментарий 3)

case 1: ff=&x::f1;

break;

case 2: ff=&x::f2;

break;

case 3: ff=&x::f3;

};

// см. комментарий 4)

k = (b.*ff)(par);

. . .

return 0;

}

Комментарии:

1) ключевое слово typedef вводит новое имя для типа:

typedef int (Х::* pf)(int); - pf – тип указателя на метод класса X с одним входным параметром типа int и типом возвращаемого значения – int.

  1. pf ff; – создание объекта ff, имеющего введенный тип pf.

  1. ff = &Х::f1; – указателю ff присваивается адрес одного из методов класса. Доступ к этому методу по данному указателю через какой-либо объект невозможен (оператор ff = &b.f1; – неверен). Дело в том, что -указатель на член класса представляется для нестатических членов не

абсолютным, а относительным адресом, то есть смещением относительно базового адреса класса (указатель на статический член класса представ-ляет собой истинный адрес).

  1. k =(b.* ff)(par); – разыменование указателя на нестатический метод класса дает доступ к коду по относительному адресу, который применяется к базовому адресу конкретного объекта (в данном случае – объекта b).

Примечание. В случае объявления методов статическими членами (см. раздел «Статические члены класса») идентификатор pf необходимо объявить обычным указа-телем на функцию:

typedef int (* pf)(int);

Разыменование объекта такого типа представляется обычным разыменованием указа-теля на функцию:

k = (*ff)(par);

Применение техники разыменования указателя на метод класса является проявлением динамического полиморфизма, когда исполняемый код для одного и того же оператора (k = (b.*ff)(par)) определяется на этапе исполнения, а не компиляции. В большей мере динамический полиморфизм реализуется вир-туальными функциями, описываемыми в следующих разделах.