Основы ООП. Различия функциональной и объектной декомпозиции. Мотивация введения ООП. Понятия класса и объекта.
Декомпозиция: Научный метод, использующий структуру задачи и позволяющий заменить решение одной большой задачи решением серии меньших задач.
Функциональная декомпозиция: Фокусировка на структурах данных и функциях их обработки.
Объектная декомпозиция: Фокусируется на объектах и их отношениях друг с другом.
ООП возникло в результате развития идеологии процедурного программирования, где данные и подпрограммы (процедуры, функции) их обработки формально не связаны.
Класс – это производный тип, введенный программистом на основе уже существующих типов. Механизм классов позволяет создавать типы, с наибольшей полнотой отображающие особенности решаемой задачи. Класс задает некоторую структурированную совокупность типизированных данных и позволяет определить набор операций над этими данными.
Объект - это конкретный экземпляр класса, располагающийся в памяти компьютера.
13. Основы ООП. Сравнение класса и структуры в С++. Модификаторыдоступаprivate, protected, public. Примеры.
Структура | Класс |
structbooks { intnomer; string name; string author; int page; int cost; books* next; }; | class books { public: intnomer; string name; string author; int page; intcost; books* next; }; |
Модификатор доступа public (открытый): К членам класса (функциям и данным), объявленным с модификатором public можно получить доступ из любого места программы.
Модификатор доступа private (закрытый): К членам класса (функциям и данным), объявленным с модификатором private можно получить доступ только из функций самого класса (а также из функций и классов друзей).
Модификатор доступа protected (защищенный): К членам класса (функциям и данным), объявленным с модификатором protected можно получить доступ только из функций самого класса, из функций потомков класса, (а также из функций‐друзей и классов‐ друзей).
Наследование – это использование ранее определенного класса. Язык С++ позволяет классу наследовать данные и функции члены одного или нескольких других классов. Другими словами, новый класс может получать атрибуты и поведение от уже существующего класса. Новый класс называют производным классом. Класс, элементы которого наследуются производным классом, называется базовым классом.
14. Основы ООП. Понятие инкапсуляции. Способы ее реализации в С++. Перегрузка операторов.
Инкапсуляция:
• Свойство языка программирования, позволяющее объединить и защитить данные и код в объект и скрыть реализацию объекта от пользователя (прикладного программиста). При этом пользователю предоставляется только спецификация (интерфейс) объекта.
• Пользователь может взаимодействовать с объектом только через этот интерфейс. Реализуется с помощью директив: public, private, protected.
• Пользователь не может влиять на работу объекта, кроме как через интерфейс. Реализуется с помощью использования закрытых данных и методов, значения которых берутся из открытого
интерфейса при создании объекта.
Примеринкапсуляции:
class Student
{
public:
voidsetName(constchar* name)
{
if (name != NULL &&strlen(name) < 80)
{
strcpy(_name, name);
}
}
constchar* getName()
{
return _name;
}
private:
char _name[80];
};
Пример использования класса:
Student s;
s.setName("Вася");
Перегрузка функций: Перегрузка (англ. «overloading») – возможность использования функций, имеющих одинаковые имена, но отличающихся друг от друга списком параметров (количеством и /или типом параметров).
Перегрузка операторов:
• Иногда возникает потребность описывать и применять к созданным программистом типам данных операции, по смыслу эквивалентные уже имеющимся в языке.
• Классический пример — библиотека для работы с комплексными числами. Они, как и обычные числовые типы, поддерживают арифметические операции, и естественным было бы создать для
данного типа операции «плюс», «минус», «умножить», «разделить», обозначив их теми же самыми знаками операций, что и для других числовых типов.
Перегрузка оператора присваивания:
Для класса Т1 оператор присваивания из типа Т2, являющийся членом класса, может иметь следующий вид.
Передача параметра по ссылке: T1&operator=(T2&source);
Передача параметра по значению: T1&operator=(T2 source);
Пример:
ClassMyInt
{
public:
MyInt&operator=(MyInt& source)
{
_value = source._value;
Return*this;
}
MyInt&operator=(int value)
{
_value = value;
Return*this;
}
private:
int _value;
};
MyInt a, b;
b = 25;
a = b;
15. Основы ООП. Конструкторы и деструкторы. Определения, примеры реализации. Перегрузка конструкторов.
Инициализация и де‐инициализация
• Для инициализации объекта класса используется специальная функция «конструктор класса»
• Для де‐инициализации класса используется специальная функция «деструктор класса»
Конструктор класса
• Функция - конструктор класса вызывается автоматически в момент создания экземпляра класса (объекта).
• Конструктор является хорошим местом для инициализации объекта.
• Имя функции конструктора должно совпадать с именем класса.
• Функция‐конструктор ничего не возвращает (даже void).
Деструктор класса
• Функция ‐ деструктор класса вызывается автоматически в момент перед разрушением экземпляра класса (объекта).
• Деструктор является хорошим местом для освобождения выделенных ресурсов (например, выделенной памяти).
• Имя функции деструктора должно начинаться с символа «тильда» ~, а в остальном совпадать с именем класса.
• Функция‐деструктор ничего не возвращает (даже void).
Пример конструктора и его перегрузки:
classbooks
{
public:
intnomer;
string name;
string author;
int page;
int cost;
books* next;
books()
{
nomer = 0;
name = "";
author = "";
page = 0;
cost = 0;
};
books(string name1, string author1, int page1, int cost1)
{
name = name1;
author = author1;
page = page1;
cost = cost1;
};
~books() {};
};
Примердеструктора:
class list
{
private:
books* start;
books* current;
books* tmp;
public:
list();
~list();
};
list::list()
{
start = NULL;
current = NULL;
tmp = NULL;
}
list::~list()
{
if (start != NULL)
{
while (start != NULL)
{
tmp = start->next;
delete start;
start = tmp;
}
}
if (tmp != NULL)
deletetmp;
}
16. Основы ООП. Решение задачи создания списочной структуры средствами ООП (задача о списке студентов).
class Student
{
public:
Student() // Конструктор
{
_id = 0;
_name = _T("");
_avgMark = 0;
}
~Student() {} // Деструктор
voidSetId(intn) // Записать "Номер"
{
if (n> 0)
_id = n;
}
intGetId() // Прочитать "Номер"
{
return _id;
}
voidSetName(string name) //ЗаписатьИмя
{
_name = name;
}
stringGetName() //ПрочитатьИмя
{
return _name;
}
voidSetMark(float n) // Записатьоценку
{
if (n > 0)
_avgMark = n;
}
floatGetMark() // Прочитатьоценку
{
return _avgMark;
}
void Print()
{
cout<< _id <<". "<< _name;
cout<<" ("<< _avgMark<<")"<<endl;
}
private:
int _id; //Номер
string _name; //Имя
float _avgMark; //Оценка
};
int _tmain(int argc, _TCHAR* argv[])
{
Student s1;
cout<<"Созданные элементы:\n";
s1.Print();
s1.SetId(1);
s1.SetName("Иван Петров");
s1.SetMark(75);
cout<<"\n\nЗаполненные элементы:\n";
s1.Print();
return 0;
}