Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
OOP_Посібник (1).doc
Скачиваний:
8
Добавлен:
01.05.2019
Размер:
544.77 Кб
Скачать

§10. Бінарні й унарні операції

Бінарна операція може бути визначена як функція-член, що одержує один параметр або як функція-друг, що одержує два параметри. Таким чином, для будь-якої бінарної операції @ aa@bb може інтерпретуватися як aa.operator@(bb), чи як operator@(aa,bb). Якщо визначені обидві операторні функції, то запис aa@bb є помилкою. Унарна операція, префіксна чи постфіксна, може бути визначена як функція-член, що не одержує параметрів, або як функція-друг, що одержує один параметр. Таким чином, будь-яка унарна операція @ aa@ чи @aa може інтерпретуватися як aa.operator@() або як operator@(aa). Якщо визначена і те, і інше, то і aa@, і @aa є помилками.

Приклад 13:

class X {

// друзі

friend X operator-(X); // унарний мінус

friend X operator-(X,X); // бінарний мінус

friend X operator-(); // помилка: немає операндів

friend X operator-(X,X,X); // помилка: тернарна операція

// члени (з неявним першим параметром: this)

X* operator&(); // унарне & (узяття адреси)

X operator&(X); // бінарне & (логічне множення і)

X operator&(X,X); // помилка: тернарне

};

Коли операції ++ і -- перезавантажуються, префіксне і постфіксне їх використання залежить від програміста.

§11. Створення класів з підкласами. Агрегація

Використання класу або його різновидності – структури всередині іншого класу називається контейнеризацією (агрегецією).

Розглянемо приклад контейнеризації для реалізації стеку, який буде зберігати будь-які типи даних.

Приклад 14:

//: Stack.h

#ifndef STACK_H //якщо не визначена директива STACK_H

#define STACK_H // визначаємо її

class Stack { // об’ява класу Stack

struct Link { // структура, яка об’явлена в класі

void* data;

Link* next;

Link(void* dat, Link* nxt);

~Link();

}* head;

public:

Stack();

~Stack();

void push(void* dat);

void* peek();

void* pop();

};

#endif // кінець визначення директиви STACK_H

//: Stack.cpp

#include "Stack.h"

Stack::Link::Link(void* dat, Link* nxt) {

data = dat;

next = nxt;

}

Stack::Link::~Link() { }

Stack::Stack() { head = 0; }

void Stack::push(void* dat) {

head = new Link(dat,head);

}

void* Stack::peek() {

return head->data;

}

void* Stack::pop() {

if(head == 0) return 0;

void* result = head->data;

Link* oldHead = head;

head = head->next;

delete oldHead;

return result;

}

Stack::~Stack() {

if (head == 0) { printf("Stack not empty");}

}

Надамо деякі пояснення до прикладу. Програма складається з двох файлів: файлу заголовку “Stack.h”, в якому знаходиться опис класу Stack, та файлу “Stack.cpp”, в якому знаходиться реалізація цього класу.

В класі Stack в приватній секції об’явлена структура Link, яка зберігає вказівник на об’єкт (змінна data) та вказівник на наступний елемент (змінна next); вказівник head, який вказує на структуру Link; конструктор Stack() та деструктор ~Stack().

Загальнодоступні функції-члени класу Stack:

  1. push для додавання об’єкта до стеку;

  2. peek для повернення об’єкта;

  3. pop для вилучення об’єкта із стеку.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]