Лабораторная работа 1 Классыиобъекты
Скачать 20.85 Kb.
|
Лабораторная работа №1 Классыиобъекты.Инкапсуляция. Цель задания:Создание консольного приложения, состоящего из нескольких файлов в системе программирования Visual Studio. Использование классов и объектов в ОО программе. Теоретические сведения2.1. Классы, объекты и их представление в ОО программе Классявляется абстрактным типом данных, определяемым пользователем, и представляет собой модель реального объекта в виде данных и функций дляработы с ними. Данные класса называются полями(по аналогии с полями структуры) или атрибутами, а функции класса — методами. Поля и методы называются элементамикласса. Описание класса в первом приближении выглядит так: class <имя> { [ private: ] <описание скрытых элементов> public: <описание доступных элементов> }; // Описание заканчивается точкой с запятой Спецификаторы доступа private и public управляют видимостью элементов класса. Элементы, описанные после служебного слова private, видимы только внутри класса. Этот вид доступа принят в классе по умолчанию. Интерфейс класса описывается после спецификатора public. Действие любого спецификатора распространяется до следующего спецификатора или до конца класса. Можно задавать несколько секций private и public, порядок их следования значения не имеет. Получить информацию о содержимом полей, описанных после спецификатора private можно только с помощью специальных методов, которые называются селекторами, а изменить – с помощью методов, которые называются модификаторами. Видимостью элементов класса можно также управлять с помощью ключевых слов struct и class. Если при описании класса используется слово struct, то все поля и методы по умолчанию будут общедоступными (public). Если при описании класса используется слово class, то по умолчанию все методы и поля класса будут скрытыми (private). Все методы класса имеют непосредственный доступ к его скрытым полям. Свойства полей класса:могут иметь любой тип, кроме типа этого же класса (но могут быть указателями или ссылками на этот класс); могут быть описаны с модификатором const, при этом они инициализируются только один раз (с помощью конструктора) и не могут изменяться; Инициализация полей при описании не допускается. Если тело метода определено внутри класса, он является встроенным (inline). Как правило, встроенными делают короткие методы. Если внутри класса записано только объявление (заголовок) метода, сам метод должен быть определен в другом месте программы с помощью операции доступа к области видимости (::): class Person { string name;//имя int age;//возраст public: void Set_Person(string Name,int Age);//модификатор void Set_Age(int Age);//модификатор string Get_Person (){return name;}//селектор int Get_Age(){return age;}//селектор void Print_Person()//встроенная функция печати { cout< “< } ... }; //определение методов класса void Person::Set_Person(string Name,int Age); { Name=name; age=Age; } Переменная класса Person называется экземпляром класса или объектом. Класс объявляется один раз, а переменных такого класса (объектов) может быть сколько угодно. Объявляются такие переменные так же как и переменные встроенных типов: Person p; Person *pp;//указатель на переменную Person Arr_p[10];//массив переменных Обращаться к полям и методам класса можно точно также как к полям структуры: Strcpy(p.name,”Ivanov”); p.age=20; p.Set_Person(”Ivanov”,20); pp=new(Person); pp->Set_Person(”Petrov”,21); Arr_p[1].Set_Person(”Sidorov”,22); Постановка задачиРеализовать определение нового класса. Для демонстрации работы с объектами написать главную функцию. Продемонстрировать разные способы создания объектов и массивов объектов. Структура-пара – структура с двумя полями, которые обычно имеют имена first и second. Требуется реализовать тип данных с помощью такой структуры. Во всех заданиях должны присутствовать : метод инициализации Init (метод должен контролировать значения аргументов на корректность); ввод с клавиатуры Read; вывод на экран Show. Реализовать внешнюю функцию make_тип(), где тип – тип реализуемой структуры. Функция должна получать значения для полей структуры как параметры функции и возвращать структуру как результат. При передаче ошибочных параметров следует выводить сообщение и заканчивать работу. Ход работыЗадачаПоле first – дробное число; поле second – целое число, показатель степени. Реализовать метод power() – возведение числа first в степень second. Метод должен правильно работать при всех значениях first и second Создать пустой проект. Для этого требуется Запустить MS Visual Studio: Выбрать команду File/New/Project В окне New Project выбрать Win Console 32 Application, в поле Name указать имя проекта (Lab1), в поле Location указать место положения проекта (личную папку), нажать кнопку Ok. В следующем окне выбрать кнопку Next. В следующем окне выбрать кнопку Next. В диалоговом окне Additional Settings установить флажок Empty (Пустой проект) и нажать кнопку Finish. В результате выполненных действий получим пустой проект. Добавим в проект файл fraction.h, содержащий описание класса. Для этого нужно: Вызвать контекстное меню проекта в панели Обозреватель решений (Solution Explorer), выбрать в нем пункт меню Add/ New Item. В диалоговом окне Add New Item – Lab1 выбрать Категорию Code, шаблон – Header File (.h), задать имя файла fraction. В результате выполненных действий получим пустой файл fraction.h. Ввести следующий текст программы: struct fraction { double first; int second; void Init(double, int);//метод для инициализации полей void Read();//метод для чтения значений полей void Show();//метод для вывода значений полей double Power();//вычисление степени }; Добавим в проект файл fraction.cpp, содержащий описание методов класса fraction. Для этого нужно: Вызвать контекстное меню проекта в панели Обозреватель решений (Solution Explorer), выбрать в нем пункт меню Add/ New Item. В диалоговом окне Add New Item – Lab1 выбрать Категорию Code, шаблон – С++File (.cpp), задать имя файла fraction. В результате выполненных действий получим пустой файл fraction.cpp. Ввести следующий текст программы: #include using namespace std; //реализация метода для инициализации полей структуры void fraction::Init(double F, int S) { first=F; second=S; } //реализация метода для чтения значений полей структуры void fraction::Read() { cout<<"\nfirst?"; cin>>first; cout<<"\nsecond?";cin>>second; } //реализация метода для вывода значений полей структуры void fraction::Show() { cout<<"\nfirst="< } //метод для возведения в степень double fraction::Power() { return pow (first, second); } Добавим в проект файл Lab1_main.cpp, содержащий основную программу. Для этого нужно: Вызвать контекстное меню проекта в панели Обозреватель решений (Solution Explorer), выбрать в нем пункт меню Add/ New Item. В диалоговом окне Add New Item – Lab1 выбрать Категорию Code, шаблон – С++File (.cpp), задать имя файла Lab1_main. В результате выполненных действий получим пустой файл Lab1_main.cpp, в котором будет редактироваться текст программы. Ввести следующий текст программы: #include using namespace std; fraction make_fraction(double F, int S) { fraction t;//создали временную переменную t.Init(F,S);//инициализировали поля переменной t с помощью параметров функции return t;//вернули значение переменной t } Изменить текст функции main() void main() { //определение переменных А и В fraction A; fraction B; A.Init(3.0,2);//инициализация переменной А B.Read();//ввод полей переменных В A.Show();//вывод значений полей переменной А B.Show();//вывод значений полей переменной В //вывод значения степени, вычисленного с помощью функции Power() cout<<"A.Power("< //указатели fraction *X=new fraction;//выделение памяти под динамическую переменную X->Init(2.0,5);//инициализация X->Show();//вывод значений полей X->Power();//вычисление степени cout<<"X.Power("< //массивы fraction mas[3];//определение массива for (int i=0;i<3; i++) mas[i].Read();//чтение значений полей for (i=0;i<3; i++) mas[i].Show(); //вывод значений полей for (i=0;i<3; i++) { mas[i].Power(); //вычисление степени cout<<"mas["< cout< } //динамические масивы fraction* p_mas=new fraction[3];//выделение памяти for (int i=0;i<3; i++) p_mas[i].Read();//чтение значений полей for (i=0;i<3; i++) p_mas[i].Show();//вывод значений полей for (i=0;i<3; i++) { p_mas[i].Power();//вычисление степени cout<<"p_mas["<cout<<")="< } //вызов функции make_fraction() double y; int z; cout<<"first?";cin>>y; cout<<"second?";cin>>z; //переменная F формируется с помощью функции make_fraction() fraction F=make_fraction(y,z); F.Show(); return 0; } Выполнить компиляцию программы, используя команду Build / Build Solution или функциональную клавишу F7. Исправить имеющиеся синтаксические ошибки и снова запустить программу на компиляцию. После появления в окне вывода сообщения 1>lab1 - 0 error(s), 0 warning(s) ========== Build: 1 succeeded, 0 failed, 0 up-to-date, 0 skipped ========== запустить программу на выполнение, используя команду Debug/ Start Without Debugging или комбинацию функциональных клавиш Ctrl+F5. Изучить полученные результаты, сделать выводы. Варианты
Контрольныевопросы Что такое класс? Что такое объект (экземпляр) класса? Как называются поля класса? Как называются функции класса? Для чего используются спецификаторы доступа? Для чего используется спецификатор public? Для чего используется спецификатор private? Если описание класса начинается со спецификатора class, то какой спецификатор доступа будет использоваться по умолчанию? Если описание класса начинается со спецификатора struct, то какой спецификатор доступа будет использоваться по умолчанию? Какой спецификатор доступа должен использоваться при описании интерфейса класса? Почему? Каким образом можно изменить значения атрибутов экземпляра класса? Каким образом можно получить значения атрибутов экземпляра класса? Класс описан следующим образом struct Student { string name; int group; ……… }; Объект класса определен следующим образом Student *s=new Student; Как можно обратиться к полю name объекта s? Класс описан следующим образом struct Student { string name; int group; …….. }; Объект класса определен следующим образом Student s; Как можно обратиться к полю name объекта s? Класс описан следующим образом class Student { string name; int group; ……. }; Объект класса определен следующим образом Student *s=new Student; Как можно обратиться к полю name объекта s? Класс описан следующим образом class Student { string name; int group; public: ….. }; Объект класса определен следующим образом Student s; Как можно обратиться к полю name объекта s? Класс описан следующим образом class Student { public: char* name; int group; ……… }; Объект класса определен следующим образом Student *s=new Student; Как можно обратиться к полю name объекта s? Содержание отчетаПостановка задачи (общая и конкретного варианта). Описание класса. Определение компонентных функций. Определение функции make_(). Объяснение результатов работы программы. Ответы на контрольные вопросы |