Суббота, 12.07.2025, 08:03
Приветствую Вас Гость | RSS
Каталог работ
Помощь студентам
Поиск
Предмет
Архивоведение [5]
курсовые по архивоведению, дипломы по архивоведению, контрольные по архивоведению
Анатомия и биология [102]
курсовые по анатомии и биологии, дипломы по анатомии и биологии, контрольные по анатомии и биологии
Английский язык [50]
курсовые по английскому, дипломы по английскому, контрольные по английскому
Аудит [184]
курсовые по аудиту, дипломы по аудиту, контрольные по аудиту
Банковское дело [170]
курсовые по банковскому делу, дипломы по банковскому делу, контрольные по банковскому делу
Бухгалтерский учет [814]
курсовые по бухгалтерскому учету, дипломы по бухгалтерскому учету, контрольные по бухгалтерскому учету
БЖД [50]
курсовые по БЖД, дипломы по БЖД, контрольные по БЖД
ВЭД [43]
рефераты по ВЭД, курсовые по ВЭД, дипломы по ВЭД
Биотехнология [1]
курсовые по биотехнологии, дипломы по биотехнологии, контрольные по биотехнологии
Ветеринария [0]
курсовые по ветеринарии, дипломы по ветеринарии, контрольные по ветеринарии
Геодезия [14]
курсовые по геодезии, дипломы по геодезии, контрольные по геодезии
Городской транспорт [5]
курсовые по городскому транспорту, дипломы по городскому транспорту, контрольные по городскому транспорту
Государственная служба [36]
курсовые по государственной службе, дипломы по государственной службе, контрольные по государственной службе
Деловодство [18]
курсовые по деловодству, дипломы по деловодству, контрольные по деловодству
Деньги и кредит [82]
курсовые по деньги и кредит, дипломы по деньги и кредит, контрольные по деньги и кредит
Деревообработка [1]
курсовые по деревообработке, дипломы по деревообработке, контрольные по деревообработке
Демография [2]
курсовые по демографии, дипломы по демографии, контрольные по демографии
Детали машин и механизмов [7]
курсовые по деталям и механизмам, дипломы по деталям и механизмам, контрольные по деталям и механизмам
Дипломатия [13]
курсовые по дипломатии, дипломы по дипломатии, контрольные по дипломатии
Документоведение [95]
курсовые по документоведению, дипломы по документоведению, контрольные по документоведению
ДУМ [1]
курсовые по ДУМу, дипломы по ДУМу, контрольные по ДУМу
Зарубежная литература [40]
курсовые по зарубежной литературе, дипломы по зарубежной литературе, контрольные по зарубежной литературе
Зоотехния [1]
курсовые по зоотехнии, дипломы по зоотехнии, контрольные по зоотехнии
Журналистика, СМИ [13]
курсовые по журналистике, дипломы по журналистике, контрольные по журналистике
Инвестирование [39]
курсовые по инвестированию, дипломы по зарубежной инвестированию, контрольные по инвестированию
Инженерная механика [3]
курсовые по инженерной механике, дипломы по инженерной механике, контрольные по инженерной механике
Информатика [87]
курсовые по информатике, дипломы по информатике, контрольные по информатике
История [89]
курсовые по истории, дипломы по истории, контрольные по истории
История Украины [103]
курсовые по истории Украины, дипломы по истории Украины, контрольные по истории Украины
Контроль и ревизия [56]
курсовые по ревизии и контролю, дипломы по ревизии и контролю, контрольные по ревизии и контролю
Культурология [73]
курсовые по культурологии, дипломы по культурологии, контрольные по культурологии
Латынь [3]
курсовые по латыни, дипломы по латыни, контрольные по латыни
Лексикология [6]
курсовые по лексикологии, дипломы по лексикологии, контрольные по лексикологии
Лингвистика [22]
курсовые по лингвистике, дипломы по лингвистике, контрольные по лингвистике
Логика [13]
курсовые по логике, дипломы по логике, контрольные по логике
Логистика [28]
курсовые по логистике, дипломы по логистике, контрольные по логистике
Макроэкономика [65]
курсовые по макроэкономике, дипломы по макроэкономике, контрольные по макроэкономике
Маркетинг [240]
курсовые по маркетингу, дипломы по маркетингу, контрольные по маркетингу
Математика (ВМ) [26]
курсовые по высшей математике, дипломы по высшей математике, контрольные по высшей математике
Международные отношения [93]
курсовые по международным отношениям, дипломы по международным отношениям, контрольные по международным отношениям
Механика грунтов [0]
курсовые по механике грунтов, дипломы по механике грунтов, контрольные по механике грунтов
Менеджмент [464]
курсовые по менеджменту, дипломы по менеджменту, контрольные по менеджменту
Металлические конструкции [6]
курсовые по металлическим конструкциям, дипломы по металлическим конструкциям, контрольные по металлическим конструкциям
Метрология [2]
курсовые по метрологии, дипломы по метрологии, контрольные по метрологии
Микробиология [1]
курсовые по микробиологии, дипломы по микробиологии, контрольные по микробиологии
Микроэкономика [113]
курсовые по микроэкономике, дипломы по микроэкономике, контрольные по микроэкономике
Налоговая система [102]
курсовые по налоговой системе, дипломы по налоговой системе, контрольные по налоговой системе
Организация и управление ресторанным бизнесом [26]
курсовые по ресторанному бизнесу, дипломы по ресторанному бизнесу, контрольные по ресторанному бизнесу
Организация труда [17]
курсовые по организации труда, дипломы по организации труда, контрольные по организации труда
Охрана труда [24]
курсовые по охране труда, дипломы по охране труда, контрольные по охране труда
Педагогика [398]
курсовые по педагогике, дипломы по педагогике, контрольные по педагогике
Полиграфия [4]
курсовые по полиграфии, дипломы по полиграфии, контрольные по полиграфии
Политология [126]
курсовые по политологии, дипломы по политологии, контрольные по политологии
Политэкономия [21]
курсовые по политэкономии, дипломы по политэкономии, контрольные по политэкономии
Право [2636]
курсовые по праву, дипломы по праву, контрольные по праву
Психология [417]
курсовые по психологии, дипломы по психологии, контрольные по психологии
Проектирование [10]
курсовые по проектированию, дипломы по проектированию, контрольные по проектированию
Религия [17]
курсовые по религии, дипломы по религии, контрольные по религии
РПС [31]
курсовые по размещению продуктивных сил, дипломы по размещению продуктивных сил, контрольные по размещению продуктивных сил
Статистика [237]
курсовые по статистике, дипломы по статистике, контрольные по статистике
Стоматология [2]
курсовые по стоматологии, дипломы по стоматологии, контрольные по стоматологии
Страхование [47]
курсовые по страхованию, дипломы по страхованию, контрольные по страхованию
Социология [229]
курсовые по социологии, дипломы по социологии, контрольные по социологии
Теория вероятности [8]
курсовые по теории вероятности, дипломы по теории вероятности, контрольные по теории вероятности
Технология приготовления пищи [108]
курсовые по технологии приготовления пищи, дипломы по технологии приготовления пищи, контрольные по технологии приготовления пищи
Товароведение [48]
курсовые по товароведению, дипломы по товароведению, контрольные по товароведению
ТО и ремонт автомобилей [10]
курсовые по ТО и ремонту автомобилей, дипломы по ТО и ремонту автомобилей, контрольные по ТО и ремонту автомобилей
Туризм [146]
курсовые по туризму, дипломы по туризму, контрольные по туризму
Украинская литература [28]
курсовые по украинской литературе, дипломы по украинской литературе, контрольные по украинской литературе
Украинский язык [46]
курсовые по украинскому языку, дипломы по украинскому языку, контрольные по украинскому языку
Управление персоналом [56]
курсовые по управлению персоналом, дипломы по управлению персоналом, контрольные по управлению персоналом
Управление проектами [7]
курсовые по управлению проектами, дипломы по управлению проектами, контрольные по управлению проектами
Управленческий учет [69]
курсовые по управленческому учету, дипломы по управленческому учету, контрольные по управленческому учету
Физвоспитание [43]
курсовые по физвоспитанию, дипломы по физвоспитанию, контрольные по физвоспитанию
Физика [11]
курсовые по физике, дипломы по физике, контрольные по физике
Филология [67]
курсовые по филологии, дипломы по филологии, контрольные по филологии
Философия [71]
курсовые по философии, дипломы по философии, контрольные по философии
Финансы [720]
курсовые по финансам, дипломы по финансам, контрольные по финансам
Химия [10]
курсовые по химии, дипломы по химии, контрольные по химии
Ценообразование [11]
курсовые по ценообразованию, дипломы по ценообразованию, контрольные по ценообразованию
Экология [48]
курсовые по экологии, дипломы по экологии, контрольные по экологии
Эконометрия [12]
курсовые по эконометрии, дипломы по эконометрии, контрольные по эконометрии
Экономика [894]
курсовые по экономике, дипломы по экономике, контрольные по экономике
Экономика предприятий [713]
курсовые по экономике предприятий, дипломы по экономике предприятий, контрольные по экономике предприятий
Этика и эстетика [28]
курсовые по этике и эстетике, дипломы по этике и эстетике, контрольные по этике и эстетике
Энергетика [0]
курсовые по энергетике, дипломы по энергетике, контрольные по энергетике
Детали машин и основы конструирования [4]
курсовые по деталям машин и основам конструированию, дипломы по деталям машин и основам конструированию, контрольные по деталям машин и основам конструированию
Дендрологія [0]
Дендропроектування [0]
Газони та луківництво [0]
Декоративне садівництво [0]
Тепличне господарство [0]
Ландшафтна архітектура [0]
Лісопаркове господарство [0]
Методологія [5]
Паркознавство [0]

Главная » Все готовые работы » Информатика

Електронне замовлення обідів
27.10.2012, 15:18
3.1 Опис мови програмування

C++ (Сі-плюс-плюс) — універсальна мова програмування високого рівня з підтримкою декількох парадигм програмування: об’єктно-орієнтованої, узагальненої та процедурної. Розроблена Б’ярном Страуструпом (англ. Bjarne Stroustrup) в AT&T Bell Laboratories (Мюррей-Хілл, Нью-Джерсі) у 1979 році та названа «С з класами». Страуструп перейменував мову у C++ у 1983 р. Базується на мові Сі. Визначена стандартом ISO/IEC 14882:2003.[1]
У 1990-х роках С++ стала однією з найуживаніших мов програмування загального призначення.

3.1.1 Особливості
При створенні С++ прагнули зберегти сумісність з мовою С. Більшість програм на С справно працюватимуть і з компілятором С++. С++ має синтаксис, заснований на синтаксисі С.
Нововведеннями С++ порівняно з С є:
1) підтримка об'єктно-орієнтованого програмування через класи;
2) підтримка узагальненого програмування через шаблони;
3) доповнення до стандартної бібліотеки;
4) додаткові типи даних;
5) обробка винятків;
6) простори імен;
7) вбудовані функції;
8) перевантаження операторів;
9) перевантаження імен функцій;
10) посилання і оператори управління вільно розподіленою пам'яттю.
У 1998 році ратифіковано міжнародний стандарт мови С++: ISO/IEC 14882 «Standard for the C++ Programming Language». Поточна версія цього стандарту — ISO/IEC 14882:2003.

3.1.2 Приклад програми "Hello, world!"
Нижче наведено приклад простої програми на С++, яка виводить на стандартний канал виводу рядок Hello World.
#include <iostream>
int main()
{
std::cout << "Hello, world!" << std::endl;
return 0;
}

Хронологія
Історія розвитку мови програмування С++ містить такі ключові події:
1) квітень 1979 — початок роботи над Cі з класами (C with Classes);
2) жовтень 1979 — робоча версія Cі з класами (Cpre);
3) серпень 1983 — C++ вперше використовується в Bell Labs;
4) 1984 — назва C++;
5) лютий 1985 — перший зовнішній випуск C++ ;
6) жовтень 1985 — перший комерційний випуск — Cfront 1.0;
7) лютий 1987 — Cfront 1.2;
8) грудень 1987 — перший випуск GNU C++ (1.13);
9) 1988 — Перші випуски Oregon Software C++ і Zortech C++;
10) червень 1989 — Cfront 2.0;
11) 1989 — книга «The Annotated C++ Reference Manual» (ARM);
12) 1990 — перша технічна зустріч комітету ANSI C++;
13) 1991 — Перша зустріч ISO; Cfront 3.0 (з шаблонами);
14) 1992 — Перші випуски IBM, DEC, Microsoft C++;
15) 1993 — RTTI (Run-time type identification);
16) 1994 — прийнято STL;
17) 1996 — прийнято export;
18) 1997 — остаточне голосування комітету за завершений стандарт;
19) 1998 — ратифіковано стандарт ISO C++;
20) 2003 — технічні поправки до стандарту; початок роботи над C++0x;
21) 2005 — перше голосування за можливості C++0x; auto, static_assert;
22) 2006 — Перше офіційне голосування з C++0x.

Історія назви
Назва «Сі++» була вигадана Ріком Масситті (Rick Mascitti) і вперше було використана в грудні 1983 року. Раніше, на етапі розробки, нова мова називалася «Сі з класами». Ім'я, що вийшло у результаті, походить від оператора Сі «++» (збільшення значення змінної на одиницю) і поширеному способу присвоєння нових імен комп'ютерним програмам, що полягає в додаванні до імені символу «+» для позначення поліпшень. Згідно Страуструпу, «ця назва указує на еволюційну природу змін Cі». Виразом «С+» називали ранішню, не пов'язану з Сі++, мову програмування.
Деякі програмісти на Сі можуть відмітити, що якщо виконуються вирази x=3; y=x++; то в результаті вийде x=4 і y=3, тому що x збільшується тільки після присвоєння його у. Проте якщо другий вираз буде y=++x; то вийде x=4 і y=4. Виходячи з цього, можна зробити висновок, що логічніше було б назвати мову не Сі++, а ++Сі. Проте обидва вирази c++ і ++c збільшують с, а крім того вираз c++ поширеніший.

Педанти також можуть відмітити, що введення мови Сі++ не змінює самого Сі, тому найточнішим ім'ям було б «С+1».

Технічний огляд
В 1998 році мова Сі++ була стандартизована Міжнародною організацією стандартизації під номером 14882:1998 — Мова Програмування Сі++. В даний час робоча група МОС працює над новою версією стандарту під кодовою назвою C++09 (раніше відомий як C++0X), який має вийти в 2009 році.
Стандарт Сі++ на 1998 рік складається з двох основних частин: ядра мови і стандартної бібліотеки. Стандартна бібліотека Сі++ увібрала в себе бібліотеку шаблонів STL, що розроблялася одночасно із стандартом. Зараз назва STL офіційно не вживається, проте в кругах програмістів на Сі++ ця назва використовується для позначення частини стандартної бібліотеки, що містить визначення шаблонів контейнерів, ітераторів, алгоритмів і функторів.
Стандарт Сі++ містить нормативне посилання на стандарт Сі від 1990 року і не визначає самостійно ті функції стандартної бібліотеки, які запозичуються із стандартної бібліотеки Сі.
Поза тим, існує величезна кількість бібліотек Сі++, котрі не входять в стандарт. У програмах на Сі++ можна використовувати багато бібліотек Сі.
Стандартизація визначила мову програмування Сі++, проте за цією назвою можуть ховатися також неповні, обмежені достандартні варіанти мови. Спочатку мова розвивалася поза формальними рамками, спонтанно, у міру завдань, що ставилися перед ним. Розвиткок мови супроводив розвиток кросс-компілятора Cfront. Нововведення в мові відбивалися в зміні номера версії кросс-компілятора. Ці номери версій кросс-компілятора розповсюджувалися і на саму мову, але стосовно теперішнього часу мову про версії мови Сі++ не ведуть.

Стандартна бібліотека
Стандартна бібліотека Сі++ включає стандартну бібліотеку Сі з невеликими змінами, які роблять її більш відповідною для мови Сі++. Інша велика частина бібліотеки Сі++ заснована на Стандартній Бібліотеці Шаблонів (STL). Вона надає такі важливі інструменти, як контейнери (наприклад, вектори і списки) і ітератори (узагальнені вказівники), що надають доступ до цих контейнерів як до масивів. Крім того, STL дозволяє схожим чином працювати і з іншими типами контейнерів, наприклад, асоціативними списками, стеками, чергами.
Використовуючи шаблони, можна писати узагальнені алгоритми, здатні працювати з будь-якими контейнерами або послідовностями, доступ до членів яких забезпечують ітератори.
Так само, як і в Сі, можливості бібліотек активізуються використанням директиви #include для включення стандартних файлів. Всього в стандарті Сі++ визначено 50 таких файлів.
STL до включення в стандарт Сі++ була сторонньою розробкою, на початку — фірми HP, а потім SGI. Стандарт мови не називає її «STL», оскільки ця бібліотека стала невід'ємною частиною мови, проте багато людей до цих пір використовують цю назву, щоб відрізняти її від решти частини стандартної бібліотеки (потоки введення/виводу (Iostream), підрозділ Сі тощо). Проект під назвою STLport, заснований на SGI STL, здійснює постійне оновлення STL, IOstream і рядкових класів. Деякі інші проекти також займаються розробкою приватних застосувань стандартної бібліотеки для різних конструкторських завдань. Кожен виробник компіляторів Сі++ обов'язково поставляє якусь реалізацію цієї бібліотеки, оскільки вона є дуже важливою частиною стандарту і широко використовується.

Нові можливості в порівнянні з Сі
Мова Сі++ багато в чому є надмножиною Сі. Нові можливості Сі++ включають оголошення у вигляді виразів, перетворення типів у вигляді функцій, оператори new і delete, тип bool, посилання, розширене поняття константності, функції, що підставляються, аргументи за умовчанням, перевизначення, простори імен, класи (включаючи і всі пов'язані з класами можливості, такі як успадкування, функції-члени (методи), віртуальні функції, абстрактні класи і конструктори), перевизначення операторів, шаблони, оператор ::, обробку винятків, динамічну ідентифікацію і багато що інше. Мова Сі++ також у багатьох випадках строго відноситься до перевірки типів, порівняно з Сі.
У Сі++ з'явилися коментарі у вигляді подвійної косої риски («//»), які були в попереднику Сі — мові BCPL.
Деякі особливості Сі++ пізніше були перенесені в Сі, наприклад ключові слова const і inline, оголошення в циклах for і коментарі в стилі Сі++ («//»). У пізніших реалізаціях Сі також були представлені можливості, яких немає в Сі++, наприклад макроси vararg і покращена робота з масивами-параметрами.

Не об'єктно-орієнтовані можливості
В цьому розділі описуються можливості, безпосередньо не пов'язані з об'єктно-орієнтованим програмуванням (ООП). Багато хто з них, проте, особливо важливі у поєднанні з ООП.
Описувач inline означає, що функція є хорошим кандидатом на оптимізацію, при якій в місцях звернення до функції компілятор вставить тіло цієї функції, а не код виклику. Приклад: inline double Sqr(double x) {return x*x;}.
Замість функцій malloc і free (які залишені тільки для зворотної сумісності), введені нові операції new і delete. Якщо T — довільний тип, то new T виділяє пам'ять, достатню для розміщення одного об'єкту типу Т, можливо, ініціалізує об'єкт в цій пам'яті, і повертає вказівник типу Т*. new T[n] виділяє пам'ять, достатню для розміщення n об'єктів типу Т, можливо, ініціалізував кожен об'єкт в цій пам'яті, і повертає вказівник типу Т*. delete p — руйнує об'єкт, на який посилається вказівник p, і звільняє область пам'яті, виділену для нього раніше операцією new T. delete [] p — руйнує кожен об'єкт в масиві, на який посилається вказівник p, і звільняє область пам'яті, виділену для цього масиву раніше операцією new T[n].
Операція delete перевіряє, що її аргумент не NULL, інакше вона нічого не робить. Операції new і delete викликають конструктори і деструктори (див. нижче).
Функції можуть приймати аргументи за посиланням. Наприклад, функція void f(int& x) {x=3;} присвоює своєму аргументу значення 3. Функції також можуть повертати результат за посиланням, і посилання можуть бути поза всяким зв'язком з функціями. Наприклад, {double&b=a[3]; b=sin(b);} еквівалентно а[3]=sin(а[3]);. Посилання певною мірою схожі з вказівниками, з наступними особливостями: при описі посилання ініціалізувалися вказівкою на існуюче значення даного типу; посилання довічно указує на одну і ту ж адресу; при зверненні до посилання операція * проводиться автоматично.
Можуть бути декілька функцій з одним і тим же ім'ям, але різними типами або кількістю аргументів (перевантаження функцій; при цьому тип значення, що повертається, на перевантаження не впливає). Наприклад, цілком можна писати:
1) void Print(int x);
2) void Print(double x);
3) void Print(int x, int y);
Один або декілька останніх аргументів функції можуть задаватися за умовчанням. Наприклад, якщо функція описана як void f(int x, int y=5, int z=10), виклики f(1), f(1,5) і f(1,5,10) еквівалентні.
При описі функцій відсутність аргументів в дужках означає, на відміну від Сі, що аргументів немає, а не те, що вони невідомі. Якщо аргументи невідомі, треба користуватися багатокрапкою, наприклад int printf(const char* fmt ...). Тип першого аргументу повинен бути заданий.
Можна описувати операції над новими типами. Наприклад, так:
struct Date {int day, month, year;};
void operator ++(struct Date& date);
Операції нічим не відрізняються від (інших) функцій. Не можна описувати операції над зумовленими типами (скажімо, перевизначати множення чисел); не можна вигадувати нові операції, яких немає в Сі++ (скажімо ** ); арность (кількість параметрів) і пріоритет операцій зберігається (скажімо, у виразі a+b*c спочатку виконуватиметься множення, а потім складання, до яких би типів не належали а, b і с.) Можна перевизначити операції [] (з одним параметром) і () (з будь-яким числом параметрів).
Додані простори імен namespace. Наприклад, якщо написати
namespace Foo {
const int x=5;
typedef int** T;
void f(y) {return y*x};
double g(T);
...
}

то поза фігурними дужками ми повинні звертатися до T, x, f, g як Foo::T, Foo::x, Foo::f, Foo::g. Якщо ми в якомусь файлі хочемо звертатися до них безпосередньо, ми можемо написати
using namespace Foo;

Або ж
using Foo::T;

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

Всі імена, описані в ньому, доступні в поточному файлі і більше ніде, неначебто ми до кожного опису приписали static.
Доданий новий тип bool, що має значення true і false. Операції порівняння повертають тип bool. Вирази в дужках після if, while приводяться до типу bool.
// означає, що вся частина рядка, що залишилася, є коментарем.
Додані шаблони (template). Наприклад, template<class T> T Min(T x, T у) {return x<y?x:y;} визначає функцію Min для будь-яких типів. Шаблони можуть задавати не тільки функції, але і типи. Наприклад, template<class T> struct Array{int len; T* val;}; визначає масив значень будь-якого типу, після чого ми можемо писати Array<float> x;
Введена стандартна бібліотека шаблонів (STL, англ. Standard Template Library), що визначає шаблони і функції для векторів (одновимірних масивів довільної довжини), множин, асоціативних масивів (map), списків, символьних рядків, потоків введення-виводу і інші шаблони і функції.
Якщо описана структура, клас (про класи див. нижче), об'єднання (union) або перерахування (enum), її ім'я є ім'ям типу, наприклад:
struct Time{int hh,mm,ss;};
Time t1, t2;
Усередині структури або класу можна описувати нові типи, як через typedef, так і через опис інших структур або класів. Для доступу до таких типів поза структурою або класу, до імені типу додається ім'я структури і дві двокрапки:
struct S {typedef int** T; T x;}; S::T у;

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

Проблеми старого підходу
В мові C основним способом організації даних були структури. Структура складається з набору полів, які ніяк не захищені. Якщо елементи структури мають змінну довжину, їх представляють у вигляді вказівників. Виділення і звільнення пам'яті під ці вказівники робляться вручну. Так, наприклад, одновимірний масив змінної довжини в мові C з перевіркою меж може представлятися таким чином:
struct Array {
double* val;
int len;
};

void FreeArray (const struct Array*);
void AllocArray (const struct Array*, int len);
double Elem (const struct Array*, int i);
void ChangeElem (const struct Array*, int i, double x);

Така реалізація небезпечна і неефективна з багатьох причин:
Необхідно викликати FreeArray і AllocArray. Програміст може забути викликати одну з цих функцій, або викликати її дуже рано/запізно, або двічі, або з вказівником на неправильний масив. Все це приводить до помилок, що важко виявити.
Функції Elem і ChangeElem повільні.
Немає ніякого способу перешкодити програмістам створювати і інші функції для роботи із структурою Array. Ці функції можуть робити з полями len і val будь-що.
Немає ніякого способу перешкодити програмістам безпосередньо міняти поля len і val. Присвоєння об'єктів типу struct Array приведе до того, що їх поля val указуватимуть на одну і ту ж область пам'яті. Немає ніякого способу ні заборонити присвоєння, ні змінити таку поведінку.
Мова Сі++, використовуючи ООП, усуває всі ці проблеми.

Інкапсуляція
Основним способом організації інформації в Сі++ є класи. На відміну від типу структура (struct) мови Сі, що складається тільки з полів, клас (class) Сі++ складається з полів і функцій-членів або методів (англ. member functions). Поля бувають публічними (public), захищеними (protected) і приватними (private). У Сі++ тип структура аналогічний типу клас, відмінність в тому, що за умовчанням поля і функції-члени у структури публічні, а у класу - приватні.
З публічними полями можна робити зовні класу все, що завгодно. До захищених і приватних полів не можна звертатися ззовні класу, щоб не порушити цілісність даних класу. Спроба такого звернення викличе помилку компіляції. До таких полів можуть звертатися тільки функції-члени класу (а також так звані функції-друзі і функції-члени класів-друзів; про поняття друзів в C++ дивись нижче.) Поза тілом функцій-членів (а також друзів) захищені і власні поля недоступні навіть для читання. Такий захист полів називається інкапсуляциєю.
Використовуючи інкапсуляцію, автор класу може захистити свої дані від некоректного використання. Крім того, вона замислювалася для полегшення сумісної розробки класів. Малося на увазі, що зміна способу зберігання даних, якщо вони оголошені як захищені або приватні не вимагає відповідних змін в класах, які використовують змінений клас. Наприклад, якщо в старій версії класу дані зберігалися у вигляді лінійного списку, а в новій версії - у вигляді дерева, ті класи, які були написані до зміни формату зберігання даних, переписувати не буде потрібно, якщо дані були приватними або захищеними (у останньому випадку - якщо використовуючі класи не були класами-нащадками), оскільки жоден з них цих класів не міг би безпосередньо звертатися до даних, а тільки через стандартні функції, які в новій версії мають вже коректно працювати з новим форматом даних. Навіть оператор доступу operator [] може бути визначений як така стандартна функція.
Функції-члени, як і поля, можуть бути публічними, захищеними і приватними. Публічні функції може викликати будь-хто, а захищені і власні - тільки функції-члени і друзі.
Використовуючи інкапсуляцію, структуру Array з попереднього розділу можна переписати таким чином:
class Array {
public:
void Alloc(int new_len);
void Free();
inline double Elem(int i);
inline void ChangeElem(int i, double x);
protected:
int len;
double* val;
};

void Array::Alloc(int new_len)
{if (len>0) Free(); len=new_len; val=new double[new_len];}
void Array::Free() {delete [] val; len=0;}
inline double Array::Elem(int i)
{assert(i>=0 && i<len ); return val[i];}
inline void Array::ChangeElem(int i, double x)
{assert(i>=0 && i<len); val[i]=x;}

І далі
Array a;
a.Alloc(10);
a.ChangeElem(3, 2.78);
double b = a.Elem(3);
a.Free();

Тут масив а має 4 публічних функції-члена і 2 захищених поля. Описувач inline означає, що замість виклику функції її код підставляється в точку виклику, що вирішує проблему неефективності.

Опис функцій в тілі класу
В тілі класу можна вказати тільки заголовок функції, а можна описати всю функцію. У другому випадку вона вважається вбудованою (inline), наприклад:
class Array {
public:
void Alloc(int _len)
{if (len==0) Free(); val=new double [len=_len];}

і так далі.

Конструктори і деструктори
Проте в приведеному прикладі не вирішена важлива проблема: функції Alloc і Free як і раніше треба викликати вручну. Інша проблема даного прикладу — небезпека оператора присвоєння. Для вирішення цих проблем в мову були введені конструктори і деструктори. Конструктор викликається кожного разу, коли створюється об'єкт даного типу; деструктор - при знищенні. При перетвореннях типів, присвоєнні, передачі параметра теж викликаються конструктори і при необхідності деструктори.

З конструкторами і деструкторами клас виглядає так:
class Array {
public:
Array() : len(0), val(NULL) {}
Array(int _len) : len(_len) {val = new double[_len];}
Array(const Array& a);
~Array() { Free(); }
inline double Elem(int i);
inline void ChangeElem(int i, double x);
protected:
void Alloc(int _len);
void Free();
int len;
double* val;
};

Array::Array(const Array& a) : len(a.len)
{
val = new double[len];
for (int i=0; i<len; i++)
val[i] = a.val[i];
}

Тут Array::Array - конструктор, а Array::~Array - деструктор. Конструктор копіювання (англ. copy constructor) Array::Array(const Array&) викликається при присвоєнні. Тепер об'єкт класу Array не можна зіпсувати: як би ми його не створювали, що б ми не робили, його значення буде коректним, тому що конструктор викликається автоматично. Всі небезпечні операції з вказівниками заховані в захищені функції.
Array a(5); // викликається Array::Array(int)
Array b; // викликається Array::Array()
Array c(a); // викликається Array::Array(const Array&)
Array d=a; // то саме
b=c; // відбувається виклик оператора =
// якщо він не визначений (як в даному випадку), то викликається оператор присвоєння за умовчанням, який
// здійснює побітове копіювання для базових типів і виклик оператора присвоєння для користувача
// як правило, конструктор копій і оператор присвоєння перевизначаються попарно
Оператор new теж викликає конструктори, а delete - деструктори.
За умовчанням, кожен клас має конструктор без параметрів і деструктор. Конструктор без параметрів за умовчанням викликає конструктори всіх елементів, а деструктор - їх деструктори. Інші конструктори за умовчанням не визначені.
Клас може мати скільки завгодно конструкторів (з різними наборами параметрів), але тільки один деструктор (без параметрів).

Інші можливості функцій-членів
Функції-члени можуть бути і операціями:
class Array {
...
inline double &operator[] (int n);

І далі
Array a(10);
...
double b = a[5];

Функції-члени (і лише вони) можуть мати описувач const
class Array {
...
inline double operator[] (int n) const;

Такі функції не мають права змінювати поля класу (окрім полів, визначених як mutable). Якщо вони намагаються це зробити, компілятор повинен видати повідомлення про помилку.

Успадкування
Для створення класів з доданою функціональністю вводять спадкування. Клас-нащадок має поля і функції-члени базового класу, але не має права звертатися до приватних (private) полів і функцій базового класу. У цьому і полягає різниця між приватними і захищеними членами.
Клас-нащадок може додавати свої поля і функції або перевизначати функції базового класу.
За умовчанням, конструктор нащадка без параметрів викликає конструктор базового класу, а потім конструктори доданих елементів. Деструктор працює в зворотному порядку. Інші конструктори доводиться визначати кожного разу наново. На щастя, це можна зробити викликом конструктора базового класу.
class ArrayWithAdd : public Array {
ArrayWithAdd(int n) : Array(n) {}
ArrayWithAdd() : Array() {}
ArrayWithAdd(const Array& a) : Array(a) {}
void Add(const Array& a);
};
Нащадок - це більш ніж базовий клас, тому він може використовуватися скрізь, де використовується базовий клас, але не навпаки.
Успадкування буває публічним, захищеним і власним. При публічному спадкуванні, публічні і захищені члени базового класу зберігають свій статус, а до приватних не можуть звертатися навіть функції-члени нащадка. Захищене спадкування відрізняється тим, що при нім публічні члени базового класу є захищеними членами нащадка. При приватному успадкуванні, до жодного члена базового класу навіть функції-члени нащадка права звертатися не мають. Як правило, публічне спадкування зустрічається значно частіше за інші.
Клас може бути нащадком декількох класів. Це називається множинним спадкуванням. Такий клас володіє полями і функціями-членами всіх його предків. Наприклад, клас FlyingCat може бути нащадком класів Cat і FlyingAnimal.
class Cat {
...
void Purr();
...
};
class FlyingAnimal {
...
void Fly();
...
};
class FlyingCat : public Cat, public FlyingAnimal {
...
PurrAndFly() {Purr(); Fly();}
...
};

Поліморфізм
Поліморфізмом в програмуванні називається перевизначення нащадком функцій-членів базового класу, наприклад
class Figure {
...
void Draw() const;
...
};

class Square : public Figure {
...
void Draw() const;
...
};

class Circle : public Figure {
...
void Draw() const;
...
};

В даному прикладі, яка з функцій буде викликана - Circle::Draw(), Square::Draw() або Figure::Draw(), визначається під час компіляції. Наприклад, якщо написати
Figure* x = new Circle(0,0,5);
x->Draw();
то буде викликане Figure::Draw(), оскільки x - об'єкт класу Figure. Такий поліморфізм називається статичним.
Але в C++ є і динамічний поліморфізм, коли функція, що викликається, визначається під час виконання. Для цього функції-члени повинні бути віртуальними.
class Figure {
...
virtual void Draw() const;
...
};

class Square : public Figure {
...
virtual void Draw() const;
...
};

class Circle : public Figure {
...
virtual void Draw() const;
...
};

Figure* figures[10];
figures[0] = new Square(1, 2, 10);
figures[1] = new Circle(3, 5, 8);
...
for (int i = 0; i < 10; i++)
figures[i]->Draw();
В цьому випадку для кожного елементу буде викликана Square::Draw() або Circle::Draw() залежно від виду фігури.
Чисто віртуальною функцією називається функція-член, яка не визначена в базовому класі, а тільки в нащадках:
class Figure {
...
virtual void Draw() const = 0;
);
Ось це = 0 і означає, що функція чисто віртуальна.
Абстрактним класом називається такий, у якого є хоч би одна чисто віртуальна функція-член. Об'єкти таких класів створювати заборонено. Абстрактні класи використовуються як інтерфейси.

Друзі
Функції-друзі — це функції, що не є функціями-членами і що проте мають доступ до захищених і власних полів і функцій-членів класу. Вони повинні бути описані в тілі класу як friend. Наприклад:
class Matrix {
...
friend Matrix Multiply(Matrix m1, Matrix m2);
...
};

Matrix Multiply(Matrix m1, Matrix m2) {
...
}

Тут функція Multiply може звертатися до будь-яких полів і функцій-членів класу Matrix.

Існують також класи-друзі. Якщо клас A - друг класу B, то всі його функції-члени можуть звертатися до будь-яких полів і функцій членам класу B. Наприклад:
class Matrix {
...
friend class Vector;
...
};
Проте в С++ не діє правило «один мій один — мій друг».

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

Недоліки мови C++
Наявність безлічі можливостей, що порушують принципи типобезпеки приводить до того, що в С++-програми може легко закрастися важковловима помилка. Замість контролю з боку компілятора розробники вимушені дотримуватися вельми нетривіальних правил кодування. По суті ці правила обмежують С++ рамками якогось безпечнішої підмови. Більшість проблем типобезпеки С++ успадкована від С, але важливу роль в цьому питанні грає і відмова автора мови від ідеї використовувати автоматичне управління пам'яттю (наприклад, збірку сміття). Так візитною карткою С++ стали вразливості типу "переповнювання буфера".
Погана підтримка модульності. Підключення інтерфейсу зовнішнього модуля через препроцесорну вставку заголовного файлу (#include) серйозно уповільнює компіляцію, при підключенні великої кількості модулів. Для усунення цього недоліку, багато компіляторів реалізують механізм прекомпіляциі заголовних файлів (англ. Precompiled Headers).
Недостача інформації про типи даних під час компіляції (CTTI).
Мова C++ є складною для вивчення і для компіляції.
Деякі перетворення типів неінтуїтивні. Зокрема, операція над беззнаковим і знаковим числами видає беззнаковий результат.
Препроцесор С++ (успадкований від C) дуже примітивний. Це приводить з одного боку до того, що з його допомогою не можна (або важко) здійснювати деякі завдання метапрограмування, а з іншою, в наслідку своєї примітивності, він часто приводить до помилок і вимагає багато дій з обходу потенційних проблем. Деякі мови програмування (наприклад, Scheme і Nemerle) мають набагато могутніші і безпечніші системи метапрограмування (також звані макросами, але макроси С/С++ вони мало нагадують).
З кінця 20-го століття в співтоваристві С++ набуло поширення так зване метапрограмування на базі шаблонів. По суті, воно використовує особливості шаблонів C++ в цілях реалізації на їх базі інтерпретатора примітивної функціональної мови програмування, що виконується під час компіляції. Сама по собі дана можливість вельми приваблива, але, в наслідку вище згаданого, такий код вельми важко сприймати і відладжувати. Мови Lisp/Scheme, Nemerle і деякі інші мають могутніші і водночас простіші для сприйняття підсистеми метапрограмування. Крім того, в мові D реалізована порівнянна по потужності, але значно простіша в застосуванні підсистема шаблонного метапрограмування.
Хоча декларується, що С++ мультипарадигмена мова, реально в мові відсутня підтримка функціонального програмування. Частково, даний пропуск усувається різними бібліотеками (Loki, Boost) що використовують засоби метапрограмування для розширення мови функціональними конструкціями (наприклад, підтримкою лямбд/анонімних методів), але якість подібних рішень значно поступається якості вбудованих у функціональні мови рішень. Такі можливості функціональних мов, як зіставлення зі зразком взагалі украй складно емулювати засобами метапрограмування.

Критика мови C++
C++ успадкував багато проблем мови C.
Операція присвоєння позначається як =, а операція порівняння як == . Їх легко сплутати, і така конструкція буде синтаксично правильною, але приведе до важковломимого багу. Особливо часто це відбувається в операторах if і while, наприклад, програміст може написати if (i=0) замість if (i==0) (Разом з тим, основна маса компіляторів видає в таких випадках попередження.) Уникнути помилку такого типу можна, якщо писати всі операції порівняння у такому вигляді: if (0==i). До того ж багато мов (Бейсик, Паскаль) використовують символ "=" саме в операціях порівняння.
Операції присвоєння (=), інкрементациі (++), декрементациі (--) та інші повертають значення. У поєднанні з великою кількістю операцій це дозволяє, але не зобов'язує, програміста створювати код, що важко читається. З іншого боку, один з основних принципів мов C і C++ — дозволяти програмістові писати в будь-якому стилі, а не нав'язувати «хороший» стиль. До того ж це іноді дозволяє компілятору створювати оптимальніший код.
Макроси (#define) є могутнім, але небезпечним засобом. У мові C++, на відміну від C, необхідність в небезпечних макросах з'являється значно рідше завдяки шаблонам і вбудованим функціям. Але в успадкованих стандартних С-бібліотеках багато потенційно небезпечних макросів.
Дехто вважає недоліком мови C++ відсутність системи збірки сміття. З іншого боку, в C++ є достатньо засобів (класи з конструкторами і деструкторами, стандартні шаблони, передача параметрів за посиланням), що дозволяють майже виключити використання небезпечних вказівників. Проте, відсутність вбудованої збірки сміття дозволяє користувачеві самому вибрати стратегію управління ресурсами.
Крім того, збірка сміття серйозно уповільнює роботу програми, і це недолік там, де продуктивність є критично важливою.

Порівняння C++ з мовами Java і C#
Мова С++ з появою перших трансляторів знайшла відразу ж дуже широке розповсюдження, на ній було створено величезну кількість програм і застосувань. У міру накопичення досвіду створення великих програмних систем сплили недоліки, які привели до пошуку альтернативних рішень. Таким альтернативним рішенням стала мова Java, яка в деяких областях стала конкурувати у популярності з C++, а фірма Майкрософт запропонувала мову C# як нову мову, що розвиває принципи C++ і що використовує переваги мови Java. Надалі з'явилася мова Nemerle, об'єднуюча переваги C# з можливістю функціонального програмування. Останнім часом з'явилася спроба об'єднання ефективності C++, безпеки і швидкості розробки, як в Java і C# - була запропонована мова D, яка поки не отримала широкого визнання.
Мова Java володіє наступними особливостями, яких немає в мові C++ :
Java є типобезпечною мовою. Типобезпека гарантує відсутність в програмах помилок, що важко знайти і які пов'язані з невірною інтерпретацією пам'яті комп'ютера. Це робить процес розробки надійнішим і передбаченим, а отже швидшим. Так само це дозволяє привертати до розробки програмістів, що мають меншу кваліфікацію і мати великі групи розробників.
Java-код компілюються спочатку не в машинний код, а в певний проміжний код, який надалі інтерпретується або компілюється, тоді як багато C++ компілятори орієнтірованни на компіляцію в машинний код заданої платформи.
У мові Java є чіткі певні стандарти на введення-виведення, графіку, геометрію, діалог, доступ до баз даних і інших типових застосувань. Завдяки цим особливостям, хастосування на Java мають значно кращу переносимість, ніж С++, і часто, будучи написані для певного комп'ютера і операційної системи, працюють під іншими системами без змін. Програмісти, що пишуть на мові Java, не залежать від пакетів, нав'язаних розробниками компіляторів на дане конкретне середовище, що різко спрощує портування програм.
У мові Java реалізована повноцінна збірка сміття, якої немає в C++. Немає в С++ і засобах перевірки правильності вказівників. З іншого боку, C++ володіє набором засобів (конструктори і деструктори, стандартні шаблони, посилання), що дозволяють майже повністю виключити виділення і звільнення пам'яті вручну і небезпечні операції з вказівниками. Проте таке виключення вимагає певної культури програмування, тоді як в мові Java воно реалізується автоматично.
Мова Java є чисто об'єктно-орієнтованою, тоді як C++ підтримує як об'єктно-орієнтоване, так і процедурне програмування.
В C++ відсутня повноцінна інформації про типи під час виконання RTTI. Цю можливість можна було б реалізувати в C++, маючи повну інформацію про типи під час компіляції CTTI.
У C++ можливість введення призначеного для користувача синтаксису за допомогою #define може привести до того, що модулі в крупних пакетах програм стають сильно пов'язані один з одним, що різко знижує надійність пакетів і можливість організації розділених модулів. З іншого боку, С++ надає достатньо засобів (константи, шаблони, вбудовані функції) для того, щоб практично повністю виключити використання #define.
Ці відмінності приводять до запеклих суперечок між прихильниками двох мов про те, яка мова краща. Прихильники Java вважають ці особливості перевагами; прихильники C++ вважають, що у багатьох випадках ці особливості є недоліками, зокрема
Ціною переносимості є вимога наявності на комп'ютері віртуальної Java-машини, що приводить до уповільнення обчислень і практичної неможливості використання нових можливостей апаратної архітектури.
Збірка сміття приводить до втрати ефективності.
Стандарти на графіку, доступ до баз даних тощо є недоліком, якщо програміст хоче визначити свій власний стандарт.
Вказівники у багатьох випадках є могутніми або навіть необхідними засобом, а їх безконтрольне використання небезпечне лише в невмілих руках.
Підтримка процедурного програмування є корисною.
Далеко не всі програмісти є прихильниками однієї з мов. На думку більшості програмістів, Java і C++ не є конкурентами, тому що мають різні області застосовності. Інші вважають, що вибір мови для багатьох завдань є питанням особистого смаку.

Майбутній розвиток
Сі++ продовжує розвиватися, щоб відповідати сучасним вимогам. Одна з груп, що займаються мовою Сі++ в його сучасному вигляді і що направляють комітету із стандартизації Сі++ поради з його поліпшення, — це Boost. Наприклад, один з напрямів діяльності цієї групи — вдосконалення можливостей мови шляхом додавання в нього особливостей метапрограмування.
Стандарт Сі++ не описує способи іменування об'єктів, деякі деталі обробки винятків і інші можливості, пов'язані з деталями реалізації, що робить несумісним об'єктний код, створений різними компіляторами. Проте для цього третіми особами створена безліч стандартів для конкретної архітектури і операційних систем.

Проте (за станом на час написання цієї статті) серед компіляторів Сі++ все ще продовжується битва за повну реалізацію стандарту Сі++, особливо в області шаблонів — частини мови, зовсім недавно повністю розробленій комітетом стандартизації.
Одним із каменів спотикання у цьому питанні є ключове слово export, використовуване також і для розділення оголошення і визначення шаблонів.
Першим компілятором, що підтримів export в шаблонах, став Comeau C++ на початку 2003 року (опісля п'ять років після виходу стандарту). У 2004 році бета-версія компілятора Borland C++ Builder X також почала його підтримку.
Обидва цих компілятора засновані на зовнішньому інтерфейсі EDG. Інші компілятори, такі як Microsoft Visual C++ або GCC, взагалі цього не підтримують. Ерб Саттер ( Herb Sutter), секретар комітету із стандартизації Си++, рекомендував прибрати export з майбутніх версій стандарту унаслідок серйозних складнощів в повноцінній реалізації, проте згодом остаточним рішенням було вирішено його залишити.
Із списку інших проблем, пов'язаних з шаблонами, можна привести питання конструкцій часткової спеціалізації шаблонів, які погано підтримувалися протягом багатьох років після виходу стандарту Сі++.

Цена: 300 грн Код работы: bodya16
Предмет: Информатика Тип работы: Диплом
0666832599

СКАЧАТЬ

Автор: bodya-herich | Просмотров: 336 | Скачали: 1 | Рейтинг: 0.0/0



Подобные работы:
Рекомендації

Все ще гадаєш, що подивитися українською нового з всесвіту серіалів, або чекаєшь рік, два на свій улюблений серіал, то зверни увагу на сайт про tvshows - https://tvshows.com.ua/. Першим відопідає на питання про дату виходу нового сезону, наприклад про серіл Відьмак від Нетфлікс, коли вийде.


Блог про банки
Новое на сайте
Філософія Варіант №12
Просмотров: 267
Опубликовано: 10.11.2016
Філософія Варіант №11
Просмотров: 213
Опубликовано: 10.11.2016
Філософія Варіант №7
Просмотров: 215
Опубликовано: 10.11.2016
Буття матеріальне та духовне
Просмотров: 210
Опубликовано: 10.11.2016
Філософський зміст проблеми буття
Просмотров: 297
Опубликовано: 10.11.2016
Філософський зміст патристики
Просмотров: 297
Опубликовано: 10.11.2016
Філософська думка Київської Русі
Просмотров: 170
Опубликовано: 10.11.2016
1. Проблема початку та структури філософії України 2. Життєві коріння філософії в Україні 3. Філософія та її місце в сучасній культурі
Просмотров: 243
Опубликовано: 10.11.2016
1. Філософія України: структура та особливості 2. Філософія України в світлі філософії Ренесансу та Просвітництва (XV-XVIII стст.) 3. Філосо
Просмотров: 315
Опубликовано: 10.11.2016
Філософія Україні в контексті світової культури
Просмотров: 289
Опубликовано: 10.11.2016
Лучшие авторы
  • umnik
    Опубликовал: 3425

  • k_alena
    Опубликовал: 3319

  • mars1814
    Опубликовал: 1048

  • tema
    Опубликовал: 488

  • alesichka55
    Опубликовал: 260

  • Romashka-1973
    Опубликовал: 200

  • Botan
    Опубликовал: 135

  • Карпа
    Опубликовал: 108

  • Gavr2012
    Опубликовал: 101

  • KozachokI
    Опубликовал: 90

  • Лучшие работы
    Звіт про проходження виробничої практики (поліграфічне підприємство)
    Просмотров: 6769
    Аналіз рентабельності діяльності підприємства з метою її підвищення
    Просмотров: 6344
    Планування і прогнозування прибутку підприємства
    Просмотров: 6249
    Облік, аналіз та аудит адміністративних витрат
    Просмотров: 5993
    Фонетична і фонематична транскрипція: історія становлення і розвитку
    Просмотров: 5879
    Гроши та кредит. Задачи 3 (три)
    Просмотров: 5511
    Скачали: 396
    Отчет по практике Черниговский хлебокомбинат
    Просмотров: 5477
    Розрахунок й оцінка фінансової стійкості підприємства
    Просмотров: 5100
    Скачали: 362
    Ідейно-теоретичні передумови виникнення соціології
    Просмотров: 5096
    ЗВІТ про проходження практики в Подільській районній державній адміністрації
    Просмотров: 5016


    2008-2025 Хостинг от uCoz