Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
9
Добавлен:
12.02.2016
Размер:
521.58 Кб
Скачать

Визначення простого класу має наступний вигляд:

class ім’я класу

{

закриті змінні і функції public:

відкриті змінні і функції

}список імен об’єктів ;

Природно, що список імен об’єктів може бути пустим.

Всередині визначення класу stack функції-члени ідентифікуються з допомогою своїх прототипів. Нагадаємо, що в мові C++ всі функції повинні мати прототип. Таким чином, прототипи є невід’ємною частиною класу. Прототип функції-члена, розміщеної всередині визначення класу, має той же зміст, що і прототип звичайної функції.

Кодуючи функцію-член класу, необхідно повідомити комп’ютеру, якому саме класу вона належить. Для цього перед її іменем слід вказати ім’я відповідного класу. Ось як, наприклад, визначаються функції push() з класу stack.

21/38

void stack::push(int i)

// Вставка елементу в стек

{

{

 

 

if(tos=SIZE)

переповнений \n”;

cout <<

“Стек

return;

}

stck(tos)=i;

tos++;

}

Оператор “::” називається оператором дозволу області видимості (scope resolution operator). Він повідомляє компілятору, що дана версія функції push() належить класу stack, тобто функція push() перебуває в області видимості класу stack.

Завдяки оператору дозволу області видимості компілятор завжди знає, якому класу належить кожна з функцій.

Посилаючись на член класу зовні, завжди слід вказувати конкретний об’єкт, якому цей член належить. Для цього використовується ім’я об’єкта, за яким слідує оператор “.” і ім’я члена. Це правило стосується як до даних-членів, так і до функцій-членів. Ось як, наприклад, викликається функція init(), яка належить об'єкту stack1.

22/38

stack stack1, stack2;

stack1.init();

В цьому фрагменті створюються два об’єкти - stack1 і stack2, а потім об’єкт stack1 ініціалізується з допомогою функції init(). Зверніть увагу на те, що змінні stack1, stack2 представляють собою два різних об’єкти. Таким чином, ініціалізація об’єкту stack1 не означає ініціалізації об’єкту stack2. Об’єкти stack1, stack2 пов’язує лишень те, що вони є екземплярами одного і того ж класу.

Всередині класу функції-члени можуть викликати одна одну і звертатись до змінних-членів, не використовуючи оператор “.”. Цей оператор необхідний лише тоді, коли звертання до функцій і змінних-членів відбувається ззовні класу.

23/38

Розглянемо завершену програму, в якій визначається клас stack.

#include <iostream.h> using namespace std;

#define SIZE 100

// Визначення класу stack class stack {

int stck[SIZE]; int tos;

public:

void init();

void push (int i); int pop();

};

void stack::init();

Ініціалізація стеку

{

 

tos=0;

 

}

 

void stack::push(int i)

Вставка нового елементу

{

 

24/38

if(tos==SIZE) {

cout << “Стек повний \n”; return;

}

stck(tos)=i;

tos++;

}

 

 

int stack::pop()

 

Вивід елемента зі стеку

{

{

 

if(tos==0)

 

cout <<

Стек пустий \n”;

return 0;

 

 

}

 

 

tos--;

 

 

return stck(tos);

 

}

 

 

int main()

 

 

{

 

 

stack stack1, stack2;

/*creation of 2 objects type stack */

stack1.init();

stack2.init();

25/38

stack1.push(1);

stack2.push(2);

stack1.push(3);

stack2.push(4);

cout << stack1.pop() << “ “; cout << stack1.pop() << “ “; cout << stack2.pop() << “ “; cout << stack2.pop() << “\n“;

return 0;

}

Результати роботи програми показано нижче:

3 1 4 2

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

Наприклад, в попередньому прикладі оператор

stack1.tos = 0; /* Помилка, змінна tos є закритою */

не можна було б помістити в функцію main(), оскільки змінна tos є закритим членом об’єкта stack1.

26/38

Ввід і вивід для типу, визначеного користувачем (перевантаження операторів)

Розглянемо процедуру перевантаження операторів вводу-виводу (“>>” і “<<”) для обєктів, визначених користувачем.

Оператор виводу “<<” називається оператором вставки (insertion operator), тому, що він вставляє символи в потік. Аналогічно, оператор вводу “>>” називають оператором видобування (extraction operator), тому що він вибирає символи з потоку. Функції, які перевантажують оператори вставки і видобування називають функціями вставки (inserters) і видобувавння (extractors) відповідно.

Створимо клас two_d для роботи в декартовій площині. Загальна форма первантаженого оператора вводу (видобування) така:

istream & operator >> (istream any_stream, class_name & object) { return any_stream;} // програма вводу користувача

Перший параметр мусить бути посиланням до об’єкта типу istream. Другий параметр також посилання. Це необхідно, тому що змінні класу class_name може бути змінена. Функція повертає посилання на об’єкт типу istream.

27/38

Загальнийй вивід (вставка) для типу користувача будується подібним чином:

ostream & operator << (ostream & any_stream, class_name object) { return any_stream; } // програма виводу користувача

Нижче наведена програма, що демонструє ввід і вивід для типу two_d визначеного користувачем:

#include<iostream.h>

#include<conio.h> class two_d

{int x,y; public:

two_d (int a, int b) {x=a; y=b;}

friend ostream & operator <<(ostream & stream, two_d obj); friend istream & operator >>(istream & stream, two_d & obj); };

ostream &operator << (ostream &stream, two_d obj)

{stream << obj.x << "\n";

stream << obj.y << "\n"; return stream;

}

istream &operator >> (istream &stream, two_d & obj) { cout << "Enter x,y coordinates: " << "\n";

28/38

stream >> obj.x >> obj.y; return stream;

}

int main (void)

{clrscr ();

two_d a(1,2);

/* Елемент класу задається константою */

cout

<<

"First result:" << "\n";

cout

<<

a;

 

cin >> a; /* Елемент класу ввід. через перевантажений оператор cin */ cout << "Second result:" << "\n";

cout << a; getch (); return 0;

}

Результат:

First result:

Second result:

1

3

2

4

Enter x,y coordinates:

 

3

 

4

 

29/38

3. Приклади програм

Наведемо приклад типової програми для виконання лабораторної роботи. Необхідно створити певний клас і використовуючи одну із різновидностей поліформізму – перегрузку функцій, використати одну і ту ж функцію як для вводу даних, так і для їх виводу. Дана програма реалізує створення класу для роботи з точками тривимірного простору. Створюється клас three_d, а функція vvid_vyvid використовується одночасно як для вводу даних, так і для Їх виводу. Ввід-вивід даних реалізується просто, з використанням стандартних функцій cin, cout, не використовуючи вводу-виводу для типу, визначеного користувачем.

#include<iostream.h>

#include<conio.h> class three_d

{

private:

float a, b, c; public:

void vvid_vuvid() /* Функція виводу */

{

cout<<"\t"<< a <<","<<b<<","<<c;

}

30/38

Соседние файлы в папке ТА_Методички