- •Об'єктно-орієнтоване
- •Класи і об'єкти
- •Дані об'єкту (змінні об'єкту,члени-дані)
- •Методи класу
- •Властивості
- •Приклад: Трикутник
- •class Point
- •Найважливіші принципи ООП
- •Абстракція даних
- •Інкапсуляція
- •class IntStack
- •Спадкоємство
- •class Plane
- •Поліморфізм
- •class Shape
- •Приклад
- •Розміщення класів в різних файлах
- •date.h
- •Обмеження доступу до даних і методів
- •Публічні (public) поля класу
- •Закриті (приватні)
- •Захищені поля класу
- •class Date
- •Посилання на себе
- •class ListItem
- •Константні методи
- •Коли виникає необхідність в константних методах
- •class IntArray
- •Мінливі (mutable) дані класу
- •class VeryComplexShape
- •Ініціалізація екземпляра
- •class Date
- •Конструктор
- •Ініціалізація даних екземпляра класу
- •Списки ініціалізації
- •class Foo
- •Деініціалізація екземпляра класу
- •class MyFile
- •Конструктор
- •Автоматично
- •Створення власного
- •Заборона
- •class CFile
Мінливі (mutable) дані класу
Дані класу, які все-таки потрібно змінювати з константних методів класу в С++ оголошуються з ключовим словом mutable
Користуватися цією можливістю слідує акуратно, чітко усвідомлюючи, що навіть в цьому випадку константні методи не повинні змінювати стан об'єкту
Під станом об'єкту тут розуміється інформація про нього, доступна за допомогою прилюдних
методів
class VeryComplexShape
{
public:
VeryComplexShape()
{
m_areaInitialized = false;
}
double GetArea()const
{
if (!m_areaInitialized)
{
// обчислюємо площу фігури (завдання вимагає тривалих обчислень)
m_areaInitialized = true;
…
}
return m_area;
}
void ModifyShape(...)
{
m_areaInitialized = false; // ...
}
private:
mutable bool m_areaInitialized;
mutable double m_area;
};
Ініціалізація екземпляра
класу
Для ініціалізації стану об'єкту у момент його створення існує спеціальна функція - конструктор
Конструктор має те ж ім'я, що і ім'я класу
Тип повертаного значення для конструктора не вказується (навіть void)
Конструктор викликається у момент створення екземпляра класу (оголошення змінній класу або виклик оператора new)
Клас може мати декілька конструкторів, що надають різні способи ініціалізації об'єкту
class Date
{
public:
Date(int day, int month)
{
m_day = day; m_month = month;
m_year = GetCurrentYear();
}
Date(int day, int month, int year)
{
m_day = day; m_month = month; m_year = year;
}
private:
int m_day, m_month, m_year;
};
Конструктор
за умовчанням
Конструктор, що не має параметрів, називається конструктором за умовчанням
Поля даних в такому конструкторі ініціалізувалися значеннями за умовчанням
Створювати такий конструктор або не створювати - залежить від конкретного завдання
Ініціалізація даних екземпляра класу
Як дані класу можуть виступати інші класи
Їх ініціалізація здійснюється ДО виконання тіла конструктора
Для їх ініціалізації викликаються конструктори за умовчанням
Якщо таких немає, програміст повинен використовувати списки ініціалізації
Списки ініціалізації
Застосовуються для ініціалізації полів класу в конструкторі ДО виконання його тіла
Використання списків ініціалізації - єдине рішення у разі, коли клас містить усередині себе
поля, що є класами без конструкторів за умовчанням
константи
посилання
class Foo |
|
public: |
|
|
|
||
|
|
||
|
|
||
{ |
|
Bar() :m_foo(3, 5) |
|
|
|||
|
|||
public: |
|
{ |
|
|
|
||
|
|
||
|
|
||
Foo(int i, int j = 0) |
|
} |
|
|
|
||
|
|
||
:m_i(i) |
|
Bar(int i, int j) |
|
|
|||
|
|||
|
|||
,m_j(j) |
|
:m_foo(i, j) |
|
|
|
||
|
|
||
{ |
|
{ |
|
|
|
||
|
|
||
|
|
||
} |
|
} |
|
|
|
||
|
|
||
private: |
|
private: |
|
|
|
||
|
|
||
int m_i, m_j; |
|
Foo |
m_foo; |
|
|||
|
|||
}; |
|
}; |
|
|
|
||
|
|
||
|
|
class Bar
{
Деініціалізація екземпляра класу
В ході своєї роботи об'єкт може використовувати певні системні ресурси
Динамічна пам'ять, відкриті файли, мережеві з'єднання і тому подібне
Для звільнення цих ресурсів служить особливий метод класу - деструкція
Ім'я деструкції збігається з ім'ям класу, лише перед ним вказується символ ~ (тильда)
Дана функція викликається автоматично при знищенні екземпляра класу:
Вихід за межі блоку, в якому оголошений екземпляр класу
Виклик оператора delete або delete []
class MyFile
{
public:
MyFile():m_pFile(NULL) {}
~MyFile()
{
Close();
}
bool Open(const char *fileName)
{
Close();
m_pFile = fopen(fileName, “r”); return m_pFile != NULL;
}
void Close()
{
if (m_pFile){fclose(m_pFile); m_pFile = NULL;}
}
private:
FILE *m_pFile;
};