C++

**C++** (читат ся ги ***сі-плус-плус*** даколи ся скорочує до **CPP**) — у основнум компілованый, статічно тіпізованый, C-самаравучый, язык проґрамованя сполочного призначіня, высокого уровня, зотвореный данськым компютерным ученым Бяреном Страструпом, котрый зачав го робити в AT&T Bell Laboratories (Муррей-Гілл, Ню-Джерзі) у 1979 годови. Выпусшеный у 1985 годови, гий розширіня про языка проґрамованя С, головнов го ідийов было додати обєктно-орьєнтовані можности у Сі, спозад чого мав имня «**C with classes**»(«русин. **Сі из класами**»), из тых часу язык ся дуже розвойив. Из 1997, C++ має обєктно-орьєнтовані, сполочні тай функціоналні функційи, звирьху д можности убробкы тямы на низкум уровни  про такых сістем, ги мікрокомпютеры, авадь діля зотворіня оперчных сістем, наприклад хосновав ся у Windows и Linux. компілаторы C++ надавут: Free Software Foundation, LLVM, Microsoft, Intel, Embarcadero, Oracle тай IBM. Упирьвоє уписаный у меженароднум стандарті ISO/IEC 14882:1998 (C++98), выдтуть выходили сякі вирзійи: C++03, C++11, C++14, C++17, C++20, C++23. Май актулным стандартом же є ISO/IEC 14882:2024 (C++23).

Пудпорює такі парадіґмы проґрамованя, ги процедурноє проґрамованя, обєктово-орьєнтованоє проґрамованя, тай сполочноє проґрамованя. Язык має грубу стандартову бібіліотеку, котора включат у ся поширині контийнеры й алґорітмы, увожіня-вывожіня, реґуларні выражіня, пудпору многопоточности тай другі можности. C++ має у собі усобности як и высокоурувньовых, та пак и низкоурувньовых языку. Руняно из його попередником — языком C — має май грубу увагу д пудпорі обєктово-орьєнтованого тай сполочного проґрамованя.

C++ Широко хоснує ся про розробку проґрамного засобованя, є єдным из май популарных коду проґрамованя, по убзвідам 2015 года, кулькость проґрамісту Сі++ є около 4,4 міліона. Область його хоснованя включат зотворіня операчных сістем, рузных прикладных проґрам, драйверу, аплікацій про вбудованых сістем, высокопродутівных серверу, ай тоже компютерных бавок. Є много реалізацій языка C++, як и дарьмовых, так и комерційных и діля рузных платформ. Наприклад, про платформы x86 то є GCC, Clang, Visual C++, Intel C++ Compiler, Embarcadero (Borland) C++ Builder тай инакі. C++ мав грубиньськый уплыв на другі языкы проґрамованя, майсилно на Java, C# и Rust.

Сінтаксіс C++ унаслідує ся уд языка С. На зачинаньови єдным из прінціпу розробкы было усокочіня сполочливости из С. айбо, при тум, C++ не є у строгум змыслови надмножинов С: кулькость проґрам, которі можут єдинако добре трансловатися як и компілаторами Сі, так и компілаторами C++, доста велика, айбо не включає всякі можливі проґрамы на С.

Неникавучи ся на широкоє принятя языка, його крітіковали такі доста знані проґрамішты ги Лінус Сторвалдс, Річард Сталлман, Джошуа Блох, Кен Томпсон тай Доналд Кнот.

## Історія

### Зотворіня
Язык появився у зачинаньови 1980 году, коли робутник фірмы Bell Labs Бярен Страуструп придумав шор изліпшинь ид языкови Сі пуд свої потребности. Коли в кунци 1970-ых году Страуструп зачав робити в Bell Labs над задачами теорійи очерідий (у проґрамі діля моделованя телефонных выклику), Бярен увидів, што коли ун пробовав убхосновати еґзістовавші у тот час языкы проґрамованя, моделованя указали ся неефектівныма, а убхоснованя высокоефектівных машинных языку низкого уровня, выйшло дуже чажкоє. позад йихньої ограничиности у выражиньови кода й потребности контроловати булшость процесу. Сяк, язык Сімула має такі можности, котрых дуже гія было діля розробкы май грубого проґрамного засобованя, айбо робит ун дуже помалы, а язык BCPL доста быстрый, айбо дуже близкый ид языкам низкого уровня и не пудходив діля розробкы май грубого проґрамного засобованя. 

Притямивши досвід свойої кандідатської дісертаційи, Страуструп вырішив доповнити язык C (наслідник BCPL) можностями, котрі были в языкови Сімула. Язык Сі, будучи базовым языком сістемы Unix, на котруй робили компютеры Bell, є быстрым, многофункціоналным и переносимым. Страуструп добавив ид нему можность роботы з класами и обєктами. У выслідках практічні задачі моделованя указали ся доступными діля вырішіня як из бока часа розробкы (дякувучи хоснованьови подобавучых класу), так и з бока часа убчисліня (дякувучи скороті C). У пирьвв очерідь у C были додані класы (из инкапсулаційов), наслідованьом класу, строга провірка тіпу, inline-функційи й арґументы за мовчаньом. Пирьві вирзійи языка, якый иззачинаня кликав ся «C with classes» («Сі из класами»), стали доступныма з 1980 года.

Коли Страуструп розробляв «Сі из класами»,  ун написав проґраму cfront — транслатор, якый переробляв выхудный код свого языка в выхудный код простого Сі. Сесе позволило робити над новым языком и хосновати го на практіци, хоснувучи ужек мавучу в unix-инфраструктуру діля розробкы на Сі. Новый язык нечекано про автора дустав грубу популарность помеже колеґ и скоро Страуструп ужек не муг личнл пудпорьовати його, удповідавучи на тысячі звідань.

Ид 1983 годови в язык были додані нові можности, такі ги віртуалні функційи, переубтирьханя функцій и оператору, удкликаня, константы, хосноватильськоє контролованя над кроманьованьом слободнов тямов, изліпшина перевірка тіпа й коментарі в стілі BCPL (`//`). Дуставшый ся язык ужек перестав быти просто доповненов вирзійов класічного C и быв перейменованый из «*Сі из класами*» на «*C++*». Його пирьвый комерційный выпуск став ся в уктобри 1985 года.

До зачинаня офіційної стандартізаційи язык розвойовав ся по-булшости силов Страуструпа в удповідь на выжаданя проґрамістської сполочности. Функцію стандартного описаня языка додержовали написані Cтрауcтрупом печатні роботы по C++ (описаня языка, діловоє ведіня й так дале). И лем у 1998 годови быв ратіфікованый меженародный стандарт языка C++: ISO/IEC 14882:1998 «Standard for the C++ Programming Language»; по принятьови технічных правок стандарта в 2003 годови — слідувуча вирзія сего стандарта — ISO/IEC 14882:2003.

Из янувара 2018 года Страуструп быв уголошеный лауреатом примійи Чарлза Старка Дрейпера позад инженірьскої діятильности в 2018 годови «за концептуалізацію тай розробку языка проґрамованя C++».

У децембрьови 2022 года C++ засів тритє місто в индексови TIOBE, тым же выпередив Java пирьвый раз у історійи индекса. На новемберь 2024 года язык засідає другоє місто по Python, а Java — тритьоє.

### Розвуй и стандартізація языка
У 1985 ищи до выпуска офіційного стандарта, выйшло пирьвоє выданя книжкы «Язык проґрамованя C++». Пирьва комерційна реалізація выйшла в уктобрьови того же года. Ся книжка дає пирьвоє уписаня языка, што было доже важно позад того, што не было офіціалного стандарта. У 1989 годови стався выхуд C++ вирзійи 2.0. ю нові можности включали несчислиность наслідованя, абстрактні класы, статічні функційи-части, функційи-константы и сокочині части. У 1990 годови вышло «Коментованоє діловоє руководство за C++», котроє, у послідку стало основов стандарта. Послідні убновіня мали у собі шаблоны, выключіня, простур имнюн, нові способы привидіня тіпа и буловый тіп. Подля основы діля сокочіня й доступа д сполочным алґорітмам была выбрана Стандартова бібліотека шаблону (STL), розроблена Александром Степановым и Менґ Лі.

Стандартова бібліотека C++ тоже розвойила ся у рокаши з ним. Пирьвым доданьом д стандартнуй бібліотеци C++ стали потокы увожіня-вывожіня, задавучі можности про заміны традіційных функцій C `printf` и `scanf`. май пузно силным розвойом стандартової бібліотекы стало додаваня у ниї Стандартової бібліотекы шаблону.

* Офіційна стандартізація языка зачала ся у 1998 годови, коли быв опублікованый стандарт ISO/IEC 14882:1998 (знаный гий C++98), розробленый комітетом по стандартізації C++ (ISO/IEC JTC1/SC22/WG21 working group). Стандарт C++ не описовав способу именованя обєкту, дакотрых деталу убробкы выключных и другых можностий, изкапчаных из деталами реалізаційи, што робит незовмісным обєктный код, зотвореный рузными компілаторами. Айбо діля сего иншыма людми было зотворено много стандарту діля конкретных архітектур тай операчных сістем.
* У 2003 годови быв опублікованый штандарт C++ ISO/IEC 14882:2003, ди были выправлині явившіся хыбы і недоробкы попередної верзії штандарта. У 2005 годови быв опублікованый звід Library Technical Report 1 (коротко іменованый TR1). Не є офіційно частёв штандарта, звід описує розширіня штандартної бібліотекы, котрі, за думков автору, мавут быти включині у слідувущу верзію штандарта. Ступінь пудпоры TR1 ізліпшуєся майжек в усьых пудпорювучых компілаторах языка C++.
* Із 2009 года ійшла робота по убновінёви попередного штандарта. Выхудна верзія называлася C++09, у слідувущуму годови ї переназвали на C++0x. Штандарт быв опублікованый у 2011 годови тай іменованый C++11. У него включині доповніня у ядрови языка і розширіня штандартної бібліотекы, в тому числови груба часть TR1.
* Слідувуща верзія штандарта, C++14, выйшла в авґустови 2014 года. Она має у собі в основному уточніня тай выправліня хыб попередної верзії.
* Штандарт C++17, опублікованый у децемброви 2017 года, включив у штандартну бібліотеку паралелні верзії штандартных алґорітму і зрушив дакотрі старі тай дуже рідко хоснуйимі елементы.
* Послідня штабілна на тепирішньый момент дівуча верзія штандарта — C++20. Миже всьым, ун має у собі прінціпно нове — пудпору модулу.
* Штандарт C++23 на даный момент актівно убговорюєся комітетом ISO.

C++ дале розвойився, для того штобы удповідати тепирішным жаданям. Єдна із ґруп, розроблявучых язык C++ і направлявучых комітетови по штандартізації C++ предклала ёго ізліпшиня — то Boost, котра заниматся, у тому числі, довершинём можностю языка путём добавліня у него особностю метапроґрамованя.

Ніко не має права на язык C++, ун є слободным. Айбо сам документ штандарта языка (за выключінём чорновика) не доступный задарь. У рамках процеса штандартізації ISO выпускає дакулько виду выдань. У частности, технічні звіды тай технічні характерістікы публікувутся, коли «видно будучность, но не є доразної можности на згоду для публікації миженародного штандарта.» До 2011 года было опубліковано три технічні звіда по C++: TR 19768: 2007 (тоже знаный ги C++, Технічный звід 1) для розширіня бібліотекы в основному інтеґрованый у C++11, TR 29124: 2010 для шпеціалных математічных функцій, і TR 24733: 2011 для десятичної арітметікы із плававучов точков. Технічна шпеціфікація DTS 18822:. 2014 (по файловуй сістемі) была утвержена в зачинанёви 2015 года, і другі технічні характерістікы находятся у стадії розвоя і чекавут удобріня.

У марцови 2016 года в Росії была зотворена робоча ґрупа РҐ21 C++. ґрупа была орґанізована для збора жадань до штандарта C++, і выправліня їх у комітет і сокочіня на сполочных зборах Миженароднов орґанізаціёв по штандартізациї (ISO).

### Історія імня
Імня «Сі++» было выдумане Ріком Масітті (Rick Mascitti) і первый раз было захосноване у децемброви 1983 года. Май скоро, на етапови розробкы, новый язык назывався «Сі із класами». Імня, што выйшло у выслідкови, выходит уд оператора Сі «`++`» (Ізбульшіня значіня ізмінної на єденицю) тай пошириному способови присвойиня новых імену компютерным проґрамам, што лежит у додаванёви до імня сімбола «`+`» для позначіня ізліпшинь. ведля Страуструпа, «се імня указує на еволуційну природу міняня Сі». Імнём «С+» называли скуршый, не ізкапчаным із Сі++ язык проґрамованя

Язык тож не назывався D, того що «*ун є розширінём C і не стараєся выправляти хыбы дорогов зрушіня елементу C*»

Дакотрі проґрамісты на Сі можут замітити, што якшто оконувутся выразы `х=3; y=x++;` то у выслідкови выйде `х=4` і `y=3`, того што `x` ізбульшуєся лем по присвойиня го до `y`. айбо якшто другый выраз буде `y=++x;` то выйде `x=4` і `y=4`. Выходячи із сего, мож зробити выслідок, што май лоґічно было бы называти язык не Сі++, а ++Сі. айбо оба выразы c++ і ++c ізбульшувут с, ай поза тым выраз c++ є май пошириным.

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

### Філозофія C++
У книжци «Дізайн і еволуція C++» Берен Страуструп описує прінціпы, котрых ун додержовався при проєктованёви C++. Сисі прінціпы обяснявут, чого C++ іменно сякый, ги ун є. Дакотрі із них:

* Получити універсалный язык із штатістічными тіпами даных, ефектівностёв і переносимостёв языка C.
* Безпосередно тай всядыбоково пудпорёвати лум штилю проґрамованя, у тум числі процедурне проґрамованя, абстракцію даных, обєктово-орєнтоване проґрамованя тай сполочне проґрамованя.
* Дати проґрамістови слободу выбора, даже аж се даст му можность выбирати неправильно.
* Максімално усокотити сполочность із C, тым же зробити можным легкый перехуд уд проґрамованя на C.
* Убминути рузночитаность миже C і C++: кажда конштрукція, допустима в обох языках, мусит у каждых із них означати єдно, тай ідводити д єдному повожінёви проґрамы.
* Убминути особности, котрі залежат уд платформы авадь не сут універсалными.
* «Не платити за то, што не хоснуєся» — ніяка языкова можность не має доводити ід знижінёви продуктованя проґрам, не хоснуючых їх.
* Не требовати через-чурь убтяжине міліє проґрамованя.

## Убозріня языка
Штандарт C++ склдатся із двох основных частий: описаня ядра языка тай описаня штандартної бібліотекы.

Первый час язык розвивався поза формалных рамок, спонтанно, за міров поставшых перед ним задач. Розвоёви языка допровожовав розвуй крос-компілатора cfront. Оновіня у языкови выдавалися на ізміні номера верзії крос-компілатора. Сисі нумера верзій крос-компілатора розусяжовалися і на самый язык, айбо до днисьных часу бисіду про верзію языка C++ не ведут. Лем у 1998 годови язык став штандартізованым.

* C++ пудпорює як коментарі ги в штилі C (`/* коментарь */`), так і єднострокові (`// вся послідующа часть строкы буде коментарём`), ди `//` означат зачинаня коментаря, а май близькый наступный сімбол нового рядка, котрум не передує сімбол `\` (вадь еквівалентный ёму убозначиный `??/`), лічится кунцём коментаря. Плус сего коментаря у тому, што го не мусай заперати, циже убозначовати кониць коментаря.
* Шпеціфікатор `inline` для функцій. Функція, дефінована в удну тіла класа, є inline за замовчінём. Даный шпеціфікатор є пудказков компілаторови і може вбудовати тіло функції у код узамін ї безпосеридного выклика.
* Кваліфікаторы `const` і `volatile`. На розділ уд С, ди `const` означає лем доступ для читаня, у C++ ізмінна із кваліфікатором `const` має быти ініціалізована. `volatile` хоснуєся у описови ізмінных і інформує компілатор, што значіня даної ізмінної може быти поміняно способом, котрый компілатор не в станови для того штобы увидіти. Для ізмінных, установленых `volatile`, компілатор не мусит зачинати дії для оптімізації, мінявучі положіня ізмінної у тямі (наприклад, розміщувучи ї у реґіштрови) авадь покладавучися на непоміняность значіня ізмінної у просторі миже двома значінями які ся юй призначавут.
* Простур імен (`namespace`). Приклад: Выбираня іменно С гий основы для зотворіня языка проґрамованя убяснявут, тым што язык C:

# Є многоцілёвым, лаконічным тай удносно низькорувнёвым языком;
# Пудходит для вырішіня бульшости сістемных задач;
# оконаня усюды і на всёму;
# стыкуєся із міліём проґрамованя UNIX.— Б. Страуструп. Язык программирования C++. Раздел 1.6

Шпеціалным трафунком є безіменный простур імен. Всі імена, описані в нему, доступні лем у поточнуй єдиниці транслації і мавут локалне скапчаня. Простур імен `std` має у собі штандартні бібліотекы C++, простур імен chrono має функції для роботы із єдиницями часа із с chrono.

* Для роботы із тямов додані операторы `new`, `new[]`, `delete` тай `delete[]`. На розділ уд бібліотековых malloc і free, прийшовшых із C, дані операторы роблят ініціалізацію обєкта. Для класу — то є выклик конштруктора, для POD-тіпу ініціалізацію можна вадь не проводити(`new Pod;`) вадь провести ініціалізацію нуловыми значінями (`new Pod(); new Pod {};`).

### Тіпы
У C++ доступні слідувущі встановлині тіпы. тіпы C++ практічно повностю повторяют тіпы даных у C:

Язык увюг такє розуміня ги удкликаня, а із штандарта C++11 *— rvalue*-удкликаня і переадресуйимі удкликаня (). (см. Удкликаня (C++))

C++ додає д C обєтово-орьєнтовані можности. Ун уводит класы, которі давут три май важливых особности ООП: інкапсулацію, наслідованя і поліморфізм.

У штандартови C++ пуд класом (class) розумієся хосноватильськый тіп, убявленый із хоснованём єдного із ключовых слув `class`, `struct` авадь `union`, пуд штруктуров (structure) розумієся клас, убявленый через ключове слово `struct`, тай пуд убєденинём (union) розумієся клас, убявленый через ключове слово `union`. У залежности уд хоснованого ключового слова мінявутся так само і дакотрі свойства самого же класа. Наприклад, у класі, обявленум через `struct`, части без особно прописаного модіфікатора доступа будут за замовчінём мати публічну руню доступа, а не пріватну.

У тілови дефініції класа мож указати як обявліня функцій, так і їх дефініцію. У посліднёму трафункови функція є ітеґрованов(`inline`). Нештатічні функції-части можут мати кваліфікаторы `const` тай `volatile`, ай не лиш, щи можут мати удкличный кваліфікатор (`&` вадь `&&`).

### [[Наслідованя (проґрамованя)|Наслідованя]]
C++ пудпрює многоразове наслідованя. Базові класы (класы-предкы) указувутся у наголовкови описаня класа, можливо, із шпеціфікаторами доступа. Наслідованя уд каждого класа може быти публічным, засокоченым авадь запертым:

За замовчінём базовый клас наслідуєся ги *private*.

На выслідкови наслідованя клас-наслідник получає всі поля класа-предка і всі го методы; мож уповісти, што каждый екземплар класа-наслідника уміщат у собі *пудекземплар* каждого із класу-предку. Якшто єден клас-предок наслідуєся дакулько раз (се можливо, якшто ун є предком дакулькых базовых класу зотворявучого класа), то екземплары класа-наслідника буде мати тулько же пудекземплару даного класа-предка. Штобы убминути такого ефекта, якшто ун нежаданый, C++ пудпорює концепцію *віртуалного наслідованя*. При наслідованёви базовый клас може обявлятися віртуалным; на всі віртуалні входы класа-предка в дерево наслідованя класа-наслідника в наслідникови зотворюєся лем єден пудекземплар.

* Private наслідованя — має у собі всі методы і особности класа «утця» у запертому доступі із вон і запертому доступі для класу потомку
* Public наслідованя — має у собі всі методы і штімованя класа «утця» у выдпертому доступі із вон
* Protected наслідованя — то саме, што і private, айбо потомкы мавут доступ ід унаслідованым методам і особностям

### Поліморфізм
C++ пудпорює дінамічный поліморфізм і штімовськый поліморфізм.

Штімовськый поліморфізм представленый:

* Арґументами за замовчінём для функцій. Наприклад, для функції `void f(int x, int y=5, int z=10)`, выклик `f(1)`, `f(1,5)` и `f(1,5,10)` еквівалентный.
* Переубтерьханя функций: функція із єдным імнём може мати рузне число і рузні по тіпу арґументы. Наприклад:
* 
```cpp
void Print(int x);
void Print(double x);
void Print(int x, int y);
```


:: Частным трафунком переубтерьханя функцій мож лічити переубтерьханя оператору.

* Механізмом шаблону

Дінамічный поліморфізм реалізуєся помочов віртуалных методу тай іерархії наслідованя. Поліморфным у C++ є тип, мавучый ходь єден віртуалный метод. приклад іерархї:
```cpp
class Figure
{
public:
    virtual void Draw() = 0; // чистый віртуалный метод
    virtual ~Figure();       // ож є ходь єден віртуалный метод дештруктор гія зробити віртуалным
};

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

class Circle : public Figure
{
public:
    void Draw() override;
};
```
Туйкы клас Figure є абштрактным (і, онь, інтерфейсным), позад того што метод Draw не дефінованый. Обєкты сего класа не мож зотворити, айбо мож хосновати удкликаня авадь указникы із тіпом Figure. Ізбраня реалізації метода Draw буде проізводитися за час окончованя выходячи із реалного тіпа обєкта.

### [[Інкапсулація (проґрамованя)|Інкапсулація]]
Інкапсуляція у C++ реалізуєся через ідіфікацію руня доступа до частий класа: они можут быти публічными (удпертыми, `public`), засокочеными (`protected`) і пріватными (запертыми, `private`). У C++ штруктуры формално рузнится уд класу лем тым, што за замовчінём руня доступа д частям класа і тіп наслідованя у штруктуры публічні, а у класа — пріватні.

Перевірка доступа іде за час компілації, проба звіданя до недоступної части класа выкликає хыбу компілації.

#### Цімборы
*Функції-цімборы* — то є функції, котрі не є функціями-частями тай зато мавучі доступ д засокоченым і запертым частям класа. Они мавут быти обявлині в тілови класа ги `friend`. Наприклад:
```cpp
class Matrix {
    friend Matrix Multiply(Matrix m1, Matrix m2);
};
```
Туйкы функція `Multiply` може звідатися д полям і функціям-частям класа `Matrix`.

Цімборськым може быти обявленый як всьый клас, так і функція-часть класа.
Чотыри важливых ограничіня, котрі ся кладут на удношіня цімборськости в C++:

* **Цімборськость не транзітівна.** Якшто A обявляє цімбором B, ай B, у свою очерідь, обявляє цімбором C, то C не стає автоматічно цімбором для A. На то, A мусит явно обявити C свойым цімбором.
* **Цімборськость не сполочна.** Якшто клас A обявляє цімбором клас B, то ун не стає автоматічно цімбором для B. На то мусит існовати явне обявліня цімборськости A в класови B.
* **Цімборськость не наслідуєся.** Якшто A обявляє клас B свойым цімбором, то потомкы B не ставут автоматічно цімборами A. На то каждый із них мусит быти обявленый цімбором A в явнуй формі.
* **Цімборськость не розусяжуєся на потумку.** Якшто клас A обявляє B цімбором, то B не стає автоматічно цімбором для класу-потумку A. Каждый потомок, якшто то-то гія, мусит обявити B свойым цімбором сам.

У цілому видячи сисе правило мож сформуловати такым образом: *«Удношіня Цімборськости існує лем миже тыми класами (класом і функціёв), для котрых оно явно обявлене в кодови, і робит лем у тому напрямлінёви, в котрому оно обявлине».*

### Шпеціалні функції
Клас за замовчінём може мати шість шпеціалных функцій: конштруктор за замовчінём конштруктор копіёваня, конштруктор переміщіня, дештруктор, оператор присвойиня копіёванём, оператор присвойиня переміщинём. Тоже мож явно дефініціёвати їх всьых (см. Правило трёх).


```cpp
class Array {
public:
	Array() = default; // компілатор зотворит конштруктор за замовчінём сам
	Array(size_t _len) :
			len(_len) {
		val = new double[_len];
	}
	Array(const Array & a) = delete;  // конштруктор копіёваня явно зотертый
	Array(Array && a); // конштруктор переміщіня
	~Array() {
		delete[] val;
	}
	Array& operator=(const Array& rhs); // оператор присвоёваня копіёванём
	Array& operator=(Array&& rhs); // оператор присвоёваня переміщінём
	double& operator[](size_t i) {
		return val[i];
	}
	const double& operator[](size_t i) const {
		return val[i];
	}

protected:
	std::size_t len = 0; // ініціалізація поля
	double* val {nullptr};
};
```
Конштруктор выкликаєся для ініціаліції обєкта (удповідного тіпа) при ёго зотворінёви, а дештруктор — для зрушіня обєкта. Клас може мати пару конштруктору, айбо дештруктор може мати лем єден. Конштрукторы в C++ не можут быти обявлині віртуалными, а дештрукторы — можут, тай в основному обявлявутся для всьых поліморфных тіпу, штобы ґарантовати правильне зрушіня доступного за удкликанём авадь указатилёви обєкта незалежно уд того, якого тіпа удкликаня вадь указатиль. аж є ходь у єдного із базовых класу віртуалного дештруктора, дештруктор класа наслідника автоматічно стає віртуалным.

### Нові можности
Шаблоны дозволювут зотворяти функції і класы, штімовані дефініційным тіпом авадь значінём. Наприклад, попередный клас муг бы реалізовати масив для ходь-якого тіпа даных:
```cpp
template <typename T>
class Array {
    ...
    T& operator[](size_t i) {
		return val[i];
	}
protected:
	std::size_t len {0}; // ініціалізація поля
	T* val {nullptr};
};
```


## Штандартна бібліотека

### Сполочна штруктура
Штандартна бібліотека C++ має набор можностю, котрі мусят быти доступні у каждуй імплементації языка, убы дати проґрамістам просту роботу із языковыми міліями тай зотворити основу про розвуй так приладных аплікацій широкого шпектра, як і шпецялізованых бібліотек. Штандартна бібліотека C++ убсягат часть штандартної бібліотекы Сі.

Штандартна бібліотека C++ має у собі часть штандартної бібліотекы Сі. Штандарт C++ має норматівне удкликаня на штандарт C уд 1990 года і не дефініціює сам тоты функції штандартної бібліотекы, котрі берутся із штандартної бібліотекы Сі. Айбо у C++ наголовчні файлы Сі адаптовані: узамін `<stdio.h>` хоснуєся `<cstdio>`, а їх уміст розміщаєся в просторі імен `std`. Уто позволяє убминути конфлікту імен і усокотити сполочность.

Доступ до можностю штандартної бібліотекы C++ ся дустає включінём у проґраму (через діректіву #include) потребных наголовочных файлу. У штандарті C++11 вызначино 79 такых файлу. У май новых верзіях языка (C++17, C++20) їх кулькость ся выросла позад додаваня новых можностю,  гий робота із файловов сістемов (), концепты () і корутіны. Вшыткы засобы штандартної бібліотекы надлежат д просторови імен std. Єдночасно ся просит не хосновати діректіву using namespace std; ґлобално, убы не выходили неєднозначности в кодови.

Із розвоём штандарту (C++11, C++14, C++17, C++20) бібліотека ся розширює, давучи май безпечні і выразнi можности проґрамованя. Наприклад, у C++11 появилися «розумні указатилі» автоматічного кроманёваня тямов, а в C++17 – штруктуры робот із файловов сістемов. Кажде обновіня хоче злегшити розробку, засокочувучи зворотну сполочность і высоку ефектівность.

### Пудпора языка
Сюды надлежат можности, котрых гія для роботы проґрам, таю за інформацію о особностях імплементації. Включає можности, котрых гія для выділіня тямы, механізмы **[[RTTI|RTTI (Run-Time Type Information)]]**, базові выйимкы, границі значінь числовых тіпу даных, базові засобы роботы із міліём, гий наприклад, сістемовый час, убробляня сіґналу UNIX, завершіня проґрамы.

### Стандартні [[Контейнеры (проґрамованя)|контейнеры]]
У штандартнуй бібліотеци сут шаблоны за такі контейнеры:

* Дінамічный масив (**vector**),
* Штатічный масив (**array**),
* Єднонапрямлиный список (**forward_list**),
* Двонапрямлиный список (**list**),
* Стек (**stack**),
* Дек (**deque**),
* Асоціатівні масивы (**map, multimap**),
* Множины (**set, multiset**),
* Очерідь із приорітетом (**priority_queue**).

### Основні утиліты
У тот розділ уходит опис основных базовых елементу, што ся ухоснововут у штандартнуй бібліотеци, алокаторы тямы, пудпора часа і даты в штилови C.

* **Ітераторы**: засокочувут шаблоны ітератору, помочов котрых у штандартнуй бібліотеци ся реалізує штандартный механізм ґрупового ухоснованя алґорітму за убробліня даных у контейнерах.

* **Алґорітмы**: шаблоны описа операцій убробляня, котрі ся можут ухоснововати до ходь-якої послідовности елементу, включно із тотыми в контейнерах. У тот розділ тоже входят функції **bsearch()** і **qsort()** із штандартної бібліотекы C.

* **Строчкы**: шаблоны рядку у штилі C++. У тому розділови тож є бібліотекы про роботу із текстом тай сімболами у штилі C.

* **Уводжіня-выводжіня**: шаблоны і вспомижні класы про потокы уводжіня-выводжіня сполочного вида, про рядкове уводжіня-выводжіня, маніпулаторы (засобованя контрола формата потокового уводжіня-выводжіня у штилі C++).

* **Локалізація**: дефініції, котрі ся ухоснововут подля пудпоры народных особностю тай формату представліня (дат, валют тай т. д.) у штилі C++ і в штилі C.

* **Діаґностіка**: дефініції ряда вийимку і механізму контрола твержінь за час оконаня проґрамы (**assert**). Пудпора убробкы хыб у штилі C.

* **Числа**: дефініція роботы із комплексными числами, математічні векторы, пудпора сополоченых математічных функцій, ґенератор трафунковых чисил.

### STL – Standard Template Library (Штандартна Шаблонова Бібліотека)
Контейнеры, рядкы, алґорітмы, ітераторы і основні утиліты, за выйимков переберань із бібліотекы C, ся в рокаши означувут ги **STL (Standard Template Library – Штандартна Шаблонова Бібліотека)**. Іззачинаня STL была окремым продуктом і ї абревіатура мала инаку інтерпретацію, айбо потум стала частёв штандартної бібліотекы C++ тай ї неудкапчанным елементом.

У імнёви пудкреслено, же для реалізації засобу сполочному виді (контейнеру, рядку, алґорітму) сут хосновані механізмы **солоченого проґрамованя** (**template** – шаблоны C++).

Бярен Страуструп у свойых роботах детално описує причины, із котрых быв зробленый іменно тот выбор. Основными причинами были:

* **Універсалность вырішіня** – шаблонові контейнеры, на розділ уд обєктных, можут быти легко хосновані для **не обєктных тіпу** і не требувут єдного предка у тіпу елементу.
* **Технічна ефектівность** – в основному, операції шаблонового контейнера не требувут **выклику віртуалных функцій** і можут быти легко вбудовані **(inline)**, што у выслідках дає выгру в продуктивности.

Тот пудход зробив **STL** єднов із май успішных і май бульш розусядженых частий штандартної бібліотекы C++.

Із штандарта C++11 додалися слідувущі можности:

* Додана бібліотека &#x3C;regex&#x3E;, реалізувуча всьымиприйняті механізмы ісканя тай пудстановкы із помочов реґуларных выразу.
* Додана пудпора многопоточности.
* Атомарні операції.
* unordered-варіанты асоціатівных масиву і множин.
* Розумні указатилі, задавущі автоматічне выслободжіня выділеної тямы.

### Реалізації
STL до того, як стала частёв штандарта C++, была боковов розробков. Іззачинаня ї розробляла фірма **[[Hewlett-Packard|HP (Hewlett-Packard)]]**, а потумкы – **[[SGI|SGI (Silicon Graphics Inc.)]]**.

Штандарт языка не означає ї **«STL»**, бо она стала неудкапчаннов частёв языка, айбо много людий і доднись хоснувут то назов, убы удрузнити ї выд иншых частий штандартної бібліотекы (наприклад, **iostream**, пудрозділ C тай ин.).

Проєкт пуд імнём STLport заснованый на **SGI STL**, заниматся фуртовым убновінём **STL, IOstream** і рядковых класу. Дакотрі инші проєкты тож ведут розвуй окремых імплементацій штандартної бібліотекы.

## Рузня із Сі

### Сполочность із Сі
Выбираня іменно С гий основы для зотворіня языка проґрамованя убяснявут, тым што язык C:

# Є многоцілёвым, лаконічным тай удносно низькорувнёвым языком;
# Пудходит для вырішіня бульшости сістемных задач;
# оконаня усюды і на всёму;
# стыкуєся із міліём проґрамованя UNIX.— Б. Страуструп. Язык проґрамованя C++. Розділ 1.6

Невзиравучи на дакотрі знані хыбы языка **Сі**, **Бярне Страуструп** выбрав ёго за основу, бо «у **Сі** є свої проблемы, айбо тоты же проблемы бы мав і розвоєный уд нула язык, а проблемы **Сі** нам знані».

Окром того, то дало можность скоро зотворити первый прототіп компілатора (**cfront**), котрый лем перетовмачовав додані сінтаксічні елементы на оріґіналный **Сі**.

Із поступом розвоя **C++** до него додали инакі можности, котрі зробили непотребными дакотры конструкції **Сі**. Позад сего не раз было звіданя про то, убы удказатися уд сполочности языку і зняти старі конструкції. Но тым не май мало сполочность была засокочена, того што:

* **Засокочено існувучый код**, написаный на **Сі**, убы го мож было прямо перенести у **C++**;
* **Не гія наново вчити проґрамісту**, котрі вже знали **Сі** (їм лем гія довчити нові можности **C++**);
* **Выключина путанина** миже языками при їх рокашному хоснованёва («якшто два языкы хоснувутся в рокаши, їх розділы мавут быти авадь мінімалні, авадь такі грубі, убы языкы не мож было ізпутати»).

### Нові можности

```cpp
class Array {
public:
	Array() = default; // компілатор зотворит конштруктор за замовчінём сам
	Array(size_t _len) :
			len(_len) {
		val = new double[_len];
	}
	Array(const Array & a) = delete;  // конштруктор копіёваня явно зотертый
	Array(Array && a); // конштруктор переміщиня
	~Array() {
		delete[] val;
	}
	Array& operator=(const Array& rhs); // оператор присвоёваня копіёванём
	Array& operator=(Array&& rhs); // оператор присвоёваня переміщинём
	double& operator[](size_t i) {
		return val[i];
	}
	const double& operator[](size_t i) const {
		return val[i];
	}

protected:
	std::size_t len = 0; // ініціалізація поля
	double* val {nullptr};
};
```
Нові можности C++ уключавут оголошіня у видови выражінь, переробліня тіпу в виді функцій, операторы `new` і `delete`, тіп `bool`, удкликаня, розширене розуміня конштантности, пудставлямі функції, аргументы за замовчінём, переопреділіня, просторы імен, класы (уключавучи і вшиткы повязані із класами можности, такі ги наслідованя, функції-части, віртуалні функції, абштрактні класы тай конштрукторы), переопреділіня оператору, шаблоны, оператор `::`, убробку выйимку, дінамічну ідентіфікацію і много иншого. Язык C++ так само в многых трафунках май строго удносится д перевіркы тіпу, як C.

У C++ появилися коментарі в вызирови двойитої косої лінії (`//`), котрі были у попередникови C — языкови BCPL.

Дакотрі особности C++ май пузно были перенесині до C, наприклад, ключові слова `const` тай `inline`, оголошіня у циклах `for` і коментарі в штилови C++ (`//`). У май пузнюй реалізації C так само были представлині можности, котрых не є у C++, наприклад макросы `va_arg` тай ізліпшина робота із масивами-штімованями.

### C++ не включат у ся C
Невзиравучи на то, же груба часть кода C буде робоча і для C++, C++ не є надмножинов C і не включат го в себе. Існує і такый правильный для C код, котрый є неправильным для C++. То удлишує го уд Objective C, іщи єдного ізліпшиня C для ООП, котре є надмножинов C.

Сут і другі рузности. Наприклад, C++ не дозволює кликати функцію main() в удну проґрамы, зато як у C то є припустиме. Окроме того, C++ є май строгый у дакотрых звіданях; наприклад, ун не допущує неявне переведіня тіпу миже не ізкапчаными тіпами указатилю і не дозволює хосновати функції, котрі іщи не были оголошені.

Ба і бульше, код, котрый є робочый для убох языку, може давати рузні выслідкы в залежности уд того, компілатор якого языка го товмачив. Наприклад, на бульшости платформ наслідувуча проґрама выведе «C», коли компілуєся компілатором C, і «C++», коли компілуєся компілатором C++. Такє ся діє зато, же в C сімболні конштанты (наприклад, `'a'`) мавут тіп `int`, а в C++ — тіп `char`, а розмір тых тіпу ся убыкло удрузнят.
```cpp
#include <stdio.h>

int main()
{
    printf("%s\n", (sizeof('a') == sizeof(char)) ? "C++" : "C");
    return 0;
}
```


### Средства C, котрых рекомендує ся не кывати
Подля зауважіня Страуструпа, «чим ліпше вы знаєте C, тым май тяжко вам буде убминути проґрамованя на C++ у штилёви C, гублячи при тум потенційні перевагы C++». Позад того ун дає слідувущый набор порекомендовань для проґрамісту на C, убы читаво убхосноватися перевагами C++:

* Не хосновати макроопреділіня `#define`. На оголошіня конштант хосновати `const`, на ґрупы конштант (перечисліня) — `enum`, на пряме включіня функцій — `inline`, на означіня сімий функцій авадь тіпу — `template`.
* Не хосновати передчасові зявы ізмінных. Зява ізмінны в блокови, ди они управді ся хоснувут, і фурт єднати зявы із ініціалізаціёв.
* Удказатися уд хоснованя `malloc()` у хосен оператора `new`, уд `realloc()` — у хосен тіпа `vector`. Май безпечным буде хоснованя розумных указатилю, такых гий `shared_ptr` тай `unique_ptr`, што доступні уд єденадцятої верзії штандарта.
* Убминутися без безтіповых указатилю, аріфметікы указатилю, неявных приведінь тіпу, ізкапчань, окроме, може, низькорунёвого кода. Хосновати «нові» переведіня тіпу, што ліпше выражавут жаданя проґраміста і сут май безпечні.
* Рада до мінімума хоснованя масиву сімболу тай рядку у штилови C, замінявучи їх на тіпы `string` і `vector` із STL. Шуга не творити свої реалізації того, што уже є у штандартнуй бібліотеци.

## Розвуй дале
Нынішня май актуална верзія **ISO/IEC 14882:2024** авадь **[[С++23]]**,была дороблена у фебруарови 2023, слідувуща верзія, має не офіційне імня **[[C++26]]**.

### Сполочне напрямліня розвоя C++
На думку автора языка Бярена Страуструпа, говорячи о дальшум розвою тай перспектівах языка, мож дашто вызначити:

* У основному дальшый розвуй языка буде іти дорогов доповнінь до штандартної бібліотекы. Єдным із головных жрідел такых доповнінь є знана бібліотека Boost.
* Міняня у ядрови языка не мавут приводити до ізмаліня уже досягнутої ефектівности C++. По никанёви Страуструпа, переважно є грубі важливі ізміны, котрі мавут реалный вплыв, ачим много малых правок, котрі можут убтяжити код і зробити язык тяжкым на учіня тай хоснованя.
* Основні путі дальшого розвоя C++ у май близькых годах уключавут розширіня можностю і доробліня сполочного проґрамованя, стандартізацію механізму паралелної убробкы, а так само розвуй засобу безпечного проґрамованя. До такых можностю надходят рузні перевіркы, безпечны переведіня тіпу, контролованя пудмінок і иншы технолоґії, котрі помагавут у писанёви стабільного і сполягливого кода.
* У рокаши C++ є спроєктованый і розвоюєся гий мултіпарадіґмовый язык, што значит, же ун є погынавый і дозволяє проґрамістам выборно хосновати рузні пудходы і методолоґії. Ун бере елементы із рузных штилю проґрамованя, айбо їх адаптує так, штобы были ефектівні на руни компілованого языка, што означат выщу руню оконавської продуктівности. Того в будучности не є вылучино, же до C++ будут додані елементы функціоналного проґрамованя, автоматічне збираня нехари тай инакі механізмы, котрі тепирь не сут в языкови. Айбо вшиткы такі зміны будут зроблині на основі вжек існувучого компілованого пудхода, без порушіня прінціпу продуктівности.
* Ходь формално єдным із основных прінціпу C++ є засокочіня сполочности із языком C, у реалности штандартізаційны комітеты C тай C++ не мавут  взайимодій. Міняня, котрі они уносят, не лиш не є згоджині, айбо даколи прямо противорічат єдны другым із ідеолоґічного бока. Наприклад, елементы, котрі нові верзії C додавут прямо до ядра языка, у C++ сут вынесині до штандартної бібліотекы. Такыми елементами є, наприклад, дінамічні масивы, масивы із фіксованымы границями, а так само засобы паралелної убробкы.  Страуструп лічит, же споєня розробкы C і C++ принесло бы грубі выгоды, айбо то є малореалістічно із політічных і орґанізаційных причин. Того в перспектіві практічна сполочность миже C тай C++ буде із часом слабіти, што означає, же коды, написані на чистум C, будут кождый раз май тяжко прямо компіловати і хосновати в C++ без модіфікацій.

### Штандарт C++11: доповніня у ядрови языка
* Ясно вызначині конштантны функції тай выражіня `constexpr`.
* Універсалне ініціалізованя.
* Конштрукторы і операторы присвойиня із семантіков переносу.  Выведіня тіпу.

:: Для хоснуваня у шаблонах, ди тяжко задати конкретный тіп ізмінної, уведені два нові механізмы: ізмінні тіпа `auto` і опис `decltype`.

* Цикл по колекції

:: Самарно многым нынішньым языкам, у C++ уведеный цикл «по колекції» у форматови: `for (type &x: array) {...}`. Туй тіло цикла ся оконує для кождого елемента колекції `array`, а `x` у каждуй ітерації буде  удкликатися на актуалный елемент колекції. Як колекцію мож видіти C-масив авадь ходь-якый контейнер із штандартної бібліотекы, котрый має ітераторы `begin` тай `end`. 

* Ламбда-выражіня

:: Додана можность задавати ламбда-выражіня (анонімні функції, што ся задаювут прямо в місті хоснованя). Такі функції можут залежати уд позапросторовых змінных (замыканя). Ламбда-выражіня мож присвойити зміннуй і хосновати усяды, ди гія функція релевантного тіпа, наприклад, у алґорітмах штандартної бібліотекы.

* Ізміны в описови віртулных методу

:: Доданый неповинный модіфікатор `override`, котрый хоснувут при описови метода, што заміщує віртуалный метод утцёвського класа. Позад хоснованя `override`  компілаторови мусай перевіряти, ци є в утцёвському класови метод із таков же сіґнатуров. Доданый тоже модіфікатор `final`, котрый, як і в Java, недозволяє подальше заміщованя метода. Так само мож задати `final` для класа — тогды уд него вже не можут наслідовати ся другі класы.

* Додана можность описа варіатівных шаблону.
* Усякі сінтаксічні доповніня.

:: Уведине ключове слово `nullptr`, што представляє конштанту — нуловый указник. Были внесені зміны у семантіку і, частично, у сінтаксіс перечислінь і спойиня. Додана можность творити сокочені перечисліня (type-safe enumerations), а споєня тепирь мавут май мало убграничінь у своюй штруктурі.  Кроме того, компілатор тепирь має правильно парсити код із множинными заперавучыми кутовыми дужками «`>>`», што уживані у вкладеных шаблонных конштрукціях. Май скоро «`>>`» автоматічно приймалося ги оператор побітового ізсува вправо, того миже знаками `>` гія было вставляти пропускы авадь ізносы рядка.

## Приклад проґрам
### Приклад № 1
Се приклад проґрамы Hello, world!, котра выводит ізвістку в консол, хоснувучи штандартну бібліотеку, і окончуєся.
```cpp
#include <iostream>

// Імпортуєме всі убявліня у просторови імен "std" у ґлобалный простур імен.
using namespace std;

int main()
{
    cout << "Hello, world!" << endl;
    return 0;
}
```


### Приклад № 2
Тепирішньый C++ позволює рішати май легкым способом і май тяжкі задачі. Тот приклад, окроме другого, показує хоснованя контейнеру із штандартної бібліотекы шаблону (STL).
```cpp
#include <iostream> // подля хосонованя std::cout
#include <vector> // має у собі дінамічный масив
#include <map> // має в собі тіп даных словарь
#include <string>

using namespace std;

int main()
{    
    // Обявляєме асоціатівный контейнер із рядковыми ключами і даными в вызирі вектору рядку.
    map<string, vector<string> > items;

    // Додаме в сись асоціатівный контейнер пару людий і даме їм дакулько предмету.
    items["Anya"].push_back("scarf");
    items["Dmitry"].push_back("tickets");
    items["Anya"].push_back("puppy");

    // Перебереме всі обєкты в контейнері
    for(const auto& person : items) {
        // person - то є пара із двох обєкту: person.first - то го імня,
        // person.second - то є список го предмету (вектор рядку)
        cout << person.first << " is carrying " << person.second.size() << " items" << endl;
    }
}
```


У тум прикладі, для простоты, імпортувутся вшиткі імена із простора імен `std`. Но в реалных проґрамах так робити ся не рекомендує, бо можут зотворитися конфлікты імен, коли рузны бібліотекы мавут єднакі назвы обєкту. Язык позволює імпортовати окромы обєкты із простора імен, же бы лем тоты, котрі дійсно гія, были доступні у кодови без явного зазначіня `std::`.
```cpp
namespace Foo
{
   const int x = 5;
}

const int y = Foo::x;
```

```cpp
#include <vector>

int main()
{
    using std::vector;
    vector<int> my_vector;
}
```
У C++ (ги у C), коли хоснованя проґрамы доходит до кунця функції `main()`, тото рунозначно команді `return 0;`. То значит, што проґрамі не гія явне вертаня `0` в кунци `main()`, бо компілатор додаст то автоматічно. Айбо такє правило не діє для ходь-якої инакої функції, окром `main()`, ди все гія явно вказати значіня, котре ся має вертати.

## Ізрунёваня із алтернатівными языками
Сут дакулько досліжінь, у котрых пробовали зробити бульш-менш обєктівне зрунёваня всякых языку проґрамованя, миже котрых є і C++. У тых досліжінях аналізовалися рузні аспекты, такі гий продуктівность коду, удобство писаня проґрам, можности оптімізації, доступ д штандартным бібліотек тай инші характерістікы, котрі важливі для проґрамісту і розвойнику проґрамного засобованя.

* У науковуй статі «Haskell vs. Ada vs. C++ vs. Awk vs. …» Пауля Гудака і Марка Джонса представлиный звід про досліджіня ряда імператавных і функціоналных языку на прикладі рішіня модельної задачі быстрого прототіпованя ГІС-сістемы воєнного призначіня.
* В инакуй науковуй роботі — «DSL implementation in metaocaml, template haskell, and C++» — чотыри авторы методічно досліжувут можности C++ і двох функціоналных языку у роли базовых інструменту для языково-орьєнтованого проґрамованя із методом порожувучого кода.
* В досліжині Лутца Прехелта аналізувутся сім языку (C, C++, Java, Perl, Python, Rexx, Tcl) у контекстови написаня простої проґрамы, котра переробляє телефонні нумера на слова за даякыми правилами.
* У статі Девіда Велера «Ada, C, C++, and Java vs. The Steelman» проводится ізруняня языку Ада, C++, C і Java із документом «Steelman» — списком потреб до языка для воєнных убудованых сістем, котрый быв розробленый у 1978 годі Міністерством сокочіня США. Ходь документ ужек устарів і не бере до увагы тепирішні можности языку, ізруняня показує, што C++ не так силно рузнится уд языку-конкуренту в плані необходимых можностю для промысловых розробок.
* Статя Метю Формента і Міхаеля Ґіллінґса описує досліжіня реалізації на шости языках (C++, C, C#, Java, Perl, Python) трёх шпеціфічных алґорітму, што хоснувутся у біоінформатіци: метод майблизькых сосіду, ґлобалне вырунёваня послідовностю (алґорітм Нідлмана — Вунша) і парсінґ выходных даных BLAST.

### C++ тай Ада
Язык Ада самарає на C++ за можностями і сферов хоснованя: то є компілованый штруктурный язык із обєктово-орьєнтованым розширінём (тота ж модел «Алґол із класами», што і в C++), має штатічну тіпізацію, пудпорює сполочне проґрамованя і призначиный для розвоя грубых і тяжкых проґрамных сістем. Айбо ідеолоґічно Ада є силно другым языком: якшто C++ розвоююєся ги універсалный інструмент для рузных задач, то Ада была спроєктована шпеціально пуд жаданя выробнику крітічно важливого проґрамного засобованя із высокыми штандартами надійности, што выразилося на ї сінтаксісі тай семантіци.

Прямых ізрунянь ефектівности кода в Аді і C++ немного. У ужек упомняненуй статі рішіня моделної задачи на Аді дало код, што быв приближно на 30% май куртый (у рядках), чим у C++. Ізрунёваня самых же языку проводилися у рузных жрідлах. Наприклад, у статті Джіма Роджерса на AdaHome наведино бульш 50 пункту удрузнинь миже языками, і  бульшость із них у хосен Ады (бульше можностю, нагынавчость повожіня, май мало можность хыб). Ходь даякі твержіня стороннику Ады перичні авадь ужек пристаріли, сполочно мож зробити выслідок:

* Сінтакс Ады є овер строгый, ги у C++. Язык жадат додержоватися дісціпліны проґрамованя, не пудпорює «проґрамістські фіґлі», айбо стімулує писаня простого, лоґічного і порозумілого кода, котрый є май легко пудпорёвати.
* На розділ уд C++, Ада є барз тіпобезпечна. Розвойина сістема тіпів позволює при додержанёви правил їх оголошіня і хоснованя майвеце контроловати коректность роботы із датами і сокотити проґраму уд нежаданых хыб. Автоматічне перероліня тіпу є звеличине у нич.
* Указатилі в Аді сут контроловані май строго, ги у C++, а адресна аріфметіка є доступна лем через окрему сістемову бібліотеку.
* Наставитильні модулы Ады за свойыми можностями сут самарні на шаблоны у C++, айбо забезпечувут ліпшый контрол.
* Ада має в язык убудовану модуларность і штандартізовану сістему розділеної компілації, зато C++ хоснує включованя текстовых файлу і вонкашні методы кроманёваня компілаціёв і складанём проґрам.
* Убудована многозадачность Ады має в собі паралелні задачы і механізм їх комунікації (вступы, рандеву, оператор `select`). У C++ сут тоты можности забезпечені лем через бібліотекы.
* Ада має строгый штандарт, што дає ліпшу переносимость проґрамового забезпечіня на рузны платформы.

У статі Штефена Цейґера із компанії Rational Software Corporation ся ствержує, же робота на Аді є на 60% май дешево, чим на иншых языках, приводит ід зотворіню кода, котрый має в 9 раз май мало хыб, чим код написаный языком Сі. Ходь і то-ты выслідкы не є прямо ты же самі для C++, ун є інтересный, бо много із хыб C++ ун взяв уд Сі.

### C++ тай Java
Java ся не може лічити же повноставна заміна C++, бо є зотворена гий безпечный язык із легшым зачатковым рунём, орьєнтоваый на зотворіня прикладных аплікацій із грубов можностёв преносимости. Она ся не годит для дакотрых роду проґрам, котрі ся роблят у C++. Айбо в окромых свойых областях в Java є реална конкурентція C++.

Головні передности Java:

* **Безпека:** Недоступность хоснованя указатилю і адресної аріфметікы, автоматічне кроманёваня тямов із ґарбадж-колектором, убудовані засобы, котрі сокотят перед май пошириными хыбами проґрам C++, гий є переповніня буфера авадь выхуд за границі масива.
* Наявность розробленої сістемы модулу і розділеної компілації, котра є май скурша і май мало пудвавучас д хыбам, як препроцесор і особна зборка C++.
* Повна штандардізація і оконаня у віртуалнуй машині, розвойите окружіня, включавучи бібліотекы про ґрафіку, хосноватильськый інтерфейс, доступ д базам даных і иншым тіповым задачам, чим є забезпечена правдива многоплатформность.
* Убудована многопоточность.
* Обєктна пудсістема Java є у разы май блища д фундаменталному прінціпу ООП «вшитко є обєкт», ги у C++. Інтерфейсы позволявут здобыти векшину предностий множинного наслідованя без ёго неґатівных ефекту.
* Рефлекція є май далекосяжна, ги у C++, і позволює у реалному часови дефініціёвати і міняти штруктуру обєкту пуд час роботы проґрамы.

Но хоснованя ґарбадж-колектора і віртуалної машины лишає тяжкопоборимі обмежіня. Проґрамы на Java сполочно сут май помалі, їм гія дуже много тямы, а віртуална машина ізолює проґраму уд операчної сістемы, што робит низкорунёве проґрамованя неможным.

Емпірічне досліджіня не найшло грубу рузню у шустрости розробкы на C++ тай Java. Инше досліджіня указало, же думаня о грубых рузнях у шустрости оконаня кода на тых языках не є фурт правдиве: у двох із трёх тесту шустрость оконаня Java- тай C++-аплікацій была доста порунима. Зато Java є май лаконічна – обєм кода є май малый на 10-15%.

### C++ тай C
**Оріґіналный Сі** дале ся розвойит, і на нему ся зотворявут много грубых проєкту: є головным языком проґрамованя подля операчных сістем, на нему написані бавкові енґіні многых дінамічных бавок, як і груба кулькость прикладных аплікацій. Дакотрі шпеціалісты повідавут, же заміна Сі на C++ не робит процес розробкы май ефектівным, ай наопак убтяжує проєкт, меншит го надійность і пудвышує наклады на пудпору. У частности:

* За думанём Лінуса Торвалдса, «C++ заставлює до писаня … грубого обєма кода, котрый не має прінціпійного значіня із никаня функціоналности проґрамы».
* Пудпора ООП, шаблоны і STL не сут рішавучов предностёв C++, бо вшитко, на што ся хоснувут, мож вырішити і хоснованём Сі. При тум ся вылучавут розширіня кода, а даякє убтяжіня, котре є далеко не фурт гія, компензуєся векшов флексібілітов, май простым тестованём, і ліпшыми перформанцными характерістіками.
* Автоматізація доступа ід тями в C++ повышує затраты тямы і чинит роботу проґрам помалов.
* Хоснованя вылучінь у C++ заставлює слідити RAII, што веде до звеличіня оконаных файлу і меншіня шустрости проґрам. Додаткові тягкости ся появлявут у паралелных і дістрібутівных проґрамах. Тым є інтересне, же кодінґ-штандарт C++ у компанії Google прямо заказує хоснованя вылучінь.
* Код на C++ є май тяжкый на розуміня і тестованя, ёго дебуґованя є май тяжкє позад хоснованя тяжкый ієрархій класу із наслідованём і шаблонами. Додатково, в розвойницькых міліях C++ ся вказує веце хыб, і в компілаторах, і в бібліотеках.
* Многі детайлі повожіня кода не сут шпеціфіковані штандартом C++, што знижує ёго портовалность і може быти причинов тяжконаходимых хыб.
* Кваліфікованых проґрамісту на Сі є у разы веце, гий на C++.

Не є пересідчивых даных о предности C++ перед Сі ні по ефектівности проґрамісту, ні по особностям проґрам. Ходь сут досліжіня, котрі твердят, же проґрамісты на Сі тратят около 30-40 % сполочного часа розробкы (не рахуючи выпраліня хыб) на кроманёваня тямов, сполочна ефектівность розробнику Сі тай C++ є ізрунима.

У низькорунёвум проґрамованёви грубинська часть новых можностю C++ ся оказує нехоснована позад ізбульшіня режійных выдатку: віртуалны функції жадавут дінамічне вызначіня актуалної адресы (RVA), шаблоны ведут до розширіня кода і понижіня можностю оптімізації, бібліотека часа оконаня (RTL) є велика, а удказ уд ниї лишат векшины можностю C++ (ходь бы позад недоступности операцій `new`/`delete`). У выслідках проґрамістови мусай убграничити ся на функціонал, унаслідованый уд Сі, што робит хоснованя C++ безцільным:

*Єдиный способ мати добрый, ефектівный, низькорунёвый і портованый C++ зводится ід тому, убы ся убграничитися вшисткым тым, котре є легко доступне в Сі. А убграничіня проєкта границями Сі буде значити, же го не выметати, і же буде доступно много проґрамісту, котрі добрі розумівут низькорунёві особинности і не удказувутся уд них позад дурної моды на «обєктні моделі».*
*… коли ефектівность є першорядна, «перевагы» C++ будут грубов хыбов.*— Лінус Торвалдс,

### C++ і функціоналні тай скріптові языкы
У єдному експеріментови скріптові і функціоналны языкы, особливо Haskell, показали 2-3-кратну перевагу у часови розробкы тай обємови кода в ізрунянёви із проґрамами на C++. Із другого бока, проґрамы на C++ были на тулько же раз скурші. Авторы признавут, же здобыты дані не є репрезентатівнов выборков і не роблят катеґорічні выслідкы. 

В иншому експеріментови строгі функціоналны языкы (Standard ML, OCaml) показали сполочне прискоріня розробкы 10-кратне (головно позад скуршому выявліню хыб) при приблизно руных показниках шустродії (были хосновані рузні компілаторы в рузных режімах).

У досліжінёви Лутца Прехелта, на основі аналіза коло 80 рішінь, написаных доброволцями, были здобыті, в часности, слідувущі выслідкы:

* Perl, Python, Rexx, Tcl забезпечили удвоє бульшу шустрость розробкы, чим C, C++ і Java, причому одержаный код быв так само удвоє май короткый.
* Проґрамы на скріптовых языках хосновали приблизно удвоє бульше тямы, ги C/C++.

## Крітіка

```cpp
#include <iostream> // для хоснованя std::cout
#include <vector> // має у собі дінамічный масив
#include <map> // має у собі тіп даных словарь
#include <string>

using namespace std;

int main()
{    
    // Обявляєме асоціатівный контейнер із радковыми ключами і даными у виді вектору рядку.
    map<string, vector<string> > items;

    // Додаме в сись асоціатівный контейнер пару людий і даме їм дакулько предмету.
    items["Anya"].push_back("scarf");
    items["Dmitry"].push_back("tickets");
    items["Anya"].push_back("puppy");

    // Перебереме всі обєкты в контейнері
    for(const auto& person : items) {
        // person - то пара двох обєкту: person.first - то го імня,
        // person.second - то є список го предмету (вектор рядку)
        cout << person.first << " is carrying " << person.second.size() << " items" << endl;
    }
}
```


### За крітіку C++ у цілому
май часті крітікы не протиставлявут C++ якомусь другому конкретному языкови, а повідавут, же удказ уд хоснованя єдного языка, што має много недостатку, в хосен декомпозіції проєкта на пудзадачі, котрі рішавутся на рузных языках, майбульш пудходящых про них, робит розробку не таков бабрачнов при єдночаснум пудвышінёви показнику квалічности проґрамованя. Із тої самої причины крітікуєся і засокочіня сполочливости із Сі: аж частина задачі жадат низькорунёвых можностю, май розумно бы было вынести ї у окрему пудсістему і написати ї на Сі.

Свою очерідь, побучникы C++ тврдят, же усуненя технічных і орґанізаційных проблем мижеязыкового сполочнодіїня позад хоснованя єдного універсалного языка взамін дакулькых шпеціалізованых є май вижливо, як хыбованя того універсалного языка. Тобто, сама широкость можностю C++ оправдує хыбы каждої зокрема можности; в тым числови і хыбы, унаслідовані уд Сі, оправдані перевагами сполочности (див. горі).

Такым способом, тоты самі особности C++ – обєм, тяжкость, еклектічность і невыразна цілёва ніша хоснованя – побучниками ся роздивлявут ги «головна перевага», а крітіками – ги «головный недостаток».

### Крітіка оремых елементу і концепцій

#### Контрол за повожінём
Ідеолоґія языка змішує «контрол за повожінём» із «контролом за ефектівностю»: прінціп «не платиш за то, што не хоснуєш» ➤ предпокладає, же засобованя повного контрола проґраміста над вшиткым, што ся діє в проґрамі на доста малому руни, є потребным і достаным про достиганя высокої ефектівности кода.
У дійсности про грубі проґрамы то не так: коли низькорунёва оптімізація кладе ся на ґорґуші проґраміста, котру квалічный компілатор предметово-орьєнтованого языка бы зробив ліпше, то то веде лем до ізбульшіня обєма кода, до тяжщого процеса розробкы і до знижіня порозумілости і тестуйимости кода.

Тым способом, прінціп «не платити за то, што не хоснуєш» в реалности не дає такых жаданых переваг в ефектівности, айбо казит квалічность проґрамы.

#### Компонентне і обєктово-орьєнтоване проґрамованя
За думанём Алана Кея, обєктова модел «Алґол із класами», котра хоснує ся в C++, уступає моделі «усё є обєкт», котра хоснує ся в Objective-C. Ун лічит, же модел Objective-C має бульшу кулькість можностю, май файні показникы поновного хоснованя кода, ліпшу порозумілость, модіфікуйимость і тестуйимость. Тото є ізкапчано із тым, же у Objective-C всі компоненты є обєктами, што засобує бульшу єднородность і простоту в хоснуванёви обєктово-орьєнтованых пудходу.
Модел наслідованя в C++ складна і тяжка в реалізації. Она часто заставляє до зотворіня складных ієрархій із неприродными удношінём миже класами. Наприклад, у многых трафунках хоснуєся наслідованя взамін вложіня, што зотворює нездорову залежность миже класами. Позад того часто выходит, же класы ставут силно ізкапчаными із неясно розділеным функціоналом, што убтяжує їхнє подалше ізміниня і тестованя.

Гий приклад, у літературі наводится рекомендація реалізовати клас «список» як пудклас уд «елемента списка», ди каждый елемент має функції доступа д иншым елементам. Таке рішення є нелоґічным із математічної точкы зріня, бо «список» не є філём «елемента списка», а складає ся із них. У бульш строгых языках проґрамованя така модел не удображаєся, бо там наслідованя має значіня «є пудфілём», а не «є частёв».

Дакотрі бібліотекы в C++ жадавут особного переведіня тіпу увирьх і долу за ієрархіёв класу через `static_cast` авадь `dynamic_cast`. То порушує тіпобезпеку языка, бо компілатор не може повностю перевірити правильность переведіня тіпу, ай проґраміст має на собі удповідальность за правильне хоснованя.

Кроме того, C++ має грубу вязкость рішінь. Тото означат, же малі міняня на пузьньых етапах розробкы можут жадати переписованя грубиньськых частий проєкта. Наприклад, якшто гія ізмінити пудход ід сокочінёви даных авадь ізмінити штруктуру класу, тото може потребовати міняня многых частий кода, што дуже убтяжує пудпору і розвуй проєкта.
Ян Джойнер крітікує C++ за хыбне ідефікація інкапсуляції (поміщіня даных у середину обєкта і удділіня реалізації уд інтерфейса) із сокрытём реалізації. Сисе означат, же в C++ доступ до даных класа гія робити через ґеттеры і сеттеры — шпеціалні функції доступа. Позад того обєм кода ізбульшуєся, а го штруктура убтяжуєся.

Такый пудход робит C++ май мало выразным руняно із языками, ди доступ ід даным реалізуєся через обєктну модел авадь через удперті штімованя. У выслідкови, C++ часто жадат бульше кода для реалізації простої функціоналности, што меншит порозумілость і продуктівність проґраміста.

Щи єдным важливым убграничінём є то, же зовпаданя тіпу у C++ вызначатся на руни ідентіфікатору, а не сіґнатур. То означат, же пудстановка компоненту, основана на зовпадіню інтерфейсу, неможлива. Позад того додаваня нової функціоналности в сістему часто жадат особного міняня ужек існувучого кода, што призводит до силної вязкости рішінь.

Лінус Торвалдс крітікує C++ за то, же «код видится абстрактным лем до тої поры, докы не гія го міняти». Тото є ізкапчано із тым, же абстракція у C++ часто пряче тяжку реалізацію, котра робит код тяжко модіфікуйимым і пудпорёваным.

Крітіка C++ із позіцій ООП приведене у роботі.

#### Метапроґрамованя
Порожувуче метапроґрамованя у C++ основуєся на шаблонах і препроцесорови, оно є тяжкым і має убграничині можности. Сістема шаблону в C++ в сути є верзіёв примітівного функціоналного языка проґрамованя, котрый ся оконує при компілації. Тот язык майжек не перехоплюєся із самым C++, позад што потенціал роста тяжкости абстракцій убграничиным. Проґрамы, котрі хоснуювут шаблоны в C++, мавут дуже низькі показникы порозумілости і тестованости, а особинно розгорнутя шаблону робит неефектівный код, бо язык шаблону не має ніякых средств оптімізації. Вбудовані предметно-шпеціфічні языкы, зроблині тым способом, єднако хочут знаня самого C++, што не забезпечує повного розділіня роботы. Такым способом, можности C++ у розширіню можностю самого C++ сут дуже убграничині.

#### Кросплатформность
Про писаня портованого кода на C++ гія груба умілость і скушеность, ай «недуйлавый» код на C++ із грубов можностёв мож быти непортованый. За думков Лінуса Торвалдса, убы засобовати портованость на C++, сумарно д Сі, проґраматор мусит убграничитися можностями C++, котрі перебрані із Сі. Штандарт має много елементу, котрі сут вызначені ги «implementation-defined» (наприклад, розмір указатиля на методы класу в рузных компілаторах кывавутся в розмірі уд 4 д 20 байтам), што слабит портованость проґрам із їх хоснованём.Дірективный характер штандартізації языка, неповна зворотна сполочность і противность жадань рузных верзій штандарта роблят проблемы при перенесінёви проґрам миже рузными компілаторами і даже верзіями єдных і тых же компілатору.

### Удсутность можностю
; **Рефлексівне метапроґрамованя**
Інтроспекція в C++ є зроблина удділено уд основної сістемы тіпу, што робить ї майжек непотребнов. Майвеце, што мож ся досягнути, то є параметрізація повожіня на наперед знамых опціях. То бримає хоснованю C++ в бульшости пудходу до реалізації умілої інтелеґенції.

Функціоналне проґрамованя Явна пудпора функціоналного проґрамованя є лем у штандарті C++0x, перед тым тоты недостаткы заповнёвали бібліотеки (Loki, Boost), котрі хосновали язык шаблону, айбо їх квалічность є далеко май слаба в поруняні із рішінями, вбудоваными д функціоналным языкам. Так само, квалічность реалізації можностю C++ (гий ООП) через функціоналні языкы є май низька. Реалізовані в C++ можности функціоналного проґрамованя не позволявут хосновати оптімізаційны стратеґії[⇨], котрі сут особні функціоналному проґрамованёви. Они лем убграничині на вызовы функціоналных бібліотек і реалізацію окремых функцій. То практічно не дає ніякых предностей при проєктованёви проґрам (див. «Удповідность Каррі — Говарда»).

;

### Ізвышні і небезпечні можности
#### Убудовані стрества убхода убграничінь
Язык має засобы, котрі позволявут проґрамістови порушати задані у конкретному припаді прінціпы проґрамованя. Наприклад, модіфікатор `const` задає обєктови особность неізмінности стана, айбо модіфікатор `mutable` дозвалює на насилне міняня стана в удну конштантного обєкта, што фактічно ізрушує конштантность. Бульше того, мож дінамічно вылучити атрібут `const` із конштантного обєкта, перемінявучи ёго на ліво-допустимый (L-value). Сутя такых можностю у языкови робит пробы формалної перевіркы кода нетяклыми, а хоснованя убграничінь на оптімізацію — неможными.

#### Неконтролуйиме макропудставліня
Засобы макропудставліня у Сі (`#define`) сут дуже моцными, айбо і небезпечным засобами. Они усокотилися у C++, ходь і в C++ є май строгі і шпеціалізовані засобы на рішіня всьых задач, на котрі они были задумані в Сі — шаблоны, переубтерьханя функцій, inline-функції, просторы імен, май розвойина тіпізація, розширине хоснованя модіфікатора `const` і инакє. У внаслідованых уд Сі штандартных бібліотеках є много потенціално небезпечных макросу. Шаблонне метапроґрамованя пораз ся комбінує із хоснованём макропудставліня на засобованя так называнаго «сінтаксічного цукра».

#### Проблемы переубтерьханя
Прінціпы переубтерьханя функцій і оператору в C++ веде д грубому дублёванёви кода. Переубтерьханя оператору, што было задумане на додаваня «сінтаксічного цукра», в C++ позволює без контрола міняти повожіня елементарных операцій про рузні тіпы. То дуже пудвыщує різік хыб, тым бульше, што уводит новый сінтаксіс авадь міняє сутный (наприклад, робити нові операторы авадь міняти пріорітеты і асоціатівность) не мож, ходь сінтаксіс штандартных оператору C++ не фурт адекватный семантіці новых тіпу, котрі ся можут потребовати в проґрамі.
Окромі проблемы робит легкота переубтерьханя оператору `new`/`delete`, што може ізробити дуже гамішні і тяжко находимі хыбы. При тум дашто із того, што бы ся чекало інтуітівно (наприклад, харіня дінамічных обєкту при ґенерації выйимку), в C++ ся не оконує, а груба часть переубтерьханых функцій і оператору ся выкликавут неявно (наприклад, при перероблінёви тіпу авадь творінёви дочасных екземплару класу).

У выслідкови засобы, котрі мали робити проґрамы май ясными і май удобными про розробку і убслугованя, перероблявутся на жрідло непотребного убтяжіня і знижавут надійность кода.


### Вылічна ефектівность
#### Резултувущый обєм оконаного кода
Хосновані шаблоны в C++ є формов параметрічного поліморфізма на руни выходного кода, айбо при компілації ун переробляєся на сітуаційный (ad hoc) поліморфізм (то є переубтерьханя функцій), што веде ід значному ізбульшіню обєма машинного кода в руняно із языками, котрі мавут управді поліморфну сістему тіпу (як у насліднику ML).

Штобы ізмешити розмір машинного кода, пробувут автоматічно убробляти выходный код перед розкрутков шаблону. Другым рішінём могла бы быти штандартізована можность експорта шаблону (щи із 1998 года), айбо она є доступна лем у мало котрых компілаторах, бо є тяжко реалізовати і не є хосенна на імпорт бібліотек шаблону C++ в языкы із инаков семантіков.

Побучникы C++ оспорювут роздуваня кода гий перебульшине, іґнорувучи факт, што в Сі параметрічный поліморфізм ся компілує просто, без дублёваня тіл функцій. Они лічат, же параметрічный поліморфізм у Сі є небезпечный — тобто май небезпечно, ги перехуд уд Сі до C++ (ходь противникы C++ думавут наопак).

#### Потенціал оптімізації
Позад слабої сістемы тіпу і бивноты побучных ефекту стає через-чурь тяжкым еквівалентне преобразованя проґрам, а значит і вбудованя у компілатор многых оптімізувущых алґорітму, такых гий автоматічне розпаралелёваня проґрам, зрушіня сполочных пудвыражінь, λ-пудём, выклик процедур із передачов продовжіня, суперкомпілація і ин. Выслідком реална ефектівность проґрам на C++ убграничуєся мавучов кваліфікаціёй проґрамісту і вкладеными в конкретный проєкт силы, і «лайдацька» реалізація може доста силно попущат по ефектівности «лайдацькым» реалізаціям на языках бульш высокого руня, што пудтверьжує зрунёвалні спытаня языку. То є значущов зашпотков для хоснованя C++ в індустрії data mining.
```cpp
#include <iostream>

// Імпортує всі оголошіня у просторі імен "std" у ґлобалный простур імен.
using namespace std;

int main()
{
    cout << "Hello, world!" << endl;
    return 0;
}
```


#### Ефектівне кроманёваня тямов
Обязаность по ефектівному кроманёваню тямов лежит ґорґушах розробника і залежит уд умілости розробника. Для автоматічного кроманёваня тямов у C++ традіційно ся хоснувут так называні «розумні указатилі», особне же кроманёваня тямов меншит ефектівность самых проґрамісту.

Многочисилні реалізації харіня мусора, такых, ги штатічный вывуд реґіону, не примінні для C++ проґрам (май точно, то требує реалізації повирьх языка C++ інтерпретатора нового языка, силно инакого уд C++ і в бульшости обєктівных особностю, і в сполочнуй ідеолоґії) із причины неубходимости прямого доступа ід абстрактно сінтаксічному дереву.

### Резултатівность
Зоудношіня фактору резултатівности із затратами на розробку, а так само сполочну култівовану в сполоченстві проґрамісту дісціпліну і културу проґрамованя важно брати до увагы заказникам, котрі выберавут язык C++ (ай, значит, тых, котрі волівут тот язык розробникам) про реалізацію задуманых ними проєкту, а так само людём, што зачинавуть учитися проґрамованёви, особливо із жаданём проґрамовати про свої потребности.

#### Квалічность і култура проґрамованя
Прінціп C++ «*не наязовати „добрый“ штил проґрамованя*» перечит промысловому пудходу д проґрамованёви, в котрому головну рол мавут квалічность проґрамного засобованя і можность допровуда кода не лем автором, ай другыми, і котрый май выгодні языкы, што мінімізувут вплыв людьського фактора, то значит якраз «*наязувут „добрый“ штил проґрамованя*», ходь такі языкы можут мати веце высокый поруг входжіня.

Існує думка, же волішность хосноватиля C++ (при можности выбирати алтернатівні языкы) уймовость характерізує професійні можности проґраміста. Наприклад, Лінус Торвалдс каже, же позітівна думка кандідату за C++ є про него крітеріём удсіва:

*C++ — кошмарный язык. Ёго робит іще веце кошмарным тот факт, же много не доста ґрамотных проґрамісту го хоснувут… Удперто кажучи, і кідь не є ніякых причин выберати Сі, кроме того, убы держати C++-проґрамісту подале, то і лем тот аргумент буде доста важливым основанём про хоснованя Сі.*
*…Я прийшов до вывода, же дійсно зачну выгнати каждого, ко выбире вести розробку проєкта на C++, а не на Сі, убы тот чилядник не загубив проєкт, у котрый я залученый.*— Лінус Торвалдс,

#### Выправліня выправленого
Неперерывна еволуція языка побужує (а часом і змушує) проґрамісту раз за разом міняти ужек удладжений код — то не лем дорожит розробку, ай і несе різік увожіня до ужек удладженого кода новых хыб. Наприклад, кідь іззачинаня зворотна сполочность із Сі была єдным із базовых прінціпу C++, уд 1999 року Сі перестав быти пудмножинов C++, так што ужек удладженый код на Сі не може быти хоснованый в проєктови на C++ без ізмініня.

#### Тяжкость подля самої тяжкости
C++ є окресленый ёго аполоґетами гий «маймоцный» *іменно позад того*, хоснує небезпечні і взайимно-противні можности. За думанём Еріка Реймонда, то робит язык сам по собі основов про особне самостверджіня проґрамісту, перероблявучи процес розробкы на самоціль.

*Проґрамісты — то часто яркі люди, котрі ся гордять … своёв можностёв справлятися із тяжкостями і шіковно убходитися із абстракціями. Часто ся перед собов змагати, пробувучися выяснити, ко може зотворити «майзапутані і майфайні тяжкости». … Суперникы мнят, же мусят змагатися із чужыми «прикрашанёми» тым, же додадут свої. Доста скоро «масивна ґырча» стане індустріалным штандартом, і всі зачнут хосоновати грубі, переповнині хыбами проґрамы, котрі не можут убрадити онь іх творцю.*

*…Такый пудход може убернутися псотов, як проґрамісты реалізувут прості речі тяжкыми способами лем зато, же їх знавут і умівут їх хосновати.*

— Ерік Реймонд в 

#### Саботаж
Зафіксовані трафункы, коли лайдацькі програмісты, хоснувучи силну контекстну залежность C++ і недостаток можностю удслідили макровызначіня компілатором, помалили розробку проєкта, коли написали єдне-два лишні, формално коректні із никаня компілатора, рядкы кода, айбо коли впровадили через то тяжко выявитильну, знівыдкы проявлявучуся хыбу. Наприклад:
```cpp
#define if(a) if(rand())
```

```cpp
#define j i
```
У языках із доказанов коректностёв, онь із розвоєными макросредствами, нанести шкоду самарным способом немож.

#### Ненадійность продукта
Невыправдана бивнота побучных ефекту у спойині із недостатком контрола із бока сістемы часа оконаня языка і слабов сістемов тіпу робит проґрамы на C++ вразливыми до непередвиденых фаталных порух (сполочнознамі «падіня» із увідомлінями ги «Access violation», «Pure virtual function call» авадь «Проґрама оконала недопустиму операцію і буде заперта»), што выключує хоснованя C++ у трафункови грубых требовань д удказостойкости. Кроме того, то іщи додатково ізбульшує триманя самого процеса розробкы.

#### Менеджмент проєкту
перечислині выще факторы роблят тяжкость менеджмента проєкту на C++ єднов із самых высоких у індустрії розроботкы ПЗ.

Джеймс Коґґінґс, котрый чотыри годы быв ведучым колонкы в *The C++ Report*, дає таке поясніня:

*— Проблема є в тому, же проґрамісты, котрі робили в ООП, експеріментовали із кровозмішаными аплікаціями і были націлині на низьку руню абстракції. Наприклад, они будовали класы, гий «зязаный список», взамін «інтерфейс хосноватиля», авадь «зарі радіації», вадь «модел із конченых елементу». Шкода што, стройна провірка тіпу, котра помагає проґрамістам C++ убминати хыб, у тому самому часі утяжчит будованя грубых обєкту із малых.*

— Ф. Брукс, Мітічный чоловіко-місяць

## Вплыв і алтернатівы

Єдиным прямым наслідником C++ є язык D, задуманый як переробка C++ для вылучіня май очевидных го проблем. Авторы удказалися уд сполочности із Сі, усокочувучи сінтаксіс і многі базові прінціпы C++ і уводжувучи в язык можности, характерні для новых языків. В *D* не є препроцесора, наголовочных файлу, множинного наслідованя, айбо є сістема модулу, інтерфейсы, асоціатівны масивы, пудпора *[[unicode]]* у рядках, харіня нехари (при усокочіню можности особного кроманёваня тямов), вбудована многопоточность, вывуд тіпу, ясне обявліня чистых функцій і неізмінных значінь. Хоснованя D є доста убграничине, і го мож лічити же реалного конкурента C++.

Май старый конкурент C++ у задачах низького руня — Objective-C, котрый так само, як C++, є побудованый на спойиню Сі із обєктнов моделов, лем же в Objective-C обєктна модел унаслідована уд *[[Smalltalk]]*. *Objective-C*, так само як і ёго наслідник *[[Swift]]*, широко ся хоснує для розробкы софтверу пуд *[[macOS]]* і *[[iOS]]*.

Єднов із первых алтернатів C++ у аплікатівнім проґрамованёви став язык Java. Ёго часто неправильно лічат прямым наслідником C++; у дійсности ёго семантіка услідована уд языка *[[Модула-2]]*, і основі семантікы C++ у *Java* не є видимі. Беручи до увагы *генеолоґію* языку (*Модула-2* є наслідником *[[Сімула|Сімулы]]*, як і *C++*, айбо ним не є *Сі*), *Java* май привильно бы іменовати «троёрудным братом» C++, а не «наслідником». То саме мож уповісти і за язык *[[C Шарп|C#]]*, ходь ступінь ёго самарности ід C++ є веце выразный, гий у *Java*.

Спробов спойиня безпечности і шустрости розробкы, характерных для Java і C#, із можностями C++ став Managed C++ (впослідстві — C++/CLI). Зотвореный *[[Microsoft Corporation|Microsoft]]*, головно для переносу існувучых C++-проєкту на платформу *[[Microsoft.NET]]*. Проґрамы ся оконувут пуд кроманёванём *[[CLR]]* і можут хосновати всьый арсенал бібліотек *.NET*, айбо накладаєся ряд убграничінь на хоснованя можностю C++, што фактічно зводит C++ до руня *C#*. Тот діалект не дустав грубого признаня і є хоснованый головно про поязаня бібліотек, написаных на чистому C++, із *C#*-аплікаціями.

Алтернатівный путь розвоя языка Сі — ёго спойиня не із ООП, айбо із апплікатівным проґрамованём, то значит поліпшіня абстракції, стройности і модулности низькорунёвых проґрам позад забезпечіня передвидіня повожіня і удканської прозорости. Приміром такых робіт служать языкы *BitC, Cyclone* і *Limbo*.

Ходь і є успішні спробы хоснованя функціоналного проґрамованя у задачах реалного часу без інтеґрації із засобами Сі, же на даный момент (2013 г.) в низькорунёвуй розробцї хоснованя Сі в рузнуй мірі дає майліпше зоудношіня затрудливости і резултатівности.

Много сил приложили розробникы *[[Python]]* і *[[Lua]]*, убы забеспечіти іх комфортне хоснованя проґрамістами на C++. ІЗ усьых языку, ізязаных із функціоналнoв парадіґмов, самі Python і Lua майчасто ся хоснувут у спойині із C++ у єднум проєктови.

Майзначными точками кываня C++ із функціоналным проґрамованём — приязкы бібліотек wxWidgets і Qt (котрі зотворині в духу ідеолоґії C++) до языку Lisp, Haskell і Python. У бцльшости трафунку приязкы до функціоналных языку роблят про бібліотекы, написані на Сі авадь иншых функціоналных языках.

Щи єдным языком, на котрый никавут ги на конкурент C++, є Nemerle — выслідок поробы спойиня модели тіпізації Гіндлі-Мілнера і макропудмножины Common Lisp із языком C#. В тому самому руслі лежит і зотвореный Microsoft язык F# — діалект ML, адаптованый про міліє .NET.

Спробов зотворити промыслову заміну Сі і C++ став Go, розробленый корпораціёв Google в 2009 році. Авторы языка прямо указали, же го зотворіня было мотівовано недостатками процеса розробкы, выкликаных особностями языку Сі і C++. Go — компактный, простый у штруктурі імператівный язык із Сі-самаравічым сінтаксісом, без препроцесора, із статічнов тіпізаціёв, стройным контролом тіпу, сістемов пакету, автоматічным кроманёванём тямов, дакотрыми функціоналныма особностями, скромно побудованов ООП-пудсістемов без пудпоры наслідованя імплементації, айбо із інтерфейсами і качовов тіпізаціёв, вбудованов многопоточностёв, основанов на зопроґрамах і каналах (в духови Occam).

Язык ся позіціонує як алтернатіва C++, то є передовшиткым засоб для командної розробкы высокоефектівных вылічытильных сістем великої тяжкост, в тому і розподілиных, айбо допущавучуй низькорунёве проґрамованя.

В єднуй ніші із Сі і C++ є і язык Rust, розробленый у 2010 годі і пудпрёваный корпораціёв Mozilla. Ёго головна орьєнтація — безпечне кроманёваня тямов без зберача нехари. У частичнуй заміні Сі і C++ на Rust в 2019 годі заінтеросовалася і корпорація Microsoft.

У 2022 годі компанія Google представила експеріменталный язык Carbon, зотвореный як потенційный наслідник C++. На розділ уд Rust, Carbon має забеспечити двонапрямову сполочность із C++ і ліпшу читабильность кода.

## Популарні проґрамы зотворині на нему
* Opera
* μTorrent
* Google Chrome
* Visual Studio
* C++ Builder
* CATIA

## Никай ся втож
* С (язык проґрамованя)
* Язык проґрамованя
* Обєктово-орьєнтоване проґрамованя
* Objective-C
* Managed C++
* Visual Studio
* C++ Builder

## Пудміткы
Думка

**Поясниня**

## Література
* 
* 
* 
* 
* 
* 

* 
* 
* 
* 
* из
* 
* 
* 
* 
* 
* 
* 
* Jeremy A. Hansen. The Rook’s Guide to C++ (A Creative Commons-Licensed Textbook).

## Удкликаня

* isocpp.org (англ.) — офіційный сайт C++
** рабочие материалы комитета по стандартизации за 2009-й год
* Бярен Страуструп. CppCoreGuidelines The C++ Core Guidelines are a set of tried-and-true guidelines, rules, and best practices about coding in C++
* Бярен Страуструп. Краткий обзор C++0x
* comp.lang.c++.moderated
* 
* 

Катеґорія:С++
Катеґорія:Языкы проґрамованя
Катеґорія:Статя написана мараморошськым ґваром
Катеґорія:Сі самаравучі языкы проґрамованя
Катеґорія:Высокорунёві языкы проґрамованя
Катеґорія:Языкы проґрамованя із особным кроманёванём тямов