C++ (Сі-плюс-плюс) — мова програмування загального призначення з підтримкою кількох парадигм програмування: об'єктно-орієнтованої, узагальненої, процедурної та ін. Б'ярн Страуструп (англ. Bjarne Stroustrup) почав створювати C++ в Bell Laboratories ([en], Нью-Джерсі) у 1979 році. На етапі зародження мова мала назву «Сі з . Згодом Страуструп перейменував мову на C++ у 1984 р. Має крпіеея в мові програмування С. Вперше описана міжнародним стандартом ISO/IEC 14882:1998 (C++98), найбільш актуальним же є стандарт ISO/IEC 14882:2020 ().
C++ | |
---|---|
Парадигма | (Мультипарадигмова): об’єктно-орієнтована, узагальнена, процедурна |
Дата появи | 1985 |
Творці | Б'ярн Страуструп |
Розробник | [en]/WG21 |
Останній реліз | (грудень 2020) |
Система типізації | статична, |
Основні реалізації | G++, , , Clang |
Діалекти | ISO/IEC 14882:1998, 2003, 2011, 2014, 2017, 2020 |
Під впливом від | Smalltalk, C, Simula, Ada 83, , CLU, ML |
Вплинула на | Ada 95, C#, Java, PHP, D, , |
Звичайні розширення файлів | .cc , .cpp , .cxx , .c , .c++ , .h , .hpp , .hh , .hxx або .h++ |
Репозиторій вихідного коду | github.com/cplusplus/draft |
Вебсайт | isocpp.org |
|
У 1990-х роках C++ стала однією з найуживаніших мов програмування загального призначення. Мову використовують для системного програмування, розробки прикладного програмного забезпечення, написання драйверів, потужних серверних та клієнтських програм, а також для розробки розважальних програм, наприклад, відеоігор. C++ суттєво вплинула на інші популярні сьогодні мови програмування: C# та Java.
Історія
Хронологія
Історія розвитку мови програмування C++ містить такі ключові події:
- квітень 1979 — початок роботи над Ci з класами (C with Classes)
- жовтень 1979 — робоча версія Ci з класами (з CPre компілятором)
- серпень 1983 — Ci з класами вперше використовується в Bell Labs
- 1984 — назва C++
- лютий 1985 — перший зовнішній випуск компілятора C++ — [en] Relese E (Educational — випуск для навчальних закладів)
- жовтень 1985 — перший комерційний випуск — Cfront 1.0
- лютий 1987 — Cfront 1.2
- грудень 1987 — перший випуск (1.13)
- 1988 — Перші випуски Oregon Software C++ і Zortech C++
- червень 1989 — Cfront 2.0
- 1989 — книга «The Annotated C++ Reference Manual» (ARM); Засновано комітет ANSI C++
- 1990 — перша технічна зустріч комітету ANSI C++; прийнято (templates), виняткові ситуації (exceptions); перший випуск Borland C++
- 1991 — Перша зустріч комітету ISO/IEC; Cfront 3.0 (з ); книга (2-га редакція)
- 1992 — Перші випуски IBM, DEC, Microsoft C++
- 1993 — RTTI (Run-time type identification — визначення типу під час виконання) прийнято; простори назв (namespaces) і string (шаблонний за символьним типом) прийнято
- 1994 — прийнято STL
- 1997 — остаточне голосування комітету за завершений стандарт
- 1998 — ратифіковано стандарт ISO/IEC 14882:1998 C++ (так званий C++98)
- 2003 — ратифіковано стандарт ISO/IEC 14882:2003 C++ (так званий C++03); початок роботи над C++0x
Подальший розвиток описаний в статтях про відповідні версії C++.
В 2023 році, у категорії найпопулярніших мов програмування серед IT-спеціалістів згідно з рейтингом IEEE Spectrum, який охоплював 59 мов програмування, топ-5 виглядав так: Python, Java, C++, C, JavaScript.
Історія назви
Назва «Сі++» була вигадана Ріком Масситті (Rick Mascitti) і вперше було використана в грудні 1983 року. Раніше, на етапі розробки, нова мова називалася «Сі з класами». Ім'я, що вийшло у результаті, походить від оператора Сі «++» (збільшення значення змінної на одиницю) і поширеному способу присвоєння нових імен комп'ютерним програмам, що полягає в додаванні до імені символу «+» для позначення поліпшень. Згідно зі Страуструпом, «ця назва указує на еволюційну природу змін Ci». Виразом «С+» називали ранішню, не пов'язану з Сі++, мову програмування.
Деякі програмісти на Сі можуть відмітити, що якщо виконуються вирази x=3; y=x++; то в результаті вийде x=4 і y=3, тому що x збільшується тільки після присвоєння його у. Проте якщо другий вираз буде y=++x; то вийде x=4 і y=4. Виходячи з цього, можна зробити висновок, що логічніше було б назвати мову не Сі++, а ++Сі. Проте обидва вирази c++ і ++c збільшують с, а крім того вираз c++ поширеніший.
Педанти також можуть відмітити, що введення мови Сі++ не змінює самого Сі, тому найточнішим ім'ям було б «С+1».
Стандарт C++11
У серпні 2011 року завершилася тривала епопея з прийняттям нового стандарту для мови Сі++. Комітет ISO зі стандартизації C++ одноголосно затвердив специфікацію C++0X як міжнародний стандарт «C++11». Стандарт C++0X планувалося випустити ще в 2008 році, але його прийняття постійно відкладалося. Більшість представлених в стандарті можливостей вже підтримуються в таких компіляторах, як GCC, IBM C++, Intel C++ і . стандартні бібліотеки з підтримкою C++ були реалізовані в рамках проекту Boost.
Новий стандарт розвивався понад 10 років і прийшов на зміну стандартам C++98 і C++03. Відзначається, що якщо відмінності між стандартами C++98 і C++03 були настільки незначними, що їх можна було не помітити, то стандарт C++11 містить низку кардинальних покращень, як самої мови, так і стандартної бібліотеки. За словами Б'ярна Страуструпа, творця C++, C++11 відчувається як нова мова, частини якої краще поєднуються одна з одною. У C++11 високорівневий стиль програмування став природнішим. Крім того, мова стала простішою для вивчення.
Стандарт C++14
Повна назва: «International Standard ISO/IEC 14882:2014(E) Programming Language C++». C++14 можна розглядати як невелике розширення для , яке в основному містить виправлення помилок і незначні покращення.
Комітет з розробки нового стандарту опублікував чернетку N3690 15 травня 2013. Робочий варіант чернетки N3936 був опублікований 2 березня 2014 року, фінальний період голосування закритий 15 серпня 2014 року, а результат (одноголосне схвалення) оголошений 18 серпня 2014 року. Дата офіційного випуску C++14 — 15 грудня 2014.
Оскільки розробка стандарту була досить тривалою, і не було визначено року випуску, в період розробки також мав поширену назву «C++1y», аналогічно до того, як стандарт C++11 до його випуску називали «C++0x»(випуск цієї версії очікували до 2010 року).
Описані нижче можливості мови відповідають чернетці N3797 [ 11 січня 2020 у Wayback Machine.]. Вони можуть дещо відрізнятися від остаточної версії стандарту [ 29 січня 2020 у Wayback Machine.].
Стандарт C++17
Стандарт дійшов до чорнової версії стандарту в березні 2017 року і, був остаточно затверджена 8 вересня 2017 року. Стандарт офіційно опублікований у грудні 2017.
У C++17 було внесено ряд змін в мову, зокрема додано декілька нових бібліотек(<string_view>, <execution>), алгоритмів(std::exclusive_scan, std::for_each) та класів до STL, поліпшено роботу з лямбда-виразами, оновлено бібліотеку <thread> для мультипотокового програмування.
Стандарт C++20
Стандарт затверджено 4 вересня 2020 року. Стандарт офіційно опублікований у грудні 2020. Ця версія має набагато більше нововведень в порівнянні з та .
Зокрема, ця версія вводить «», співпрограми, новий оператор порівняння <=> тощо.
Особливості
При створенні C++ прагнули зберегти сумісність з мовою С. Більшість програм на С справно працюватимуть і з компілятором C++. C++ має синтаксис, заснований на синтаксисі С (див. ).
Нововведеннями C++ порівняно з С є:
- підтримка об'єктно-орієнтованого програмування через класи;
- підтримка узагальненого програмування через шаблони;
- доповнення до стандартної бібліотеки;
- додаткові типи даних;
- обробка винятків;
- простори імен;
- вбудовані функції;
- перевантаження операторів;
- перевантаження імен функцій;
- посилання і оператори управління вільно розподіленою пам'яттю.
Приклади
Приклад програми «Hello, world!»
Нижче наведено приклад простої програми на C++, яка виводить на стандартний потік виводу рядок Hello, world!.
#include <iostream> // Підключення файлу з функціями та полями імен using namespace std; // Вкористання поля імен int main() // Це головна функція { cout << "Hello, world!" << endl; return 0; // Каже те що программа завершилася нормально } // - це позначка початку коментаря
Приклад програми зі змінною
Після запуску програми на екрані з'явиться повідомлення How old are you?, а курсор буде розміщений в наступному рядку. Там потрібно ввести цілочислове значення та натиснути клавішу Enter. Приклад: вводимо число 25, тоді з'явиться повідомлення You are 25 years old.
#include <iostream> using namespace std; int main() { int age; // Змінна для запису віку cout << "How old are You?\n"; // Скільки вам років? cin >> age; // Зчитування віку cout << "You are " << age << " years old\n"; // Результат return 0; }
Технічний огляд
Частина інформації в цій статті застаріла. (квітень 2020) |
В 1998 році мова C++ була стандартизована Міжнародною організацією стандартизації під номером 14882:1998 — Мова Програмування C++. Поточний стандарт — , він був прийнятий у 2011 році робочою групою МОС після десятирічної підготовки.
Стандарт C++ на 1998 рік складається з двох основних частин: ядра мови і стандартної бібліотеки. увібрала в себе бібліотеку шаблонів STL, що розроблялася одночасно із стандартом. Зараз назва STL офіційно не вживається, проте в колах програмістів на C++ ця назва використовується для позначення частини стандартної бібліотеки, що містить визначення шаблонів контейнерів, ітераторів, алгоритмів і функторів.
Стандарт C++ містить нормативне посилання на стандарт Сі від 1990 року і не визначає самостійно ті функції стандартної бібліотеки, які запозичуються із стандартної бібліотеки С.
Поза тим, існує величезна кількість бібліотек C++, котрі не входять в стандарт. У програмах на C++ можна використовувати багато бібліотек С.
Стандартизація визначила мову програмування C++, проте за цією назвою можуть ховатися також неповні, обмежені достандартні варіанти мови. Спочатку мова розвивалася поза формальними рамками, спонтанно, у міру завдань, що ставилися перед ним. Розвиток мови супроводив розвиток кросс-компілятора Cfront. Нововведення в мові відбивалися в зміні номера версії кросс-компілятора. Ці номери версій кросс-компілятора розповсюджувалися і на саму мову.
Актуальний стандарт ухвалений в 2023 році .
Стандартна бібліотека
Стандартна бібліотека C++ включає стандартну бібліотеку С з невеликими змінами, які роблять її відповіднішою для мови C++. Інша велика частина бібліотеки C++ заснована на Стандартній Бібліотеці Шаблонів (STL). Вона надає такі важливі інструменти, як контейнери (наприклад, вектори і списки) і ітератори (узагальнені вказівники), що надають доступ до цих контейнерів як до масивів. Крім того, STL дозволяє схожим чином працювати і з іншими типами контейнерів, наприклад, асоціативними списками, стеками, чергами.
Використовуючи шаблони, можна писати узагальнені алгоритми, здатні працювати з будь-якими контейнерами або послідовностями, доступ до членів яких забезпечують ітератори.
Так само як і в С, можливості бібліотек активізуються використанням директиви #include для включення стандартних файлів. Всього в стандарті C++ визначено 50 таких файлів.
STL до включення в стандарт C++ була сторонньою розробкою, на початку — фірми HP, а потім SGI. Стандарт мови не називає її «STL», оскільки ця бібліотека стала невіддільною частиною мови, проте багато людей досі використовують цю назву, щоб відрізняти її від решти частини стандартної бібліотеки (потоки введення/виведення (Iostream), підрозділ Сі тощо). Проект під назвою STLport [ 7 червня 2018 у Wayback Machine.], заснований на SGI STL, здійснює постійне оновлення STL, IOstream і рядкових класів. Деякі інші проєкти також займаються розробкою приватних застосувань стандартної бібліотеки для різних конструкторських завдань. Кожен виробник компіляторів C++ обов'язково поставляє якусь реалізацію цієї бібліотеки, оскільки вона є дуже важливою частиною стандарту і широко використовується.
Причиною успіху STL, зокрема її вхід до стандартної бібліотеки C++, була націленість на широке коло завдань і узагальнена структура. В цьому сенсі, близькою за духом STL на сьогодні є бібліотека Boost. Boost теж є бібліотекою загального застосування і теж впливає на формування стандартної бібліотеки C++.
Нові можливості в порівнянні з С
Мова Сі++ багато в чому є надмножиною С. Нові можливості C++ включають оголошення у вигляді виразів, перетворення типів у вигляді функцій, оператори new і delete, тип bool, посилання, розширене поняття константності та змінності, функції, що підставляються, аргументи за умовчанням, перевизначення, простори імен, класи (включаючи і всі пов'язані з класами можливості, такі як успадкування, функції-члени (методи), віртуальні функції, абстрактні класи і конструктори), перевизначення операторів, шаблони, оператор ::, обробку винятків, динамічну ідентифікацію і багато що інше. Сі++ є також мовою строгого типування і накладає більше вимагань щодо дотримання типів, порівняно з Сі.
У C++ з'явилися коментарі у вигляді подвійної косої риски («//»), які були в попереднику С — мові BCPL.
Деякі особливості C++ пізніше були перенесені в С, наприклад ключові слова const і inline, оголошення в циклах for і коментарі в стилі C++ («//»). У пізніших реалізаціях С також були представлені можливості, яких немає в C++, наприклад макроси vararg і покращена робота з масивами-параметрами.
Не об'єктно-орієнтовані можливості
В цьому розділі описуються можливості, безпосередньо не пов'язані з об'єктно-орієнтованим програмуванням (ООП). Багато які з них, проте, особливо важливі у поєднанні з ООП.
- Ключове слово inline означає, що функція є хорошим кандидатом на оптимізацію, при якій в місцях звернення до функції компілятор вставить тіло цієї функції, а не код виклику. Приклад: inline double Sqr(double x) {return x*x;}
- Замість функцій malloc і free, введені нові оператори і . Якщо T — довільний тип, то
- new T виділяє пам'ять, достатню для розміщення одного об'єкта типу Т; після завершення виклику оператора, компілятор здійснює ініціалізацію об'єкта (викликаючи його конструктор, якщо такий був визначний) і повертає вказівник типу Т*.
- new T[n] виділяє пам'ять, достатню для розміщення n об'єктів типу Т; після завершення виклику оператора, компілятор здійснює ініціалізацію кожного з n об'єктів і повертає вказівник типу Т*.
- delete p — звільняє пам'ять, на яку посилається вказівник p, виділену для нього раніше операцією new T. Деініціалізація об'єкта (викликаючи деструктор) забезпечується компілятором ще до виклику оператора delete.
- delete [] p — звільняє область пам'яті, виділену для цього масиву раніше операцією new T[n]. Деініціалізація кожного елементу масиву забезпечується компілятором ще до виклику оператора.
Як видно, однією з принципових відмінностей операторів new та delete від своїх попередників, malloc і free, є обов'язковість ініціалізації об'єктів, пам'ять під які було призначено. Іншою відмінністю є те, що загальна реалізація (тобто визначена за умовчанням) оператора new не повертає нульове значення вказівника у випадку помилки призначення пам'яті (наприклад з причини її браку). Натомість new кидає виняток (наприклад, std::bad_alloc в ситуації браку пам'яті). Так само як і для free, якщо значенням аргументу оператора delete є 0, ані звільнення пам'яті, ані деініціалізація не відбувається (при цьому, подібна ситуація не вважається помилковою).
- Функції можуть приймати аргументи за посиланням. Наприклад, функція void f(int& x) {x=3;} присвоює своєму аргументу значення 3. Функції також можуть повертати результат за посиланням, і посилання можуть бути поза всяким зв'язком з функціями. Наприклад, {double& b=a[3]; b=sin(b);} еквівалентно а[3]=sin(а[3]);. Посилання певною мірою схожі з вказівниками, з такими особливостями: при описі посилання ініціалізувалися вказівником на наявне значення даного типу; посилання довічно указує на одну і ту ж адресу; при зверненні до посилання операція читання пам'яті за адресою посилання проводиться автоматично. На відміну від вказівників, посилання не може бути константним саме по собі, однак може посилатися на константний об'єкт. Наприклад, int const & const ref = a[3]; — є некоректним, з точки зору C++, виразом, на відміну від int const * const ref = &a[3]; своєю чергою, і int const & ref = a[3];, і int const * ref = &a[3]; — є цілком прийнятними.
- Можуть бути декілька функцій з одним і тим же ім'ям, але різними типами або кількістю аргументів (перевантаження функцій; при цьому тип значення, що повертається, на перевантаження не впливає). Наприклад, цілком можна писати:
void Print(int x); void Print(double x); 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);
Оператори нічим не відрізняються від (інших) функцій. Не можна описувати оператори над зумовленими типами (скажімо, перевизначати множення чисел); не можна вигадувати нові операції, яких немає в C++ (скажімо **); арність (кількість параметрів) і пріоритет операцій зберігається (скажімо, у виразі 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. Якщо ми в якійсь одиниці трансляції (файл основного коду, наприклад myFile.cpp, та всі заголовкові файли що він включає) хочемо звертатися до них безпосередньо, ми можемо написати
using namespace Foo;
Або ж
using Foo::T;
Також можна створити синонім на вже наявний простір імен (наприклад, аби уникнути постійно повторювати довгу назву простору)
namespace MyVeryOwnNameSpace { typedef std::vector< std::string > StringTable; } namespace My = MyVeryOwnNameSpace;
Простори імен потрібні, щоб не виникало колізій між пакетами, що мають однакові імена глобальних змінних, функцій і типів. Спеціальним випадком є безіменний простір імен
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 основним способом організації даних були структури. Структура складається з набору полів, які ніяк не захищені. Якщо елементи структури мають змінну довжину, їх представляють як вказівники. Виділення і звільнення пам'яті під ці вказівники роблять вручну. Наприклад, одновимірний масив змінної довжини в мові 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. Програміст може забути викликати одну з цих функцій, або викликати її дуже рано/запізно, або двічі, або з вказівником на неправильний масив. Все це приводить до помилок, що важко виявити.
- Немає ніякого способу перешкодити програмістам створювати і інші функції для роботи зі структурою Array. Ці функції можуть робити з полями len і val будь-що.
- Немає ніякого способу перешкодити програмістам безпосередньо міняти поля len і val.
- Присвоєння об'єктів типу struct Array призведе до того, що їхні поля val указуватимуть на одну і ту ж область пам'яті. Засобами мови Сі відсутня можливість заборонити присвоєння, ні змінити таку поведінку.
Натомість, у мові C++, завдяки наявності засобів об'єктно-орієнтованого програмування, є можливість уникнути цих недоліків.
Інкапсуляція
Основним способом організації інформації в C++ є класи. На відміну від типу, структура (struct) мови С, що складається тільки з полів, клас (class) C++ складається з полів і функцій-членів або методів (англ. member functions). Поля бувають публічними (public), захищеними (protected) і приватними (private). У C++ тип структура аналогічний типу клас, відмінність в тому, що за умовчанням поля і функції-члени у структури публічні, а у класу — приватні.
З публічними полями можна робити зовні класу все, що завгодно. До захищених і приватних полів не можна звертатися ззовні класу, щоб не порушити цілісність даних класу. Спроба такого звернення викличе помилку компіляції. До таких полів можуть звертатися тільки функції-члени класу (а також так звані функції-друзі і функції-члени класів-друзів; про поняття друзів в 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++03 вкладений клас не має прав доступу до закритих членів обхопного класу і не може бути оголошений його другом (це виходить з визначення терміну друг як нечлена класу). Проте, багато розповсюджених компіляторів порушують обидва ці правила (може, зважаючи на сукупну дивність цих правил).
Переваги та недоліки
Переваги мови C++
- Стандартизація. C++ визначається міжнародним стандартом, а отже не контролюється якоюсь одною фірмою чи людиною.
- Швидкодія. Швидкість роботи програм на C++ практично не поступається програмам на С, хоча програмісти отримали в свої руки нові можливості і нові засоби.
- Ефективність. Рішення розроблені на C++ можуть використовувати мінімальну необхідну кількість ресурсів таких як пам'ять, ЦП, енергія та інші.
- Масштабованість. На мові C++ розробляють програми для найрізноманітніших платформ і систем, які варіюються за розміром від кількох до мільйонів рядочків коду.
- Можливість роботи на низькому рівні з пам'яттю, адресами, портами. (Що, при необережному використанні, може легко перетворитися на недолік.)
- Можливість створення узагальнених алгоритмів для різних типів даних, їхня спеціалізація, і обчислення на етапі компіляції, з використанням шаблонів.
- Підтримуються різні стилі та технології програмування, включаючи традиційне процедурне програмування, ООП, узагальнене програмування, метапрограмування (шаблони, макроси).
Недоліки мови C++
- Наявність безліч можливостей, що порушують принципи типобезпеки приводить до того, що в C++ програми може легко закрастися важковловна помилка. Замість контролю з боку компілятора розробники вимушені дотримуватися вельми нетривіальних правил кодування. По суті, ці правила обмежують C++ рамками якоїсь безпечнішої підмови. Більшість проблем типобезпеки C++ успадкована від С, але важливу роль в цьому питанні грає і відмова автора мови від ідеї використовувати автоматичне управління пам'яттю (наприклад, збірку сміття). Так візитною карткою C++ стали вразливості типу «переповнювання буфера».
- Погана підтримка модульності. Підключення інтерфейсу зовнішнього модуля через препроцесорну вставку заголовного файлу (#include) серйозно уповільнює компіляцію, при підключенні великої кількості модулів. Для усунення цього недоліку, багато компіляторів реалізують механізм прекомпіляції заголовних файлів (англ. Precompiled Headers).
- Недостача інформації про типи даних під час компіляції ().
- Мова C++ є складною для вивчення і для компіляції.
- Деякі перетворення типів неінтуїтивні. Зокрема, операція над беззнаковим і знаковим числами видає беззнаковий результат.
- Препроцесор C++ (успадкований від C) дуже примітивний. Це приводить з одного боку до того, що з його допомогою не можна (або важко) здійснювати деякі завдання метапрограмування, а з іншого, внаслідок своєї примітивності, він часто приводить до помилок і вимагає багато дій з обходу потенційних проблем. Деякі мови програмування (наприклад, Scheme і Nemerle) мають набагато могутніші і безпечніші системи метапрограмування (також звані макросами, але макроси С/C++ вони мало нагадують).
- З кінця 1990-х в спільноті C++ набуло поширення так зване метапрограмування на базі шаблонів. По суті, воно використовує особливості шаблонів C++ в цілях реалізації на їхній базі інтерпретатора примітивної функціональної мови програмування, що виконується під час компіляції. Сама по собі ця можливість вельми приваблива, але, внаслідок вищезгаданого, такий код вельми важко сприймати і зневаджувати. Мови Lisp/Scheme, Nemerle і деякі інші мають могутніші і водночас простіші для сприйняття підсистеми метапрограмування. Крім того, в мові D реалізована порівнянна за потужністю, але значно простіша в застосуванні підсистема шаблонного метапрограмування.
- Хоча декларується, що C++ мультипарадигмова мова, реально в мові відсутня підтримка функціонального програмування. Частково, даний пропуск усувається різними бібліотеками (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#
Мова C++ з появою перших трансляторів знайшла відразу ж дуже широке розповсюдження, на ній було створено величезну кількість програм і застосунків. У міру накопичення досвіду створення великих програмних систем спливли недоліки, які спонукали до пошуку альтернативних рішень. Таким альтернативним рішенням стала мова Java, яка в деяких галузях стала конкурувати у популярності з C++, а фірма Майкрософт запропонувала мову C# як нову мову, що розвиває принципи C++ і що використовує переваги мови Java. Надалі з'явилася мова Nemerle, що об'єднує переваги C# з можливістю функціонального програмування. Останнім часом з'явилася спроба об'єднання ефективності C++, безпеки і швидкості розробки, як в Java і C# — була запропонована мова D, яка поки не отримала широкого визнання.
Мова Java має такі особливості, яких немає в мові C++ :
- Java є типобезпечною мовою. Типобезпека гарантує відсутність у програмах помилок, які важко знайти і які пов'язані з неправильною інтерпретацією пам'яті комп'ютера. Це робить процес розробки надійнішим і передбачуваним, а отже швидшим. Так само це дозволяє залучати до розробки програмістів, що мають меншу кваліфікацію і мати великі групи розробників.
- Java-код компілюється спочатку не в машинний код, а в певний проміжний код, який надалі інтерпретується або компілюється, тоді як багато C++ компіляторів орієнтовані на компіляцію в машинний код заданої платформи.
- У мові Java є чіткі певні стандарти на введення-виведення, графіку, геометрію, діалог, доступ до баз даних і інших типових застосувань. Завдяки цим особливостям, застосунки на Java мають значно кращу кросплатформовість, ніж C++, і часто, бувши написані для певного комп'ютера й операційної системи, працюють під іншими системами без змін. Програмісти, що пишуть на мові Java, не залежать від пакунків, нав'язаних розробниками компіляторів на дане конкретне середовище, що різко спрощує портування програм.
- У мові Java реалізовано повноцінне збирання сміття, якого немає в C++. Немає в C++ і засобів перевірки правильності вказівників. З іншого боку, C++ володіє набором засобів (конструктори і деструктори, стандартні шаблони, посилання), що дозволяють майже повністю виключити виділення і звільнення пам'яті вручну і небезпечні операції з вказівниками. Проте таке виключення вимагає певної культури програмування, тоді як в мові Java воно реалізується автоматично.
- Мова Java є чисто об'єктно-орієнтованою, тоді як C++ підтримує як об'єктно-орієнтоване, так і процедурне програмування.
- В C++ відсутня повноцінна інформація про типи під час виконання RTTI. Цю можливість можна було б реалізувати в C++, маючи повну інформацію про типи під час компіляції .
- У C++ є можливість введення призначеного для користувача синтаксису за допомогою #define, що може привести до того, що модулі у великих пакетах програм стають сильно пов'язані один з одним. Це різко знижує надійність пакетів і можливість організації розділених модулів. З іншого боку, C++ надає достатньо засобів (константи, шаблони, вбудовані функції) для того, щоб практично повністю виключити використання #define.
Ці відмінності призводять до запеклих суперечок між прихильниками двох мов про те, яка мова найкраща. Прихильники Java вважають ці особливості перевагами; прихильники C++ вважають, що у багатьох випадках ці особливості є недоліками, зокрема
- Ціною переносності є вимога наявності на комп'ютері віртуальної Java-машини, що приводить до уповільнення обчислень і практичної неможливості використання нових можливостей апаратної архітектури.
- Автоматичне збирання сміття призводить до втрати контролю зі сторони розробника (що можна би було використати для покращення швидкодії чи ефективності використання пам'яті).
- Стандарти на графіку, доступ до баз даних тощо є недоліком, якщо програміст хоче визначити свій власний стандарт.
- Вказівники у багатьох випадках є могутнім, або навіть необхідним засобом, а їхнє безконтрольне використання небезпечне лише в невмілих руках.
- Підтримка процедурного програмування є корисною.
Далеко не всі програмісти є прихильниками однієї з мов. На думку деяких програмістів, Java і C++ не є конкурентами, тому що мають різні галузі застосування. Інші вважають, що вибір мови для багатьох завдань є питанням особистого смаку. Деякі архітектори програмних рішень базують свій вибір мови програмування для того чи іншого рішення на основі сильних та слабких сторін мов програмування так загальному контексті розробки рішення.
Примітки
- Evolving a language in and for the real world: C++ 1991—2006, Bjarne Stroustrup (PDF). (PDF) оригіналу за 20 листопада 2007. Процитовано 20 листопада 2007.
- IEEE Spectrum опублікувала рейтинг найпопулярніших мов програмування 2023 року. // Автор: Артем Житкевич. 30.08.2023
- . Архів оригіналу за 27 листопада 2011. Процитовано 15 серпня 2011.
- . ISO. 14 January 2014. Архів оригіналу за 29 січня 2017. Процитовано 29 січня 2020.
- (PDF). ISO. 15 мая 2013. Архів оригіналу (PDF) за 21 січня 2022. Процитовано 29 січня 2020.
- Sutter, Herb (18 серпня 2014), , архів оригіналу за 19 серпня 2014, процитовано 18 серпня 2014
- . 21 березня 2017. Архів оригіналу за 4 лютого 2020. Процитовано 21 березня 2017.
- (PDF). Архів оригіналу (PDF) за 25 березня 2017.
{{}}
: Cite має пустий невідомий параметр:|df=
() - . Архів оригіналу за 29 січня 2020. Процитовано 29 січня 2020.
- ISO/IEC 14882:2017. Архів оригіналу за 17 травня 2013. Процитовано 29 січня 2020.
Посилання
- isocpp.org [ 14 липня 2018 у Wayback Machine.] — домашня сторінка Стандарту C++ в інтернеті — новини, статус і обговорення C++ на усіх компіляторах і платформах.(англ.)
- корисні ресурси по C++ [ 26 листопада 2021 у Wayback Machine.].(англ.)
- C++ reference [ 26 листопада 2021 у Wayback Machine.].(англ.)
Онлайн-курси
- Безплатний курс НВУ для початківців, включно з тестами [ 25 лютого 2008 у Wayback Machine.](рос.)
- Безплатний курс НВУ для професіоналів, включно з тестами (рос. переклад Бьєрна Страуструпа) [ 24 лютого 2008 у Wayback Machine.](рос.)
- Авторський курс лекцій з C++ Алексєєва Є. Р.
Статті та книги
- Основи мови програмування C++
- Підручник C++ в Вікіпідручники [Архівовано 16 листопада 2021 у Wayback Machine.]
- (англ.)
- A Brief Look at C++0x by Bjarne Stroustrup [ 9 листопада 2020 у Wayback Machine.] (англ.)
- Timothy A. Budd. C++ For Java Programmers [1] [ 25 березня 2013 у Wayback Machine.]
Див. також
- Java, C# — популярні мови програмування створені під впливом C++.
- Об'єктно-орієнтоване програмування
Вікіпедія, Українська, Україна, книга, книги, бібліотека, стаття, читати, завантажити, безкоштовно, безкоштовно завантажити, mp3, відео, mp4, 3gp, jpg, jpeg, gif, png, малюнок, музика, пісня, фільм, книга, гра, ігри, мобільний, телефон, android, ios, apple, мобільний телефон, samsung, iphone, xiomi, xiaomi, redmi, honor, oppo, nokia, sonya, mi, ПК, web, Інтернет
C Si plyus plyus mova programuvannya zagalnogo priznachennya z pidtrimkoyu kilkoh paradigm programuvannya ob yektno oriyentovanoyi uzagalnenoyi procedurnoyi ta in B yarn Straustrup angl Bjarne Stroustrup pochav stvoryuvati C v AT amp T Bell Laboratories en Nyu Dzhersi u 1979 roci Na etapi zarodzhennya mova mala nazvu Si z klasami Zgodom Straustrup perejmenuvav movu na C u 1984 r Maye krpieeya v movi programuvannya S Vpershe opisana mizhnarodnim standartom ISO IEC 14882 1998 C 98 najbilsh aktualnim zhe ye standart ISO IEC 14882 2020 C 20 C ParadigmaMultiparadigmova ob yektno oriyentovana uzagalnena procedurnaData poyavi1985TvorciB yarn StraustrupRozrobnik en WG21Ostannij relizC 20 gruden 2020 Sistema tipizaciyistatichna Osnovni realizaciyiG Microsoft Visual C Borland C Builder ClangDialektiISO IEC 14882 1998 2003 2011 2014 2017 2020Pid vplivom vidSmalltalk C Simula Ada 83 CLU MLVplinula naAda 95 C Java PHP D Zvichajni rozshirennya fajliv cc cpp cxx c c h hpp hh hxx abo h Repozitorij vihidnogo kodugithub com cplusplus draftVebsajtisocpp org Instrukciyi u Vikipidruchniku Mediafajli u Vikishovishi U 1990 h rokah C stala odniyeyu z najuzhivanishih mov programuvannya zagalnogo priznachennya Movu vikoristovuyut dlya sistemnogo programuvannya rozrobki prikladnogo programnogo zabezpechennya napisannya drajveriv potuzhnih servernih ta kliyentskih program a takozh dlya rozrobki rozvazhalnih program napriklad videoigor C suttyevo vplinula na inshi populyarni sogodni movi programuvannya C ta Java IstoriyaHronologiya B yarn Straustrup tvorec movi Istoriya rozvitku movi programuvannya C mistit taki klyuchovi podiyi kviten 1979 pochatok roboti nad Ci z klasami C with Classes zhovten 1979 robocha versiya Ci z klasami z CPre kompilyatorom serpen 1983 Ci z klasami vpershe vikoristovuyetsya v Bell Labs 1984 nazva C lyutij 1985 pershij zovnishnij vipusk kompilyatora C en Relese E Educational vipusk dlya navchalnih zakladiv zhovten 1985 pershij komercijnij vipusk Cfront 1 0 lyutij 1987 Cfront 1 2 gruden 1987 pershij vipusk GNU C 1 13 1988 Pershi vipuski Oregon Software C i Zortech C cherven 1989 Cfront 2 0 1989 kniga The Annotated C Reference Manual ARM Zasnovano komitet ANSI C 1990 persha tehnichna zustrich komitetu ANSI C prijnyato shabloni templates vinyatkovi situaciyi exceptions pershij vipusk Borland C 1991 Persha zustrich komitetu ISO IEC Cfront 3 0 z shablonami kniga The C Programming Language 2 ga redakciya 1992 Pershi vipuski IBM DEC Microsoft C 1993 RTTI Run time type identification viznachennya tipu pid chas vikonannya prijnyato prostori nazv namespaces i string shablonnij za simvolnim tipom prijnyato 1994 prijnyato STL 1997 ostatochne golosuvannya komitetu za zavershenij standart 1998 ratifikovano standart ISO IEC 14882 1998 C tak zvanij C 98 2003 ratifikovano standart ISO IEC 14882 2003 C tak zvanij C 03 pochatok roboti nad C 0x Podalshij rozvitok opisanij v stattyah pro vidpovidni versiyi C V 2023 roci u kategoriyi najpopulyarnishih mov programuvannya sered IT specialistiv zgidno z rejtingom IEEE Spectrum yakij ohoplyuvav 59 mov programuvannya top 5 viglyadav tak Python Java C C JavaScript Istoriya nazvi Nazva Si bula vigadana Rikom Massitti Rick Mascitti i vpershe bulo vikoristana v grudni 1983 roku Ranishe na etapi rozrobki nova mova nazivalasya Si z klasami Im ya sho vijshlo u rezultati pohodit vid operatora Si zbilshennya znachennya zminnoyi na odinicyu i poshirenomu sposobu prisvoyennya novih imen komp yuternim programam sho polyagaye v dodavanni do imeni simvolu dlya poznachennya polipshen Zgidno zi Straustrupom cya nazva ukazuye na evolyucijnu prirodu zmin Ci Virazom S nazivali ranishnyu ne pov yazanu z Si movu programuvannya Deyaki programisti na Si mozhut vidmititi sho yaksho vikonuyutsya virazi x 3 y x to v rezultati vijde x 4 i y 3 tomu sho x zbilshuyetsya tilki pislya prisvoyennya jogo u Prote yaksho drugij viraz bude y x to vijde x 4 i y 4 Vihodyachi z cogo mozhna zrobiti visnovok sho logichnishe bulo b nazvati movu ne Si a Si Prote obidva virazi c i c zbilshuyut s a krim togo viraz c poshirenishij Pedanti takozh mozhut vidmititi sho vvedennya movi Si ne zminyuye samogo Si tomu najtochnishim im yam bulo b S 1 Standart C 11 Dokladnishe C 11 U serpni 2011 roku zavershilasya trivala epopeya z prijnyattyam novogo standartu dlya movi Si Komitet ISO zi standartizaciyi C odnogolosno zatverdiv specifikaciyu C 0X yak mizhnarodnij standart C 11 Standart C 0X planuvalosya vipustiti she v 2008 roci ale jogo prijnyattya postijno vidkladalosya Bilshist predstavlenih v standarti mozhlivostej vzhe pidtrimuyutsya v takih kompilyatorah yak GCC IBM C Intel C i Visual C standartni biblioteki z pidtrimkoyu C buli realizovani v ramkah proektu Boost Novij standart rozvivavsya ponad 10 rokiv i prijshov na zminu standartam C 98 i C 03 Vidznachayetsya sho yaksho vidminnosti mizh standartami C 98 i C 03 buli nastilki neznachnimi sho yih mozhna bulo ne pomititi to standart C 11 mistit nizku kardinalnih pokrashen yak samoyi movi tak i standartnoyi biblioteki Za slovami B yarna Straustrupa tvorcya C C 11 vidchuvayetsya yak nova mova chastini yakoyi krashe poyednuyutsya odna z odnoyu U C 11 visokorivnevij stil programuvannya stav prirodnishim Krim togo mova stala prostishoyu dlya vivchennya Standart C 14 Dokladnishe C 14 Povna nazva International Standard ISO IEC 14882 2014 E Programming Language C C 14 mozhna rozglyadati yak nevelike rozshirennya dlya C 11 yake v osnovnomu mistit vipravlennya pomilok i neznachni pokrashennya Komitet z rozrobki novogo standartu opublikuvav chernetku N3690 15 travnya 2013 Robochij variant chernetki N3936 buv opublikovanij 2 bereznya 2014 roku finalnij period golosuvannya zakritij 15 serpnya 2014 roku a rezultat odnogolosne shvalennya ogoloshenij 18 serpnya 2014 roku Data oficijnogo vipusku C 14 15 grudnya 2014 Oskilki rozrobka standartu bula dosit trivaloyu i ne bulo viznacheno roku vipusku v period rozrobki takozh mav poshirenu nazvu C 1y analogichno do togo yak standart C 11 do jogo vipusku nazivali C 0x vipusk ciyeyi versiyi ochikuvali do 2010 roku Opisani nizhche mozhlivosti movi vidpovidayut chernetci N3797 11 sichnya 2020 u Wayback Machine Voni mozhut desho vidriznyatisya vid ostatochnoyi versiyi standartu 29 sichnya 2020 u Wayback Machine Standart C 17 Dokladnishe C 17 Standart C 17 dijshov do chornovoyi versiyi standartu v berezni 2017 roku i buv ostatochno zatverdzhena 8 veresnya 2017 roku Standart oficijno opublikovanij u grudni 2017 U C 17 bulo vneseno ryad zmin v movu zokrema dodano dekilka novih bibliotek lt string view gt lt execution gt algoritmiv std exclusive scan std for each ta klasiv do STL polipsheno robotu z lyambda virazami onovleno biblioteku lt thread gt dlya multipotokovogo programuvannya Standart C 20 Dokladnishe C 20 Standart C 20 zatverdzheno 4 veresnya 2020 roku Standart oficijno opublikovanij u grudni 2020 Cya versiya maye nabagato bilshe novovveden v porivnyanni z C 14 ta C 17 Zokrema cya versiya vvodit koncepciyi spivprogrami novij operator porivnyannya lt gt tosho OsoblivostiPri stvorenni C pragnuli zberegti sumisnist z movoyu S Bilshist program na S spravno pracyuvatimut i z kompilyatorom C C maye sintaksis zasnovanij na sintaksisi S div spisok operatoriv mov S ta C Novovvedennyami C porivnyano z S ye pidtrimka ob yektno oriyentovanogo programuvannya cherez klasi pidtrimka uzagalnenogo programuvannya cherez shabloni dopovnennya do standartnoyi biblioteki dodatkovi tipi danih obrobka vinyatkiv prostori imen vbudovani funkciyi perevantazhennya operatoriv perevantazhennya imen funkcij posilannya i operatori upravlinnya vilno rozpodilenoyu pam yattyu PrikladiPriklad programi Hello world Nizhche navedeno priklad prostoyi programi na C yaka vivodit na standartnij potik vivodu ryadok Hello world include lt iostream gt Pidklyuchennya fajlu z funkciyami ta polyami imen using namespace std Vkoristannya polya imen int main Ce golovna funkciya cout lt lt Hello world lt lt endl return 0 Kazhe te sho programma zavershilasya normalno ce poznachka pochatku komentarya Priklad programi zi zminnoyu Pislya zapusku programi na ekrani z yavitsya povidomlennya How old are you a kursor bude rozmishenij v nastupnomu ryadku Tam potribno vvesti cilochislove znachennya ta natisnuti klavishu Enter Priklad vvodimo chislo 25 todi z yavitsya povidomlennya You are 25 years old include lt iostream gt using namespace std int main int age Zminna dlya zapisu viku cout lt lt How old are You n Skilki vam rokiv cin gt gt age Zchituvannya viku cout lt lt You are lt lt age lt lt years old n Rezultat return 0 Tehnichnij oglyadChastina informaciyi v cij statti zastarila Vi mozhete dopomogti onovivshi yiyi Mozhlivo storinka obgovorennya mistit zauvazhennya shodo potribnih zmin kviten 2020 V 1998 roci mova C bula standartizovana Mizhnarodnoyu organizaciyeyu standartizaciyi pid nomerom 14882 1998 Mova Programuvannya C Potochnij standart C 11 vin buv prijnyatij u 2011 roci robochoyu grupoyu MOS pislya desyatirichnoyi pidgotovki Standart C na 1998 rik skladayetsya z dvoh osnovnih chastin yadra movi i standartnoyi biblioteki Standartna biblioteka C uvibrala v sebe biblioteku shabloniv STL sho rozroblyalasya odnochasno iz standartom Zaraz nazva STL oficijno ne vzhivayetsya prote v kolah programistiv na C cya nazva vikoristovuyetsya dlya poznachennya chastini standartnoyi biblioteki sho mistit viznachennya shabloniv kontejneriv iteratoriv algoritmiv i funktoriv Standart C mistit normativne posilannya na standart Si vid 1990 roku i ne viznachaye samostijno ti funkciyi standartnoyi biblioteki yaki zapozichuyutsya iz standartnoyi biblioteki S Poza tim isnuye velichezna kilkist bibliotek C kotri ne vhodyat v standart U programah na C mozhna vikoristovuvati bagato bibliotek S Standartizaciya viznachila movu programuvannya C prote za ciyeyu nazvoyu mozhut hovatisya takozh nepovni obmezheni dostandartni varianti movi Spochatku mova rozvivalasya poza formalnimi ramkami spontanno u miru zavdan sho stavilisya pered nim Rozvitok movi suprovodiv rozvitok kross kompilyatora Cfront Novovvedennya v movi vidbivalisya v zmini nomera versiyi kross kompilyatora Ci nomeri versij kross kompilyatora rozpovsyudzhuvalisya i na samu movu Aktualnij standart uhvalenij v 2023 roci C 23 Standartna bibliotekaStandartna biblioteka C vklyuchaye standartnu biblioteku S z nevelikimi zminami yaki roblyat yiyi vidpovidnishoyu dlya movi C Insha velika chastina biblioteki C zasnovana na Standartnij Biblioteci Shabloniv STL Vona nadaye taki vazhlivi instrumenti yak kontejneri napriklad vektori i spiski i iteratori uzagalneni vkazivniki sho nadayut dostup do cih kontejneriv yak do masiviv Krim togo STL dozvolyaye shozhim chinom pracyuvati i z inshimi tipami kontejneriv napriklad asociativnimi spiskami stekami chergami Vikoristovuyuchi shabloni mozhna pisati uzagalneni algoritmi zdatni pracyuvati z bud yakimi kontejnerami abo poslidovnostyami dostup do chleniv yakih zabezpechuyut iteratori Tak samo yak i v S mozhlivosti bibliotek aktivizuyutsya vikoristannyam direktivi include dlya vklyuchennya standartnih fajliv Vsogo v standarti C viznacheno 50 takih fajliv STL do vklyuchennya v standart C bula storonnoyu rozrobkoyu na pochatku firmi HP a potim SGI Standart movi ne nazivaye yiyi STL oskilki cya biblioteka stala neviddilnoyu chastinoyu movi prote bagato lyudej dosi vikoristovuyut cyu nazvu shob vidriznyati yiyi vid reshti chastini standartnoyi biblioteki potoki vvedennya vivedennya Iostream pidrozdil Si tosho Proekt pid nazvoyu STLport 7 chervnya 2018 u Wayback Machine zasnovanij na SGI STL zdijsnyuye postijne onovlennya STL IOstream i ryadkovih klasiv Deyaki inshi proyekti takozh zajmayutsya rozrobkoyu privatnih zastosuvan standartnoyi biblioteki dlya riznih konstruktorskih zavdan Kozhen virobnik kompilyatoriv C obov yazkovo postavlyaye yakus realizaciyu ciyeyi biblioteki oskilki vona ye duzhe vazhlivoyu chastinoyu standartu i shiroko vikoristovuyetsya Prichinoyu uspihu STL zokrema yiyi vhid do standartnoyi biblioteki C bula nacilenist na shiroke kolo zavdan i uzagalnena struktura V comu sensi blizkoyu za duhom STL na sogodni ye biblioteka Boost Boost tezh ye bibliotekoyu zagalnogo zastosuvannya i tezh vplivaye na formuvannya standartnoyi biblioteki C Novi mozhlivosti v porivnyanni z SMova Si bagato v chomu ye nadmnozhinoyu S Novi mozhlivosti C vklyuchayut ogoloshennya u viglyadi viraziv peretvorennya tipiv u viglyadi funkcij operatori new i delete tip bool posilannya rozshirene ponyattya konstantnosti ta zminnosti funkciyi sho pidstavlyayutsya argumenti za umovchannyam pereviznachennya prostori imen klasi vklyuchayuchi i vsi pov yazani z klasami mozhlivosti taki yak uspadkuvannya funkciyi chleni metodi virtualni funkciyi abstraktni klasi i konstruktori pereviznachennya operatoriv shabloni operator obrobku vinyatkiv dinamichnu identifikaciyu i bagato sho inshe Si ye takozh movoyu strogogo tipuvannya i nakladaye bilshe vimagan shodo dotrimannya tipiv porivnyano z Si U C z yavilisya komentari u viglyadi podvijnoyi kosoyi riski yaki buli v poperedniku S movi BCPL Deyaki osoblivosti C piznishe buli pereneseni v S napriklad klyuchovi slova const i inline ogoloshennya v ciklah for i komentari v stili C U piznishih realizaciyah S takozh buli predstavleni mozhlivosti yakih nemaye v C napriklad makrosi vararg i pokrashena robota z masivami parametrami Ne ob yektno oriyentovani mozhlivostiV comu rozdili opisuyutsya mozhlivosti bezposeredno ne pov yazani z ob yektno oriyentovanim programuvannyam OOP Bagato yaki z nih prote osoblivo vazhlivi u poyednanni z OOP Klyuchove slovo inline oznachaye sho funkciya ye horoshim kandidatom na optimizaciyu pri yakij v miscyah zvernennya do funkciyi kompilyator vstavit tilo ciyeyi funkciyi a ne kod vikliku Priklad inline double Sqr double x return x x Zamist funkcij malloc i free vvedeni novi operatori new i delete Yaksho T dovilnij tip to new T vidilyaye pam yat dostatnyu dlya rozmishennya odnogo ob yekta tipu T pislya zavershennya vikliku operatora kompilyator zdijsnyuye inicializaciyu ob yekta viklikayuchi jogo konstruktor yaksho takij buv viznachnij i povertaye vkazivnik tipu T new T n vidilyaye pam yat dostatnyu dlya rozmishennya n ob yektiv tipu T pislya zavershennya vikliku operatora kompilyator zdijsnyuye inicializaciyu kozhnogo z n ob yektiv i povertaye vkazivnik tipu T delete p zvilnyaye pam yat na yaku posilayetsya vkazivnik p vidilenu dlya nogo ranishe operaciyeyu new T Deinicializaciya ob yekta viklikayuchi destruktor zabezpechuyetsya kompilyatorom she do vikliku operatora delete delete p zvilnyaye oblast pam yati vidilenu dlya cogo masivu ranishe operaciyeyu new T n Deinicializaciya kozhnogo elementu masivu zabezpechuyetsya kompilyatorom she do vikliku operatora Yak vidno odniyeyu z principovih vidminnostej operatoriv new ta delete vid svoyih poperednikiv malloc i free ye obov yazkovist inicializaciyi ob yektiv pam yat pid yaki bulo priznacheno Inshoyu vidminnistyu ye te sho zagalna realizaciya tobto viznachena za umovchannyam operatora new ne povertaye nulove znachennya vkazivnika u vipadku pomilki priznachennya pam yati napriklad z prichini yiyi braku Natomist new kidaye vinyatok napriklad std bad alloc v situaciyi braku pam yati Tak samo yak i dlya free yaksho znachennyam argumentu operatora delete ye 0 ani zvilnennya pam yati ani deinicializaciya ne vidbuvayetsya pri comu podibna situaciya ne vvazhayetsya pomilkovoyu Funkciyi mozhut prijmati argumenti za posilannyam Napriklad funkciya void f int amp x x 3 prisvoyuye svoyemu argumentu znachennya 3 Funkciyi takozh mozhut povertati rezultat za posilannyam i posilannya mozhut buti poza vsyakim zv yazkom z funkciyami Napriklad double amp b a 3 b sin b ekvivalentno a 3 sin a 3 Posilannya pevnoyu miroyu shozhi z vkazivnikami z takimi osoblivostyami pri opisi posilannya inicializuvalisya vkazivnikom na nayavne znachennya danogo tipu posilannya dovichno ukazuye na odnu i tu zh adresu pri zvernenni do posilannya operaciya chitannya pam yati za adresoyu posilannya provoditsya avtomatichno Na vidminu vid vkazivnikiv posilannya ne mozhe buti konstantnim same po sobi odnak mozhe posilatisya na konstantnij ob yekt Napriklad int const amp const ref a 3 ye nekorektnim z tochki zoru C virazom na vidminu vid int const const ref amp a 3 svoyeyu chergoyu i int const amp ref a 3 i int const ref amp a 3 ye cilkom prijnyatnimi Mozhut buti dekilka funkcij z odnim i tim zhe im yam ale riznimi tipami abo kilkistyu argumentiv perevantazhennya funkcij pri comu tip znachennya sho povertayetsya na perevantazhennya ne vplivaye Napriklad cilkom mozhna pisati void Print int x void Print double x void Print int x int y Odin abo dekilka ostannih argumentiv funkciyi mozhut zadavatisya za umovchannyam Napriklad yaksho funkciya opisana yak void f int x int y 5 int z 10 vikliki f 1 f 1 5 i f 1 5 10 ekvivalentni Pri opisi funkcij vidsutnist argumentiv v duzhkah oznachaye na vidminu vid Si sho argumentiv nemaye a ne te sho voni nevidomi Yaksho argumenti nevidomi treba koristuvatisya trikrapkoyu napriklad int printf const char fmt Tip pershogo argumentu povinen buti zadanij Mozhna opisuvati operatori nad novimi tipami Napriklad tak struct Date int day month year void operator struct Date amp date Operatori nichim ne vidriznyayutsya vid inshih funkcij Ne mozhna opisuvati operatori nad zumovlenimi tipami skazhimo pereviznachati mnozhennya chisel ne mozhna vigaduvati novi operaciyi yakih nemaye v C skazhimo arnist kilkist parametriv i prioritet operacij zberigayetsya skazhimo u virazi a b c spochatku vikonuvatimetsya mnozhennya a potim skladannya do yakih bi tipiv ne nalezhali a b i s Mozhna pereviznachiti operator z odnim parametrom i z bud yakim chislom parametriv Dodani prostori imen namespace Napriklad yaksho napisatinamespace Foo const int x 5 typedef int T void f y return y x double g T to poza figurnimi duzhkami mi povinni zvertatisya do T x f g yak Foo T Foo x Foo f Foo g Yaksho mi v yakijs odinici translyaciyi fajl osnovnogo kodu napriklad myFile cpp ta vsi zagolovkovi fajli sho vin vklyuchaye hochemo zvertatisya do nih bezposeredno mi mozhemo napisati using namespace Foo Abo zh using Foo T Takozh mozhna stvoriti sinonim na vzhe nayavnij prostir imen napriklad abi uniknuti postijno povtoryuvati dovgu nazvu prostoru namespace MyVeryOwnNameSpace typedef std vector lt std string gt StringTable namespace My MyVeryOwnNameSpace Prostori imen potribni shob ne vinikalo kolizij mizh paketami sho mayut odnakovi imena globalnih zminnih funkcij i tipiv Specialnim vipadkom ye bezimennij prostir imen namespace Vsi imena opisani v nomu dostupni v potochnij odinici translyaciyi i bilshe nide nenachebto mi do kozhnogo opisu pripisali static Dodanij novij tip bool sho maye znachennya true i false Operaciyi porivnyannya povertayut tip bool Virazi v duzhkah pislya if while privodyatsya do tipu bool oznachaye sho vsya chastina ryadka sho zalishilasya ye komentarem Dodani shabloni template Napriklad template lt class T gt T Min T x T u return x lt y x y viznachaye funkciyu Min dlya bud yakih tipiv Shabloni mozhut zadavati ne tilki funkciyi ale i tipi Napriklad template lt class T gt struct Array int len T val viznachaye masiv znachen bud yakogo tipu pislya chogo mi mozhemo pisati Array lt float gt x Vvedena standartna biblioteka shabloniv STL angl Standard Template Library sho viznachaye shabloni i funkciyi dlya vektoriv odnovimirnih masiviv dovilnoyi dovzhini mnozhin asociativnih masiviv map spiskiv simvolnih ryadkiv potokiv vvedennya vivodu ta inshi shabloni i funkciyi Yaksho opisana struktura klas pro klasi div nizhche union abo pererahuvannya enum yiyi im ya ye im yam tipu napriklad struct Time int hh mm ss Time t1 t2 Useredini strukturi abo klasu mozhna opisuvati novi tipi yak cherez typedef tak i cherez opis inshih struktur abo klasiv Dlya dostupu do takih tipiv poza strukturoyu abo klasom do imeni tipu dodayetsya im ya strukturi i dvi dvokrapki struct S typedef int T T x S T u Ob yektno oriyentovani osoblivosti moviC dodaye do S ob yektno oriyentovani mozhlivosti Vin vvodit klasi yaki zabezpechuyut tri najvazhlivishi vlastivosti OOP inkapsulyaciyu uspadkuvannya i polimorfizm Problemi starogo pidhodu V movi C osnovnim sposobom organizaciyi danih buli strukturi Struktura skladayetsya z naboru poliv yaki niyak ne zahisheni Yaksho elementi strukturi mayut zminnu dovzhinu yih predstavlyayut yak vkazivniki Vidilennya i zvilnennya pam yati pid ci vkazivniki roblyat vruchnu Napriklad odnovimirnij masiv zminnoyi dovzhini v movi C z perevirkoyu mezh mozhe buti predstavlenij tak 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 Taka realizaciya maye taki nedoliki Neobhidno viklikati FreeArray i AllocArray Programist mozhe zabuti viklikati odnu z cih funkcij abo viklikati yiyi duzhe rano zapizno abo dvichi abo z vkazivnikom na nepravilnij masiv Vse ce privodit do pomilok sho vazhko viyaviti Nemaye niyakogo sposobu pereshkoditi programistam stvoryuvati i inshi funkciyi dlya roboti zi strukturoyu Array Ci funkciyi mozhut robiti z polyami len i val bud sho Nemaye niyakogo sposobu pereshkoditi programistam bezposeredno minyati polya len i val Prisvoyennya ob yektiv tipu struct Array prizvede do togo sho yihni polya val ukazuvatimut na odnu i tu zh oblast pam yati Zasobami movi Si vidsutnya mozhlivist zaboroniti prisvoyennya ni zminiti taku povedinku Natomist u movi C zavdyaki nayavnosti zasobiv ob yektno oriyentovanogo programuvannya ye mozhlivist uniknuti cih nedolikiv Inkapsulyaciya Osnovnim sposobom organizaciyi informaciyi v C ye klasi Na vidminu vid tipu struktura struct movi S sho skladayetsya tilki z poliv klas class C skladayetsya z poliv i funkcij chleniv abo metodiv angl member functions Polya buvayut publichnimi public zahishenimi protected i privatnimi private U C tip struktura analogichnij tipu klas vidminnist v tomu sho za umovchannyam polya i funkciyi chleni u strukturi publichni a u klasu privatni Z publichnimi polyami mozhna robiti zovni klasu vse sho zavgodno Do zahishenih i privatnih poliv ne mozhna zvertatisya zzovni klasu shob ne porushiti cilisnist danih klasu Sproba takogo zvernennya vikliche pomilku kompilyaciyi Do takih poliv mozhut zvertatisya tilki funkciyi chleni klasu a takozh tak zvani funkciyi druzi i funkciyi chleni klasiv druziv pro ponyattya druziv v C divis nizhche Poza tilom funkcij chleniv a takozh druziv zahisheni i vlasni polya nedostupni navit dlya chitannya Takij zahist poliv nazivayetsya inkapsulyaciyeyu Vikoristovuyuchi inkapsulyaciyu avtor klasu mozhe zahistiti svoyi dani vid nekorektnogo vikoristannya Krim togo vona zamislyuvalasya dlya polegshennya sumisnoyi rozrobki klasiv Malosya na uvazi sho zmina sposobu zberigannya danih yaksho voni ogolosheni yak zahisheni abo privatni ne vimagaye vidpovidnih zmin v klasah yaki vikoristovuyut zminenij klas Napriklad yaksho v starij versiyi klasu dani zberigalisya u viglyadi linijnogo spisku a v novij versiyi u viglyadi dereva ti klasi yaki buli napisani do zmini formatu zberigannya danih perepisuvati ne bude potribno yaksho dani buli privatnimi abo zahishenimi u ostannomu vipadku yaksho vikoristovuyuchi klasi ne buli klasami nashadkami oskilki zhoden z nih cih klasiv ne mig bi bezposeredno zvertatisya do danih a tilki cherez standartni funkciyi yaki v novij versiyi mayut vzhe korektno pracyuvati z novim formatom danih Navit operator dostupu operator mozhe buti viznachenij yak taka standartna funkciya Funkciyi chleni yak i polya mozhut buti publichnimi zahishenimi i privatnimi Publichni funkciyi mozhe viklikati bud hto a zahisheni i vlasni tilki funkciyi chleni i druzi Vikoristovuyuchi inkapsulyaciyu strukturu Array z poperednogo rozdilu mozhna perepisati takim chinom 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 gt 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 gt 0 amp amp i lt len return val i inline void Array ChangeElem int i double x assert i gt 0 amp amp i lt len val i x I dali Array a a Alloc 10 a ChangeElem 3 2 78 double b a Elem 3 a Free Tut masiv a maye 4 publichnih funkciyi chlena i 2 zahishenih polya Opisuvach inline oznachaye sho zamist vikliku funkciyi yiyi kod pidstavlyayetsya v tochku vikliku sho rozv yazuye problemu neefektivnosti Opis funkcij v tili klasu V tili klasu mozhna vkazati tilki zagolovok funkciyi a mozhna opisati vsyu funkciyu U drugomu vipadku vona vvazhayetsya vbudovanoyu inline napriklad class Array public void Alloc int len if len gt 0 Free val new double len len i tak dali Konstruktori i destruktori Prote v navedenomu prikladi ne virishena vazhliva problema funkciyi Alloc i Free yak i ranishe treba viklikati vruchnu Insha problema danogo prikladu nebezpeka operatora prisvoyennya Dlya rozv yazannya cih problem u movu buli vvedeni konstruktori i destruktori Konstruktor viklikayetsya shorazu koli stvoryuyetsya ob yekt danogo tipu destruktor pri znishenni Pri peretvorennyah tipiv prisvoyenni peredachi parametra tezh viklikayutsya konstruktori i pri neobhidnosti destruktori Z konstruktorami i destruktorami klas viglyadaye tak class Array public Array len 0 val NULL Array int len len len val new double len Array const Array amp 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 amp a len a len val new double len for int i 0 i lt len i val i a val i Tut Array Array konstruktor a Array Array destruktor Konstruktor kopiyuvannya angl copy constructor Array Array const Array amp viklikayetsya pri prisvoyenni Teper ob yekt klasu Array ne mozhna zipsuvati yak bi mi jogo ne stvoryuvali sho b mi ne robili jogo znachennya bude korektnim tomu sho konstruktor viklikayetsya avtomatichno Vsi nebezpechni operaciyi z vkazivnikami zahovani v zahisheni funkciyi Array a 5 viklikayetsya Array Array int Array b viklikayetsya Array Array Array c a viklikayetsya Array Array const Array amp Array d a te same b c vidbuvayetsya viklik operatora yaksho vin ne viznachenij yak v danomu vipadku to viklikayetsya operator prisvoyennya za umovchannyam yakij zdijsnyuye pobitove kopiyuvannya dlya bazovih tipiv i viklik operatora prisvoyennya dlya koristuvacha yak pravilo konstruktor kopij i operator prisvoyennya pereviznachayutsya poparno Operator new tezh viklikaye konstruktori a delete destruktori Za umovchannyam kozhen klas maye konstruktor bez parametriv i destruktor Konstruktor bez parametriv za umovchannyam viklikaye konstruktori vsih elementiv a destruktor yihni destruktori Inshi konstruktori za umovchannyam ne viznacheni Klas mozhe mati skilki zavgodno konstruktoriv z riznimi naborami parametriv ale tilki odin destruktor bez parametriv Inshi mozhlivosti funkcij chleniv Funkciyi chleni mozhut buti i operaciyami class Array inline double amp operator int n I dali Array a 10 double b a 5 Funkciyi chleni i lishe voni mozhut mati opisuvach const class Array inline double operator int n const Taki funkciyi ne mayut prava zminyuvati polya klasu okrim poliv viznachenih yak mutable Yaksho voni namagayutsya ce zrobiti kompilyator povinen vidati povidomlennya pro pomilku Uspadkuvannya Dlya stvorennya klasiv z dodanoyu funkcionalnistyu vvodyat uspadkuvannya Klas nashadok maye polya i funkciyi chleni bazovogo klasu ale ne maye prava zvertatisya do privatnih private poliv i funkcij bazovogo klasu U comu i polyagaye riznicya mizh privatnimi i zahishenimi chlenami Klas nashadok mozhe dodavati svoyi polya i funkciyi abo pereviznachati funkciyi bazovogo klasu Za umovchannyam konstruktor nashadka bez parametriv viklikaye konstruktor bazovogo klasu a potim konstruktori dodanih elementiv Destruktor pracyuye v zvorotnomu poryadku Inshi konstruktori dovoditsya viznachati shorazu nanovo Na shastya ce mozhna zrobiti viklikom konstruktora bazovogo klasu class ArrayWithAdd public Array ArrayWithAdd int n Array n ArrayWithAdd Array ArrayWithAdd const Array amp a Array a void Add const Array amp a Nashadok ce bilsh nizh bazovij klas tomu vin mozhe vikoristovuvatisya skriz de vikoristovuyetsya bazovij klas ale ne navpaki Uspadkuvannya buvaye publichnim zahishenim i privatnim Pri publichnomu uspadkuvanni publichni i zahisheni chleni bazovogo klasu zberigayut svij status a do privatnih ne mozhut zvertatisya navit funkciyi chleni nashadka Zahishene uspadkuvannya vidriznyayetsya tim sho pri nim publichni chleni bazovogo klasu ye zahishenimi chlenami nashadka Pri privatnomu uspadkuvanni do zhodnogo chlena bazovogo klasu navit funkciyi chleni nashadka prava zvertatisya ne mayut Yak pravilo publichne uspadkuvannya zustrichayetsya znachno chastishe za inshi Klas mozhe buti nashadkom dekilkoh klasiv Ce nazivayetsya mnozhinnim uspadkuvannyam Takij klas volodiye polyami i funkciyami chlenami vsih jogo predkiv Napriklad klas FlyingCat mozhe buti nashadkom klasiv Cat i FlyingAnimal class Cat void Purr class FlyingAnimal void Fly class FlyingCat public Cat public FlyingAnimal PurrAndFly Purr Fly Polimorfizm Polimorfizmom v programuvanni nazivayetsya pereviznachennya nashadkom funkcij chleniv bazovogo klasu napriklad class Figure void Draw const class Square public Figure void Draw const class Circle public Figure void Draw const V danomu prikladi yaka z funkcij bude viklikana Circle Draw Square Draw abo Figure Draw viznachayetsya pid chas kompilyaciyi Napriklad yaksho napisati Figure x new Circle 0 0 5 x gt Draw to bude viklikane Figure Draw oskilki x ob yekt klasu Figure Takij polimorfizm nazivayetsya statichnim Ale v C ye i dinamichnij polimorfizm koli funkciya sho viklikayetsya viznachayetsya pid chas vikonannya Dlya cogo funkciyi chleni povinni buti virtualnimi 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 lt 10 i figures i gt Draw U comu razi dlya kozhnogo elementu bude viklikana Square Draw abo Circle Draw zalezhno vid vidu figuri Chisto virtualnoyu funkciyeyu nazivayetsya funkciya chlen yaka ne viznachena v bazovomu klasi a tilki v nashadkah class Figure virtual void Draw const 0 Os ce 0 i oznachaye sho funkciya chisto virtualna Abstraktnim klasom nazivayetsya takij u yakogo ye hoch bi odna chisto virtualna funkciya chlen Ob yekti takih klasiv stvoryuvati zaboroneno Abstraktni klasi vikoristovuyutsya yak interfejsi Druzi Funkciyi druzi ce funkciyi sho ne ye funkciyami chlenami prote mayut dostup do zahishenih i vlasnih poliv i funkcij chleniv klasu Voni povinni buti opisani v tili klasu yak friend Napriklad class Matrix friend Matrix Multiply Matrix m1 Matrix m2 Matrix Multiply Matrix m1 Matrix m2 Tut funkciya Multiply mozhe zvertatisya do bud yakih poliv i funkcij chleniv klasu Matrix Isnuyut takozh klasi druzi Yaksho klas A drug klasu B to vsi jogo funkciyi chleni mozhut zvertatisya do bud yakih poliv i funkcij chleniv klasu B Napriklad class Matrix friend class Vector Prote v C ne diye pravilo drug mogo druga mij drug Za standartom C 03 vkladenij klas ne maye prav dostupu do zakritih chleniv obhopnogo klasu i ne mozhe buti ogoloshenij jogo drugom ce vihodit z viznachennya terminu drug yak nechlena klasu Prote bagato rozpovsyudzhenih kompilyatoriv porushuyut obidva ci pravila mozhe zvazhayuchi na sukupnu divnist cih pravil Perevagi ta nedolikiPerevagi movi C Standartizaciya C viznachayetsya mizhnarodnim standartom a otzhe ne kontrolyuyetsya yakoyus odnoyu firmoyu chi lyudinoyu Shvidkodiya Shvidkist roboti program na C praktichno ne postupayetsya programam na S hocha programisti otrimali v svoyi ruki novi mozhlivosti i novi zasobi Efektivnist Rishennya rozrobleni na C mozhut vikoristovuvati minimalnu neobhidnu kilkist resursiv takih yak pam yat CP energiya ta inshi Masshtabovanist Na movi C rozroblyayut programi dlya najriznomanitnishih platform i sistem yaki variyuyutsya za rozmirom vid kilkoh do miljoniv ryadochkiv kodu Mozhlivist roboti na nizkomu rivni z pam yattyu adresami portami Sho pri neoberezhnomu vikoristanni mozhe legko peretvoritisya na nedolik Mozhlivist stvorennya uzagalnenih algoritmiv dlya riznih tipiv danih yihnya specializaciya i obchislennya na etapi kompilyaciyi z vikoristannyam shabloniv Pidtrimuyutsya rizni stili ta tehnologiyi programuvannya vklyuchayuchi tradicijne procedurne programuvannya OOP uzagalnene programuvannya metaprogramuvannya shabloni makrosi Nedoliki movi C Nayavnist bezlich mozhlivostej sho porushuyut principi tipobezpeki privodit do togo sho v C programi mozhe legko zakrastisya vazhkovlovna pomilka Zamist kontrolyu z boku kompilyatora rozrobniki vimusheni dotrimuvatisya velmi netrivialnih pravil koduvannya Po suti ci pravila obmezhuyut C ramkami yakoyis bezpechnishoyi pidmovi Bilshist problem tipobezpeki C uspadkovana vid S ale vazhlivu rol v comu pitanni graye i vidmova avtora movi vid ideyi vikoristovuvati avtomatichne upravlinnya pam yattyu napriklad zbirku smittya Tak vizitnoyu kartkoyu C stali vrazlivosti tipu perepovnyuvannya bufera Pogana pidtrimka modulnosti Pidklyuchennya interfejsu zovnishnogo modulya cherez preprocesornu vstavku zagolovnogo fajlu include serjozno upovilnyuye kompilyaciyu pri pidklyuchenni velikoyi kilkosti moduliv Dlya usunennya cogo nedoliku bagato kompilyatoriv realizuyut mehanizm prekompilyaciyi zagolovnih fajliv angl Precompiled Headers Nedostacha informaciyi pro tipi danih pid chas kompilyaciyi Mova C ye skladnoyu dlya vivchennya i dlya kompilyaciyi Deyaki peretvorennya tipiv neintuyitivni Zokrema operaciya nad bezznakovim i znakovim chislami vidaye bezznakovij rezultat Preprocesor C uspadkovanij vid C duzhe primitivnij Ce privodit z odnogo boku do togo sho z jogo dopomogoyu ne mozhna abo vazhko zdijsnyuvati deyaki zavdannya metaprogramuvannya a z inshogo vnaslidok svoyeyi primitivnosti vin chasto privodit do pomilok i vimagaye bagato dij z obhodu potencijnih problem Deyaki movi programuvannya napriklad Scheme i Nemerle mayut nabagato mogutnishi i bezpechnishi sistemi metaprogramuvannya takozh zvani makrosami ale makrosi S C voni malo nagaduyut Z kincya 1990 h v spilnoti C nabulo poshirennya tak zvane metaprogramuvannya na bazi shabloniv Po suti vono vikoristovuye osoblivosti shabloniv C v cilyah realizaciyi na yihnij bazi interpretatora primitivnoyi funkcionalnoyi movi programuvannya sho vikonuyetsya pid chas kompilyaciyi Sama po sobi cya mozhlivist velmi privabliva ale vnaslidok vishezgadanogo takij kod velmi vazhko sprijmati i znevadzhuvati Movi Lisp Scheme Nemerle i deyaki inshi mayut mogutnishi i vodnochas prostishi dlya sprijnyattya pidsistemi metaprogramuvannya Krim togo v movi D realizovana porivnyanna za potuzhnistyu ale znachno prostisha v zastosuvanni pidsistema shablonnogo metaprogramuvannya Hocha deklaruyetsya sho C multiparadigmova mova realno v movi vidsutnya pidtrimka funkcionalnogo programuvannya Chastkovo danij propusk usuvayetsya riznimi bibliotekami Loki Boost sho vikoristovuyut zasobi metaprogramuvannya dlya rozshirennya movi funkcionalnimi konstrukciyami napriklad pidtrimkoyu lyambd anonimnih metodiv ale yakist podibnih rishen znachno postupayetsya yakosti vbudovanih u funkcionalni movi rishen Taki mozhlivosti funkcionalnih mov yak zistavlennya zi zrazkom vzagali ukraj skladno emulyuvati zasobami metaprogramuvannya Kritika movi C C uspadkuvala bagato problem movi C Operaciya prisvoyuvannya poznachayetsya yak a operaciya porivnyannya yak Yih legko splutati i taka konstrukciya bude sintaksichno pravilnoyu ale privede do vazhkovlovnoyi pomilki Osoblivo chasto ce vidbuvayetsya v operatorah if i while napriklad programist mozhe napisati if i 0 zamist if i 0 Razom z tim osnovna masa kompilyatoriv vidaye v takih vipadkah poperedzhennya Uniknuti pomilki takogo tipu mozhna yaksho pisati vsi operaciyi porivnyannya u takomu viglyadi if 0 i Do togo zh bagato mov Bejsik Paskal vikoristovuyut simvol same v operaciyah porivnyannya Operaciyi prisvoyuvannya inkrementaciyi dekrementaciyi ta inshi povertayut znachennya U poyednanni z velikoyu kilkistyu operacij ce dozvolyaye ale ne zobov yazuye programista stvoryuvati kod sho vazhko chitayetsya Z inshogo boku odin z osnovnih principiv mov C i C dozvolyati programistovi pisati v bud yakomu stili a ne nav yazuvati horoshij stil Do togo zh ce inodi dozvolyaye kompilyatoru stvoryuvati optimalnishij kod Makrosi define ye potuzhnim ale nebezpechnim zasobom U movi C na vidminu vid C neobhidnist v nebezpechnih makrosah z yavlyayetsya znachno ridshe zavdyaki shablonam i vbudovanim funkciyam Ale v uspadkovanih standartnih S bibliotekah bagato potencijno nebezpechnih makrosiv Dehto vvazhaye nedolikom movi C vidsutnist sistemi zbirki smittya Z inshogo boku v C ye dostatno zasobiv klasi z konstruktorami i destruktorami standartni shabloni peredacha parametriv za posilannyam sho dozvolyayut majzhe viklyuchiti vikoristannya nebezpechnih vkazivnikiv A vidsutnist vbudovanoyi zbirki smittya dozvolyaye koristuvachevi samomu vibrati strategiyu upravlinnya resursami Krim togo avtomatichna zbirka smittya serjozno upovilnyuye robotu programi i ce nedolik tam de produktivnist ye kritichno vazhlivoyu Porivnyannya C z movami Java i C Mova C z poyavoyu pershih translyatoriv znajshla vidrazu zh duzhe shiroke rozpovsyudzhennya na nij bulo stvoreno velicheznu kilkist program i zastosunkiv U miru nakopichennya dosvidu stvorennya velikih programnih sistem splivli nedoliki yaki sponukali do poshuku alternativnih rishen Takim alternativnim rishennyam stala mova Java yaka v deyakih galuzyah stala konkuruvati u populyarnosti z C a firma Majkrosoft zaproponuvala movu C yak novu movu sho rozvivaye principi C i sho vikoristovuye perevagi movi Java Nadali z yavilasya mova Nemerle sho ob yednuye perevagi C z mozhlivistyu funkcionalnogo programuvannya Ostannim chasom z yavilasya sproba ob yednannya efektivnosti C bezpeki i shvidkosti rozrobki yak v Java i C bula zaproponovana mova D yaka poki ne otrimala shirokogo viznannya Mova Java maye taki osoblivosti yakih nemaye v movi C Java ye tipobezpechnoyu movoyu Tipobezpeka garantuye vidsutnist u programah pomilok yaki vazhko znajti i yaki pov yazani z nepravilnoyu interpretaciyeyu pam yati komp yutera Ce robit proces rozrobki nadijnishim i peredbachuvanim a otzhe shvidshim Tak samo ce dozvolyaye zaluchati do rozrobki programistiv sho mayut menshu kvalifikaciyu i mati veliki grupi rozrobnikiv Java kod kompilyuyetsya spochatku ne v mashinnij kod a v pevnij promizhnij kod yakij nadali interpretuyetsya abo kompilyuyetsya todi yak bagato C kompilyatoriv oriyentovani na kompilyaciyu v mashinnij kod zadanoyi platformi U movi Java ye chitki pevni standarti na vvedennya vivedennya grafiku geometriyu dialog dostup do baz danih i inshih tipovih zastosuvan Zavdyaki cim osoblivostyam zastosunki na Java mayut znachno krashu krosplatformovist nizh C i chasto buvshi napisani dlya pevnogo komp yutera j operacijnoyi sistemi pracyuyut pid inshimi sistemami bez zmin Programisti sho pishut na movi Java ne zalezhat vid pakunkiv nav yazanih rozrobnikami kompilyatoriv na dane konkretne seredovishe sho rizko sproshuye portuvannya program U movi Java realizovano povnocinne zbirannya smittya yakogo nemaye v C Nemaye v C i zasobiv perevirki pravilnosti vkazivnikiv Z inshogo boku C volodiye naborom zasobiv konstruktori i destruktori standartni shabloni posilannya sho dozvolyayut majzhe povnistyu viklyuchiti vidilennya i zvilnennya pam yati vruchnu i nebezpechni operaciyi z vkazivnikami Prote take viklyuchennya vimagaye pevnoyi kulturi programuvannya todi yak v movi Java vono realizuyetsya avtomatichno Mova Java ye chisto ob yektno oriyentovanoyu todi yak C pidtrimuye yak ob yektno oriyentovane tak i procedurne programuvannya V C vidsutnya povnocinna informaciya pro tipi pid chas vikonannya RTTI Cyu mozhlivist mozhna bulo b realizuvati v C mayuchi povnu informaciyu pro tipi pid chas kompilyaciyi U C ye mozhlivist vvedennya priznachenogo dlya koristuvacha sintaksisu za dopomogoyu define sho mozhe privesti do togo sho moduli u velikih paketah program stayut silno pov yazani odin z odnim Ce rizko znizhuye nadijnist paketiv i mozhlivist organizaciyi rozdilenih moduliv Z inshogo boku C nadaye dostatno zasobiv konstanti shabloni vbudovani funkciyi dlya togo shob praktichno povnistyu viklyuchiti vikoristannya define Ci vidminnosti prizvodyat do zapeklih superechok mizh prihilnikami dvoh mov pro te yaka mova najkrasha Prihilniki Java vvazhayut ci osoblivosti perevagami prihilniki C vvazhayut sho u bagatoh vipadkah ci osoblivosti ye nedolikami zokrema Cinoyu perenosnosti ye vimoga nayavnosti na komp yuteri virtualnoyi Java mashini sho privodit do upovilnennya obchislen i praktichnoyi nemozhlivosti vikoristannya novih mozhlivostej aparatnoyi arhitekturi Avtomatichne zbirannya smittya prizvodit do vtrati kontrolyu zi storoni rozrobnika sho mozhna bi bulo vikoristati dlya pokrashennya shvidkodiyi chi efektivnosti vikoristannya pam yati Standarti na grafiku dostup do baz danih tosho ye nedolikom yaksho programist hoche viznachiti svij vlasnij standart Vkazivniki u bagatoh vipadkah ye mogutnim abo navit neobhidnim zasobom a yihnye bezkontrolne vikoristannya nebezpechne lishe v nevmilih rukah Pidtrimka procedurnogo programuvannya ye korisnoyu Daleko ne vsi programisti ye prihilnikami odniyeyi z mov Na dumku deyakih programistiv Java i C ne ye konkurentami tomu sho mayut rizni galuzi zastosuvannya Inshi vvazhayut sho vibir movi dlya bagatoh zavdan ye pitannyam osobistogo smaku Deyaki arhitektori programnih rishen bazuyut svij vibir movi programuvannya dlya togo chi inshogo rishennya na osnovi silnih ta slabkih storin mov programuvannya tak zagalnomu konteksti rozrobki rishennya PrimitkiEvolving a language in and for the real world C 1991 2006 Bjarne Stroustrup PDF PDF originalu za 20 listopada 2007 Procitovano 20 listopada 2007 IEEE Spectrum opublikuvala rejting najpopulyarnishih mov programuvannya 2023 roku Avtor Artem Zhitkevich 30 08 2023 Arhiv originalu za 27 listopada 2011 Procitovano 15 serpnya 2011 ISO 14 January 2014 Arhiv originalu za 29 sichnya 2017 Procitovano 29 sichnya 2020 PDF ISO 15 maya 2013 Arhiv originalu PDF za 21 sichnya 2022 Procitovano 29 sichnya 2020 Sutter Herb 18 serpnya 2014 arhiv originalu za 19 serpnya 2014 procitovano 18 serpnya 2014 21 bereznya 2017 Arhiv originalu za 4 lyutogo 2020 Procitovano 21 bereznya 2017 PDF Arhiv originalu PDF za 25 bereznya 2017 a href wiki D0 A8 D0 B0 D0 B1 D0 BB D0 BE D0 BD Cite web title Shablon Cite web cite web a Cite maye pustij nevidomij parametr df dovidka Arhiv originalu za 29 sichnya 2020 Procitovano 29 sichnya 2020 ISO IEC 14882 2017 Arhiv originalu za 17 travnya 2013 Procitovano 29 sichnya 2020 Posilannyaisocpp org 14 lipnya 2018 u Wayback Machine domashnya storinka Standartu C v interneti novini status i obgovorennya C na usih kompilyatorah i platformah angl korisni resursi po C 26 listopada 2021 u Wayback Machine angl C reference 26 listopada 2021 u Wayback Machine angl Onlajn kursi Bezplatnij kurs NVU dlya pochatkivciv vklyuchno z testami 25 lyutogo 2008 u Wayback Machine ros Bezplatnij kurs NVU dlya profesionaliv vklyuchno z testami ros pereklad Byerna Straustrupa 24 lyutogo 2008 u Wayback Machine ros Avtorskij kurs lekcij z C Aleksyeyeva Ye R Statti ta knigi Osnovi movi programuvannya C Pidruchnik C v Vikipidruchniki Arhivovano 16 listopada 2021 u Wayback Machine angl A Brief Look at C 0x by Bjarne Stroustrup 9 listopada 2020 u Wayback Machine angl Timothy A Budd C For Java Programmers 1 25 bereznya 2013 u Wayback Machine Div takozhC u sestrinskih VikiproyektahPortal Programuvannya Teksti u Vikipidruchniku Fajli u Vikishovishi Operatori v C ta C Java C populyarni movi programuvannya stvoreni pid vplivom C Ob yektno oriyentovane programuvannya Shabloni C