Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Мет_2 часть_укр.doc
Скачиваний:
1
Добавлен:
09.11.2019
Размер:
938.5 Кб
Скачать

4.4. Методичні вказівки

  1. Всі операції над матрицями виконувати за допомогою функцій-членів класу.

  2. Програма має виводити на екран вихідні матриці й результати обчислень.

  3. У деяких варіантах в заголовку конструктора використати фіктивні параметри, які не беруть участь у побудові матриць, але служать розпізнаванню конструктора.

4.5. Зміст звіту

  1. Постановка завдання.

  2. Код програми.

  3. Скриншот з результатами роботи програми.

  4. Пояснення результатів і висновки.

5. Лабораторна робота 5. "Перезавантаження операторів. Дружні функції"

Ціль роботи: Створення й застосування дружніх функцій. Вивчення механізму перезавантаження операторів і застосування перезавантаження до операцій з комплексними числами, зокрема, до обчислення рядів функцій комплексного аргументу.

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

5.1.1. Дружні функції

Функції, що не є членами класу, можуть оперувати тільки з відкритими членами класу (з розділу public). Щоб забезпечити доступ до закритих членів класу (з розділу private), вводяться дружні функції або функції-друзі. Щоб зробити функцію "дружньою" класу, необхідно включити її прототип в оголошення класу із ключовим словом friend. Функція-член одного класу може бути friend-функцією іншого класу. Прототип дружньої функції записується в оголошення класів, з якими вона "дружить":

class t1 {

friend void a(); // функція-друг

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

};

class t2 {

friend int t1::b(); // функція-член класу t1 //має доступ до всіх закритих полів класу t2

};

Приведемо приклад, у якому визначений клас вектора й оголошена дружня функція, що обчислює суму елементів вектора:

#include <iostream.h>

const int N=5;

class Vector{

int j, a[N];

public:

Vector() { //Визначення конструктора

cout<<"Enter numbers\n";

for (j=0; j<N; j++)

cin>>a[j];

};

friend int sum(Vector); //Прототип функції-друга

};

int sum(Vector v){ //Визначення функції-друга

int s=0;

for (int j=0; j<N; j++) s+=v.a[j];

return s;};

void main(){

Vector v1;

//Звертання до функції-друга

cout<<"Sum of numbers: "<<sum(v1)<<endl;

};

Тут дружня функція sum(), не будучи членом класу Vector, забезпечує доступ до закритих членів класу, а саме до змінного a[j].

5.1.1. Перезавантаження операторів

У С++ можна перезавантажувати не тільки функції й конструктори класів, але й оператори. Значення оператора, що перезавантажується, визначається для конкретного класу. Наприклад, клас, що визначає матриці, може використати оператор «+» для додавання матриць, а оператор * – для їхнього множення. У якому-небудь іншому класі ці оператори можуть використовуватися для інших операцій. Оператори перезавантажуються й вибираються на підставі відповідності типів.

Можна перезавантажувати множину операцій С++:

+ - * / % ^ & | ~ !

= < > += -= *= /= %= ^= &=

|= << >> >>= <<= == != <= >= &&

|| ++ -і [] () new delete

Змінювати пріоритети операцій не можна. Також не можна змінювати синтаксис виразів, наприклад, визначити унарну операцію % або бінарну !.

5.1.2. Операторні функції для комплексних чисел

Оскільки операції мови C++ визначені лише для основних типів даних, для виконання операцій над комплексними числами зручніше за все визначити відповідний клас Complex. Тоді для двох змінних a і b, що є об'єктами класу Complex, будуть працювати очевидні операції додавання, віднімання, множення й ділення:

Complex c1=a+b, c2=a-b, c3=a*b, c4=a/b;

Оператори +, -, *, / є перезавантаженими. Кожний з них трактується як функція, для назви якої використається ключове слово operator і знак оператора, що перезавантажується:

<тип> operator <знак оператора> ([<параметри-операнди>]);

Наприклад,

Complex operator + (Complex a, Complex b)

Оголошення класу Complex і операторних функцій, необхідних для дій над комплексними числами, записуються у такий спосіб:

class Complex {

double Re, Im;

public:

//Конструктор за умовчанням (нульового числа)

Complex () { Re = 0; Im = 0; };

//Конструктор дійсного числа

Complex (double re) { Re = re; Im = 0; };

//Конструктор комплексного числа

Complex (double re, double im) { Re = re; Im = im; };

//Прототипи дружніх функцій

friend Complex operator + (Complex a, Complex b);

friend Complex operator + (double a, Complex b);

friend Complex operator + (Complex a, double b);

friend Complex operator - (Complex a, Complex b);

friend Complex operator - (double a, Complex b);

friend Complex operator - (Complex a, double b);

friend Complex operator * (Complex a, Complex b);

friend Complex operator * (double a, Complex b);

friend Complex operator * (Complex a, double b);

friend Complex operator / (Complex a, Complex b);

friend Complex operator / (double a, Complex b);

friend Complex operator / (Complex a, double b);

void show () {//Функція виведення комплексного числа

cout<<Re<<" "<<Im<<"i"; };

};

Тут кожний з операторів (+, -, * , /) перезавантажується для трьох можливих наборів операндів, з яких хоча б один є об'єктом класу Complex. Наприклад, перезавантажені оператори для додавання об'єктів записуються так:

Complex operator + (Complex a, Complex b) {

return Complex (a.Re + b.Re, a.Im+b.Im); };

Complex operator + (double a, Complex b) {

return Complex (a + b.Re, b.Im); };

Complex operator + (Complex a, double b) {

return Complex (a.Re + b, a.Im); };

Дружні функції введені для того, щоб можна було оперувати не тільки з об'єктами класу Complex, але й зі звичайними дійсними числами. Тому доцільно визначити операторну функцію + поза класом і оголосити ії дружньої.

Робота з об'єктами класу Complex у функції main може виглядати в такий спосіб:

Complex a (1, 2), b (4, -2.1);

a = a+b; a.show ();

b=b+5; b.show();