- •1)Краткий обзор основных парадигм программирования
- •Основные принципы ооп
- •Абстрактные типы данных
- •Синтаксис описания класса
- •Управление доступом к членам класса
- •Манипуляции с состоянием объекта
- •Класс как область видимости
- •Объявление и определение методов класса. Спецификатор inline
- •Указатель на член класса
- •Указатель this
- •Конструкторы и деструкторы
- •Конструктор умолчания
- •Конструктор преобразования и конструкторы с двумя и более параметрами
- •Конструктор копирования
- •Порядок вызова конструкторов и деструкторов
- •Статические члены класса
- •Константные члены класса. Модификатор const
- •Друзья классов
- •Статический полиморфизм
- •Перегрузка бинарных операций
- •Перегрузка унарных операций
- •Перегрузка функций
- •Виды отношений между классами
- •Одиночное наследование
- •Правила наследования
- •Преобразования указателей.
- •Правила видимости при наследовании.
- •Закрытое (private) наследование
- •Перекрытие имен
- •Динамический полиморфизм, механизм виртуальных функций
- •Реализация виртуальных функций
- •Абстрактные классы. Чистые виртуальные функции
- •12. Средства обработки ошибок, исключения и обработка исклю-чений
- •Правила выбора обработчика исключения
Манипуляции с состоянием объекта
Для доступа к внутренним информационным членам объекта, созданного на основе класса (чтение/запись), необходимо использовать специальные методы класса, называемые модификаторами (setters) и селекторами (getters). Они осу-ществляют подконтрольное считывание и изменение внутренних информаци-онных членов. Так, если изменяется внутреннее информационное поле size объекта класса stack, описывающее максимальный размер стека, то необходимо осуществить ряд действий по согласованному изменению других информаци-онных членов (выделение дополнительной памяти и т. д.):
class stack { int* c1;
int top, size; public:
. . .
int putnewsize(int ns){ if (top > ns) return 1; int* nc1 = new int[ns]; if (top > 0)
for (int i = 0; i < top; i++) nc1[i] = c1[i];
delete c1; c1 = nc1; size = ns; return 0;
}
};
Таким образом, изменение информационных полей объекта должно осуще-ствляться специальными методами, производящими изменение требуемого ин-формационного поля согласованно с одновременным изменением других ин-формационных полей. Такие методы обеспечивают согласованность внутренних данных объекта.
Класс как область видимости
Класс является областью видимости описанных в нем членов класса. Иден-тификатор члена класса локален по отношению к данному классу. Классы могут быть вложенными. Одноименные идентификаторы членов класса закрывают видимость соответствующих внешних идентификаторов.
Операция '::' позволяет получить доступ к одноименным объектам, внешним по отношению к текущей области видимости, в частности, к глобальным функциям и переменным, следующим образом:
имя_класса :: имя_члена_класса или
:: имя - для имен глобальных функций и переменных.
Пример:
int ia1;
void f1(int b1) { ia1 = ia1 + b1;
}
class x {
int ia1; public:
x(){ia1 = 0;} void f1(int b1){
::f1(b1); // вызов глобальной функции
}
};
int main(){ x a2; a2.f1(2); return 0;
}
Объявление и определение методов класса. Спецификатор inline
Каждый метод класса, должен быть определен в программе. Определить метод класса можно либо непосредственно в классе (если тело метода не слишком сложно и громоздко), либо вынести определение вне класса, а в классе только объявить соответствующий метод, указав его прототип.
При определении метода класса вне класса для указания области видимости соответствующего имени метода используется операции ‘::’:
Пример:
class x {
int ia1; public:
x(){ia1 = 0;} int func1();
};
int x::func1(){ … return ia1; }
Это позволяет повысить наглядность текста, особенно , в случае значитель-ного объема кода в методах. При определении метода вне класса с использова-нием операции ‘::’ прототипы объявления и определения функции должны совпадать.
Метод класса и любую функцию, не связанную ни с каким классом, можно определить со спецификатором inline:
inline int func1();
Такие функции называются встроенными.
Спецификатор inline указывает компилятору, что необходимо по воз-можности генерировать в точке вызова код функции, а не команды вызова функции, находящейся в отдельном месте кода модуля. Это позволяет уменьшить время выполнения программы за счет отсутствия команд вызова функции и воз-врата из функции, которые кроме передачи управления выполняют действия со-ответственно по сохранению и восстановлению контекста (содержимого ос-новных регистров процессора). При этом размер модуля оказывается увеличен-ным по сравнению с программой без спецификаторов inline. Следует отметить, что спецификатор inline является рекомендацией компилятору. Данный спе-цификатор неприменим для функций со сложной логикой. В случае невозмож-ности использования спецификатора для конкретной функции компилятор выдает предупреждающее сообщение и обрабатывает функции стандартным способом.
По определению методы класса, определенные непосредственно в классе, являются inline-функциям
