- •2.1 Елементи концепції ооп .. 20
- •1.1 Коментарі.
- •1.2 Прототипи функцій.
- •1.3 Операція розширення області видимості.
- •1.4 Оголошення в операторах.
- •1.5 Перегрузка функцій.
- •1.6 Значення формальних параметрів по замовчуванню.
- •1.7 Посилання та вказівники.
- •1.8 Специфікатор inline
- •1.9 Операції new та delete .
- •1.10 Вказівник на void.
- •1.11 Зв’язування із збереженням типів
- •1.12 Про структури та об’єднання.
- •2.1 Елементи концепції ооп.
- •2.3 Опис протоколу класу.
- •2.4 Передача повідомлень об’єктам.
- •3 Функції-члени.
- •3.1 Функції-члени в межах та за межами формального опису класу.
- •3.2 Про вказівник this.
- •3.3 Перевантаження функцій-членів. Параметри по замовчуванню.
- •4. Конструктори та деструктори.
- •4.1 Поняття про конструктори.
- •4.2 Деструктори.
- •4.3 Досягнення високої ефективності. Конструктор копіювання.
- •5 Глобальні та локальні об’єкти.
- •6 Статична пам’ять та класи.
- •7. Наслідування
- •7.1 Синтаксична реалізація наслідування
- •7.2 Правила доступу до полів даних
- •7.3 Конструктори та деструктори в похідних класах
- •7.4 Використання заміщуючих функцій-членів.
- •7.5 Похідні класи та вказівники.
- •7.6 Ієрархія типів
- •7.7 Множинне наслідування
- •8 Вiртуальнi функцiї та класи
- •8.1 Віртуальні функції.
- •8.2 Чисті віртуальні функції. Абстрактні класи.
- •8.3 Віртуальні деструктори.
- •8.4 Посилання як засіб для реалізації поліморфізму
- •8.5 Технічна реалізація механізму віртуальних функцій.
- •8.6 Віртуальні базові класи
- •8.6.1 Ієрархії класів та наслідування
- •8.6.2 Віртуальні базові класи
- •8.6.3 Виклик конструкторів та віртуальні базові класи.
- •9 Друзі
- •9.1 Дружні класи.
- •9.2 Дружні функції.
- •10 Перевантаження операторiв.
- •10.1 Перевантаження операторів. Загальний підхід.
- •10.2 Перетворення типів.
- •10.3 Перевантаження деяких операторів.
- •10.3.1 Оператор індексування масиву.
- •10.3.2 Перевантаження оператора виклику функції.
- •10.3.3 Оператор доступу до члена класу.
- •10.3.4 Перевантаження операторів інкремента та декремента.
- •10.3.5 Перевантаження операторів управління пам’яттю (new,delete).
- •10.3.6 Перевантаження оператора присвоювання.
- •11.1 Функціональні шаблони
- •11.1.1 Визначення та використання шаблонів функцiй.
- •11.1.2 Перевантаження шаблонiв функцiї.
- •11.1.3 Cпецiалiзованi функцiї шаблона.
- •11.2 Шаблони класів.
- •11.2.1 Визначення шаблонів класу
- •11.2.2 Константи та типи як параметри шаблону
- •11.2.3 Використання шаблонних класів
- •11.2.4 Спецiалiзацiя шаблонiв класу.
- •11.3 Шаблони та конфiгурацiя компiлятора.
- •11.3.1 Шаблони Smart.
- •11.3.2 Шаблони Global I External.
- •12.2 Переадресація вводу-виводу
- •12.3 Розширення потоків для типів кориcтувача
- •12.4 Операції роботи з потоком як дружні
- •12.5 Форматований ввід-вивід
- •12.5.1 Ширина поля
- •12.5.2 Заповнюючий символ
- •12.5.3 Число цифр дійсних чисел
- •12.5.4 Прапорці форматування
- •12.5.5 Маніпулятори
- •12.6 Стан потоку
- •12.7 Файловий ввід-вивід
- •12.7.1 Конструктори файлових потокiв
- •12.7.2 Вiдкриття файлу
- •12.8 Неформатований ввід-вивід
- •12.9 Деякі функції вводу-виводу
- •12.10 Форматування в пам’яті
- •13 Управління виключеннями
- •13.1 Виключення та стек
- •13.2.1 Синтаксис основних конструкцій
- •13.2.1.1 Використання try та сatch
- •13.2.1.2 Використання throw
- •13.2.2 Тип виключення та конструктор копії
- •13.2.3 Пошук відповідного типу виключення
- •13.2.4 Використання terminate() та некеровані виключення
- •13.2.5 Робота з специфікаціями виключень
- •13.2.6 Робота з непередбаченими виключеннями
- •13.2.7 Робота з конструкторами та виключеннями
- •13.2.8 Динамічні об’єкти
- •13.2.9 Передача значень з конструктора та деструктора
- •13.2.10 Робота з ієрархіями виключень
- •13.2.11 Робота з специфічними класами виключень
- •13.3 Структурне управління виключеннями
- •13.3.1 Використання кадрованого управління виключеннями
- •13.3.1.1 Синтаксис
- •13.3.1.2 Про функцію RaiseException()
- •13.3.1.3 Фільтруючий вираз
- •13.3.1.4 Перехоплення виключення процесора
- •13.3.2 Використання завершуючих обробників виключень
1.11 Зв’язування із збереженням типів
Відмітимо, що в ранніх версіях С++(до 2.0) в програму не можна було включати файли, написані на С. В С++ 2.0 був введений механізм зв’язування з збереженням типу, який дозволив використовувати С-функції в С++-програмах.
В С++ 2.0 всі імена функцій кодуються компілятором. Тому якщо програміст хоче використовувати С -функції, то вони повинні бути оголошеними наступним чином:
extern “C”
{
//визначення чи прототипи С-функцій
}
В цьому випадку компілятор не буде кодувати імена функцій на С, які поміщені в фігурних дужках.
Зручно робити наступним чином:
extern C
{
#include<stdio.h>
}
Це приведе до того, що всі прототипи функцій в stdio.h кодуватись не будуть. Програма на С++ в цьому випадку може використовувати одне чи більше імен функцій з <stdio.h> не боячись недопустимого перевантаження.
1.12 Про структури та об’єднання.
В С++ структури та об’єднання мають ряд нових властивостей. На відміну від ANSI C, полями структур та об’єднань можуть бути функції. Крім цього, структури та об’єднання мають інші властивості, які є аналогічними і для класів. (В літературі інколи класи, структури та об’єднання навіть розглядають разом, див.[5]). Структури та класи відрізняються лише тим, що члени класу по замовчуванню мають режим доступу private, а члени структури - public.у Деякі відмінності мають об’єднання. В об’єднаннях не допускаються ключові слова private, public та protected . Об’єднання не можуть брати участь в механізмі наслідування. В С++ допускаються неіменовані об’єднання:
union{список членів};
Вони визначають об’єкт, а не тип. Імена членів такого об’єднання повинні бути унікальними в межах області видимості. Ці імена використовуються безпосередньо, без операції доступу до члена об’єднання. Але, оскільки вони являються членами об’єднання, для них виділяється одне і те ж місце, вони мають одну і ту ж адресу.
Приклад:
main()
{ union{long l;
unsigned char ch[4]};
cout<<“введіть число типу long:”;
cin>>l;
cout<<”молодший байт”<<(int)ch[0]<<“\n”;
cout<<”другий байт”<<(int)ch[1]<<“\n”;
cout<<”третій байт”<<(int)ch[2]<<“\n”;
cout<<”старший байт”<<(int)ch[3]<<“\n”;
return 0;
}
Контрольні запитання
1. Чи можна в С++ використовувати коментарі мови С ?
2. Як задаються коментарі в С++?
3. Які символи допускаються всередині коментарів в С++?
4. Чому в С++ потрібно вказувати сигнатури при оголошенні функцій ?
5. Чи можна включати фрагменти С програм в програмах, написаних на С++?
6. Чи допускається наявність в програмі функцій, які відрізняються лише типами значень, що повертаються?
7. Чи допускається наявність в програмі двох функцій з такими сигнатурами:
void f(float x,int y,char z=‘B’); та void f(float x,int y=16,char z);
8. Чи правильно задано наступне визначення функції:
void f(float x,int y=16,char z)
{
//тіло
}
9. Чи допускається оголошення виду: int &y;
10. В чому специфіка вказівника на void?
11. Яким буде результат, якщо функцію swap() з пункту 2.10 описати так:
void swap (void* item1, void* item2)
{void* temp=item1;
item1=item2;
item2=temp;
}
12. Як діють наступні оператори : delete a;
delete[ ]a;
delete [10] a;
13. Чи можна за допомогою механізму параметрів по замовчуванню повністю замінити перегрузку функцій? Навести приклади.
14. Що відбуватиметься при виклику increment (& anotherv) , якщо другий варіант функції increment не визначений ?
Завдання 1.
1. Написати систему перевантажених функцій сортування масивів елементів різних типів.
2. Написати функцію знаходження максимального значення довільної кількості параметрів (<=20), вказаних як аргументи функції(типу max(a1,a2,...,an)).
3. Написати універсальну функцію сортування масиву елементів будь-якого базового типу.
4. Перевірити приклад на використання директиви inline для вашої версії компілятора С++ та комп’ютера з використанням бібліотечної функції Gettime() чи інших аналогічних функцій.
5. Описати структуру, полями якої є деякі вказівники. В головній програмі визначити посилання на елемент відповідної структури. Перевірити, що відбувається у випадку звілнення пам’яті відповідного поля за допомогою оператора delete.
6. Визначити динамічний масив цілих чисел a та перевірити роботу оператора delete:
delete a;
delete [5]a;
delete &a[3];
delete a+3;
delete &a[sizeof(a)];
7. Написати систему перевантажених функцій malloc, які виділяють пам’ять розміром n*p байт та повертають вказівник на тип першого аргумента, де n - ціле значення другого аргумента, p -розмір в байтах першого аргумента .
2 ОБ’ЄКТНО-ОРІЄНТОВАНЕ ПРОГРАМУВАННЯ ТА С++.