русс | укр

Языки программирования

ПаскальСиАссемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование

Все о программировании


Linux Unix Алгоритмические языки Аналоговые и гибридные вычислительные устройства Архитектура микроконтроллеров Введение в разработку распределенных информационных систем Введение в численные методы Дискретная математика Информационное обслуживание пользователей Информация и моделирование в управлении производством Компьютерная графика Математическое и компьютерное моделирование Моделирование Нейрокомпьютеры Проектирование программ диагностики компьютерных систем и сетей Проектирование системных программ Системы счисления Теория статистики Теория оптимизации Уроки AutoCAD 3D Уроки базы данных Access Уроки Orcad Цифровые автоматы Шпаргалки по компьютеру Шпаргалки по программированию Экспертные системы Элементы теории информации

Перегруженные конструкторы


Дата добавления: 2015-07-09; просмотров: 717; Нарушение авторских прав


Теперь рассмотрим применение перегруженных функций на практике:

Так как конструкторы - это не что иное, как функции, то соответственно их можно перегружать. Для этого в определении класса нужно определить два конструктора:

 

soldier() : x(0), y(0),ammo(0)

{}

 

soldier (int x_init, int y_init, int ammo_init) : x(x_init),

y(y_init), ammo(ammo_init)

{}

 

Заголовок второго конструктора получился довольно длинным, но это компенсируется появившимися у нас возможностями:

soldier s1;

soldier s1(3,4,10);

При создании первой переменной вызывается конструктор без аргументов. Во втором случае - конструктор с аргументами. Посмотрите насколько легко теперь можно инициализировать новые переменные. При этом мы используем список инициализации, только в скобки подставляем не константные значения, а значения переданных в конструктор параметров.

Определение методов вне класса

 

Методы класса можно определять не только внутри классов. При этом в классе должно быть объявление (прототип) метода:

class soldier

{

public:

int attack();

};

int soldier::attack()

{

return 0;

}

Внутри класса в блоке public мы объявляем метод attack. Определение метода находится за пределами класса, но метод всё равно может пользоваться сокрытыми даннами своего класса. Для того, чтобы было понятно, что данная функция является методом класса, используется операция глобального разрешения ::. Сначала мы записываем имя класса, знак операции глобального разрешения и затем - имя метода. Во всём остальном определение функции совпадает с тем, что мы уже видели.

 

Вот как будет выглядить класс soldier если мы вынесем метод move за пределы класса:

 

class soldier

{

private:

int x, y;

int ammo;

 

public:

soldier() : x(0), y(0), ammo(0)



{}

soldier(int x_init, int y_init, int ammo_init) : x(x_init),

y(y_init), ammo(ammo_init)

{}

 

void move(int, int);

};

 

void soldier::move(int dx, int dy)

{

x = dx;

y = dy;

}

Методы выносятся за пределы определения класса при создании крупных классов.

Статические данные класса

Для каждого объекта данного класса создаётся свой набор переменных. Но у нас есть возможность для всех объектов создать одну переменную. В ней, например, можно хранить количество уже созданных объектов данного класса.

class soldier

{

public:

static int counter;

 

soldier()

{

counter++;

}

}

 

int soldier::counter = 0;

 

Переменную counter мы объявили с ключевым словом static. Кроме того за пределами класса мы инициализировали эту переменную. При инициализации мы также как и в классах использовали операцию глобального разрешения.

В конструкторе мы увеличиваем переменную на единицу.

Теперь каждый раз, когда в программе будет создаваться объект типа soldier, переменная counter будет инкрементироваться.

Отсюда

К пониманию ООП

Логическая единица объектно-ориентированной программы – объект. Объект в реальной жизни – это сущность, обладающая некоторым набором свойств и моделью поведения. Объект в программе представляет собой абстракцию реального объекта, т. е. в программе объект наделяется теми чертами и характеристиками реального времени, которые существенны для решаемой задачи. Второстепенные же характеристики в программную абстракцию не включаются, при этом характеристики одного и того же реального объекта, существенные для одной задачи, оказываются второстепенными в другой задаче. Рассмотрим хорошо знакомый нам объект – принтер. Если разрабатывать программу для обслуживания магазина, продающего принтеры, существенными будут модель принтера, цена, габариты, скорость печати, цвет корпуса и т. д. Если рассматривать принтер с точки зрения администратора вычислительной сети, то существенными характеристиками будут логическое имя устройства в сети, его IP-адрес, драйверы, обеспечивающие работу принтера.

Объект в программе имеет имя, ограниченный набор свойств, набор допустимых состояний (т. е. набор конкретных значений свойств), набор методов (операций), определяющих модель поведения объекта (действия объекта).

Пример Модель принтера

абстракции:

Имя: HP_5P

Набор свойств: Модель, год выпуска, состояние готовности

Значения Модель = "HP 5P",

свойств: Год выпуска = 1999,

Состояние готовности=Ready (готов к печати)

Действия объекта: Печатает

Как видно, эта абстракция включает в себя далеко не полный перечень свойств принтера, но для определенной задачи этого набора будет достаточно. Если задача изменится (усложнится), в модель принтера можно будет добавить недостающие свойства и описания новых действий.

В программе свойства объекта представлены с помощью переменных, а действия объекта – с помощью подпрограмм (в C++ – функций). Подпрограммы, содержащие описания действий объекта, называются методами. Набор конкретных значений переменных, характеризующих объект, определяет состояние объекта. Объект имеет ограниченный набор допустимых состояний. Например, в нашей модели принтера возможны два состояния: «готов к печати» и «печатает». Остальные свойства задаются для конкретного принтера изначально и не изменяются в процессе работы программы.

Таким образом, объект в объектно-ориентированном программировании (ООП) – это совокупность переменных состояния и связанных с ними методов (операций). Эти методы, с одной стороны, определяют, как объект взаимодействует с внешним миром. С другой стороны, методы осуществляют переход объекта из одного состояния в другое, причем метод проверяет, возможен ли такой переход в данной ситуации. Например, принтеру дается команда отпечатать документ. Если принтер находился в этот момент в состоянии «готов к печати», изменит свое состояние на состояние «печатает». Если принтер в момент получения команды печатал другой документ, то он остается в прежнем состоянии «печатает», а наш документ ставится в очередь на печать. Когда принтер закончит печатать один документ, он приступит к печати нашего документа. Отпечатав наш документ, принтер проверит, есть ли еще документы в очереди на печать, и, если очередь пуста, перейдет в режим «готов к печати». Таким образом, в ответ на наше действие принтер сам определил свои дальнейшие действия, и его выбор зависел от предыдущего состояния принтера. Объектно-ориентированный подход позволяет объектам самим решать, как выполнить ту или иную задачу.

В основе разработки программы с использованием методов ООП применяется объектная декомпозиция задачи. Объектная декомпозиция задачи включает в себя разбиение задачи на отдельные объекты, выявление существенных свойств объектов и способов их взаимодействия. Программа представляет при этом совокупность объектов, взаимодействующих между собой.

В процессе декомпозиции задачи могут быть выявлены объекты с одинаковыми наборами свойств и поведением. Например, для программы, моделирующей футбольный матч, необходимы две команды объектов-«футболистов». Каждого игрока матча можно охарактеризовать следующими свойствами: название команды, форма одежды, номер, координаты на поле. Поведение игроков на поле можно описать следующими действиями: стоит, бежит, отдает мяч, получает мяч. Объекты с одинаковым набором свойств и методов образуют класс. Класс – основа объектно-ориентированной методологии – служит для создания в программе любого количества объектов с заданным набором свойств и заданной моделью поведения. Если проводить параллель с алгоритмической методологией, то класс выступает в роли типа данных, однако это специфический тип, так как кроме данных в класс включаются действия (функции-члены класса, манипулирующие с данными).

Теперь рассмотрим основные термины ООП.

Класс (class) – это тип данных, включающий в себя группу данных различных типов (свойства) и методы работы с этими данными.

Объект (object) – это экземпляр класса, обладающий набором свойств с заданными значениями.

Свойство (property) – характеристика объекта, представленная в виде переменной, являющейся членом класса.

Метод (method) – это подпрограмма, входящая в состав класса и управляющая данными объекта.

Событие (event) – какое-либо происшествие в программе, системе, например, была нажата кнопка мыши.

Сообщение (message) – адресованная конкретному объекту информация о происшедшем событии; объект, получивший сообщение, должен на него ответить своими действиями, вызвав метод, соответствующий этому событию. Например, если получено сообщение о том, что была нажата левая кнопка мыши на пункте меню Exit, произойдет завершение программы, если был выбран пункт меню Save, будет выполнено сохранение информации.

Объект состоит из следующих трех частей:

• имени объекта,

• состояния (переменных состояния);

• методов (операций).

Можно дать обобщающее определение: объект ООП — это совокупность переменных состояния и связанных с ними методов(операций). Упомянутые методы определяют, как объект взаимодействует с окружающим миром.

Под методами объекта понимают процедуры и функции, объявление которых включено в описание объекта и которые выполняют действия. Возможность управлять состояниями объекта посредством вызова методов в итоге и определяет поведение объекта. Совокупность методов часто называют интерфейсом объекта.

Косновным терминам ООП нужно отнести такие понятия, как инкапсуляция, наследование и полиморфизм.

Инкапсуляция — это механизм, который объединяет данные и методы, манипулирующие этими данными, и защищает и то и другое от внешнего вмешательства или неправильного использования. Когда методы и данные объединяются таким способом, создается объект

Применяя инкапсуляцию, мы защищаем данные, принадлежащие объекту, от возможных ошибок, которые могут возникнуть при прямом доступе к этим данным. Кроме того, применение указанного принципа очень часто помогает локализовать возможные ошибки в коде программы. А это намного упрощает процесс поиска и исправления этих ошибок. Можно сказать, что инкапсуляция обеспечивает сокрытие данных, что позволяет защитить эти данные. Однако применение инкапсуляции ведет к снижению эффективности доступа к элементам объекта. Это обусловлено необходимостью вызова методов для изменения внутренних элементов (переменных) объекта. Но при современном уровне развития вычислительной техники подобные потери в эффективности не играют существенной роли.

Наследование -это процесс, посредством которого один объект может наследовать свойства другого объекта и добавлять к ним черты, характерные только для него. В итоге создается иерархия объектных типов, где поля данных и методов «предков» автоматически являются и полями данных и методов «потомков»

Смысл и универсальность наследования заключаются в том, что не надо каждый раз заново («с нуля») описывать новый объект, а можно указать «родителя» (базовый класс) и описать отличи тельные особенности нового класса. В результате новый объект будет обладать всеми свойствами родительского класса плюс своими собственными отличительными особенностями.

Пример 1. Можно создать базовый класс «транспортное средство», который универсален для всех средств передвижения, к примеру, на четырех колесах. Этот класс «знает», как двигаются колеса, как они поворачиваются, тормозят и т. д. Затем на основе этого класса создадим класс «легковой автомобиль». Поскольку новый класс унаследован из класса «транспортное средство», унаследованы все особенности этого класса, и нам не надо в очередной раз описывать, как двигаются колеса и т. д. МЫ просто добавим те черты, которые характерны для легковых автомобилей. В то же время мы можем взять за основу этот же класс «транспортное средство» и построить класс «грузовые автомобили». Описав отличительные особенности грузовых автомобилей, получим новый класс «грузовые автомобили». А, к примеру, на основании класса «грузовой автомобиль» уже можно описать определенный подкласс грузовиков и т. д. Таким образом, сначала формируем простой шаблон, а затем, усложняя и конкретизируя, поэтапно создаем все более сложные шаблоны.

Полиморфизм— это свойство, которое позволяет одно и то же имя использовать для решения нескольких технически разных задач. Полиморфизм подразумевает такое определение методов в иерархии типов, при котором метод с одним именем может при меняться к различным родственным объектам. В общем смысле концепцией полиморфизма является идея «один интерфейс -множество методов». Преимуществом полиморфизма является то, что он помогает снижать сложность программ, разрешая использование одного интерфейса для единого класса действий. Выбор конкретного действия в зависимости от ситуации возлагается на компилятор.

Пример 2. Пусть есть класс «автомобиль», в котором описано, как должен передвигаться автомобиль, как он поворачивает, как подает сигнал и т.д. Там же описан метод «переключение передачи», допустим, что в этом методе класса «автомобиль» описана автоматическая коробка передач. А теперь необходимо описать класс «спортивный автомобиль», у которого механическое (ручное) переключение скоростей. Конечно, можно было бы описать заново все методы для класса «спортивный автомобиль». Вместо этого указываем, что класс «спортивный автомобиль» унаследован из класса «автомобиль», а следовательно, он обладает всеми свойствами и методами, описанными для класса-родителя. Единственное, что надо сделать — это переписать метод «переключение передач» для механической коробки передач. В результате при вызове метода «переключение передач» будет выполняться метод не родительского класса, а самого класса «спортивный автомобиль».

Например для языка программирования это означает, что при изменении алгоритма того или иного метода в потомках класса, можно придавать этим потомкам отсутствующие у родителя специфические свойства(объявить в потомке метод с именем как и у родителя, но их алгоритмическая основа разная.).

Механизм работы ООП в таких случаях можно описать при мерно так: при вызове того или иного метода класса сначала ищется метод в самом классе. Если метод найден, то он выполняется, и поиск этого метода завершается. Если же метод не найден, то обращаемся к родительскому классу и ищем вызванный метод в нем. Если он найден, то поступаем, как при нахождении метода в самом классе. А если нет,- то продолжаем дальнейший поиск вверх по иерархическому дереву, вплоть до корня (верхнего класса) иерархии. Этот пример отражает так называемый механизм раннего связывания.

 

Классы языка C++

В основе объектно-ориентированного программирования ле­жит понятие объекта - структуры, обладающей определенными свойствами, над которой выполняются действия .C++ позволяет программно определять все атрибуты объектов с помощью сложных структур, называемых классами.



<== предыдущая лекция | следующая лекция ==>
 | 


Карта сайта Карта сайта укр


Уроки php mysql Программирование

Онлайн система счисления Калькулятор онлайн обычный Инженерный калькулятор онлайн Замена русских букв на английские для вебмастеров Замена русских букв на английские

Аппаратное и программное обеспечение Графика и компьютерная сфера Интегрированная геоинформационная система Интернет Компьютер Комплектующие компьютера Лекции Методы и средства измерений неэлектрических величин Обслуживание компьютерных и периферийных устройств Операционные системы Параллельное программирование Проектирование электронных средств Периферийные устройства Полезные ресурсы для программистов Программы для программистов Статьи для программистов Cтруктура и организация данных


 


Не нашли то, что искали? Google вам в помощь!

 
 

© life-prog.ru При использовании материалов прямая ссылка на сайт обязательна.

Генерация страницы за: 0.913 сек.