
oop2
.docxМинистерство науки и высшего образования Российской Федерации
Федеральное государственное бюджетное
образовательное учреждение высшего образования
«Уфимский университет науки и технологий»
Факультет информатики и робототехники
Кафедра вычислительной математики и кибернетики
Лабораторная работа №2
“Объекты и Классы”
По дисциплине “Объектно-ориентированное программирование”
Выполнил:
Студент группы ПРО-232Б
Ихсанова Э. А.
Проверил:
доцент кафедры ВМиК
Котельников В. А.
Уфа-2023
Цель работы:
Определение и реализация тестовых классов, и написание программы, иллюстрирующей их использование
Задание:
Определения
классов
атрибутов, методов
классов-наследников
конструкторов (обязательно несколько: без параметров, с параметрами, с параметром-объектом того же класса), деструкторов
доступности атрибутов и методов (показать, как влияют модификаторы private, protected, public)
Реализация
методов объектов
реализация методов сразу в определении или после определения
конструкторов, деструкторов
Создание и использование (обращение к атрибутам, вызов методов)
статически создаваемых объектов («MyClass obj;»)
динамически создаваемых объектов («MyClass *obj = new MyClass();»)
объектов с помощью различных конструкторов (у каждого создаваемого объекта должны быть: конструктор без параметров, с параметрами, с параметром-объектом того же класса – конструктор копирования)
инициализация полей класса в списке инициализации конструктора
помещение объектов в переменные различных типов (объяснять, чем отличается MyBase * obj = new MyBase() от MyBase * obj = new MyDeriv())
объектов классов-наследников (проверить и продемонстрировать, какие конструкторы классов при этом вызываются)
композиция объектов: атрибутом одного объекта класса A является другой объект класса B (не указатель!), инициализируемый в списке инициализации конструктора класса A; показать, когда этот объект класса B удаляется
композиция объектов: атрибутом одного объекта класса A является указатель на другой объект класса B, создаваемый в конструкторе класса A и уничтожаемый в деструкторе класса A; композируемые классы должны определяться отдельно (не один в другом); при композиции показать, в чем разница, если объект класса А хранит прямо объект класса В или указатель на объект класса В.
Уничтожение
статически созданных объектов
динамически созданных объектов
объектов классов-наследников (проверить и продемонстрировать, какие деструкторы классов при этом вызываются)
Х
од
работы:
Рис. 1 Создание статического объекта и методы
Рис. 2 Создание динамического объекта(наследственный)
Рис. 3 Композиция
Вывод:
В результате выполнения работы было освоено создание классов, создание дочерних классов, композиция, реализация методов внутри и вне описания класса, изменение атрибутов доступа через поля класса, а также удаление объектов класса.
Ссылка на GitHub: https://github.com/eikhovna/oop2
Приложение 1
Листинг программы
#include<iostream>
#include<conio.h>
using namespace std;
class Stasic { //статический объект
protected:
int x, y;
//int a;
public:
Stasic() {
cout << "Stasic() запуск конструктора" << endl;
x = 0;
y = 0;
}
Stasic(int x, int y) {
cout << "Stasic() запуск конструктора с параметром" << endl;
this->x = x;
this->y = y;
}
Stasic(const Stasic& s) {
cout << "Stasic() запуск конструктора копирования" << endl;
x = s.x;
y = s.y;
}
~Stasic() {
cout << x << " " << y << endl;
cout << "Stasic() запуск деструктора" << endl;
}
void move(int dx, int dy) {//метод объекта, определяется сразу
x = x + dx;
y = y + dy;
}
void after();//метод объекта, определяется позже
};
void Stasic::after() {
x = 4;
y = 8;
}
class Dimasik:public Stasic {//динамический объект(наследственный)
protected:
int a;
public:
Dimasik():Stasic() {
cout << "Dimasik() запуск конструктора" << endl;
a = 0;
}
Dimasik(int x, int y, int a):Stasic(x, y) {
cout << "Dimasik() запуск конструктора с параметром" << endl;
this->a = a;
}
Dimasik(const Dimasik& s) {
cout << "Dimasik() запуск конструктора копирования" << endl;
x =s.x;
y = s.y;
a = s.a;
}
~Dimasik() {
cout << x << " " << y << " " << a << endl;
cout << "~Dimasik() запуск деструктора" << endl;
}
};
class Papik {//композиция
protected:
Stasic s,*s2;
public:
Papik() {
cout << "Papik() запуск конструктора" << endl;
s = Stasic();
s2 = new Stasic();
}
Papik(int x, int y, int x1, int y1) {
cout << "Papik() запуск конструктора с параметром" << endl;
s = Stasic(x, y);
s2 = new Stasic(x1, y1);
}
Papik(const Papik& p) {
cout << "Papik() запуск конструктора копирования" << endl;
s =Stasic((p.s));
s2 =new Stasic(*(p.s2));
}
~Papik() {
delete s2;
cout << "~Papik() запуск деструктора" << endl;
}
};
int main()
{
setlocale(LC_ALL, "rus");
{
Stasic s;
Stasic s2(5, 9);
Stasic s3(s2);
}
cout << " " << endl << endl << endl;;
{
Stasic* s = new Stasic;//создание динамических переменных
Stasic* s2 = new Stasic(5, 9);
Stasic* s3 = new Stasic(*s2);
//Stasic* d = new Stasic(5, 9);
//Stasic* d2 = new Stasic(5, 9);
s->move(5, 1);//запуск методов
s2->after();
delete s;//работа деструктора
delete s2;
delete s3;
//delete d;
//delete d2;
}
cout << " " << endl << endl << endl;
{
Dimasik* s1 = new Dimasik();
Dimasik* s = new Dimasik(7, 3, 10);
Dimasik* s2 = new Dimasik(*s);
// Stasic* s3 = new Dimasik(7, 3, 10);//помещение объектов в переменные разных типов
delete s;
delete s1;
delete s2;
// delete s3;
}
cout << " " << endl << endl << endl;;
{
Papik* s = new Papik;
Papik* s2 = new Papik(3, 5, 1, 1);
Papik* s3 = new Papik(*s);
delete s;
delete s2;
delete s3;
}
_getch();
return 0;
}