- •1. Временная сложность алгоритмов. Примеры алгоритмов с различной временной сложностью.
- •2. Процедурное и объектно-ориентированное программирование. Основные концепции объектно-ориентированного программирования.
- •3. Класс как тип данных. Поля и методы класса. Создание класса на основе структурного и объединяющего типов данных.
- •6. Классы. Принцип наследования. Создание иерархии классов.
- •7. Наследование полей и методов. Изменение статуса видимости полей и методов при наследовании.
3. Класс как тип данных. Поля и методы класса. Создание класса на основе структурного и объединяющего типов данных.
Класс может быть получен простым расширением структуры путем включения в нее кроме определений полей (данных) также и определений функций. Например, класс Employee (Сотрудник) можно определить следующим образом:
class employee
{
public:
char name[64];
long employee_id;
float salary;
void show_employee(void);
};
Функции, принадлежащие классу, принято называть методами класса. Данные, входящие в состав класса, называются полями класса.
Класс может быть определен с использованием служебного слова class. В этом случае все элементы класса по умолчанию являются закрытыми и для выделения открытых методов нужно использовать служебное слово public. Открытые методы класса обеспечивают внешний интерфейс его объектов, делая возможным их использование в программах.
Класс может быть создан не только на основе структур, но и на основе объединений. В этом случае для всех полей объекта в памяти выделяется одно и то же место и в каждый момент времени доступным является только одно поле. Как и в случае классов-структур, все элементы класса-объединения по умолчанию являются общедоступными. Статус видимости элементов класса-объединения может быть изменен с помощью служебных слов public, private, или protected.
Классы. Принцип инкапсуляции. Статус видимости элементов класса, управление видимостью.
Объединение в единую сущность данных и функций их обработки в совокупности с защитой этих данных от внешнего доступа называется инкапсуляцией данных. Инкапсуляция данных – это один из основных принципов объектно-ориентированного программирования. В соответствии с этим принципом данные должны помещаться в закрытую область класса, а методы, или хотя бы часть их – в открытую. Поля и методы класса могут иметь разный статус видимости.
Под статусом видимости элемента класса понимается возможность обращения к нему из внешних по отношению к классу участков программного кода. Стандарт C++ определяет три возможных статуса видимости – открытый, закрытый и защищенный .
Статус видимости «открытый» означает, что элемент класса доступен для внешних обращений. По умолчанию все элементы класса, созданного на основе структуры, являются открытыми
Статус видимости «закрытый» означает, что элемент класса доступен только для обращений из методов этого класса и недоступен для внешних обращений
Статус видимости «защищенный» означает, что элемент класса доступен только для обращений из методов этого класса и методов классов-потомков
Изменение статуса видимости может быть выполнено размещением в определении класса одного из трех ключевых слов: public (открытый ), private (закрытый ), или protected (защищенный ) с последующим двоеточием. Появление любого из спецификаторов доступа в тексте определения класса означает, что до конца определения либо до другого спецификатора доступа все компоненты класса имеют указанный статус. Защищенные элементы класса нужны только при построении иерархии классов путем создания классов-наследников.
Например, пусть программист решил в классе TPoint запретить внешний доступ к координатам точки и разрешить внещний доступ к методам перемещения точки на плоскости, тогда можно построить описание класса как:
class TPoint
{
private:
int x,y;
public:
void movePoint(int newx, int newy); // Перенос точки
void relmove (int dx, int dy); // Сдвиг точки
int getx() {return x;};
int gety() {return y;};
};
Конструкторы и деструкторы, создание объектов и инициализация полей.
При создании объектов класса выполняется инициализация их полей. Для этой цели в определение класса включают специальный метод, называемый конструктором.Такой метод имеет следующие отличия от остальных методов класса:
1.он должен иметь имя, совпадающее с именем класса
2.для него не задается тип возвращаемого значения
3.вызов конструктора осуществляется автоматически при создании объекта
Например, пусть программист решил в классе TPoint запретить внешний доступ к координатам точки и разрешить внещний доступ к методам перемещения точки на плоскости, тогда можно построить описание класса как:
class TPoint
{
private:
int x,y;
public:
void movePoint(int newx, int newy); // Перенос точки
void relmove (int dx, int dy); // Сдвиг точки
int getx() {return x;};
int gety() {return y;};
TPoint(int x0, int y0):x(x0), y(y0){};//Конструктор
};
В этом конструкторе все компоненты получают значения из списка инициализации, а тело конструктора представлено пустым состаным оператором.
Конструктор может быть включен программистом в определение класса.Такой конструктор может иметь формальные параметры, которые используются в качестве инициализирующих значений для полей класса . Класс может иметь несколько конструкторов с разными параметрами для разных видов инициализации, т.е. конструктор может быть перегружен. Конструктор существует для любого класса; если он не задан программистом, то он создается по умолчанию. Созданный по умолчанию конструктор не имеет параметров и присваивает полям объекта значения по умолчанию. Конструктор неявно вызывается всякий раз при определении объекта класса или создании его посредством операции new.
Вызов конструктора класса:
Например:
Employee c1;
Employee *c2 = new Employee;
В этих случаях вызывается конструктор по умолчанию.
Другой пример:
Employee c1(“”, 20,1000);
Employee *c2 = new Employee (“”, 20,1000);
В этих случаях вызывается конструктор, заданный программистом с указанием значений для инициализации полей .
Деструктор класса – это специальный метод, используемый для «деинициализации» объекта. Имя деструктора имеет вид:
~ имя_класса
Деструктор не имеет параметров и, следовательно, не может быть перегружен. Деструктор вызывается автоматически в двух случаях:
когда объект выходит из области видимости;
когда объект, созданный операцией new, удаляется операцией delete
Деструктор не вызывается автоматически в двух других случаях:
когда выходит из области видимости объект, созданный операцией new ;
когда из области видимости выходит указатель на объект
В этих случаях требуется явный вызов деструктора. Обычно деструктор нужен в классе, который получает динамическую память, связанную с объектом; деструктор освобождает эту динамическую память, чтобы дать возможность ее повторного использования после выхода объекта из области видимости.
