на тему рефераты Информационно-образоательный портал
Рефераты, курсовые, дипломы, научные работы,
на тему рефераты
на тему рефераты
МЕНЮ|
на тему рефераты
поиск
Побудова і використання класів
p align="left">ім'я_класу (фактичні_параметри_деструктора);

Перша форма допускається тільки при непорожньому списку фактичних параметрів. Вона передбачає виклик конструктора при визначенні нового об'єкта даного класу:

complex ss(10.3, 0.22); //ss.real = 10.3;

//ss.imag = 0.22;

complex ee(2.345); //ee.real = 2.345;

//ee.imag = 0.0 (за замовченням)

complex dd(); //помилка! Компілятор порахує, що це

//прототип функції без параметрів,

//який повертає значення типа complex

Інша форма явного виклику конструктора приводить до створення об'єкту, який не має імені. Створений таким чином об'єкт без імені можна використовувати у тих виразах, де можна використовувати об'єкт даного класу. Наприклад:

complex zz = complex (4.0, 5.0); //zz.real = 4.0; zz.imag = 5.0;

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

~ім'я_класу () {оператори тіла деструктора};

Назва деструктору в С++ завжди починається з символа тильда «~», за яким без пропусків та інших роздільних знаків поміщується ім'я класу. У деструктора не може бути параметрів (навіть типу void). Деструктор не має повертає мого значення (навіть типу void). Виклик деструктора виконується неявно, автоматично, як тільки об'єкт класу знищується. [3]

1.4. Особливості розробки класів мовою С++

У відповідності до синтаксису мови С++ кожний компонент класу має статус доступу. Таких статуси три: загальнодоступний (public), власний (private) та захищений (protected). За специфікаторами доступу (public, private, protected) йде двокрапка. Дія специфікаторів на компоненти класу починається з моменту написання до нового специфікатора або до кінця описання класу.

Специфікатор доступу private використовується для завдання статусу доступу до елементів даних класу, що дозволяє вирішити проблему захисту даних. Власні дані становляться доступними тільки для методів свого класу. Специфікатор доступу public часто використовується для завдання загальнодоступного доступу методів класу, які організують зв'язок об'єкта даного класу з зовнішнім світом. Статус захищений (protected) використовується в класах при використанні механізму успадкування класів. При відсутності успадкування специфікатор protected еквівалентний специфікатору private.

Усі компоненти класу, введені за допомогою ключових слів struct і union є за замовченням загально ступними, а за допомогою ключового слова class - власними, тобто недоступними для зовнішніх викликів. Для заміни статусу доступу компонентів класу, описаних за допомогою ключових слів class та union, необхідно використовувати специфікатори доступу. Класи, описані за допомогою ключового слова union, не можуть використовуватися як базові класи при успадкуванні. У об'єктів, об'явлених на основі подібного класу, для елементів даних виділяється загальне місце в пам'яті. Статус компонентів у таких класів змінити неможна. [2]

Одним з найважливіших механізмів в С++ є механізм успадкування. Успадкування в будь-якій сучасній мові програмування виконує дві ролі: з одного боку, попереджає дублювання кодів, а з іншого - допомагає розвивати роботу в необхідному направленні. При успадкуванні обов'язково є клас-родитель та клас-нащадок. В С++ клас-родитель прийнято називати базовим, а клас-нащадок - похідним. Відносини між родительським класом та його нащадками називають ієрархією класів.

Простим (або одиночним) називається успадкування, при якому похідний клас має тільки одного родителя. Формально успадкування одного класу от іншого можна завдати наступною конструкцією:

Class ім'я_класу-нащадника: [модифікатор_доступу] ім'я_базового_класу

{тіло_класу}

Клас-нащадок успадковує структуру (всі елементи даних) та поведінку (всі функції-методи) базового класу. Модифікатор_доступу визначає доступність елементів базового класу в класі-нащадку. Квадратні дужки говорять о том, що цей модифікатор може бути відсутнім. Цей модифікатор називається модифікатором успадкування.

Існують чотири варіанти успадкування: клас від класу, клас від структури, структура від структури та структура від класу. В залежності від модифікаторів доступу при об'яві базового класу та при успадкуванні, доступність об'єктів базового класу із класів-нащадків змінюється.

В Таблиці 1 приведені усі варіанти доступності елементів базового класу в похідному класі.

Модифікатор в базовому класі

Модифікатор успадкування

Доступ в похідному класі

struct

class

public

відсутній

public

private

protected

відсутній

public

private

private

відсутній

недоступний

недоступний

public

public

public

public

protected

public

protected

protected

private

public

недоступний

недоступний

public

protected

protected

protected

protected

protected

protected

protected

private

protected

недоступний

недоступний

public

private

private

private

protected

private

private

private

private

private

недоступний

недоступний

Таблиця 1. Доступ до елементів базового класу в класах-нащадках.

Якщо у якості специфікатора доступу записано слово public, то таке успадкування називається відкритим. Відповідно, при використанні модифікатора protected маємо захищене успадкування, а слово private визначає закрите успадкування.

Також мова С++ підтримує механізм множинного успадкування. Тобто, один клас-нащадок може мати два та більше класів-родителів. Такий клас-нащадок буде успадковувати дані та методи з усіх класів-родителів відповідно до статусу доступу в класів-родителів. Множинне успадкування можна задати такою конструкцією:

Class ім'я_класу-нащадника: [модифікатор_доступу1] ім'я_базового_класу1,

[модифікатор_доступу2] ім'я_базового_класу2,

...

[модифікатор_доступуN] ім'я_базового_класуN

{тіло_класу}

[4]

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

· перевантаження функцій та операцій;

· віртуальні функції;

· узагальнені функції, або шаблони.

Перевантаження функцій та операцій можна визначити як статичний поліморфізм, тому що він підтримується на етапі компіляції. Віртуальні функції відносяться до динамічного поліморфізму, тому що він реалізується при виконанні програм.

В С++ дозволяється наявність декількох однойменних функцій, які виконують аналогічні дії над даними різних типів. Наприклад, в програмі визначені дві функції з прототипами:

int max(int, int);

float max(float, float);

В процесі компіляції програми при виклику функцій max() в залежності від типу та числа аргументів буде здійснюватися завантаження необхідного екземпляра функції. Цей механізм називається перевантаженням функцій.

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

+, -, *, /, =, <, >, +=, -=, *=, /=, <<, >>, <<=, >>=, ==, !=, <=, >=, ++, --, %, &, ^, !, ~, &=, ^=, |=, |, &&, ||, %=, [], (), new, delete

Не можуть бути перевизначені операції: . , .*, ?:, ::, sizeof.

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

тип_результату operator знак_операції (список_параметрів)

{оператори_тіла_операторної_функції}

Тут тип_оператора визначає тип повертає мого значення при виконанні перевизначеної операції; в круглих дужках задається список типів параметрів, при наявності яких у аргументів звернення до операції до операцій з даним знаком буде виконуватися перевантаження (виклик) саме цього екземпляру операції. [2]

Один з варіантів використання поліморфізму - віртуальні функції. Якщо при використанні віртуальної функції запит здійснюється з допомогою вказівника базового класу (або посилання), то С++ вибирає правильно перевизначену функцію у відповідному похідному класі, який зв'язаний з цим об'єктом.

Іноді функція-елемент визначається в базовому класі як віртуальна, але перевизначена в похідному класі. Якщо така функція-елемент викликається через вказівник похідного класу, то використовується версія похідного класу. Це не поліморфна поведінка.

Завдяки використанню поліморфних функцій та поліморфізму виклик функції-елемента може привести до різних дій, які залежать від типу об'єкту, який викликається. [5]

Як вже було сказано, механізм керування доступом дозволяє виділяти загальнодоступні (public), захищені (protected) та власні (private) компоненти класів. Захищені компоненти доступні всередині класу та в похідних класах. Власні компоненти локалізовані в класі та недоступні ззовні. З допомогою загальнодоступних компонентів реалізується взаємодія класу з будь-якими частинами програми. Проте, є ще одна можливість розширити інтерфейс класу. Це забезпечують дружні функції. За визначенням, дружньою функцією класу є функція, яка не будучи його компонентом, має доступ до його захищених та власних компонентів. Функція не може стати другом класу «без його згоди». Для отримання прав друга функція повинна бути описана в тілі класу із специфікатором friend. Саме при наявності такого опису клас дає функції права доступу до захищених та власних компонентів.

Приклад роботи класу з дружньою функцією.

#include <conio.h> //для консольних функцій у текстовому режимі

//клас «символ у заданій позиції екрану»

class charlocus

{

int x, y; //координати місця символу на екрані

char cc;

//прототип дружньої функції для заміни символу

friend void friend_put (charlocus*, char);

public:

charlocus (int xi, int yi, char ci) //конструктор

{

x = xi;

y = yi;

cc = ci;

}

void display (void) //вивести символ на екран

{

gotoxy(x, y);

putch(cc);

}

}

//дружня функція заміни символа в конкретному об'єкті

void friend_put(charlocus *p, char c)

{

p -> cc = c;

}

void main()

{

charlocus D(20, 4, `d'); //створити об'єкт

charlocus S(10, 10, `s'); //створити об'єкт

clrscr(); //очистити екран

D.display(); getch(); S.display(); getch();

friend_put(&D, `*'); D.display(); getch();

friend_put(&S, `#'); S.display(); getch();

}

Програма послідовно виводить на екран d (в позицію 20, 4), s в позицію (10, 10), * (в позицію 20, 4), # (в позицію 10, 10).

Страницы: 1, 2, 3, 4



© 2003-2013
Рефераты бесплатно, курсовые, рефераты биология, большая бибилиотека рефератов, дипломы, научные работы, рефераты право, рефераты, рефераты скачать, рефераты литература, курсовые работы, реферат, доклады, рефераты медицина, рефераты на тему, сочинения, реферат бесплатно, рефераты авиация, рефераты психология, рефераты математика, рефераты кулинария, рефераты логистика, рефераты анатомия, рефераты маркетинг, рефераты релиния, рефераты социология, рефераты менеджемент.