asyan.org
добавить свой файл
1

ЛАБОРАТОРНА РОБОТА 3


Тема. Перевантаження операцій.

Мета роботи: засвоїти принципи перевантаження операцій.

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


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

1. Звичайний опис функції з назвою operator знак. Наприклад:
Point operator +(Point A, Point B)

{

// тіло функції

}
Тоді вираз A+B інтерпретується як operator +(A, B).

2. Опис у тілі класу методу з тією самою назвою. Тоді викликається метод для першого операнда, і йому як аргументи передаються інші операнди:
class Point

{

// тіло класу

Point operator +(Point p);

};
У цьому випадку вираз A+B інтерпретується як A.operator +(B).

Деякі операції — такі як =, new, delete, можна перевантажувати тільки другим способом.

Вказівник *this. Вираз *this означає об’єкт, для якого викликано функцію-член. Але це не звичайна змінна: неможливо отримати її адресу чи присвоїти їй якесь значення. У константній функції-члені класу Х this має тип const X* для упередження будь-яких модифікацій самого об’єкта.

Приклад виконання


Розглянемо клас String із лабораторної роботи 2 і наведемо приклад перевантаження стандартних операцій:

class String

{

public:

String(); // конструктор за замовчуванням

String(const String& s); // конструктор копіювання

String(const char* s); //конструктор з параметром

// const char*, який являє собою

//стандартний рядок s

~String(); // деструктор

const char* GetString(); // отримати s-рядок

String& operator =(const String& s); //перевантаження

//операції присвоювання

friend String operator +(const String& a, const String& b);

//визначимо функцію operator + як дружню, щоб вона могла

//працювати з private-полями.

private:

char* array; // масив символів

int size; // розмір масиву

};

String::String()

{

size=1;

array=new char[1];

array[0]=0;

}

String::String(const String& s)

{

size=s.size;

array=new char[size];

for(int i=0; i
}

String::String(const char* s)

{

size=1;

while(s[size-1]!=0) size++;

array=new char[size];

for(int i=0; i
}

String::~String()

{

delete[] array;

}

const char* String::GetString()

{

return array;

}

String& String::operator =(const String& s)

{

delete[] array;

size=s.size;

array=new char[size];

for(int i=0; i
return *this;

}

String operator +(const String& a, const String& b)

//перевантаження операції +

{

String s;

delete[] s.array;

s.size=a.size+b.size-1;

s.array=new char[s.size];

int i;

for(i=0; i
for(i=0; i
return s;

}

Виклик перевантажених операцій здійснюється так:

int main()

{ String a, b, c;

c=a+b;

//...

}

Порядок виконання роботи


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

Варіанти завдань


1. Операції: = (присвоювання)

+, – (поелементні математичні операції).

2. Операції: = (присвоювання)

+, – (поелементні математичні операції).

3. Операції: = (присвоювання)

== (перевірка на рівність масивів оцінок).

4. Операції: [ ] (одержання елемента масиву)

= (присвоювання масивів)

+, –, * (поелементні математичні операції).

5. Операції: = (присвоювання масивів)

+, –, * (поелементні математичні операції).

6. Операції: = (присвоювання).

7. Операції: = (присвоювання).

8. Операції: = (присвоювання).

9. Операції: = (присвоювання).

10. Операції: = (присвоювання).

11. Операції: = (присвоювання)

+ (об’єднання множин)

* (перетин множин)

– (різниця множин).

12. Операції: = (присвоювання)

+ (додавання одного тексту до іншого).