Программирование на Си и С++ с нуля 158) Программирование на С++: Объекты
Школа программирования
158) Программирование на С++: Объекты
Объект - это ключевое понятие С++. Существовал язык Си, на основе которого был создан С++, и все отличие С++ от своего предшественника - это наличие объектов. Но пока мы их не изучали :)
Все, что мы видим в окружающем нас мире - это объекты. Стол, стул, компьютер, машина, чашка, авторучка, человеки :) , одежда, сумка, мобильник итд. Почти любое имя существительное, существующее в материальном мире, можно считать объектом. Когда мы создаем разные полезные сущности в процессе своего труда, мы пользуемся различными объектами. Неплохо бы и при создании программ использовать концепцию объектов, правда? Но пока нам доступны переменные простейших базовых типов, ну и массивы. Поэтому процесс программирования
почти не имеет аналогов с реальной жизнью, и в силу излишней абстракции обычно вызывает немало проблем.
Объекты отличаются друг от друга наборами свойств (характеристик), а также значениями этих свойств.
Например объект "компьютер" имеет свойства "процессор", "оперативная память", "жесткий диск", "клавиатура" итд. Объект "автомобиль" имеет свойства "двигатель", "колесо" (таких свойств будет четыре :), "руль" итд.
Отметим, что любое из свойств может в свою очередь быть другим объектом. "Двигатель", очевидно, будет состоять из множества других объектов.
Пока под объектом мы подразумеваем некую схему, модель, чертеж реально существующего объекта. Например, "объект" "Двигатель" описывает, определяет внутреннюю структуру, схему, по которой может создаваться множество конкретных двигателей. Все они будут устроены идентично. Поэтому под объектом во избежание путаницы обычно понимают физические сущности (в жизни или в компьютерной программе) - те же двигатели, созданные по заданной схеме, по модели. А вот для этой модели используют особое название. В разных языках
программирования они различаются, но в С++ схема объекта, описывающая его структуру, называется КЛАСС. Ну как в биологии есть классы животных, объединенных общими характеристиками. А объекты, созданные по схеме, заданной классом, называют еще ЭКЗЕМПЛЯРЫ КЛАССОВ.
В программировании класс - это фактически то же самое, что тип данных. Тип данных int задает структуру целых чисел, тип данных AnsiString (на самом деле это - класс :) задает структуру строковых значений и так далее. Значение 15 типа int - это объект, экземпляр типа int.
Но у классов есть принципиальные отличия от обычных, базовых типов данных. Во-первых, класс может включать в себя поля (внутренние переменные), которые также могут быть классами. Это надо, чтобы представлять сложные структуры - например, "Двигатель", который состоит из элементов, каждый из которых также можно разобрать на более мелкие детали. В классе "Автомобиль", например, может быть поле "Бензобак" (переменная дробного типа), которая хранит текущее количество залитого в бак бензина. Поле "Левое переднее колесо"
может характеризоваться, например, степенью износа и так далее.
Во-вторых, экземпляр класса может не только хранить некоторые данные - он также способен выполнять определенные действия (функции :). При описании класса мы задаем поля, входящие в его состав (внутренние переменные), а также функции, которые принадлежат только этому классу. Такие функции называют МЕТОДЫ.
Например, у класса "Автомобиль" может быть метод "Ехать" :) А также "Добавить газ", "Затормозить", "Повернуть направо на заданный угол" итд.
Классы немного напоминают модули. В одном модуле мы можем описать переменные и функции, относящиеся к конкретной задаче, и в классе также сосредотачиваются тематические поля и методы, относящиеся к конкретной сущности. Но при этом с классами и объектами работать гораздо удобнее, нежели с модулями, и код получается значительно нагляднее.
Объекты реальной жизны отличаются следующими особенностями.
1) Далеко не в каждый объект можно влезть внутрь. Как минимум, это нежелательно - неумело ковыряясь в компьютере или телевизоре, его скорее всего сломаешь. В объектном программировании существует принцип ИНКАПСУЛЯЦИИ - поля и методы внутри класса можно скрывать - делать их видимыми только при использовании внутри методов текущего класса. Например, метод "Ехать" может понижать значение поля (переменной) "Запас бензина", однако попытка модификации этого поля извне должна быть запрещена. В С++ имеются развитые
механизмы для разделения видимости полей и методов как внутри классов, так и "снаружи".
2) Любой автомобиль обладает рядом свойств, общих для всех автомобилей. У него есть руль, которым можно рулить общепринятым способом :) , педали газа и тормоза, спидометр итд. В то же время, когда мы пользуемся конкретной машиной (экземпляром класса "Автомобиль"), мы обычно используем разные удобные мелочи, специфичные для конкретной марки. Но создавать отдельный класс для каждой марки машины - занятие хлопотное. Ведь такой класс содержит десятки тысяч полей и методов, и их потребуется реализовывать заново,
с нуля.
Принцип НАСЛЕДОВАНИЯ в объектном программировании допускает создание нового класса на базе уже существующего класса. Например, класс "Запорожец" можно создать на базе родительского класса "Автомобиль" - в таком случае в "Запрожец" перейдут все поля и методы родительского "Автомобиля" (точнее, те поля и методы, которым по правилам инкапсуляции задана соответствующая видимость-доступность в дочерних классах). А программисту достаточно добавить несколько оригинальных полей, характеризующих конкретную модель.
3) В процессе наследования можно создавать длинные цепочки родительских и дочерних классов. Например, автомастер может доработать стандартный "Запрожец" - создать новый класс "Мой-СуперЗапорожец-с-турбиной-от-Subaru" на базе класса "Запрожец". В таком случае возможно создание объектов (экземпляров классов) "Запрожец" и "Мой-СуперЗапорожец...", которые будут существовать одновременно. Но особенность С++ такова, что переменная, хранящая объект, представляет собой лишь указатель на место в памяти, где хранится
сам объект, - то есть проверка типов указуемых объектов при записи указателя на объект в переменную не выполняется. Другими словами, мы создали переменную, хранящую объект класса "Запорожец" (точнее, ссылку на него), однако можем записать в эту переменную указатель на объект класса "Мой-СуперЗапорожец..." или даже класса "Автомобиль". В результате впоследствии теоретически возможны конфликты обращения к несуществующим полям и методам разных классов.
В объектном программировании существует еще один, третий кит - принцип ПОЛИМОРФИЗМА. Считается, что если переменная явно описана как класс "Запорожец", то и при обращении к его методам будет вызван правильный вариант метода. То есть если для переменной класса "Запорожец" вызывается метод "Ехать", то это будет метод, реализованный именно в классе "Запорожец" (а не в классе "Автомобиль" или "Мой-СуперЗапорожец..."). Данный принцип, на первый взгляд достаточно очевидный, важен потому, что С++ допускает, как уже
говорилось, хранение в переменной одного класса ссылки на экземпляр другого класса. В таком случае для разрешения конфликтов обращения к методам с одинаковым названием, но из разных классов по цепочке наследования, и вводятся различные реализации принципа полиморфизма.
В следующем занятии мы познакомимся с реализацией объектов и трех объектных принципов в языке С++.
(c) 2004-2007 Сергей Бобровский : bo собака russianenterprisesolutions.com
Все эти учебные курсы рассчитаны не только на разработчиков, но и на всех тех, кто хочет стать ИТ-менеджером. Для этого как минимум нужно иметь общее представление о современных технологиях разработки и их истории и владеть соответствующей терминологией.
В книгах описаны десятки технологий, каждой из которых посвящены отдельные книги. Таким образом, купив один учебный курс, вы существенно сэкономите :) В книгах полностью описаны:
- Delphi (версия 2006, полностью совместимая с Turbo Delphi) для обеих платформ - Win32 и .NET;
- C# (новый язык Microsoft, на котором базируется платформа .NET и все новые версии Windows);
- C++ для платформы Win32.
Охвачены также темы работы с файлами на этих платформах, создания файл-серверных, клиент-серверных, распределенных приложений, веб-программ (Indy, ASP.NET, веб-сервисы). Описаны языки SQL и OCL. Немало глав посвящены истории программирования и различных технологий. Особое внимание уделено созданию программ с помощью технологии ECO и языка моделирования UML - программы фактически рисуются, и теперь даже для создания корпоративных приложений и их переноса в Интернет не обязательно знать программирование!
Отдельная часть отведена технологиям организации групповой работы, управления требованиями, контроля версий, локализации и тестирования.
Тут подробнее про книги.