Методические указания к лабораторным работам Кузнецк 2011 Лабораторная работа 1 Тема: Знакомство с интегрированной средой разработки ide visual Studio (C++). Классы




Скачать 1.13 Mb.
страница 1/5
Дата 30.08.2016
Размер 1.13 Mb.
  1   2   3   4   5

Министерство образования и науки РФ


Кузнецкий институт информационных и управленческих технологий

Объектно-ориентированное программирование

Методические указания


к лабораторным работам

Кузнецк 2011

Лабораторная работа 1

Тема: Знакомство с интегрированной средой разработки IDE Visual Studio (C++). Классы.


Цель работы: изучение особенностей практической реализации аспектов концепции объектно −ориентированного программирования

Знакомство с интегрированной средой разработки IDE Visual Studio (C++)


Интегрированная среда разработки (IDE) Visual Studio предоставляет набор инструментов, которые помогают в создании и изменении кода, а также в обнаружении и исправлении ошибок.

При написании программы на Visual C++ с помощью Visual Studio первым этапом является выбор типа проекта. Для каждого типа проекта Visual Studio устанавливает параметры компилятора и генерирует стартовый код. Создание нового проектаВ меню Файл выберите команду Создать и затем пункт Проект....

Рис.1 Диалоговое окно Создать проект.


  1. В области Типы проектов выберите пункт CLR Console Application, зададим в его нижней части имя будущего проекта в поле Имя, которое перекочует в поле Имя решения, затем с помощью кнопки Обзор установим папку, в которую будет помещен наш проект. Нижняя часть окна рис.1 станет выглядеть так, как показано на рис.2.

Рис.2 Формирование консольного приложения.


  1. Затем нажмем кнопку ОК. В результате получится то, что показано на рис.3.

Заготовка состоит из заголовка главной функции:

int main(array ^args)

и тела, ограниченного фигурного скобками.

Рис.3. Вид заготовки консольного приложения.



  1. Преобразуем заголовок функции main(множество аргументов функции)к виду main(),т.е. к виду без аргументов, а из тела удалим оператор return 0.

Когда мы формировали заготовку консольного приложения, то видели, что при задании имени приложения формировалось и некое поле Имя решения. Дело в том, что среда VC++ оформляет создаваемое приложение в виде двух контейнеров, вложенных один в другой. Один (главный контейнер) называется Имя решения, а другой – Проект. Проект определен как конфигурация (каркас, контейнер), объединяющая группу файлов.

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

Проекты являются частью другого каркаса, другого контейнера, который называется Решение и который отражает взаимосвязь между проектами: одно Решение может содержать множество проектов, а проект содержит множество элементов, обеспечивающих существование приложения как такого. Можно сказать, что Решение – это не что иное, как группа объединенных проектов. Назовем его просто: «Группа проектов», чтобы термин «Решение» не вводил нас в заблуждение.

Существует специальный инструмент работы с группой проектов, называемый Обозреватель решений. К нему можно добраться через опцию Вид меню среды разработки. Сама среда автоматически формирует создаваемое приложение как группу проектов, содержащую собственно проект (рис.4).



Рис. 4. Формирование проекта приложения.

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

В качестве примера создадим проект с именем 2_2008 таким же способом, как мы создавали проект 1_2008, и добавим его к имеющейся группе 1_2008. При создании нового проекта в нижней части окна Создать проект наряду с полем Имя решения ниже кнопки Обзор (рис. 1) имеется переключатель Создать каталог для решения. Если включить этот переключатель. То будет создана новая группа проектов с именем, по умолчанию совпадающем с именем создаваемого проекта. Мы включим этот переключатель.

Теперь попробуем объединить два проекта в одно Решение (в одну группу проектов). Для этого, во-первых, закроем Решение 2_2008 и откроем Решение 1_2008, а затем щелкнем правой кнопкой мыши на строке Решение “1_2008” и в появившемся контекстном меню выберем команду Добавить | Существующий проект … (рис. 5)

Рис.5 Процесс добавления созданного ранее проекта к группе проектов.

При этом откроется диалоговое окно для поиска проекта, затем обычным способом откроем проект 2_2008, в результате чего он добавится к Решение “1_2008” (рис.6)

Рис.6 Решение “1_2008” с добавленным к нему проектом 2_2008.

Рассмотрим некоторые файлы, попавшие в проект, показанные на рис.3:


  • 1_2008.cpp – это главный исходный файл и точка входа в создаваемое приложение (1_2008 – это в данном случае имя проекта);

  • stdafx.cpp – подключает для компиляции файл stdafx.h;

  • stdafx.h – если для проекта требуются какие-то дополнительные заголовочные файлы, то они задаются пользователем в этом файле;

  • ReadMe.txt – файл, описывающий некоторые из созданных шаблоном консольного приложения файлы проекта. Посмотреть содержимое указанных файлов можно через их контекстные меню, если выполнить в них команду Открыть.

Запуск программы в режиме отладки


  1. Щелкните вкладку 1_2008.cpp в области редактирования, если этот файл не отображается.

  2. Щелкните следующую строку в редакторе, чтобы установить ее в качестве текущей:

while (f

  1. Чтобы установить в этой строке точку останова, в меню Отладка выберите команду Точка останова или нажмите клавишу F9. Кроме того, для установки или удаления точки останова можно щелкнуть в области слева от строки кода.

Слева от строки с установленной точкой останова появляется красный кружок.

  1. В меню Отладка выберите команду Начать отладку или нажмите клавишу F5.

При достижении программой строки с установленной точкой останова выполнение временно приостанавливается (так как программа находится в режиме приостановки выполнения). Строка, которая должна выполняться следующей, отмечается желтой стрелкой слева от строки.

  1. Чтобы узнать текущее значение переменной f, наведите на нее курсор. Имя переменной и ее значение, равное 0.00000000, отобразится в окне всплывающей подсказки (рис.7).

Чтобы наблюдать за переменной f в окне Контрольные значения, щелкните ее правой кнопкой мыши и выберите команду Добавить контрольное значение. Кроме того, можно выделить переменную и перетащить ее в окно Контрольные значения.

Рис.7


  1. В меню Отладка нажмите кнопку Шаг с обходом или нажмите клавишу F10, чтобы перейти к следующей строке кода.

Значение переменной f изменится на 20.000000.

Рис.8


  1. Щелкните правой кнопкой мыши последнюю строку в методе main (getch();) и выберите команду Выполнить до текущей позиции. Желтая стрелка слева от строки кода указывает на следующий оператор, который должен выполняться.

  2. Чтобы остановить программу, в меню Отладка выберите команду Остановить отладку или нажмите сочетание клавиш SHIFT+F5.



Отладка проекта (C++)

В этом разделе рассматривается изменение программы для устранения проблемы, выявленной при тестировании проекта.



Развертывание программы (C++)

Заключительным этапом создания приложения является создание установщика, с помощью которого другие пользователи смогут устанавливать программу на своих компьютерах. Для этого мы добавим новый проект в имеющееся решение. Выходным файлом проекта будет являться файл setup.exe, служащий для установки ранее созданного приложения на других компьютерах.

В этом руководстве для развертывания приложений используется установщик Windows. Кроме того, для развертывания приложения может использоваться ClickOnce.

Создание проекта установки и установка программы


  1. Правой кнопкой мыши щелкните на 1_2008 выбрать пункт Добавить и выберите команду Создать проект. Откроется диалоговое окно Добавление нового проекта.

  2. В области Типы проектов разверните узел Другие типы проектов и выберите пункт Установка и развертывание.

  3. В области Шаблоны выберите Мастер установки. Введите имя проекта установки, например faleInstaller, и нажмите кнопку ОК.

  4. Откроется диалоговое окно Мастер установки. Нажмите кнопку Далее для продолжения.

  5. В области Выбор типа проекта мастера выберите пункт Создать программу установки для приложения Windows и нажмите кнопку Далее для продолжения.

  6. В области Выбор включаемых выходных данных проекта мастера выберите пункт Основные выходные файлы из game и нажмите кнопку Далее для продолжения.

  7. В установщик не должны включаться дополнительные файлы, поэтому в области Выбор файлов для включения установщика нажмите кнопку Далее.

  8. Просмотрите изменения с помощью мастера и убедитесь, что все правильно. Чтобы создать проект, нажмите кнопку Готово (рис.).

В Обозревателе решений отобразится новый проект faleInstaller. Этот проект будет содержать список зависимостей приложения, таких как библиотека времени выполнения C или .NET Framework, а также файлов проекта, которые должны быть включены в установщик.

После создания проекта установки могут быть изменены различные параметры.

Произведите построение установщика, выбрав его в Обозревателе решений и щелкнув команду Построить faleInstaller в меню Построение.


  1. Перейдите к месту размещения файлов setup.exe и faleInstaller.msi, созданных на предыдущем этапе. Чтобы установить приложение на компьютере, дважды щелкните любой из этих файлов.

Рис.9


Теоретические основы:

Концепция объектно-ориентированного программирования (ООП) включает в себя понятия объектов, классов, инкапсуляции и наследования.

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

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



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

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



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

В чем же фактическая польза от механизма классов-объектов?

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

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

В-третьих, имеется возможность многократного использования элемента (как и когда-то многократное использование библиотеки стандартных программ).

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

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

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

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

Класс – это дальнейшее развитие структур: в них тоже объединяются данные разных типов. Это такой шаблон, под который (как и под структуру) память выделяется только тогда, когда мы создаем «переменную типа этого шаблона». Вспомним, что если у нас была некая структура А, то чтобы работать с ней, мы создавали экземпляр этой структуры а путем объявления А а; а затем уже работали с экземпляром а. Можно сказать, что мы объявляли переменную а типа А.

Точно так же поступают и для класса: если есть класс А (шаблон, под него память не выделяется), то объявляют переменную типа А путем объявления А а;, после чего можно работать уже как бы с самим классом, а на самом деле – с его экземпляром а. Как и при использовании структур, к членам класса (данным и методам) можно обращаться по тем же правилам: если объявлено А а;, то обращение к члену класса с именем аа будет записываться как а.аа, а если был объявлен указатель на класс (например, как А *а;), то обращение к члену класса с именем аа будет записываться как а->аа.

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

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

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



Принципы построения классов.

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



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

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

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

Например, в Visual C++ существует компонент «форма» (класс Form) и компонент «кнопка» (класс Button), у которых есть свои свойства, методы и события. Если при проектировании приложения в форму поместить две кнопки, то с помощью определения двух разных значений свойствам кнопок Text (название кнопки) и Visible (значения false и true определяют видимость кнопки при исполнении приложения) вы получаете два экземпляра, которые ведут себя по-разному: первая кнопка при выполнении программы будет невидима в форме, а вторая останется видимой. При помощи события компонент сообщает пользователю, что на него произведено определенное воздействие (например, для компонента «кнопка» событием может быть нажатие кнопки – щелчок кнопкой мыши), а методы служат для обработки реакции компонента на события.



Наследование.

Наследование – второй принцип построения классов. Мы видели, что классы в общем случае могут составлять иерархию: один класс получается из другого, на основании другого получается третий и т.д. То есть речь идет о том, что и в классах существуют родители и дети, бабушки с дедушками, их внуки и т.д. наследование предполагает, что все характеристики класса-родителя присваиваются классу-потомку. После этого потомку при необходимости добавляют новые характеристики. Иногда некоторые методы в классе-потомке, полученном от предков, переопределяются, т.е. наполняются новым содержанием.

Рассмотрим структуру базового класса, из которого могут создаваться классы-потомки. Объявление класса представлено в листинге 1:

class

{

private: /* Имя секции. Данные и методы, помещенные в эту секцию будут доступны только методам этого класса. Доступ к ним методом производных классов запрещен*/



Приватные данные>

Приватные конструкторы>

Приватные методы>

protected: /* Имя секции. Данные и методы, помещенные в эту секцию будут доступны только методам этого класса и производным от него, т.е. его потомкам */

Защищенные данные >

Защищенные конструкторы >

Защищенные методы >

public: /* Имя секции. Данные и методы, помещенные в эту секцию будут доступны методам всех классов */

Общедоступные данные >

Общедоступные конструкторы >

Общедоступные деструкторы >

Общедоступные методы >

}; /*обратите внимание, что так же заканчивается и объявление структуры */

В секциях private, protected, public можно определять функции (в классах – это методы), а вызывать методы на выполнение можно только в соответствии с тем, в какой секции находится функция. Атрибуты private, protected, public называются атрибутами доступа к членам класса. В классах методы вызываются так же, как если бы они находились в структуре:

имя (экземпляра).f (фактические параметры функции);

Полиморфизм

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

Например, все классы имеют общего прародителя – класс Object. В этом классе определен метод draw (рисовать фигуру). Классы, рисующие различные фигуры и произошедшие от Object, - родственные классы.

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

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

Кроме атрибута virtual, у методов существует атрибут friend. Методы с таким атрибутом, расположенным (как и атрибут virtual) в объявлении метода перед указанием типа возвращаемых данных, называются дружественными. Метод, объявленный с атрибутом friend, имеет полный доступ к членам класса, расположенным в секциях private и protected, даже если этот метод – не член этого класса. Это справедливо и для классов: внешний класс (т.е.его методы) имеет полный доступ к классу, который объявляет этот внешний класс дружественным.

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

Указатель this

Каждый объект содержит свой экземпляр полей класса. Методы класса находятся в памяти в единственном экземпляре и используются всеми объектами совместно, поэтому необходимо обеспечить работу методов с полями именно того объекта, для которого они были вызваны. Это обеспечивается передачей в функцию скрытого параметра this, в котором хранится константный указатель на вызвавший функцию объект. Указатель this неявно используется внутри метода для ссылок на элементы объекта. В явном виде этот указатель применяется в основном для возвращения из метода указателя (return this;) или ссылки (return *this;) на вызвавший объект.

Указатель this можно также применять для идентификации поля класса в том случае, когда его имя совпадает с именем формального параметра метода. Другой способ идентификации поля использует операцию доступа к области видимости.

Примеры создания классов

Приведем примеры трех программ, в которых объявлены и использованы простейшие классы.



Пример_1:

// 1_2010.cpp: главный файл проекта.


#include "stdafx.h"

#include

#include
using namespace System;

class A


{

protected:

int x;/* к этим данным имеют доступ только методы данного класса и производных*/

int y;


public:

int a;


int b;

int f1(int x,int y)/* метод класса*/

{

return (x-y);



}

};
int main()

{

Console::WriteLine(L"Здравствуй, мир!");



A min; //создание экземпляров классов А,В

min.a=10; // Работа с элементами класса А из секции public

min.b=20;

int x1=min.f1(min.a,min.b);

printf("x1= %d\n ",x1);

_getch();

//return 0;

}

Рис.10 Результат работы программы Пример_1

Пример_2: Создадим класс, членами которого будут изделия, состоящие из деталей и их стоимостей,а также методы, первый из которых присваивает значения изделию,детали, а также их стоимости через свои параметры,а второй выводит на экран значения, присвоенные первым методом.
#include "stdafx.h"

#include //for printf()

#include // for _getch()
using namespace System;

class produce //начало определения класса

{

private:


// поля класса

int modelnumber; // номер изделия

int partnumber; // номер детали

float cost; // стоимость детали


public:

// установка данных с помощью метода

// присваивает данным класса значения своих параметров

void setpart(int mn, int pn, float c)

{

modelnumber=mn;



partnumber=pn;

cost=c;


}

void show() // вывод данных

{

printf("The Number of the Model is %d\n",modelnumber);



printf("The Number of the Part is %d\n ",partnumber);

printf("The Number of the Cost is %.2f\n ",cost);

}

};//конец описания класса


// обработка класса в головной программе

int main()

{

produce izd;// определение объекта мз класса (экземпляр класса)



izd.setpart(100,200,250.5);// вызов метода класса

izd.show();// вывод данных

_getch();
}

Рис.11 Результат работы программы Пример_2

Обратите внимание, что когда вы создаете переменную типа класса, т.е. экземпляр класса (например, A min;, где min – это экземпляр класса), то для этого экземпляра никакой памяти не выделяется. А компилятор все-таки размещает этот экземпляр где-то в памяти. Почему?

Среди исполнения приложений в Си++ выделяют два вида памяти: статическую и динамическую. Последняя носит название «куча» (heap). Куча может быть управляемой и неуправляемой. Если компилятор способен определить размер памяти под объявленную переменную, то он выделяет для нее место в статической памяти (например, под переменную типа int из 10 элементов он выделит 40 байтов).

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


  • Функция malloc(), которая выделяет область памяти в динамической области и возвращает указатель на эту область.

  • Функция free(), которая освобождает занятую переменной область и передает освобожденную память в общее пользование.

Если же работа происходит с объектами, то здесь используются операторы new – аналог malloc(), и delete – аналог free().

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

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

Но приведем пример этой же программы (пример_1), в которой используется (по нашему желанию) динамическая память:


В данном случае оператор new размещает объект в куче, выдает адрес этого объекта, а конструктор инициализирует объект.
Пример_3: // 1_2010.cpp: главный файл проекта.
#include "stdafx.h"

#include

#include
using namespace System;

class A


{

protected:

int x;

int y;


public:

int a;


int b;

int f1(int x,int y)

{

return (x-y);



}

};

int main()



{

Console::WriteLine(L"Здравствуй, мир!");

A *min=(A *) new A();

min->a=10;

min->b=20;

int x1=min->f1(min->a,min->b);

printf("x1= %d\n x2= %d\n",x1);

_getch();

delete min;

}

Рис.12 Результат работы программы Пример_3
Конструкторы и деструкторы класса.

Конструктор класса.

Конструктор класса тоже член класса, но специфический – это метод с таким же именем, что и класс. Такие методы не имеют право возвращать какие-либо значения: если вы написали в конструкторе оператор return, компилятор выдаст ошибку. Конструктор выполняет различные задачи и не виден вам, как программисту. Даже если вы сами не писали его текст, конструктор по умолчанию всегда присутствует в классе, ибо основная его задача – создавать в памяти экземпляр класса (т.е. как бы по проекту (классу) построить дом (экземпляр класса)). В этом случае конструктор берется из общего прародителя классов – класса Object, в котором он имеется.

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

Пример_4:
#include "stdafx.h"

#include

#include
using namespace System;

class Date

{

public:


/*Это члены-данные класса.

С ними будут работать функции-члены класса:get...и set... */

int month;

int day;

int year;

Date (int dy,int mn, int yr) //конструктор класса

{

/*члены-данные month, day, year будут принимать значения, которые поступят



в конструктор как в функцию при его использовании где-нибудь в приложении*/

day=dy;


month=mn;

year=yr;


}
int getMonth() const;
/*Функция getMonth() объявлена с атрибутом const - может данные

только поставлять, не изменяя их (read-only),

а функция SetMonth() не имеет квалификатора const и поэтому данные внутри

себя может изменять: виды функций определены вне класса */


void setMonth(int mn);

int getDay();

void setDay(int dy);

int getYear();

void setYear(int yr);
~Date()//деструктор класса

{ }


}; // конец описания класса
/*создание функций (вне класса, поэтому надо указывать имя класса,

для которого эти функции создаются)*/

int Date::getMonth() const

{

return month; //Функция ничего не изменяет



}

void Date::setMonth(int mn)

{

month=mn; } //Функция изменяет член-данное класса



int Date::getDay()

{

return Date::day;



}

void Date::setDay(int dy)

{

day=dy;


}

int Date::getYear()

{

return Date::year; }


void Date::setYear(int yr)

{

Date::year=yr;



}

int main() // Работа с созданным классом

{

/*Здесь с помощью конструктора в экземпляре класса (экземпляр с именем MyDate)



устанавливаются заданные пользователем значения:*/

Date Mydate(21,1,2010);

int d,m,y;d=Mydate.getDay(); //d=21

m=Mydate.getMonth(); //m=3

y=Mydate.getYear(); //y=2007

printf("d=%d, m=%d, y=%d\n",d,m,y);

Date BirthDate(1,12,1938);

/*Изменить значение месяца на значение 4 в экземпляре Mydate*/

Mydate.setMonth(4);

m=Mydate.getMonth(); // m=4

printf("d=%d, m=%d, y=%d\n",d,m,y);

/*Изменить значение месяца на значение 5 в экземпляре BirthDate*/

BirthDate.setMonth(5);

m=BirthDate.getMonth(); // m=5

printf("d=%d, m=%d, y=%d\n",d,m,y);
_getch();
}

Рис.13 Работа конструктора класса

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

Деструктор класса.

Суть этой функции – обратная сути функции конструктора. Она призвана разрушить созданный конструтором экземпляр класса и освободить от него память. Имя деструктора совпадает с именем класса, но перед ним указывается знак «тильда» (~). Деструктор у класса должен быть один.



Методические указания

При выполнении задания к данной лабораторной работе необходимо:

Написать программу, демонстрирующую работу с классом согласно варианту задания.


  • Создать проект CLR – консольное приложение.

  • Протестировать проект.

  • Построить проект.

  • Создать установщик для своего приложения.

Варианты лабораторных заданий.

Вариант 1

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



Вариант 2

Создайте класс с именем Time, содержащий три поля типа char предназначенные для хранения часов, минут и секунд. Один из конструкторов класса должен инициализировать поля нулевыми значениями, а другой конструктор — заданным набором значений. Создайте метод класса, который будет выводить значения полей на экран в формате 11:59:59. и метод, складывающий значения двух объектов типа Time, передаваемых в качестве аргументов.



Вариант 3

1). Создайте класс с именем Date. Его данные должны размешаться в трех полях тина int; Month, Day и Year. Метод класса Getdate() должен принимать значение для объекта в формате 12/05/09, а метод Showdate() — выводить данные на экран в формате 12 мая 2009г.



Вариант 4

1). Создайте класс, имитирующий работу пункта для взимания платежей за проезд по автостраде. Каждая проезжающая машина должна заплатить за проезд n руб, однако часть машин платит за проезд, а часть проезжает бесплатно. В кассе ведется учет числа проехавших машин и суммарная выручка от платы за проезд.

Класс должен содержать три поля. Одно из них типа unsigned int предназначено для учета количества проехавших автомобилей, второе, имеющее тип double, будет содержать суммарную выручку от оплаты проезда, а третье константное поле – плату за проезд. Конструктор должен инициализировать два поля нулевыми значениями, а третье значением заданным пользователем. Метод payingCar() инкрементирует число машин и увеличивает на значение константного поля суммарную выручку. Другой метод. nopayCar(). увеличивает на единицу число автомобилей, но оставляет без изменения выручку. Метод display() выводит оба значения на экран.

Вариант 5

Создайте класс Fraction. Данные класса должны быть представлены двумя полями: числителем и знаменателем. Методы класса должны получать от пользователя значения числителя и знаменателя дроби в формате 3/5 и выводить значение дроби в этом же формате. Кроме того, должен быть разработан метод, складывающий значения двух дробей. Напишите программу, которая циклически запрашивает у пользователя ввод пары дробей, затем складывает их и выводит результат на экран. После каждой такой операции программа должна спрашивать пользователя, следует ли продолжать цикл.



Вариант 6

Создайте класс Employee. Класс должен включать поле типа int для хранения номера сотрудника, поле типа std::string для хранения ФИО сотрудника и поле типа float для хранения величины его оклада. Методы класса должны позволять пользователю вводить и отображать данные класса. Создайте программу, демонстрирующую работу класса. Напишите программу, создающую массив типа Employee, а затем предложить пользователю внести данные для 10 служащих. После этого необходимо вывести данные всех служащих на экран компьютера.



Вариант 7

Создайте класс Money имитирующий денежный тип с фиксированной десятичной точкой. Данные класса должны быть представлены двумя полями: количеством рублей (тип long) и количеством копеек (тип char). Методы класса должны получать от пользователя строку в формате 4 000 678 889,88 руб и выводить значение в этом же формате. Кроме того, должен быть разработан метод, складывающий значения двух денежных величин. Напишите программу, выводящую на экран сумму всех денежных величин введенных пользователем.



Вариант 8

Напишите класс SafeArray который использует массив типа int фиксированного размера. В классе необходимо описать два метода. Первый, Set(). принимает индекс и значение типа int как аргументы и вставляет это значение в массив по заданному индексу. Второй, Get(), принимает индекс как аргумент и возвращает значение типа int, содержащееся в элементе с этим индексом. Оба метода должны проверять индекс аргумента, чтобы быть уверенными, что он не выходит за размеры массива.



Вариант 9

Создать класс Date для работы с датами в формате «год, месяц день». Дата представляется структурой с тремя полями типа unsigned int: для года, месяца и дня. Класс должен включать не менее трех функций инициализации: числами, строкой вида «год, месяц, день» (например. «2004.08.31») и датой. Обязательными операциями являются: вычисление даты через заданное количество дней, вычитание заданного количества дней из даты, определение високосности года, присвоение и получение отдельных частей (год, месяц, день), сравнение дат (равно, до, после), вычисление количества дней между датами.



Вариант 10

Рациональная (несократимая) дробь представляется парой целых чисел (а, b), где а — числитель. b — знаменатель. Создать класс Rational для работы с рациональными дробями. Обязательно должны быть реализованы операции:



  • сложения add, (a, b) + (c,d) = (ad + be, bd);

  • вычитания sub, (а, b) − (с, d) = (ad − be, bd);

  • умножения mul, (a, b) * (с, d) = (ас, bd);

  • деления div, (a, b) / (c,d) = (ad, be);

Вариант 11

Создать класс Money для работы с денежными суммами. Число должно быть представлено двумя полями: типа long для рублей и типа unsigned char — для копеек. Дробная часть (копейки) при выводе на экран должна быть отделена от целой части запятой. Реализовать сложение, вычитание, деление сумм, деление суммы на дробное число, умножение на дробное число и операции сравнения.



Вариант 12

Создать класс Angle для работы с углами на плоскости, задаваемыми величиной в градусах и минутах. Обязательно должны быть реализованы: перевод в радианы, приведение к диапазону 0−360º, увеличение и уменьшение угла на заданную величину, получение синуса, сравнение углов.



Вариант 13

Создать класс Time для работы со временем в формате «час:минута:секунда». Класс должен включать в себя не менее четырех функций инициализации: числами, строкой (например, «23:59:59»), секундами и временем. Обязательными операциями являются: вычисление разницы между двумя моментами времени в секундах, сложение времени и заданного количества секунд, вычитание из времени заданного количества секунд, сравнение моментов времени, перевод в секунды, перевод в минуты (с округлением до целой минуты).



Вариант 14

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


Вариант 15

Номиналы российских рублей могут принимать значения 1, 2, 5, 10, 50. 100. 500, 1000, 5000. Копейки представить как 0.01 (1 копейка). 0.05 (5 копеек). 0.1 (10 копеек). 0.5 (50 копеек). Создать класс Money для работы с денежными суммами. Сумма должна быть представлена полями−номиналами, значениями которых должно быть количество купюр данного достоинства. Реализовать сложение сумм, вычитание сумм, деление сумм, деление суммы на дробное число, умножение на дробное число и операции сравнения. Дробная часть (копейки) при выводе на экран должна быть отделена от целой части запятой.



Вариант 16

Написать класс для аффективной работы со строками, позволяющий форматировать и сравнивать строки, хранить в строках числовые значения и извлекать их. Для этого необходимо реализовать:



  • перегруженные операции присваивания и конкатенации;

  • операции сравнения и приведения типов;

  • преобразование в число любого типа;

  • форматный вывод строки.

Вариант 17

Описать класс «записная книжка». Предусмотреть возможность работы с произвольным числом записей, поиска записи по какому−либо признаку (например, по фамилии, дате рождения или номеру телефона), добавления и удаления записей, сортировки по разным полям.



Вариант 18

Создать класс Fraction для работы с дробными числами. Число должно быть представлено двумя нолями, целая часть длинное целое со знаком, дробная часть — беззнаковое короткое целое. Реализовать арифметические операции сложения, вычитания, умножения и операции сравнения.



Вариант 19

Создать класс Goods (товар). В классе должны быть представлены данные−члены: наименование товара, дата оформления, цена товара, количество единиц товара, номер накладной, по которой товар поступил на склад. Реализовать методы изменения цены товара, изменения количества товара (увеличения и уменьшения), вычисления стоимости товара. Метод toString() должен выдавать в виде строки стоимость товара.



Вариант 20

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


Контрольные вопросы:

  1. Как создать проект CLR – консольное приложение?

  2. Что такое файл исходного кода? Как добавить такой файл в проект?

  3. Как запускается проект в режиме отладки?

  4. Что такое развертывание программы?

  5. Определение класса? Структура класса?

  6. Конструкторы и деструкторы класса?

  7. Основные принципы построения классов

  8. Спецификаторы доступа ?

  9. Экземпляры класса ?

  10. Инициализация данных объекта?

  11. Переопределение операций?

  12. Что такое объект и каким образом объекты соединяются в систему для решения задачи?

  13. Чем характеризуется объект?

  14. Каким образом в программных объектах реализуются состояние, поведение и идентификация объектов предметной области?

  15. Что такое переопределение операций? Какие операции можно переопределять?
  1   2   3   4   5


База данных защищена авторским правом ©infoeto.ru 2022
обратиться к администрации
Как написать курсовую работу | Как написать хороший реферат
    Главная страница