- •1)Краткий обзор основных парадигм программирования
- •Основные принципы ооп
- •Абстрактные типы данных
- •Синтаксис описания класса
- •Управление доступом к членам класса
- •Манипуляции с состоянием объекта
- •Класс как область видимости
- •Объявление и определение методов класса. Спецификатор inline
- •Указатель на член класса
- •Указатель this
- •Конструкторы и деструкторы
- •Конструктор умолчания
- •Конструктор преобразования и конструкторы с двумя и более параметрами
- •Конструктор копирования
- •Порядок вызова конструкторов и деструкторов
- •Статические члены класса
- •Константные члены класса. Модификатор const
- •Друзья классов
- •Статический полиморфизм
- •Перегрузка бинарных операций
- •Перегрузка унарных операций
- •Перегрузка функций
- •Виды отношений между классами
- •Одиночное наследование
- •Правила наследования
- •Преобразования указателей.
- •Правила видимости при наследовании.
- •Закрытое (private) наследование
- •Перекрытие имен
- •Динамический полиморфизм, механизм виртуальных функций
- •Реализация виртуальных функций
- •Абстрактные классы. Чистые виртуальные функции
- •12. Средства обработки ошибок, исключения и обработка исклю-чений
- •Правила выбора обработчика исключения
Указатель this
В классах С++ неявно введен специальный указатель this – указатель на текущий объект. Каждый метод класса при обращении к нему получает данный указатель в качестве неявного параметра. Через него методы класса могут по-лучить доступ к другим членам класса.
Указатель this можно рассматривать как локальную константу, имеющую тип X*, если X – имя описываемого класса. Нет необходимости использовать его явно. Он используется явно, например, в том случае, когда выходным значением для метода является текущий объект.
Данный указатель, как и другие указатели, может быть разыменован.
При передаче возвращаемого значения метода класса в виде ссылки на те-кущий объект используется разыменованный указатель this, так как ссылка, как уже было указано, инициализируется непосредственным значением.
Пример:
class x {
. . .
public:
x& f(. . .){
. . .
return *this;
}
};
Указатель на член класса
Кроме адресации областей памяти, содержащих информационные объекты, указатели могут содержать адреса членов класса. Технологию создания и ис-пользования таких указателей легче описать с использованием конкретного примера, операторы которого подробно прокомментированы:
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.
pf ff; – создание объекта ff, имеющего введенный тип pf.
ff = &Х::f1; – указателю ff присваивается адрес одного из методов класса. Доступ к этому методу по данному указателю через какой-либо объект невозможен (оператор ff = &b.f1; – неверен). Дело в том, что -указатель на член класса представляется для нестатических членов не
абсолютным, а относительным адресом, то есть смещением относительно базового адреса класса (указатель на статический член класса представ-ляет собой истинный адрес).
k =(b.* ff)(par); – разыменование указателя на нестатический метод класса дает доступ к коду по относительному адресу, который применяется к базовому адресу конкретного объекта (в данном случае – объекта b).
Примечание. В случае объявления методов статическими членами (см. раздел «Статические члены класса») идентификатор pf необходимо объявить обычным указа-телем на функцию:
typedef int (* pf)(int);
Разыменование объекта такого типа представляется обычным разыменованием указа-теля на функцию:
k = (*ff)(par);
Применение техники разыменования указателя на метод класса является проявлением динамического полиморфизма, когда исполняемый код для одного и того же оператора (k = (b.*ff)(par)) определяется на этапе исполнения, а не компиляции. В большей мере динамический полиморфизм реализуется вир-туальными функциями, описываемыми в следующих разделах.
