- •Обзорные лекции по курсу
- •1.Концепции и методология объектно-ориентированного программирования
- •2.Классы. Конструкторы и деструкторы
- •Void set_a(int num);
- •Void AnyClass::get_a()
- •Int AnyClass::set_a(int num)
- •Конструкторы и деструкторы. Список инициализации элементов
- •Void Show();
- •Int main()
- •Void Show();
- •Int main()
- •Статические члены класса
- •3. Простое и множественное наследование
- •Int GetX(){return X;}
- •Int GetY(){return у;}
- •Int GetX(){return X;}
- •Int GetY(){return y;}
- •Void ShowX(){cout « GetX() « ' ' ;}
- •Void ShowY(){cout « GetY()« ' ';}
- •OutCoord(int _x, int _y): Coord(_x, _y){}
- •Int GetX() {return X;}
- •Int GetY(){return y;}
- •Void ShowX(){cout « GetX() « ' ';}
- •Void ShowY(){cout « GetY()« ' ';}
- •Void ShowX(){cout « Coord::GetX() « ' ';}
- •PrintMsg(int _x, int _y, char* msg): Coord(_x, _y), SaveMsg(msg){}
- •Void set_a(int num);
- •Void AnyClass::get_a()
- •Int AnyClass::set_a(int num)
- •Void Show();
- •Int main()
- •Int GetX() {return X;}
- •PrintMsg(int _x, int _y, char* msg): Coord(_x, _y), SaveMsg(msg){}
- •Упражнения для самопроверки
PrintMsg(int _x, int _y, char* msg): Coord(_x, _y), SaveMsg(msg){}
В основной программе этому конструктору передаются аргументы при создании объекта класса PrintMsg с помощью оператора new:
ptr = new PrintMsg(10, 5, "Множественное ");
Выполнение функции-члена Show() приводит к выводу на экран в указанных координатах сообщения, заданного третьим аргументом.
Следующие за этим вызовы функций-членов SetX (), SetY () и SetMsg () приводят к установке новых значений координат и нового сообщения, которое выводится повторным вызовом функции Show ().
Рассмотрим еще один пример, который демонстрирует порядок вызова конструкторов и деструкторов базовых классов.
#include <iostream.h>
class Basel
{
public:
Basel(){cout «"Мы в конструкторе Basel\n";}
~Basel(){cout «"Мы в деструкторе Basel\n";}
};
class Base2
{
public:
Base2() {cout «"Мы в конструкторе Base2\n";}
~Base2(){cout «"Мы в деструкторе Base2\n";}
};
class Derived: public Basel, public Base2
{
public:
Derived()
{
cout « "Мы в конструкторе Derived \n";
}
~Derived()
{
cout « "Мы в деструкторе Derived \n";
}
};
main()
{
Derived ob;.
return 0;
}
Эта программа выводит на экран следующее:
Мы в конструкторе Basel
Мы в конструкторе Base2
Мы в конструкторе Derived
Мы в деструкторе Derived
Мы в деструкторе Base2
Мы в деструкторе Basel
Этот пример наглядно демонстрирует, что конструкторы базовых классов вызываются в порядке их объявления. Деструкторы вызываются в обратном порядке.
РЕЗЮМЕ
В методологии ООП понятием класс определяется группа однотипных объектов. При этом каждый представитель (или экземпляр) класса называется объектом. Каждый объект всегда имеет свое, уникальное состояние, определяемое текущими значениями его данных-членов (элементов-данных). Функциональное назначение класса определяется возможными действиями над объектами класса, которые задаются его функциями-членами (функциями-элементами или методами). В каждом классе распределяется память для хранения данных, и устанавливаются допустимые операции для каждого объекта данных данного типа. Создание объектов данного класса производится специальной функцией-членом, которая называется конструктором, а уничтожение — другой специальной функцией-членом, которая называется деструктором. Класс позволяет делать недоступными внутренние данные, представляя их как открытые (public), закрытые (private) и защищенные (protected). Класс устанавливает четко определенный интерфейс для взаимодействия объектов этого типа с остальным миром. Закрытые коды или данные доступны только внутри этого объекта. С другой стороны, открытые коды и данные, несмотря на то, что они заданы внутри объекта, доступны для всех частей программы. Открытая часть объекта как раз и используется для создания интерфейса объекта с остальным миром. Полученными объектами можно управлять при помощи сообщений (или запросов), которые представляют собой просто вызовы функций-членов. Мы будем пользоваться термином запрос, чтобы не путать это понятие с сообщениями операционной системы Windows.
В объектно-ориентированном проектировании решаемая задача представляется не в виде алгоритмической модели, а в виде совокупности объектов различных классов, которые обмениваются запросами. Объект, получивший запрос, отвечает на него посредством вызова соответствующей функции-члена. Нахождение общности между типами объектов задачи — далеко не простой процесс. Он осуществляется на стадии объектно-ориентированного проектирования. На этой стадии вначале рассматривается вопрос о применимости ООП к решаемой задаче. При этом для принятия решения о применимости ООП решающую роль играет та степень общности между классами, которую можно использовать, применяя механизмы наследования и виртуальные функции.
Понятие класса является ключевым как в методологии в ООП, так и в языке C++, где класс – синтаксическая конструкция с широким функциональным наполнением:
class <имя_класса>
{//закрытые функции-члены и данные-члены класса
public:
//открытые функции-члены и данные-члены класса
}
Функции и переменные, указанные внутри объявления класса, становятся членами этого класса. Переменные, указанные внутри объявления класса, называются данными-членами этого класса; функции, указанные внутри объявления класса, называются функциями-членами класса. По умолчанию, все функции и переменные, объявленные в классе, становятся закрытыми для этого класса. Это означает, что они доступны только для других членов этого класса. Для объявления открытых членов класса используется ключевое слово public, за которым следует двоеточие. Все функции и переменные, объявленные после слова public, доступны и для других членов класса, и для любой другой части программы, в которой содержится класс.
Вот пример объявления класса:
class AnyClass
{//закрытый элемент класса
int a;
public:
int get_a();