Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
+ООП_Навч_посібник.doc
Скачиваний:
7
Добавлен:
01.07.2025
Размер:
6.58 Mб
Скачать

21.5. Застосування до функцій-членів класу модифікаторів const і mutable

Функції-члени класу можуть бути оголошені з використанням модифікатора const. Це означає, що з покажчиком this у цьому випадку необхідно звертатися як з const-покажчиком. Іншими словами, const-функція не може модифікувати об'єкт, для якого вона викликана. Окрім того, const-об'єкт не може викликати не const-функцію|-члена класу. Але const-функцію|-члена можуть викликати як const-, так і не const-об'єкти.

Константна (const-) функція-член класу не може модифікувати об'єкт, який її викликав.

Щоб визначити функцію як const-члена класу, використовується формат, який представлено у наведеному нижче прикладі:

class aType { // Оголошення класового типу

int some_var;

public:

int fun_1() const; // const-функція-член

};

Як бачите, модифікатор const розташовується після оголошення переліку параметрів функції.

Мета оголошення функції як const-члена класу – не допустити модифікацію об'єкта, який її викликає. Для розуміння сказаного розглянемо наведену нижче програму.

Код програми 21.10. Демонстрація механізму використання const-функцій-членів

// Ця програма не скомпілюється.

#include <iostream> // Для потокового введення-виведення

using namespace std; // Використання стандартного простору імен

class Demo {

int izm;

public:

int getIzm() const;

return izm; // Все гаразд

}

void setIzm(int x) const

{

izm = x; // помилка! }

};

int main()

{

Demo ob;

ob.setIzm(1900);

cout << ob.getIzm();

getch(); return 0;

}

Ця програма не скомпілюється, оскільки функцію setIzm() оголошено як const-член. Це означає, що їй не дозволено модифікувати той об'єкт, який її викликає. Її спроба змінити вміст змінної izm призводить до виникнення помилки. На відміну від функції setIzm(), функція getIzm() не намагається модифікувати змінну izm, і тому вона абсолютно прийнятна.

Можливі ситуації, коли потрібно, щоб const-функція могла змінити один або декілька членів класу, але ніяк не могла вплинути на інші. Це можна реалізувати за допомогою модифікатора mutable, який перевизначає атрибут функції const. Іншими словами, mutable-член може бути модифікований const-функцією-членом. Розглянемо такий приклад.

Код програми 21.11. Демонстрація механізму використання модифікатора mutable

#include <iostream> // Для потокового введення-виведення

using namespace std; // Використання стандартного простору імен

class Demo {

mutable int izm;

int jzm;

public:

int getIzm() const { return izm; // Все гаразд }

void setIzm(int x) const

{

izm = x; // тепер все гаразд

};

// Наступна функція не скомпілюється.

void setJzm(int x) const

{

jzm = x; // Це, як і раніше, неправильно!

};

}

int main()

{

Demo A_ob;

A_ob.setIzm(1900);

cout << A_ob.getIzm();

getch(); return 0;

}

У цій програмі закритий член-даних izm визначено з використанням модифікатора mutable, тому його можна змінити за допомогою функції setIzm(). Проте змінна jzm не є mutable-членом, тому функції setJzm() не дозволяється модифікувати його значення.