Перейти до вмісту

C++

Зо сторінкы Вікіпедія
C++
Дізайноване одБярен Страуструп
ВывоярьISO/IEC JTC1/SC22[en]/WG21
Стабілне выданяISO/IEC 14882:2024 С++23 (19 уктобра 2024)
Основна реалізаціяG++, Microsoft Visual C++, Borland C++ Builder, Clang
ОвпливнивAda 95, C#, Java, PHP, D, Aikido, Dao, Rust

C++ (читат ся гий сі-плус-плус[1] даколи ся скорочує до 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[2]. Упирьвоє описаный у меженароднум штандарті ISO/IEC 14882:1998 (C++98), выдтуть выходили сякі вирзійи: C++03, C++11, C++14, C++17, C++20, C++23. Май актулным стандартом же є ISO/IEC 14882:2024 (C++23)[3].

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

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

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

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

історичный етап розвоя[7] Гуд
Язык BCPL 1966
Язык Бі (оріґінална розробка Томпсона пуд UNIX) 1969
Язык Сі 1972
«Сі из класами» 1980
C84 1984
Cfront (выпуск E) 1984
Cfront (выпуск 1.0) 1985
Множинноє/віртуалноє наслідованя 1988
Сполочноє проґрамованя (шаблоны) 1991
ANSI C++ / ISO-C++ 1996
ISO/IEC 14882:1998 1998
ISO/IEC 14882:2003 2003
C++/CLI 2005
TR1 2005
C++11 2011
C++14 2014
C++17 2017
C++20 2020
C++23 2023
C++26 2024

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

Бярен Страуструп, твориць C++, у свойому офісови AT&T New Jersey, c. 2000

Притямивши досвід свойої кандідатської дісертаційи, Страуструп вырішив доповнити язык 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[8].

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

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

Розвуй и штандартізація языка

[едітовати | едітовати жрідло]

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

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

  • Офіцічна штандартізація языка зачала ся у 1998 годови, кой быв опублікованый штандарт ISO/IEC 14882:1998 (знаный гий C++98)[14], розробленый комітетом по штандартізаційи 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)[15].

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

Язык тож не называв ся D, того што «ун є розширіньом C и не старає ся выправляти хыбы путьом зрушіня елементу C»[16]

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

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

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

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

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

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

  • C++ пудпорює як коментарі ги в стілі C (/* коментарь */), так и єдношорові (// вшитка послідувуча часть шорика буде коментарьом), де // означат зачинаня коментаря, а май близкый слідувучый сімбол нового шора, котрому не передує сімбол \ (вадь еквівалентный йому убозначиный ??/), рахує ся кунцьом коментаря. Плус сего коментаря у тум, што го не мусай заперати, циже убозначовати кониць коментаря.
  • Шпеціфікатор inline про функцій. Функція, дефінована вудну тіла класа, є inline за замовчіньом. Даный шпеціфікатор є пудказков компілаторови й може встройити тіло функційи у код умісто ю безпосередного выклика.
  • Кваліфікаторы const и volatile. На розділ выд С, де const означає лем доступ про читаня, у C++ змінна из кваліфікатором const має быти иніціялізована. volatile хоснує ся у описови змінных и информує компілатор, што значиня даної змінної може быти поміняно способом, котрый компілатор не годен про то убы увидіти. Про змінных, установленых volatile, компілатор не мусит зачинати дії про оптімізацію, мінявучі положіня змінної у тямі (наприклад, розміщувучи ю у реґістрови) авадь покладавучи ся на непоміняность значіня змінної у просторі меже двома значінями, котрі ся юй призначавут.
  • Простур имен (namespace). Приклад: Выбираня именно С гий основы про зотворіня языка проґрамованя убяснявут, тым, што язык C:
  1. Є многоцільовым, лаконічным тай удносно низкорувньовым языком;
  2. Пудходит про вырішіня булшости сістемных задач;
  3. Оконаня усюды й на всьому;
  4. Стыкує ся з мілійом проґрамованя 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:[18]

Тіп даных Вага Сінтаксіс
Информація
Сімболні тіпы[19]
char 1 байт(8 біт) char ch1 = 'A'; авадь char ch1 = 65; , што є ідентічно, бо сімбол «A» стойит у ASCII пуд значінём 65.
може сокотити в собі сімбол( його чиловоє значіня ASCII).
wchar_t 2 ~ 4 байт(16 ~ 32 біт) зависимо уд платформы wchar_t ch2 = L'Я';
Хоснує взамін ASCII UTF-16 на Windows, UTF-32 на другых сістемах, на Windows його рекомедувут хосновати лем при роботі з Windows API[20]. Доданый у С++ 11.
char8_t 1 байт(8 біт) char8_t ch8 = u8'A';
Тот же char,лем назнчиный про роботу з сімболами UTF-8. Має літерал u8.Тіп доданый у С++20.
char16_t 2 байт(16 біт) char16_t ch16 = u'あ';
Зотвореный діля роботы з UTF-16. Має літерал u.Тіп доданый у С++11.
char32_t 4 байт(32 біт) char32_t ch32 = U'😊';
Зотвореный діля роботы з UTF-32.Має літерал U.Тіп доданый у С++11.
Цілочисилні знакові[21]
short(short int) 2 байт(16 біт) short si = -20000;
Може сокотити у собі числові значіня уд -32 768 до 32 767. Хоснує ся діля скочіня тямы.
int 4 байт(32 біт) int i = 1000000;
Може сокотити у собі числові значіня уд -2 147 483 648 до 2 147 483 647. Май часто ся хоснує діля роботы з цілыми числами, має оптімалный баланс меже вагов, и діяпазоном значинь.
long(long int) 4 ~ 8 байт(32 ~ 64 біт) зависимо уд платформы long int li = 3000000000L;
Може сокотити у собі числові значіня уд -2 147 483 648 до 2 147 483 647 авадь -9 223 372 036 854 775 808 до 9 223 372 036 854 775 807. Хоснує ся діля сокочіня грубых чисел. На 32-бітных сістемах у основному має тоту же вагу, што й int. Має літерал L.
long long 8 байт(64 біт) long long lli = 9000000000000000000LL;
Може сокотити у собі числові значіня уд -9 223 372 036 854 775 808 до 9 223 372 036 854 775 807. Хоснує ся діля сокочіня грубых чисил. Має літерал LL. Тіп доданый у C++11.
__intN:[22] N - число біт _int8 i8 = 100;[22]
Зотворено, вбы особно вказовати число біт, наприклад: _int8(8 біт), _int16(16 біт), _int32(32 біт), _int64(64 біт), можут сокотити у собі числові значіня уд -(2n-1) до 2n-1-1[23].
Из плававучов крапков[21]
float 4 байт (32 біт) float f = 3.14f;
Має 6 ~ 7 дисятковых цифер, Хоснує ся діля сокочіня чисил из плававучов крапков, помірнов бізувностьов, наприклад: діля компютерных бавок. Має літерал f. Діяпазон уд ±1.18×10-³⁸ до ± 3.4×10³⁸.
double 8 байт (64 біт) double d = 3.141592653589793;
Має 15 ~ 16 дисятковых цифер, Хоснує ся діля сокочіня чисел из плававучов крапков, и серидньов бізувностьов, май часто діля роботы з дробами. Діяпазон уд ±2.23×10-³º⁸ до ±1.80×10³º⁸.
long double 10-16 байт (80 ~ 128 біт) long double ld = 3.1415926535897932385L;
Має 18-19 дисяткових цифер. Хоснує ся діля научных убчислинь, має высоку бізувность. Діяпазон ±3.36×10-⁴⁹³²-4932 до ±1.18×10⁴⁹³².
Лоґічні[21]
bool[24] 1 байт(8 біт) bool b = true;
Діяпазон уд 0 до 1, удкликає ся на звіданя правда(true) вадь бріхня(false), май часто хоснувут у if, while.[25]
false[26] Сінонім до 0, означат бріхню, хоснує ся про bool. bool f = false;
true[27] Сінонім до 1, означат правду, хоснує ся про bool. bool t = true;
Цілочисилні знакові тай беззнакові(signed і unsigned)[23][21]
Тіп даных Информація Приклад
signed Знаковый тіп, котрый робит діяпазон хоть якої цілочисленної змінної уд -(2n-1) до 2n-1-1[23] ди N то кулькость біт тіпа даных. signed Є тіпом за замовчіньом У signed int діяпазон уд -2 147 483 648 до 2 147 483 647, а у signed short уд -32 768 до 32 767, так само які і без приписаня signed.
unsigned Беззнаковый тіп, котрого, аж прикласти до цілочислных тіпу, то йих діяпазон буде мочи мати лем додатньоє значіня, уд 0 до 2n (N — вага в бітах прикладеного тіпа) unsigned long long уд 0 до 18 446 744 073 709 551 615, ци unsigned short уд 0 до 65 535.[23]

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

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

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

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

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

Доступ части базового класа/режім наслідованя private-часть protected-часть public-часть
private-наслідованя недоступный private private
protected-наслідованя недоступный protected protected
public-наслідованя недостуный protected public

За замовчіньом базовый клас наслідує ся ги 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) еквівалентный.
  • Переубтирьханя функцій: функція з єдным имньом може мати рузноє число и рузні по тіпу арґументы. Наприклад:
    void Print(int x);
    void Print(double x);
    void Print(int x, int y);
    
Частным трафунком переубтирьханя функцій мож лічити переубтирьханя оператору.
  • Механізмом шаблону

Дінамічный поліморфізм реалізує ся помочов віртуалных методу тай іерархійи наслідованя. Поліморфным у C++ є тіп, мавучый хоть єден віртуалный метод. приклад іерархї:

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++ штруктуры формално рузнит ся уд класу лем тым, што за замовчіньом руня доступа д частям класа и тіп наслідованя у структуры публічні, а у класа — пріватні.

Доступ private protected public
Самый клас Айно Айно Айно
Цімборы Айно Айно Айно
Наслідникы ні Айно Айно
Изпоза ні ні Айно

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

Функційи-цімборы — то є функційи, котрі ниє функціями-частями тай задто мавучі доступ д засокоченым і запертым частям класа. Уни мавут быти убявлині в тілови класа ги friend. Наприклад:

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 свойим цімбором сам.

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

Шпеціялні функційи

[едітовати | едітовати жрідло]

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

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++ не можут быти убявлині віртуалными, а деструкторы — можут, тай в основнум убявлявут ся діля всьых поліморфных тіпу, штобы ґарантовати правилноє зрушіня доступного за удкликаньом авадь указатильови обєкта независимо уд того, котрого тіпа удкликаня вадь указатиль. аж є хоть у єдного из базовых класу віртуалного деструктора, деструктор класа наслідника автоматічно стає віртуалным.

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

[едітовати | едітовати жрідло]

Шаблоны дозволювут зотворяти функційи и класы, штімовані дефініцічным тіпом авадь значіньом. Наприклад, спередущый клас муг бы реалізовати масив діля хоть якого тіпа даных:

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) йих кулькость ся выросла позад додаваня новых возможностю, гий робота з файловов сістемов (<filesystem>), концепты (<concepts>) и корутіны. Вшиткі засобы штандартної бібліотекы надлежат д просторови имен std. Єдночасно ся просит не хосновати діректіву using namespace std; ґлобално, вбы не выходили неєднозначности в кодови.

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

Сюды надлежат возможности, котрых гія діля роботы проґрам, тай за информацію о особностях імплементаційи. Включає возможности, котрых гія про выділіня тямы, механізмы 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 додали ся слідувучі возможности:

  • Додана бібліотека <regex>, реалізувуча всьымиприйняті механізмы гляданя тай пудстановкы з помочов реґуларных выразу.
  • Додана пудпора многопоточности.
  • Атомарні операційи.
  • unordered-варіянты асоціятівных масиву и множин.
  • Розумні указатилі, задавучі автоматічноє выслободжіня выділеної тямы.

STL до того, як стала частьов штандарта C++, была боковов розробков. Иззачинаня ю розробляла фірма HP (Hewlett-Packard), а потумкы – SGI (Silicon Graphics Inc.).

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

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

ґенеолоґія й рокашный вплыв вирзій Сі і C++ (за «Короткым курсом» Страуструпа)

Сполочность из Сі

[едітовати | едітовати жрідло]

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

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

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

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

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

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

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

[едітовати | едітовати жрідло]
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, а розмір тых тіпу ся убыкло удрузнят.

#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()[29] у хосен оператора new, уд realloc()[30] — у хосен тіпа vector. Май безпечным буде хоснованя розумных указатилю, такых гий shared_ptr тай unique_ptr, што доступні уд єденадцятої вирзійи штандарта.
  • Убыйти без безтіповых указатилю, аріфметікы указатилю, неявных приведінь тіпу, скапчань, окроме, може, низкоруньового кода. Хосновати «нові» перевединя тіпу, што ліпше выражавут жаданя проґраміста й сут май безпечні.
    • Рада до мінімума хоснованя масиву сімболу тай шорику у штилови C, замінявучи йих на тіпы string и vector із STL. Шуга не творити свої реалізаційи того, што уже є у штандартнуй бібліотеци.

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

Сполочноє напрямліня розвоя C++

[едітовати | едітовати жрідло]

На думку автора языка Бярена Страуструпа[34][35][36], говорячи о далшум розвою тай перспектівах языка, мож дашто вызначити:

  • У основнум далшый розвуй языка буде йти путьом доповнінь до штандартної бібліотекы. Єдным из головных жрідел такых доповнінь є знана бібліотека 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), а спойиня типирь мавут май мало убграничінь у своюй структурі. Кроме того, компілатор типирь має правилно парсити код из множинными заперавучыми кутовыми дужками «>>», што уживані у вкладеных шаблонных конструкціях. Май скоро «>>» автоматічно приймало ся ги оператор побітового зсува вправо, того меже знаками > гія было вставляти пропускы авадь износы шорика.

Приклад проґрам

[едітовати | едітовати жрідло]

Се приклад проґрамы Hello, world!, котра выводит извістку в консол, хоснувучи штандартну бібліотеку, и окончує ся.

#include <iostream>

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

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

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

#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::.

namespace Foo
{
   const int x = 5;
}

const int y = Foo::x;
#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. …» Пауля Гудака й Марка Джонса[37] представлиный звід про досліджіня шора імператавных и функціоналных языку на прикладі рішіня модилної задачі быстрого прототіпованя ГІС-сістемы воєнного призначіня.
  • В инакуй науковуй роботі — «DSL implementation in metaocaml, template haskell, and C++» — чотыри авторы[38] методічно досліжувут возможности C++ и двох функціоналных языку у роли базовых инструменту про языково-орьєнтованого проґрамованя з методом порожувучого кода.
  • У досліжині Лутца Прехелта[39] аналізувут ся сім языку (C, C++, Java, Perl, Python, Rexx, Tcl) у контекстови написаня простої проґрамы, котра переробляє телефонні нумера на слова за даякыми правилами.
  • У статі Девіда Велера «Ada, C, C++, and Java vs. The Steelman»[40] проводит ся зруняня языку Ада, C++, C и Java із документом «Steelman» — списком потреб до языка про воєнных убудованых сістем, котрый быв розробленый у 1978 годі Міністерством сокочіня США. Хоть документ ужек устарів и не бере до увагы типирішні возможности языку, зруняня показує, што C++ не так силно рузнится уд языку-конкуренту в плані необходимых возможностю про промысловых розробок.
  • Статя Метю Формента й Міхаеля Ґіллінґса[41] описує досліжіня[42] реалізаційи на шість языках (C++, C, C#, Java, Perl, Python) трьох шпеціфічных алґорітму, што хоснувут ся у біоинформатіци: метод майблизкых сусіду, ґлобалноє выруньованя послідовностю (алґорітм Нідлмана — Вунша) и парсінґ выходных даных BLAST.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

… коц ефектівность є пирьвошорна, «ліпшины» C++ будут грубов хыбов.

C++ и функціоналні тай скріптові языкы

[едітовати | едітовати жрідло]

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

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

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

  • Perl, Python, Rexx, Tcl забезпечили удвоє булшу быстроту розробкы, гий C, C++ и Java, причому одержаный код быв так само удвоє май куртым.
  • Проґрамы на скріптовых языках хосновали приблизно удвоє булше тямы, ги C/C++.
#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++ якомусь другому конкретному языкови, а повідавут, же удказ уд хоснованя єдного языка, што має много недостатку, в хосен декомпозіційи проєкта на пудзадачі, котрі рішавут ся на рузных языках, майбулш пудходящых про них, робит розробку не таков бабрачнов при єдночаснум пудвышіньови показнику квалітности проґрамованя[56][57]. Из тої самої причины крітікує ся й засокочіня сполочливости з Сі: аж частина задачі жадат низкоруньовых возможностю, май розумно бы было вынести ю у окрему пудсістему й написати ю на Сі.

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

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

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

[едітовати | едітовати жрідло]

Контрола за повожіньом

[едітовати | едітовати жрідло]

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

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

Компонентноє й обєктово-орьєнтованоє проґрамованя

[едітовати | едітовати жрідло]

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

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

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

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

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

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

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

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

Метапроґрамованя

[едітовати | едітовати жрідло]

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

Кросплатформность

[едітовати | едітовати жрідло]

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

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

Удсутность возможностю

[едітовати | едітовати жрідло]
Рефлексівноє метапроґрамованя

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

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

Извышні й небезпичні возможности

[едітовати | едітовати жрідло]

Устройині стрества убхода убграничінь

[едітовати | едітовати жрідло]

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

Неконтролуйимоє макропудставліня

[едітовати | едітовати жрідло]

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

Проблемы переубтирьханя

[едітовати | едітовати жрідло]
Прінціпы переубтирьханя функцій и оператору в C++ веде д грубому дублованьови кода. Переубтирьханя оператору, што было задуманоє на додаваня «сінтаксічного цукра», в C++ позволяє без контролы міняти повожіня елементарных операцій про рузні тіпы. То дуже пудвысшує різік хыб, тым булше, што уводит новый сінтаксіс авадь міняє сутный (наприклад, робити нові операторы авадь міняти пріорітеты й асоціятівность) не мож, хоть сінтаксіс штандартных оператору C++ не фурт адекватный семантіци новых тіпу, котрі ся можут потребовати в проґрамі.

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

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

Вылічна ефектівность

[едітовати | едітовати жрідло]

Резултувучый обєм оконаного кода

[едітовати | едітовати жрідло]

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

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

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

Потенціял оптімізаційи

[едітовати | едітовати жрідло]

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

#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++ и недостаток возможностю удслідили макровызначіня компілатором, помалили розробку проєкта, коли написали єдно-два лишні, формално коректні з никаня компілатора, шорикы кода, айбо коли впровадили через то чажко выявителну, знівыдкы проявлявучу ся хыбу. Наприклад:
#define if(a) if(rand())
#define j i

У языках из доказанов коректностьов, онь из розвоєными макросредствами, нанести шкоду подобным способом не мож.

Ненадійность продукта

[едітовати | едітовати жрідло]

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

Менеджмент проєкту

[едітовати | едітовати жрідло]

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

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

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

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

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

[едітовати | едітовати жрідло]
Проґрама «Hello, world!» на C тай 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++ є булш выразный, гий у Java.

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

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

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

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

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

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

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

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

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

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

Популарні проґрамы зотворині на нюм

[едітовати | едітовати жрідло]
  1. Bjarne Stroustrup's FAQ (по en). Bjarne Stroustrup. Ocober 1, 2017. Архівна копія з оріґінала зроблена 2016-02-06. https://web.archive.org/web/20160206214150/http://www.stroustrup.com/bs_faq.html#name. [перевірено 2017-12-04]. „The name C++ (pronounced "see plus plus")“
  2. Stroustrup, Bjarne (1997). 1. The C++ Programming Language (Third ed.). Addison-Wesley. ISBN 0-201-88954-4. OCLC 59193992. https://archive.org/details/cprogramminglang00stro_0.
  3. "ISO/IEC 14882:2024". International Organization for Standardization. Retrieved 21 October 2020
  4. 1 2 Страуструп, 1999.
  5. Бярен Страуструп (2015-04-16). Bjarne Stroustrup’s FAQ (по анґліцькы). http://www.stroustrup.com/bs_faq.html.
  6. Infographic: C/C++ Facts We Learned Before Going Ahead with CLion | The CLion Blog (по анґліцькы). The JetBrains Blog. 2015-07-27. https://blog.jetbrains.com/clion/2015/07/infographics-cpp-facts-before-clion/.
  7. Стенли Ліппман, Pure C++: Hello, C++/CLI
  8. C++ — Standards. Архівна копія з оріґінала зроблена 2010-11-20. https://web.archive.org/web/20101120215619/http://www.open-std.org/jtc1/sc22/wg21/docs/standards. [перевірено 2010-11-14].
  9. Computer Science Pioneer Bjarne Stroustrup to Receive the 2018 Charles Stark Draper Prize for Engineering. National Academy of Engineering. 3 Януара 2018. Архівна копія з оріґінала зроблена 14 Децембра 2021. https://web.archive.org/web/20180103190112/https://www.nae.edu/177355.aspx.
  10. TIOBE (November 2024). TIOBE Index for November 2024. TIOBE Company. https://www.tiobe.com/tiobe-index/. [перевірено 18 November 2024].
  11. Страуструп, Бярен. The C++ Programming Language. http://www.stroustrup.com/1st.html. [перевірено 16 September 2010].
  12. Страуструп, Бярне (7 Марца 2010). "Bjarne Stroustrup's FAQ: When was C++ invented?". stroustrup.com. Archived з оріґінала 6 фебруара 2016 года. Одержано 16 септембра 2010 года.
  13. Александр Степанов (7 Марца 1994). Hewlett-Packard, Technical Report X3J16/94-0095, WG21/N0482. The Standard Template Library. http://www.stepanovpapers.com/Stepanov-The_Standard_Template_Library-1994.pdf.
  14. Bjarne Stroustrup.. C++ Glossary. Архівна копія з оріґінала зроблена 2011-05-01. https://web.archive.org/web/20110501150638/http://www2.research.att.com/~bs/glossary.html. [перевірено 2007-06-08].
  15. Яндекс организует рабочую группу по стандартизации языка C++ (по ru). ИКС Медиа. Архівна копія з оріґінала зроблена 2018-08-29. https://web.archive.org/web/20180829212016/http://www.iksmedia.ru/news/5298228-Yandeks-sozdaet-rabochuyu-gruppu.html. [перевірено 2018-08-29].
  16. Страуструп, 1999, с. 46, 1.4. Исторические замечания.
  17. Страуструп, Дизайн и эволюция C++, 2007.
  18. тіпы даных C++ із сайта Microsoft https://learn.microsoft.com/uk-ua/cpp/cpp/data-type-ranges?view=msvc-170
  19. https://learn.microsoft.com/uk-ua/cpp/cpp/char-wchar-t-char16-t-char32-t?view=msvc-170
  20. https://ravesli.com/urok-35-simvolnyj-tip-dannyh-char/#toc-7[dead link]
  21. 1 2 3 4 тіпы даных C++ із сайта Microsoft https://learn.microsoft.com/uk-ua/cpp/cpp/data-type-ranges?view=msvc-170
  22. 1 2 https://learn.microsoft.com/ru-ru/cpp/cpp/int8-int16-int32-int64?view=msvc-170
  23. 1 2 3 4 https://acode.com.ua/urok-34-tsilochyselni-typy-danyh-short-int-i-long/#toc-2
  24. bool тіп даных https://learn.microsoft.com/en-gb/cpp/cpp/bool-cpp?view=msvc-170
  25. ISO/IEC 14882:1998, розділ 6.4, пункт 4: «The value of a condition that is an initialized declaration in a statement other than a switch statement is the value of the declared variable implicitly converted to bool … The value of a condition that is an expression is the value of the expression, implicitly converted to bool for statements other than switch; if that conversion is ill-formed, the program is ill-formed».
  26. false тіп даных https://learn.microsoft.com/en-gb/cpp/cpp/false-cpp?view=msvc-170
  27. true тіп даных https://learn.microsoft.com/ru-ru/cpp/cpp/true-cpp?view=msvc-170
  28. STLport: Welcome!. Архівна копія з оріґінала зроблена 2018-06-07. https://web.archive.org/web/20180607183150/http://www.stlport.org/. [перевірено 2007-07-26].
  29. std::vector — cppreference.com. http://en.cppreference.com/w/cpp/container/vector. [перевірено 2015-11-28].
  30. std::realloc — cppreference.com. http://en.cppreference.com/w/cpp/memory/c/realloc. [перевірено 2015-11-28].
  31. ISO/IEC 14882:2024 Programming languages — C++. https://www.iso.org/standard/83626.html.
  32. C++23 "Pandemic Edition" is complete (Trip report: Winter ISO C++ standards meeting, Issaquah, WA, USA). 13 February 2023. https://herbsutter.com/2023/02/13/c23-pandemic-edition-is-complete-trip-report-winter-iso-c-standards-meeting-issaquah-wa-usa/.
  33. Working Draft, Standard for Programming Language C++. ISO/IEC. 2024-04-16. https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2024/n4981.pdf.
  34. Интервью Б. Страуструпа LinuxWorld.com. http://www.codenet.ru/progr/cpp/straustrup.php. [перевірено 2013-01-04].
  35. Интервью Б. Страуструпа журналу «Системный администратор». http://samag.ru/archive/article/1034. [перевірено 2013-01-04].
  36. CNews: Эксклюзивное интервью с создателем языка программирования C++. Архівна копія з оріґінала зроблена 2015-03-17. https://web.archive.org/web/20150317122705/http://www.cnews.ru/reviews/index.shtml?2010%2F09%2F29%2F410282. [перевірено 2019-11-01].
  37. An Experiment in Software Prototyping Productivity. Paul Hudak, Mark P. Jones. Yale University, Department of Computer Science, New Haven, CT 06518. July 4, 1994.
  38. K. Czarnecki, J. O’Donnell, J. Striegnitz, W. Taha. DSL implementation in metaocaml, template haskell, and C++. Архивировано из первоисточника 7 апріля 2022.. Цитата: C++ Template Metaprogramming suffers from a number of limitations, including portability problems due to compiler limitations (although this has significantly improved in the last few years), lack of debugging support or IO during template instantiation, long compilation times, long and incomprehensible errors, poor readability of the code, and poor error reporting.
  39. Lutz Prechelt (Universität Karlsruhe) (2000-03-14). An empirical comparison of C, C++, Java, Perl, Python, Rexx, and Tcl for a search/string-processing program (pdf). http://page.mi.fu-berlin.de/prechelt/Biblio/jccpprt_computer2000.pdf. [перевірено 2019-11-20].
  40. «Ada, C, C++, and Java vs. The Steelman» David A. Wheeler July/August 1997. https://dwheeler.com/steelman/steeltab.htm. [перевірено 2019-03-23].
  41. «A comparison of common programming languages used in bioinformatics». https://bmcbioinformatics.biomedcentral.com/articles/10.1186/1471-2105-9-82. [перевірено 2021-09-02].
  42. Сравнение языков программирования в реализации алгоритмов биоинформатики — описание эксперимента.. http://www.bioinformatics.org/benchmark/index.html. [перевірено 2021-09-02].
  43. An Experiment in Software Prototyping Productivity. Paul Hudak, Mark P. Jones. Yale University, Department of Computer Science, New Haven, CT 06518. July 4, 1994.
  44. Comparison of Ada and C++ Features (en). http://www.adahome.com/articles/9703/ada_vs_cpp.html. [перевірено 2019-03-23].
  45. Stephen Zeigler, Comparing Development Costs of C and Ada. Архівовано 4 апріля 2007.
  46. 1.2 Design Goals of the Java™ Programming Language. Oracle. 1999-01-01. http://www.oracle.com/technetwork/java/intro-141325.html. [перевірено 2013-01-14].
  47. Lutz Prechelt (Universität Karlsruhe) (2000-03-14). An empirical comparison of C, C++, Java, Perl, Python, Rexx, and Tcl for a search/string-processing program (pdf). http://page.mi.fu-berlin.de/prechelt/Biblio/jccpprt_computer2000.pdf. [перевірено 2019-11-20].
  48. «A comparison of common programming languages used in bioinformatics». https://bmcbioinformatics.biomedcentral.com/articles/10.1186/1471-2105-9-82. [перевірено 2021-09-02].
  49. Google C++ Style Guide. Exceptions.. https://google.github.io/styleguide/cppguide.html#Exceptions. [перевірено 2019-03-31].
  50. Boehm H.. Advantages and Disadvantages of Conservative Garbage Collection. Архивировано из первоисточника 24 юлія 2013. (удкликаня із Реймонд, Ерік.. Искусство программирования для Unix. — ISBN 5-8459-0791-8.)
  51. An Experiment in Software Prototyping Productivity. Paul Hudak, Mark P. Jones. Yale University, Department of Computer Science, New Haven, CT 06518. July 4, 1994.
  52. 1 2 Хыбна цітація: Хыба в таґу <ref>; цітації означеной "autogenerated1" не є доданый жаден текст
  53. An Experiment in Software Prototyping Productivity. Paul Hudak, Mark P. Jones. Yale University, Department of Computer Science, New Haven, CT 06518. July 4, 1994.
  54. Ray Tracer Language Comparison (бенчмарк языков программирования — ffconsultancy.com/languages/ray_tracer/)
  55. Lutz Prechelt (Universität Karlsruhe) (2000-03-14). An empirical comparison of C, C++, Java, Perl, Python, Rexx, and Tcl for a search/string-processing program (pdf). http://page.mi.fu-berlin.de/prechelt/Biblio/jccpprt_computer2000.pdf. [перевірено 2019-11-20].
  56. 1 2 Martin Ward. Language Oriented Programming[en]. — Computer Science Department, Science Labs. Архивировано из первоисточника 4 марца 2016.
  57. Paul Hudak. Modular Domain Specific Languages and Tools. — Department of Computer Science, Yale University.
  58. Alan Kay's Definition Of Object Oriented Programming. Архівна копія з оріґінала зроблена 2013-08-24. https://web.archive.org/web/20130824235515/http://c2.com/cgi/wiki?AlanKaysDefinitionOfObjectOriented. [перевірено 2013-08-05].
  59. Шилдт, Теория и практика C++, 1996, с. 64—67.
  60. 1 2 Ian Joyner. A Critique of C++ and Programming and Language Trends of the 1990s - 3rd Edition // копирайт и список изданий. Архивировано из первоисточника 25 новембра 2013.
  61. Paulson, Lawrence C.. ML for the Working Programmer, 2nd edition  Cambridge University Press, 1996. — ISBN 0-521-57050-6 (hardback), 0-521-56543-X (paperback)., c.271-285
  62. Открытая переписка gmane.comp.version-control.git от 06.09.2007. Архівна копія з оріґінала зроблена 2013-12-09. https://web.archive.org/web/20131209133259/http://thread.gmane.org/gmane.comp.version-control.git/57643/focus=57918. [перевірено 2013-08-05].
  63. Walid Taha. Domain-Specific Languages. — Department of Computer Science, Rice University. Архивировано из первоисточника 24 октобра 2013.
  64. Lugovsky V.S.. Using a hierarchy of Domain Specific Languages in complex software systems design. Архивировано из первоисточника 10 авґуста 2016.
  65. Андрей Карпов. 20 ловушек переноса Си++ - кода на 64-битную платформу. — RSDN Magazine #1-2007. Архивировано из первоисточника 2 апріля 2015.
  66. Открытая переписка gmane.comp.version-control.git от 06.09.2007. Архівна копія з оріґінала зроблена 2013-12-09. https://web.archive.org/web/20131209133259/http://thread.gmane.org/gmane.comp.version-control.git/57643/focus=57918. [перевірено 2013-08-05].
  67. Don Clugston, CSG Solar Pty Ltd (Перевод: Денис Буличенко). {{{тітул}}}. Архивировано из первоисточника 19 октобра 2013.
  68. Страуструп, Программирование: принципы и практика использования C++, 2001
  69. Dave Gottner.. Templates Without Code Bloat. — януарь 1995. Архивировано из первоисточника 7 юнія 2008.
  70. Adrian Stone. (2009-09-22). Minimizing Code Bloat: Redundant Template Instantiation. Game Angst. Архівна копія з оріґінала зроблена 2011-12-08. https://web.archive.org/web/20111208031943/http://gameangst.com/?p=246. [перевірено 2010-01-19].
  71. Herb Sutter.. C++ Conformance Roundup. Dr. Dobb's Journal, . Архивировано из первоисточника 15 януара 2009.
  72. Scott Meyers (2002-05-16). Code Bloat due to Templates. comp.lang.c++.moderated. Usenet. http://groups.google.com/group/comp.lang.c++.moderated/browse_thread/thread/2b00649a935997f5/5feec243078c5fd8. [перевірено 2010-01-19].
  73. Ray Tracer Language Comparison (бенчмарк языков программирования — ffconsultancy.com/languages/ray_tracer/)
  74. Zhanyong Wan and Paul Hudak. Event-Driven FRP // Department of Computer Science, Yale University. Архивировано из первоисточника 16 авґуста 2011.
  75. Walid Taha. Архівна копія з оріґінала зроблена 2013-08-13. https://www.webcitation.org/6IqLu1AP0?url=http://www.cs.rice.edu/~taha/publications/. [перевірено 2019-11-20].
  76. MLKit. Архівна копія з оріґінала зроблена 2013-09-17. https://web.archive.org/web/20130917074849/http://www.it-c.dk/research/mlkit/index.php/Main_Page. [перевірено 2013-07-30].
  77. Чистяков Влад aka VladD2. Синтаксический сахар или C++ vs. Nemerle :) // RSDN Magazine #1-2006. — 24.05.2006. Архивировано из первоисточника 13 децембра 2013.
  78. Go at Google: Language Design in the Service of Software Engineering. talks.golang.org. https://talks.golang.org/2012/splash.article. [перевірено 2017-09-19].
  79. Catalin Cimpanu (2019-06-17). Microsoft to explore using Rust. ZDNet. https://www.zdnet.com/article/microsoft-to-explore-using-rust/. [перевірено 2019-09-26].
Думка
  1. vanDooren (2008-09-24). C++ keyword of the day: export. Blogs@MSMVPs. Архівна копія з оріґінала зроблена 2009-05-06. https://web.archive.org/web/20090506053736/http://msmvps.com/blogs/vandooren/archive/2008/09/24/c-keyword-of-the-day-export.aspx. [перевірено 2010-01-19]. „The export keyword is a bit like the Higgs boson of C++. Theoretically it exists, it is described by the standard, and noone has seen it in the wild. … There is 1 C++ compiler front-end in the world which actually supports it“
Убясниня
  1. Наприклад, Boost.Lambda позіціонуєся як ламбда-функція, єднако C++ не отілиснює ламбда-вычислиня Чёрча повностю; імітація комбінатору посредством языка шаблону через-чурь тяжка, штобы чекати їх хоснованя на практіці; продовжіня, унаслідовані уд Сі, рахувутся неідеоматічными и небезпечными, а їх реалізація посредством языка шаблону нежлива; кроме того, хоснованя λ-пудёма[en] для оптімізації C++ неможливо,— так што фактічно Boost.Lambda — то є просто анонімна функція, а не обєкт лямбда-вычисліня.
Поясниня