Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
О.О.П / ооп / 4_кол / Лекції / 17. Об'єктно-орієнтоване програмування, л.5.1 - 5.3.ppt
Скачиваний:
37
Добавлен:
30.05.2020
Размер:
871.94 Кб
Скачать

Мінливі (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;

};