Основы информатики Классы Заикин Олег Сергеевич zaikin.all24.org
Объектно - ориентированное программирование Инкапсуляция - скрытие деталей реализации, обеспечение доступности главного путем помещения всего мешающего, второстепенного в некую условную капсулу ( чёрный ящик ). Наследование позволяет создавать иерархию объектов, в которой объекты - потомки наследуют все свойства своих предков. Свойства при наследовании повторно не описываются. Кроме унаследованных, потомок обладает собственными свойствами. Объект в C++ может иметь сколько угодно потомков и предков. Полиморфизм - возможность определения единого по имени действия, применимого ко всем объектам иерархии, причем каждый объект реализует это действие собственным способом. Класс – инкпасулированная абстракция
Класс Объектно-ориентированное программирование основано на понятии класса. Класс – тип данных, который включает данные и код (предназначенный для выполнения над этими данными. Класс связывает данные с кодом. Объект – экземпляр класса. Класс задает формат объекта. Класс – абстракция, которая реально не существует, пока не будет создан объект этого класса.
Класс Объявляя класс, Вы задаете данные и код, который выполняется над данными. Простой класс может содержать только данные или только код, но обычно содержится и то и другое. Данные объявляются в виде переменных, код оформляется в виде функций. Функции и переменные, составляющие класс, называются его полями.
Описание класса Поля класса: могут иметь любой тип, кроме типа этого же класса (но могут быть указателями или ссылками на этот класс); могут быть описаны с модификатором const. Инициализация полей при описании не допускается.
Класс Объявление класса начинается с ключевого слова class и синтаксически подобно объявлению структуры. По умолчанию поля класса являются закрытыми (private), т.е. к ним могут получить доступ только функции этого же класса. Никакие другие части программы этого не могут. Это одно из проявлений инкапсуляции – можно управлять доступом к определенным элементам данных. class { private: public: };
Пример класса Пример. Класс очередь (queue) class queue { int q[100]; int sloc, rloc; void init(); void qput(int i); int qget(); }; // переменные и функции класса закрыты Почему этот класс бесполезен? Эквивалентно class queue { private: int q[100]; int sloc, rloc; void init(); void qput(int i); int qget(); };
Класс Ключевое слово public используется для объявления открытых членов класса. class queue { int q[100]; int sloc, rloc; public: void init(); void qput(int i); int qget(); }; К функциям init(), qput() и qget() доступ открытый.
Класс После создания объект имеет собственную копию данных, которые составляют класс. Объект занимает определенную область памяти. Чтобы получить доступ к открытому члену класса используется оператор «точка», как и при работе со структурами. Функции-члены класса имеют доступ к закрытым переменным класса. Пример queue Q1, Q2; // объявление двух объектов класса queue Q1.init(); // нет ошибки, доступ к открытой функции Q1.sloc = 3; // ошибка, попытка обращения к закрытому члену класса.
Класс В объявлении класса содержатся прототипы функций. Чтобы реализовать функцию, необходимо указать к какому классу она принадлежит. Для этого перед именем функции нужно поставить имя класса и ::. :: - оператор разрешения области видимости, он квалифицирует имя члена класса вместе с именем его класса. Пример void queue :: qput(int i) { if (sloc == 100) { cout
Класс Различные классы могут использовать одинаковые имена своих полей. С помощью оператора :: компилятор определит, к какому классу он относится. Для вызова из функции-члена другой функции-члена этого же класса оператор. не требуется. Аналогично для обращения к переменным-членам класса. Пример void queue :: init() { rloc = sloc = 0; }
Класс Обычно описание класса помещают в заголовочный файл (расширение *.h), а реализацию функций класса – в файл c расширением *.cpp. Называться файлы должны одинаково. Файл queue.h class queue { int sloc, rloc; public: void init(int i); }; Файл queue.cpp #include queue.h; void queue :: init() { rloc = sloc = 0; }
Пример программы
Закрытые элементы Если rloc и sloc будут public, к чему это может привести?
Присваивание объектов Если есть два объекта одного класса, то один можно присвоить другому. По умолчанию данные поразрядно копируются, в том числе закрытые. queue Q1. Q2; Q1.init(); // Q1.rloc == 0, Q2.rloc неопределен Q2 = Q1; // Q1.rloc == 0, Q2.rloc == 0 Если в классе есть указатель, что произойдет при копировании объектов? my
Присваивание объектов class myclass { int *a; } ; myclass x, y; x.a = new int[2]; y = x; Если в классе есть указатель, что произойдет при копировании объектов?
Конструктор Конструктор – функция, которая автоматически вызывается при создании объекта. Имя конструктора совпадает с именем класса. Используется для инициализации части данных. Например для класса queue при инициализации переменным rloc и sloc нужно присвоить нулевые значения. В рассмотренном ранее примере инициализация выполняется в функции init().
Если программист не указал ни одного конструктора, компилятор создает его автоматически. Такой конструктор вызывает конструкторы по умолчанию для полей класса и конструкторы по умолчанию базовых классов. Конструкторы не наследуются. Конструкторы глобальных объектов вызываются до вызова функции main. Локальные объекты создаются, как только становится активной область их действия. Конструктор запускается и при создании временного объекта (например, при передаче объекта из функции).Конструктор
Конструктор Пример class queue { int q[100]; int sloc, rloc; public: queue(); // конструктор void qput(int i); int qget(); }; queue :: queue() { sloc = rloc = 0; }
Деструктор Деструктор – функция, которая вызывается при разрушении объекта. Нужен для освобождения ранее выделенной для объекта памяти или других действий при разрушении объекта. Имя деструктора – это имя конструктора, перед которым стоит символ ~ class queue { int q[100]; int sloc, rloc; public: queue(); // конструктор ~queue(); // деструктор void qput(int i); int qget(); };
Деструктор вызывается автоматически, когда объект выходит из области видимости: для локальных объектов при выходе из блока, в котором они объявлены; для глобальных как часть процедуры выхода из main; для объектов, заданных через указатели, деструктор вызывается неявно при использовании операции delete. Пример деструктора: monstr::~monstr() {delete [] name;}Деструктор
Деструктор : не имеет аргументов и возвращаемого значения; не наследуется; Если деструктор явным образом не определен, компилятор автоматически создает пустой деструктор. Деструктор можно вызвать явным образом путем указания полностью уточненного имени, например: queue *q;... q -> ~queue();Деструктор