Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Курс лекцій.doc
Скачиваний:
15
Добавлен:
03.11.2018
Размер:
1.12 Mб
Скачать

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 ОБ’ЄКТНО-ОРІЄНТОВАНЕ ПРОГРАМУВАННЯ ТА С++.