
- •1.Объявление и определение класса.
- •3. Дружественные функции.
- •4. Пеpегpузка опеpаций ( синтаксис operator)
- •5. Статические компоненты класса.
- •7. Иерархия классов ( последовательность работы конструкторов и деструкторов )
- •8. Доступ к наследуемым компонентам
- •9. Виртуальные функции (когда применяются, форма вызова)
- •10 . Шаблоны ( пример template)
- •15 Преобразование типов данных.
- •17 Ввод-вывод в файл. Сохранение объектов в файле.
- •18 Обработка исключений (блоки try, throw, catch)
- •Примеры обработки исключительных ситуаций
- •20. Паттерны и их классификация. Принцип классификации паттернов проектирования
- •Паттерны проектирования классов/обьектов
- •21. Абстрактная фабрика.
- •22. Классификация типов данных. Система типов
- •Oбщий взгляд
- •Класс String
- •Объявление строк. Конструкторы класса string
- •Операции над строками
- •Цикл foreach
- •Наследование
- •Добавление полей потомком
- •Конструкторы родителей и потомков
- •Интерфейсы
- •Две стратегии реализации интерфейса
- •Преобразование к классу интерфейса
5. Статические компоненты класса.
Компоненты класса как поля, так и функции можно объявлять статическими (static). Эти элементы занимают статическую область памяти и являются общими для всех объектов класса.
К закрытым статическим компонентам возможен доступ через интерфейс класса или со спецификатором класса. Статические компоненты в отличие от нестатических полей могут быть инициализированы , даже если не создан ни один объект класса. Статический компонент не имеет указателя this. Статическая функция видима только в пределах класса. Приведем пример:
void f() {cout<<“Я - глобальная функция”<<endl;} //Глобальная функция class MyClass { static int a; public:
//Статическая функция static void f() {cout<<“Я - статическая функция”<<a<<endl; } }; int MyClass::a=66;// Инициализация статической переменной void main() { MyСlass mc; MyСlass::f(); mc.f(); f(); }
Вид информации на экране дисплея:
Я - статическая функция 66
Я - статическая функция 66
Я - глобальная функция
7. Иерархия классов ( последовательность работы конструкторов и деструкторов )
Производные классы являются эффективным средством для расширения функциональных возможностей существующих классов без перепрограммирования этих классов и повторной компиляции существующих программ.
Сконструируем класс Person на основе двух классов: Name и Job.
Иерархия классов выглядит следующим образом:
Классы Name и Job называются базовыми для производного класса Person. Поля и функции, которые определены в базовых классах, могут быть использованы в производном. Использование компонентов базовых классов в производных называется наследованием. Программа выглядит следующим образом:
struct Name{ char *FirstName; // Имя char *SurName; // Фамилия Name( char *Fn, char *Sn ); { cout<<“Конструктор класса Name”<<endl; FirstName=Fn; SurName=Sn;} ~Name() { cout<<“Деструктор класса Name”<<endl; } }; struct Job{ char *Company; //Название компании char *Position; // Должность Job (char *Co, char *Po) { cout<<“Конструктор класса Job”<<endl; Company=Co; Position=Po;} ~Job() { cout<<“Деструктор класса Job”<<endl; } }; struct Person: Name, Job { // Собственные компоненты производного класса
int Age; // возраст char Sex; // пол Person ( char *Ifn, char *Isn, char *Ico, char *Ipo, int Ia, char *Is):
Name (Ifn, Isn), Job(Ico, Ipo) // Список конструкторов базовых классов {cout<<“Конструктор класса Person”<<endl; Age=Ia; Sex=Is;} ~Person() {cout<<“Деструктор класса Job”<<endl; } }; void main() { Person Pl ( “Владимир”, “Сидоров”, “SoftSci”, “Программист”, 30, “муж” ); }
Благодаря наследованию поля FirstName, SurName, Company и Position, определенные в базовых классах, доступны в производном. Доступны в этом классе и конструкторы базового класса.
В примере приведено так называемое множественное наследование – один производный класс имеет несколько базовых; в то же время один класс может быть базовым для нескольких производных, производный класс может быть, в свою очередь, базовым для какого-либо класса и т.д. Принято называть базовый класс родительским, а производный класс – потомком.
При создании объектов производного класса сначала автоматически вызываются конструкторы базовых классов согласно списку базовых классов в объявлении производного класса, а затем конструктор производного класса. Конструкторы базовых классов вызываются независимо от того, перечислены они явно в конструкторе производного класса, как в нашем случае, или нет.
Объекты разрушаются в порядке, обратном их созданию, т.е. вначале вызывается деструктор производного класса, а затем базовых. При запуске приведенной программы выведенная информация будет иметь следующий вид:
Конструктор класса Name Конструктор класса Job Конструктор класса Person Деструктор класса Person Деструктор класса Job Деструктор класса Name
В базовом и производном классах функции могут иметь одно и то же имя и список параметров, но отличаться текстом (Такие функции называют переопределенными). Кроме того, в производном функция
может использовать функцию базового класса с тем же именем. В этих
случаях для различения функций следует использовать оператор принадлежности.
Заметим, что при построении иерархии классов полезно попытаться ответить на вопрос: «Что из себя представляет объект?». Например, «Что такое окружность? Окружность – геометрическое место точек, равноудаленных от центра. Что такое многоугольник? Многоугольник – фигура, состоящая из ломаных линий. Что такое линия? Линия-совокупность точек». Исходя из этого целесообразно для классов «Окружность» и «Многоугольник » в качестве базового выбрать класс «Точка».
Формат определения производного класса следующий:
тип_класса имя_класса : [модификатор_доступа]список_базовых_классов{ ...};