Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабораторний практикум.doc
Скачиваний:
0
Добавлен:
01.04.2025
Размер:
3 Мб
Скачать
☆

Лабораторна робота 13

Тема роботи: Програмування класів: конструктор, деструктор, перевантаження операторів

Мета роботи: Формування навиків роботи із класами з використанням перевантажених операцій, конструкторів та деструктора.

Для виконання роботи необхідно знати:

  • опис класу;

  • доступ до відкритих та закритих членів класу;

  • поняття конструктора, його призначення та опис;

  • поняття деструктора, його призначення та опис;

  • перевантаження операцій та їх опис.

Теоретичні відомості

Конструктор – це функція-метод класу з таким самим ім’ям, як у класу. Він призначений для створення та ініціалізації об’єктів класу та при­своєння початкових значень їх полям. В класі може бути виз­начено кілька конструкторів, які відрізняються списком параметрів. При ство­ренні об’єктів класу викликатися буде (перевантаження конструктора) конструктор із відповідною кількістю та типом вхідних параметрів. Конструктор може мати вхідні параметри, а може їх і не мати. Конструкт­тор, який не має вхідних параметрів називається конструктором за замов­чуванням.

Клас може і не мати конструктора у явному вигляді. Тоді розподіл пам’яті та ініціалізація об’єкту виконуються системою автоматично стан­дартним шляхом. Стандартна процедура не враховує особливостей класу, тому може бути некоректною і приводити до помилок в роботі програми.

Деструктор – це функція-метод класу, яка відповідає за коректне вивільнення пам’яті при знищенні об’єкту. Деструктор завжди має ім’я класу, перед яким ставиться символ „~”. Якщо деструктор у програмі не визначено, то він генерується на етапі компіляції програми автоматично. Локальні об’єкти видаляються деструктором тоді, коли вони виходять за межі області видимості, о глобальні об’єкти – по завершенні роботи функції main(). Деструктор, при необхідності, може виконувати і будь-які інші дії – вивід кінцевих значень елементів даних чи текстових повідомлень при налагодженні програми.

Конструктори і деструктори не можуть повертати значень і тому при їх описі відсутній тип результату (див. приклад №1).

В С++ визначено ряд операцій (+, - , * , / і. т.д.) при роботі зі змінними стандартних типів. Перевантаження операторів дозволяє призначити відповідні операції при їх використанні до елементів-членів власного класу. Компілятор відрізняє різні функції за числом і типом параметрів і операндів. Основними перевантаженими операціями є: +; -; *; /; %; =; <; >; +=; -=; *=; /=; <; >; &&; ||; ++; --. При цьому перевантажена операція є членом класу і може вико­рис­товуватися тільки у виразах із об’єктами свого класу.

Для перевантаження операції в середині класу необхідно написати відповідні функції-методи класу. Для визначення нової, перевантаженої дії, операції використовується ключове слово operator згідно наступ­ного синтаксису:

унарна операція:

void operator <символ оператора>() (префіксний оператор)

void operator <символ оператора>(int) (постфіксний оператор)

бінарна операція:

<тип> operator <символ оператора>(<тип1> <імя змінної>)

де:

<тип> - тип значення, що повертається операцією;

<символ оператора> - символ перевантаженої операції;

<тип1> - тип другого операнду (першим операндом є член класу);

<імя змінної> - ім’я змінної другого операнду.

Приклади унарних операцій:

префіксна операція збільшення дійсної частини комплексного числа на 1 може мати наступ­ний вигляд:

void operator ++();

. . . .

void complex::operator ++()

{

x++;

};

постфіксна операція зменшення уявної частини комплексного числа на 1 може мати наступний вигляд:

void operator ++(int);

. . . .

void complex::operator ++(int)

{

y--;

};

Приклади бінарних операцій:

операція додавання двох комплексних чисел:

complex operator +(complex );

. . . .

complex complex::operator +(complex a)

{

complex temp(0.);

temp.x=x+a.x;

temp.y=y+a.y;

return temp;

};

Операція додавання двох комплексних чисел з використанням вказівника this : вказівник на екземпляр об’єкту класу, для якого вико­нується метод. Він використовується для отримання доступу до самого об’єкту в тілі члена-функції без його додаткового оголошення. Наприклад:

complex operator +(complex );

. . . .

complex complex::operator +(complex a)

{

x=x+a.x;

y=y+a.y;

return *this;

};

Приклади операцій присвоєння:

операція присвоєння =

complex operator =(complex );

. . . .

complex complex::operator =(complex a)

{

x=a.x;

y=a.y;

return *this;

};

Примітка: якщо операція присвоєння не перевантажена явно, то по за­мов­чуванню у виразі x=y відбувається побайтове копіювання даних об’єкту y в дані об’єкту x.

операція присвоєння -=

complex operator -=(complex );

. . . .

complex complex::operator -=(complex a)

{

x-=a.x;

y-=a.y;

return *this;

};

Приклади логічних операцій:

операція порівняння двох комплексних чисел:

bool operator ==(complex);

. . .

bool complex::operator== (complex other)

{

if(m_re == other.m_re && m_im == other.m_im)

{

return true;

}

return false;

};