Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Shpory_OOP.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
2.17 Mб
Скачать

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

В базовом и производном классах функции могут иметь одно и то же имя и список параметров, но отличаться текстом (Такие функции называют переопределенными). Кроме того, в производном функция

может использовать функцию базового класса с тем же именем. В этих

случаях для различения функций следует использовать оператор принадлежности.

Заметим, что при построении иерархии классов полезно попытаться ответить на вопрос: «Что из себя представляет объект?». Например, «Что такое окружность? Окружность – геометрическое место точек, равноудаленных от центра. Что такое многоугольник? Многоугольник – фигура, состоящая из ломаных линий. Что такое линия? Линия-совокупность точек». Исходя из этого целесообразно для классов «Окружность» и «Многоугольник » в качестве базового выбрать класс «Точка».

Формат определения производного класса следующий:

тип_класса имя_класса : [модификатор_доступа]список_базовых_классов{ ...};

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]