Public://відкриті функції-члени і дані-члени

Віртуальна функція (virtual function) є членом класу. Вона оголошується всередині базового класу і перевизначається у похідному класі. Для того, щоб функція стала віртуальною, перед оголошенням функції ставиться ключове слово virtual. Віртуальна функція може викликатися так само, як і будь-яка інша функція-член. Однак найбільш цікавий виклик віртуальної функції через вказівник, завдяки чому підтримується динамічний поліморфізм. Якщо клас, що містить віртуальну функцію, успадковується, то в похідному класі віртуальна функція перевизначається. перевантажена функція повинна відрізнятися типом і/або кількістю параметрів, а перевизначена віртуальна функція повинна мати такий самий тип параметрів, кількість параметрів, і такий самий тип значення, що повертається. Коли у віртуальної функції базового класу відсутня значима дія, то в будь-якому класі, похідному від цього базового, така функція обов’язково повинна бути перевизначена. Для реалізації цього положення в С + + підтримуються так звані чисті віртуальні функції Якщо клас містить хоча б одну чисто віртуальну функцію, то про нього говорять як про абстрактний клас (abstract class). Оскільки в абстрактному класі міститься, принаймні, одна функція, у якої відсутнє тіло функції, технічно такий клас неповний, і жодного об’єкта цього класу створити не можна. Таким чином, абстрактні класи можуть бути тільки успадкованими. Родова функція визначає базовий набір операцій, які будуть застосовуватиь до різних типів даних. template <class Фтип> повернене__знаення ім’я_функції (список_параметрів) { //Тіло функції} На додаток до родових функцій можна визначити і родові класи. При цьому створюється клас, в якому визначені всі необхідні алгоритми, а фактичні типи даних задаються в якості параметрів пізніше, при створенні об’єктів цього класу. template <class Фтип> class ім’я_класу { //…} 10. Динамічна ідентифікація типу не характерна для мов програмування, в яких не підтримується поліморфізм. Інформацію про тип об'єкта отримують за допомогою оператора typeid. Для використання оператора typeid в програму необхідно включити заголовок <typeinfo>. Нижче представлена основна форма оператора typeid:

Typeid (об'єкт)

Тут об'єкт ‑ цей той об'єкт, інформацію про тип якого необхідно отримати.

10. Оператор dynamic_cast реалізує приведення типів в динамічному режимі, що дозволяє контролювати правильність цієї операції під час роботи програми. Якщо при виконанні оператора dynamic_cast приведення типів не відбулося, буде видано помилку приведення типів. dynamic_cast <тип> (вираз). Основне призначення оператора dynamic_cast полягає в реалізації операції приведення поліморфних типів.

12. Існує ще три оператори для динамічної ідентифікації типів. Нижче представлені їх основні форми:

 

const_cast <цільовий_тип> (вираз)

reinterpret_cast <цільовий_тип> (вираз)

statiс_саst <цільовий_тип> (вираз)

 

Тут цільовий_тип ‑ це тип, яким має стати тип параметри виразу після виконання операції приведення типів. Оператор const_cast при виконанні операції приведення типів виконується для явної підміни атрибутів const (постійних) і/або volatile (змінних). Оператор static_cast призначений для виконання операцій приведення типів над об'єктами неполіморфних класів. Оператор reinterpret_cast дає можливість перетворити вказівник одного типу в вказівник зовсім іншого типу.

13. Простір імен призначені для локалізації імен ідентифікаторів щоб уникнути конфліктів імен (name collisions). Ключове слово namespace шляхом оголошення іменованих областей дає можливість розділити глобальний простір імен. По суті, простір імен визначає область видимості. namespace ім'я {//Оголошення}. Все, що визначено всередині інструкції namespace, знаходиться всередині області видимості даного простору імен.

14. Функція перетворення (conversion function) перетворить об'єкт в значення, сумісний з іншим типом даних, який часто є одним з вбудованих типів даних С++. operator тип () {return значення;}

 Тут тип - це цільовий тип перетворення, а значення - це значення об'єкта після виконання перетворення.

15. Змінні-члени класу можна оголошувати як статичні (static). Використовуючи статичні змінні-члени, можна вирішити кілька непростих проблем. Якщо оголосити змінну статичною, то може існувати тільки одна копія цієї змінної - незалежно від того, скільки об'єктів цього класу створюється. Коли оголошується статичні дані-члени всередині класу, ви не визна чається їх. Визначити їх можна де-небудь поза класом.

16. Функції-члени класу можуть оголошуватися постійними(з ідентифікатором const). Якщо функція оголошена постійною, вона не може змінити об'єкт, який її викликає. class X {int some_var;public:int f1 () const; //постійна функція-член};. Модифікований член класу можна змінити за допомогою постійної функції-члена.

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

 

 

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

Функція не може стати другом класу “без його згоди”. Для одержання прав друга функція повинна бути описана в тілі класу.

Щоб оголосити функцію дружньою деякому класу, у визначення цього класу включають її прототип, перед яким ставиться ключове слово friend

19. . Шаблони дозволяють давати узагальнені, в значенні довільності типів даних, визначення функцій і класів, що використовуються. Тому їх часто називають функціями і класами, що параметризуються. Часто також використовуються терміни шаблонні функції і шаблонні класи.

Шаблон функціїє узагальненим визначенням функції, з якого компілятор автоматично створює представник функції для заданого користувачем типу (або типів) даних. template <class T1 | Т1 ідентифікатор1, class Т2 | Т2 ідентифікатор2,..., class Tn | Тn ідентифікаторn> тип ім’я_функції (список параметрів) { //тіло функції}

20. Шаблон класує узагальненим визначенням класу, що включає типи даних як параметри, з якого компілятор автоматично створює клас для заданих користувачем типів даних. Коли компілятор створює за шаблоном класу конкретний клас для певних користувачем типів даних, то говорять, що він створив породжений клас. У зв’язку з цією обставиною шаблон класу називають іноді родовим класом. template <class T1 ідентифікатор1, T2 ідентифікатор2,..., TN ідентифікаторN> class ім’я класу{ //тіло класу}.

Дуже часто шаблони використовуються для створення колекцій, тобто класів, що представляють з себе набір об'єктів одного і того ж типу.

 

21. Структура може бути представлена як деякий набір різнотипних і/або однотипних даних, сукупність яких розглядається як зовсім новий, користувацький тип даних. Структура оголошується за допомогою ключового слова struct. struct NewType

{typel Namel; type2 Name2;…typeN NameN;}; Наступний важливий момент - доступ до елементів структури. Щоб записати або прочитати дані структури, після імені об’єкта ставиться символ крапки (.), за яким випливає ім’я члена структури

22. Найчастіше в тіло функції необхіднопередати інформацію, структуровану по визначеному принципу. При цьому як параметр у прототипі функції вказується користувацький тип даних, сформований при оголошенні структури. struct ALLNUMB

{int nVar,long LVar; short shVar; unsigned int uiVar;};

прототип функції буде, наприклад, мати вигляд:

void Func(ALLNUMB);

23. Для визначення розміру структурованого об’єкта в пам’яті до нього застосовують оператор (або функцію) sizeof. Таким чином, окремий екземпляр структури House буде займати, наприклад, 64 байта:

int i = sizeof(HOUSE);

Однак дуже часто структури допомагають заощаджувати пам’ять завдяки використанню так званих бітових полів. У цьому випадку оголошення поля структури має вигляд: оголошення_поля : константний вираз;

де оголошення__поля - оголошення типу й імені поля структури:

константний__вираз визначає довжину поля в бітах.Тип поля повинен бути цілочисельним (int, long, unsigned, char). Оголошення_поля може бути відсутнім.

24. Об’єднання служить для розміщення в одній і тій же області пам’яті (по тому самому адресу) даних різних типів. Очевидно, що в окремий момент часу в пам’яті може знаходитися тільки один із зазначених при оголошенні об’єднання типів.

Оголошення об’єднання починається з ключового слова union, за яким слідує ідентифікатор і блок опису елементів різного типу, наприклад:

union MyData

{int iVarl ;unsigned long ulFreq;char Symb[10] ;}

25. Абстракція даних – це можливість визначати нові типи даних, з якими можна працювати майже так само, як і з основними типами даних. Такі типи даних часто називають абстрактними типами даних. Хоча термін “типи даних визначені користувачем” є більш точними.

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

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

26. Поняття класу є, мабуть, найважливішим в мові C++. Синтаксис опису класу схожий на синтаксис опису структури. Ось його основна форма:

class <ім’я_класу>

 {//Закриті функції-члени і дані-члени

//класу

public://відкриті функції-члени і дані-члени

//класу } <список_об’єктів>;

Не можна створити об’єкт не повністю визначеного класу. Спроба створення такого класу приводить до помилки компіляції.

27.

private : Дані-члени і функції-члени доступні тільки для функцій-членів цього класу.
protected: Дані-члени і функції-члени доступні для функцій-членів даного класу і класів,  похідних від нього.
public : Дані-члени і функції-члени класу доступні для функцій-членів цього класу і  інших функцій програми, в якій є представник класу.

 

28.

Відмінність Класи Структури Об’єднання
Ключове слово: class struct union
Доступ по замовчуванню: private public public
Перекриття даних: Ні Ні Так

 

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

30. Якщо в похідного класу є декілька базових класів, то таке успадкування називають множинним спадкуванням. Множинне спадкування дозволяє сполучити в одному похідному класі властивості і поводження декількох класів. специфікатор успадкованого доступу встановлює той рівень доступу, до якого знижується рівень доступу до членів, встановлений у базовому класі.

31. Специфікатор доступу при спадкуванні визначає рівень доступу до елементів базового класу, що одержують елементи похідного класу.

Специфікатор успадкованого доступу Доступ у базовому класі Доступ у похідному класі
Public (зовнішнє спадкування) Public Protected Private public protected недосту пні
Protected (захищене спадкування) Public Protected Private Protected Protected Недосту пні
Private (внутрішнє спадкування) Public Protected Private Private Private Недосту пні

 

32. У складній ієрархії класів при множинному спадкуванні може вийти так, що похідний клас непрямо успадкує два або більше екземпляри того самого класу. В такому випадку при компіляції виникнуть помилки. Щоб уникнути цієї неоднозначності, можна використовувати кваліфікацію імен, застосувавши операцію дозволу видимості.

 Уникнути повторного включення непрямого базового класу в похідний клас можна, давши вказівку компілятору використовувати віртуальний базовий клас. Це здійснюється за допомогою ключового слова virtual, що вказується перед специфікатором успадкованого доступу або після нього.

 

 

33. Віртуальні методи дозволяють програмувати дії, загальні для всіх похідних класів, в межах базового класу. Динамічно, під час виконання програми, буде викликаний метод потрібного конкретного класу

34. . Оголосили базовий клас Іtem, який представляє загальні властивості всіх одиниць зберігання в бібліотеці. Ряд методів базового класу не можуть бути реалізовані в ньому, а повинні бути реалізовані в породжених класах. Реалізація методу Name в базовому класі досить умовна, вона не має особливого сенсу. Було б набагато логічніше взагалі не реалізовувати цей метод в базовому класі, а залишити його на відповідальності похідних класів.

Клас можна зробити абстрактним, навіть якщо всі його методи визначені.

 

 

 

 

 


Дата добавления: 2018-05-12; просмотров: 390; Мы поможем в написании вашей работы!

Поделиться с друзьями:




Мы поможем в написании ваших работ!