- •1.1. _Классика. Общие сведения
- •1.1.3. Элементарные функции ввода-вывода
- •1.2. Функции
- •Void surface(int dl, int VI, int shi);
- •1.3.1. Задание значений аргумента функций по умолчанию
- •1.3.2. Перезагружаемые функции (function overloading)
- •1.3.4. Допускается использование функции с различным количеством аргументов.
- •1.3.6. Дружественные функции (friend)
- •1.3.9. Виртуальные (virtual) функции
- •1.3.8. Шаблоны.
- •1.3.10. Абстрактные классы
- •1.4. Указатели (ссылки). Массивы.
- •Int fprintf ([указатель-На-Входной-Поток], Управляющая-строка, [,Имя-переменной-1, [Имя-переменной-2…]]);
- •Int cprintf (УправляющаяСтрока[,Имя-переменной-1, [Имя-переменной-2…]]);
- •1.6.1 Директива Include
- •1.6.2 Директивы #define и #undef
- •1.6.3 Условные Директивы
- •1.8..Проект (создание проекта классическими средствами языка с)
- •1 .8.1. Классы памяти
- •1.8.3. Проект
- •Раздел 2. Классы
- •31.10.11 Кр Связан с созданием классов и про ооп
- •Лекция 8 от 17.10.2011
- •7.2.2. Динамически присоединенные библиотеки
Раздел 2. Классы
2.1 Средства создания классов
31.10.11 Кр Связан с созданием классов и про ооп
Объектно-ориентированный подход является основой для построения всех программ, работающих под ОС Windows. Диалоговые окна, операционное меню, кнопки, поля со списком и т.д. представляют собой прикладные объекты соответствующего класса. В отличии от процедурного программирования, эти объекты не производят никаких действий пока не получат соответствующего сообщения от пользователя, от другого программного объекта, от аппаратных средств, от внешнего приложения. Принципиальным отличием здесь является, что поведение объектов не имеет жесткого алгоритма. Объект представляет собой совокупность свойств и методов функционирования объекта.
Абстрактный объект для каждой прикладной категории в языке С представляет собой класс. Представления схема поведения прикладного объекта:
Методы делятся на 2 типа:
типизируют поведение объекта – внутренние
пустые, можно прописать
Для того, чтобы создаваемый класс отвечал идеологии ООП необходимо соблюдать следующие принципы:
Принцип модульности. Эта концепция позволяет сгруппировать созданные объекты в логические модули, которые объединяют взаимосвязанные объекты и классы, оставляя внешним модулям только необходимые детали интерфейса. В языке С++ принцип модульности дополняется понятием проекта и возможностью использования инструментариев файлов заголовков. Это позволило получить следующие 3 дополнительные достоинства:
В сложных проектах каждый программист работает независимо, объединяя модули только на уровне их интерфейсов.
Отдельные модули легко модифицируются внутри, не затрагивая весь проект в целом.
Предлагая общие принципы построения интерфейса, объектные классы можно легко повторно использовать в других проектах.
Принцип инкапсуляции или скрытия информации. Инкапсуляция – это механизм, который объединяет данные им методы и защищает их от внешнего вмешательства. Дополнительно принцип инкапсуляции позволяет изолировать прикладные объекты от их внутренней реализации.
Принцип полиморфизма. Позволяет одно и то же имя использовать для решения различных технических задач. Этот принцип основывается на понятии одного интерфейса для множества методов.
Принцип наследования. Означает, что производный класс может иметь новые данные, методы и свойства, которые отсутствуют в базовом классе, но может и наследовать эти же характеристики из родительских классов.
Принцип захвата ресурсов при инициализации объектов. Для захвата ресурсов в языке С было введено 2 специальных оператора NEW и DELETE.
Основой оператора NEW является использование указателей. Оператор NEW возвращает указатель на базовый адрес созданного объекта. Если с помощью оператора NEW выделяется память под массив объектов, то он возвращает базовый адрес первого элемента. Если оператор NEW по какой-либо причине не может выделить память под объект, то он возвращает значение 0.
Оператор DELETE предназначен для освобождения памяти под выделенный объект. Если с помощью оператора DELETE удалять не созданный объект, или объект, под который не была выделена память, то ошибок не происходит.
Если многократно удалять один и тот же объект, то возникает ошибка, последствие от которой зависит от версии ОС.
Для того, чтобы перейти к синтезу классу, сделаем замечания:
Принцип модульности в языке С реализуется дополнительно в виде статистического связывания и в виде динамического связывания. Статистическое связывание основано на том, что интерфейсы используемых объектов находятся в заголовочных файлах. Динамическое связывание основывается на инструменте оверлеев (в классическом С++) и использовании dll-библиотек в современных системах.
Развитые системы программирования позволяют:
Создавать собственные классы
Автоматизировать процесс создания собственных классов
Создавать динамически-присоединяемые библиотеки
Использовать депозитарий для создания простейших объектов
Для создания нового класса в языке С используется следующий формат:
Если класс производный, то через : можно привести списки классов-родителей.
4 раздела, в каждом данные, методы, свойства и события, которые мы можем ввести.
Методы – функции, данные – простые или сложные переменные.
Мы можем создать список экземпляров классов. Далее могут идти описания функций/методов, которые тут указаны. Методы – прототипы функций.
В языке С все разработанные классы, разработанные в билдере, начинаются с t (tedit,…).
Класс представляет собой особый тип данных, предназначенный для формализации некой типовой категории. Класс должен быть определен до своего первого использования.
Спецификатор public используется для создания объектов, доступных прикладному программисту либо в режиме конструктора, либо в программном режиме.
Спецификатор protected служит для выделения защищенных объектов, которые будут доступны программисту в производных классах.
Спецификатор private используется для создания объектов, данных свойств, методов, событий, который являются внутренними и недоступными для прикладного программиста.
По умолчанию, т.е. любой их этих объектов может отсутствовать, в классах представляется наличие только спецификатора private. Т.е. реализуется принцип защищенности.
Published означает тоже самое, что public, но данные указанные в нем заносятся в спектр объектов (событий?). Кроме тех, что мы видим в спектре, еще может быть список свойств\объектов, которые могут быть доступные в программном режиме, но не доступны в режиме конструктора.
Внутри секции public можно использовать 2 специальные функции:
Конструктор класса, который инициализирует данные и распределяет память под прикладной объект. Вызов конструктора класса совпадает с именем класса.
Имя класса(); full_windows();
Функция деструктора класса, которая слежит для удаления прикладного объекта из класс. Функция начинается с ~ (тильда).
~Имя класса(); ~full_windows();
Существует следующие 3 основных способа создания прикладного объекта или экземпляра класса:
Объявление экземпляра инициализации класса без указания его свойств.
При таком объявлении экземпляра класса можно инциализировать его данные, если внутри описания класса имеется конструктор.
Создать экземпляр класса можно сразу после объявления класса после завершающей фигурной скобкой и перед «;».
Создание динамически размещаемого экземпляра (прикладного объекта) класса с помощью оператора NEW. Этот вариант является единственным приемлемым способом для создания объектов, если среди его предков есть объекты С-Builder’a.
3-я лр – в Турбо-С. Вчера выслал метариал. (адские коды) И тексты программ. Предлагает сделанные 2 класса: окна и меню. Выводимая построчно информация, должна отражать наш курсач (дата прихода кассового ордера и т.д.). Отдельное окно для ввода (дата, сумма и т.д.). Представлены несколько типовых объектов. Контролируемый символ ввода. В том числе и включение пробела.
Вышлет отлаженный проект. За нас все написано. Влезть в оба класса, видоизменить проект под себя. Научимся использовать класс. Класс проверки ввода данных. (на +1 балл).
Тоже самое что и во второй, но реализовать через окна.
(В скобках /t и он будет переключать «конец ввода» только при табуляции. Можно использовать пробелы)
Есть символ заполнитель. Нам нужно сделать тень. Берется темный символ, чертится черная рамка. Подымаемая на 1 символ и чертим поверх еще одно окно. Получается окно объекмного вида. Чертим заголовок и область. Текст-атрибут – цвет символов. Гоу-те Х У – устанавливает курсор в указанной позиции. Путч – выводит просто пробел, он является показателем символа заполнения. Обджект.сипипи. Там 2 объекта: окно и меню => * Вышлет работу. Только одно окно является возможным для редактирования. Если окно не является первым, то закрыть ввод в окно, перейти к вводу в предыдущее окно. Enter или стрелка вниз – переход по окнам. Взять 4-5 полей из курсача. И далее просмотр БД.
Описание методов класса может идти в любой последовательности. Но обязательным является ссылка на разрешение области действия, т.е. класс еще не появился, но можно описать методы. И наоборот.
Имя класса :: Имя функции
Допускается описание тела (а не прототипа) функции внутри класса. Но это нарушает принципы открытого интерфейса языка С++. Если по смыслу задачи требуется включить функцию внутрь класса, то рекомендуется использование спецификатора inline, описав функцию все равно на внешнем уровне. Она тогда будет включена после компиляции.
По умолчанию все функции класса имеют доступ как к открытым, так и к закрытым переменным класса.
Для прикладного программиста доступны только открытые переменные. Для разрешения доступа к закрытым элементам, их необходимо определять как дружественные.
При создании прикладного экземпляра класса каждый объект имеет свою собственную копию данных класса, в том числе и закрытых, таким образом обеспечивается независимость экземпляров друг от друга. Иногда требуется по смыслу задачи иметь одну копию данных класса для (различных) всех экземпляров.
Пример:
