Deprecated: mysql_connect(): The mysql extension is deprecated and will be removed in the future: use mysqli or PDO instead in /home/studb20/public_html/index.php on line 4
 2.5.1 Протокол опису класу - Програмування С, С++теорія та практика (частина 2) - Studbook

Програмування С, С++теорія та практика (частина 2)

2.5.1 Протокол опису класу

Протокол опису класу - опис ідентифікатору класу (типу) із вказівкою елементів-даних (тетеЬег іїаіа) та повідомлень або елементів-функцій (тетеЬег/ипєґіоп), які об’єкт обробляє. Елементи- дані - це такі ж звичайні змінні, як елементи структури, елементи- функції - це функції, визначені в рамках класу, що можуть працювати лише з елементами-даними цього класу. Усі оголошення даних та повідомлень повинні знаходитися всередині протоколу класу (оголошення):

Синтаксис:

СІ855 <ім'я> {

[ ргіуаїе : ]

[ <опис прихованих елементів> ]

[ ргоїесїеС :

<опис захищених елементів> ]

[ риЬІіс :

<опис доступних елементів> ]

};

Приклад опису класу роіпі (представлення точки на площині) за допомогою іігисі : з'Ьгис'Ь роіп£

{  // опис класу за допомогою зЬгисЬ

рг^а^е: / / специфікатор доступу

іп£ х,у;      // приховані елементи-дані

риЬ1іс: / / специфікатор доступу

VОій. зе^х(іп^ х);// далі-відкриті елементи-функції VОій. зе£у (іп£ у) ; іп£ де£х() ; іп£ де£у () ;

};

Наведемо приклад опису класу за допомогою сіам :

сіазз Ііпе {

// по замовчанню - рг^а^е елементи іп£ х1, у1, х2, у2;

риЬІіс:

Ііпе(іпї х1,іп£ у1,іп£ х2,іп£ у2);

Vоій. зЬом () ;

~1іпе () ;

} ;

В даному прикладі оголошується клас для представлення відрізка на площині. В цьому класі передбачено чотири приховані елементи- змінні х1,у1,х2,у2, конструктор Ііпе(іпі х1,іпі у1,іпі х2,іпі у2); , деструктор ~1іпе() та метод уоій 8коч>();.

Будь-яка змінна, оголошена (визначена) у класі, має область видимості класу (сІам хсоре), що простягається з місця її опису до закінчення протокольного опису класу. Даними-членами класу можуть бути змінні будь-якого типу, включаючи інші класи, покажчики на типи об’єктів класів тощо. Проте існують обмеження на використання елементів-даних.

Елементи-дані :

1.       можуть мати будь-який тип, окрім типу цього ж класу (але можуть бути покажчиками або посиланнями на цей клас);

2.       можуть бути описані з модифікатором соті, при цьому вони ініціалізуються тільки один раз (за допомогою конструктора) і не можуть змінюватися;

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

4.       ініціалізація полів при описі не допускається.

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

Приклад 1 (визначення функцій-членів в протоколі опису класу): с1азз 1іпе {

іп£ х1, у1, х2, у2; риЬ1іс:

1іпе(іп£ _х1,іп£ _у1,іп£ _х2,іп£ _у2)

{

х1=_х1; у1=_у1; х2=_х2; у2=_у2;

}

VОІЙ зЬом()

{

}

~1іпе ()

{

}

};

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

Приклад 2 :

//1іпе.Ь с1азз 1іпе {

іп£ х1, у1, х2, у2; риЬ1іс:

1іпе(іп£ _х1, іп£ _у1, іп^ _х2, іп£ _у2);

VОій зЬом();

VОій тоVе(іп^ х,іп£ у);

~1іпе () ;

};

// 1іпе.срр #іпс1ийе "1іпе.Ь"

1іпе::1іпе(іп£ _х1,іп£ _у1,іп£ _х2,іп£ _у2)

{

х1=_х1; у1=_у1; х2=_х2; у2=_у2;

VОіС 1іпе::тоVе(іп■Ь х,іп£ у)

{

х1+=х;

у1+=у;

х2+=х;

у2+=у;

}

З вищенаведеного прикладу 1 випливає, що немає необхідності включати ім’я класу в ім’я елемента-функції при визначенні її у протокольній частині опису класу. Однак треба визнати, що поза протоколом така вказівка обов’язкова (див. приклад 2) - тут ми застосовуємо операцію розв’язання видимості :: (зсоре гезоіиііоп орегаіог), вказуючи належність до конкретного класу (наприклад, уоій ііпе::тоуе(іпі х, іпі у) ). Функція тоуе(іпі х, іпі у) без імені класу буде звичайною зовнішньою функцією. До речі, вона може бути описана як зовнішня і таким чином - ::тоуе(іпі х, іпі у), коли є декілька функцій з однаковими іменами, як у наступному випадку:

//визначення зовнішньої функції тоVе()

VОІС тоVе(іп■Ь х, іп£ у) {

// ...

}

с1азз 1іпе {

іп£ х1, у1, х2, у2; риЬ1іс:

// визначення функції класу тоVе()

VОІС^ тОVе(Іп■Ь х,іп£ у) {

// ...

}

VОІС зе^(іп^ х, іп£ у) {

тоVе(x,у);      // 1іпе::тоVе(x,у)

::тоVе(x,у);    // зовнішня ::тоVе(x,у);

}

};

 

21