(Сі++) — кампіляваная статычна тыпізаваная мова праграмавання агульнага прызначэння. Падтрымлівае розныя парадыгмы праграмавання, але, у параўнанні са сваёй папярэдніцай мовай Сі, найбольшая ўвага скіравана на падтрымку аб’ектна-арыентаванага і абагульненага праграмавання.

Назва «C++» паходзіць ад назвы мовы Сі (C), у якой унарны (аднамесны) аператар ++ пазначае прырост зменнай на адзінку.

У 1990-х гадах мова стала адной з самых ўжывальных моў праграмавання агульнага прызначэння.

Пры стварэнні C++ імкнуліся захаваць сумяшчальнасць з мовай Сі. Большасць праграм на Сі можна, амаль не змяняючы, сабраць і з дапамогай кампілятара C++. Мова C++ мае сінтаксіс, заснаваны на сінтаксісе Сі.

Гісторыя Мова з’явілася напачатку 1980-х гадоў, калі супрацоўнік фірмы Bell Laboratories Б’ёрн Страўструп прыдумаў шэраг удасканаленняў да мовы Сі пад уласныя патрэбы. Да пачатку афіцыйнай стандартызацыі мова развівалася галоўным чынам сіламі Страўструпа ў адказ на запыты праграмісцкай супольнасці. У 1998 годзе быў прынят міжнародны стандарт мовы C++: ISO/IEC 14882:1998 «Standard for the C++ Programming Language»; пасля прыняцця тэхнічных выпраўленняў да стандарту ў 2003 годзе — цяперашняя версія гэтага стандарту — ISO/IEC 14882:2003.

Раннія версіі мовы, вядомыя пад назвай «C з класамі», пачалі з’яўляцца ў 1980-я гады. Ідэя стварэння новай мовы бярэ пачатак з доследаў Страўструпа ў праграмаванні падчас працы над дысертацыяй. Ён выявіў, што мова мадэлявання Сімула (Simula) мае такія магчымасці, якія былі б вельмі карыснымі пры распрацоўцы вялікага праграмнага забеспячэння, але працуе занадта павольна. У той жа час мова BCPL даволі хуткая, але занадта блізкая да моў нізкага ўзроўню і не падыходзіць для распрацоўкі вялікага праграмнага забеспячэння. Страўструп пачаў працаваць у Bell Labs над задачамі тэорыі чэрг (у прыкладаннях да мадэлявання тэлефонных выклікаў). Спробы прымяніць існаваўшыя ў той час мовы мадэлявання засталіся безвыніковымі. Успомніўшы доследы са сваёй дысертацыі, Страўструп вырашыў дапоўніць мову Сі (пераемніцу BCPL) магчымасцямі мовы Сімула. Мова Сі, якая была асноўнай мовай сістэмы UNIX, на якой працавалі камп’ютары Bell, хуткая, шматфункцыянальная і пераносная. Страўструп дадаў да яе магчымасць працы з класамі і аб’ектамі. У выніку, практычныя задачы мадэлявання сталі даступнымі для развязання як з пункту гледжання часу распрацоўкі (дзякуючы выкарыстанню Сімула-падобных класаў) так і з пункту гледжання часу вылічэнняў (дзякуючы хуткадзеянню Сі). Напачатку ў Сі былі ўключаны класы (з інкапсуляцыяй), вытворныя класы, строгая праверка тыпаў, inline-функцыі і аргументы па змаўчанні.

Распрацоўваючы Сі з класамі (пазней C++), Страўструп таксама напісаў праграму cfront — транслятар, які перакладаў зыходны код Сі з класамі у зыходны код звычайнай Сі. Новая мова, нечакана для аўтара, набыла вялікую папулярнасць сярод калег, і неўзабаве Страўструп ужо не мог падтрымліваць яе асабіста, адказваючы на тысячы пытанняў.

У 1983 годзе адбылося перайменаванне мовы з Сі з класамі у C++. Акрамя таго, у яе былі ўключаны новыя магчымасці, такія як віртуальныя функцыі, перагрузка функцый і аператараў, спасылкі, канстанты (сталыя), карыстальніцкі кантроль над кіраваннем свабоднай памяццю, палепшаная праверка тыпаў і новы стыль каментарыяў (//). Яе першы камерцыйны выпуск адбыўся ў кастрычніку 1985 года.

Развіццё і ўпарадкаванне мовы

У 1985 годзе выйшла першае выданне кнігі «Мова праграмавання C++», першае апісанне гэтай мовы, што было надзвычай важным з-за адсутнасці афіцыйнага стандарту. У 1989 годзе адбыўся выхад C++ версіі 2.0. Яго новыя магчымасці ўключалі множнае наследаванне, абстрактныя класы, статычныя функцыі-члены, функцыі-канстанты і ахаваныя члены.

У 1990 годзе выйшла «Каментаванае даведачнае кіраўніцтва па C++», якое пасля легла ў аснову стандарту. Апошнія абнаўленні ўключалі шаблоны, выключэнні, прасторы імён, новыя спосабы прывядзення тыпаў і булеўскі тып.

Стандартная бібліятэка мовы C++ таксама развівалася разам з ёю. Першым дабаўленнем к стандартнай бібліятэцы C++ сталі патокі ўводу/вываду, якія даюць сродкі для замены традыцыйных функцый Сі printf і scanf. Пазней самым значным крокам у развіцці стандартнай бібліятэкі стала ўключэнне ў яе Стандартнай бібліятэкі шаблонаў.

У 1998 годзе, пасля некалькіх гадоў працы, сумесны камітэт ANSI-ISO прыняў стандарт мовы C++ (ISO/IEC 14882:1998 — Мова праграмавання C++). На працягу некалькіх гадоў пасля афіцыйнага выхаду стандарту камітэт апрацоўваў паведамленні пра памылкі і ў выніку выпусціў выпраўленую версію стандарту C++ у 2003 годзе. У наш час працоўная група МОС (ISO) працуе над новай версіяй стандарту пад кодавай назвай C++09 (раней вядомы як C++0X), які павінен выйсці ў 2009 годзе.

Ніхто не валодае правамі на мову C++, гэта свабодная мова праграмавання. Аднак сам дакумент стандарту мовы (за выключэннем чарнавікоў) бясплатна не даступны.

Гісторыя назвы Назва «C++» была прыдумана Рыкам Масіцці (Rick Mascitti) і ўпершыню была выкарыстана ў снежні 1983 года. Раней, на ступені распрацоўкі, новая мова называлася «Сі з класамі».

Імя, атрыманае ў выніку, паходзіць ад аператара мовы Сі «++» (павелічэнне значэння зменнай на адзінку). Імя «C+» не было выкарыстана таму, што з’яўляецца сінтаксічнай памылкай у Сі і, акрамя таго, гэта імя было занята іншай мовай. Мова таксама не названа «D», бо «з’яўляецца пашырэннем Сі і не спрабуе здымаць праблемы шляхам выдалення элементаў Сі».

Філасофія C++ У кнізе «Дызайн і эвалюцыя C++» Б’ёрн Страуструп апісвае прынцыпы, якіх ён прытрымліваўся пры распрацоўцы мовы C++. Гэтыя прынцыпы тлумачаць, чаму C++ менавіта такая, якой яна ёсць. Некаторыя з іх: Атрымаць універсальную мову са статычнымі тыпамі даных, эфектыўнасцю і пераноснасцю мовы Сі. Непасрэдна і ўсебакова падтрымліваць мноства стыляў праграмавання, у тым ліку працэдурнае праграмаванне, абстракцыю даных, аб’ектна-арыентаванае праграмаванне і абагульненае праграмаванне. Даць праграмісту свабоду выбару, нават калі гэта дасць яму магчымасць выбіраць няправільна. Максімальна захаваць сумяшчальнасць з Сі, тым самым спрашчаючы пераход з мовы Сі. Пазбегнуць розначытанняў паміж Сі і C++: любая канструкцыя, якая дапушчальная ў абедзвюх мовах, павінна ў кожнай з іх абазначаць адно і тое ж і прыводзіць да адных і тых жа паводзін праграмы. Пазбягаць асаблівасцей, якія залежаць ад платформы ці не з’яўляюцца ўніверсальнымі. Ніякі моўны сродак не павінен прыводзіць да зніжэння прадукцыйнасці праграм, якія не выкарыстоўваюць яго. Не патрабаваць занадта складанага асяроддзя праграмавання.

Агляд мовы Стандарт C++ на 1998 год складаецца з дзвюх асноўных частак: ядра мовы і стандартнай бібліятэкі.

Стандартная бібліятэка C++ увабрала ў сябе бібліятэку шаблонаў STL, якая распрацоўвалася адначасова са стандартам. Цяпер назва STL афіцыйна не ўжываецца, аднак у кругах праграмістаў на C++ і ў навучанні гэта назва выкарыстоўваецца для пазначэння часткі стандартнай бібліятэкі, якая змяшчае азначэнні шаблонаў кантэйнераў, ітэратараў, алгарытмаў і функтараў.

Стандарт C++ утрымоўвае нарматыўную спасылку на стандарт Сі ад 1990 года і не вызначае самастойна тыя функцыі стандартнай бібліятэкі, якія пазычаны са стандартнай бібліятэкі Сі.

Акрамя таго, існуе велізарная колькасць бібліятэк C++, якія не ўваходзяць у стандарт. У праграмах на C++ можна выкарыстоўваць шматлікія бібліятэкі Сі.

Мова праграмавання C++ вызначана стандартам, аднак за гэтай назвай могуць хавацца таксама няпоўныя, абмежаваныя, дастандартныя адмены мовы. Напачатку свайго існавання мова развівалася па-за фармальнымі рамкамі, адказваючы на задачы, якія ставіліся перад ёю. Развіццю мовы спадарожнічала развіццё крос-кампілятара cfront. Змены і новыя ўласціваці ў мове адлюстроўваліся ў змене нумара версіі крос-кампілятара. Гэтыя нумары версій крос-кампілятара распаўсюджваліся і на саму мову. Аднак цяпер звычайна пра версіі мовы C++ не кажуць.

Новыя магчымасці ў параўнанні з Сі Новаўвядзеннямі C++ у параўнанні з Сі з’яўляюцца: падтрымка аб’ектна-арыентаванага праграмавання; падтрымка абагульненага праграмавання праз шаблоны; дадатковыя тыпы даных; выключэнні; прасторы імён; убудавальныя функцыі; перагрузка аператараў; перагрузка імён функцый; спасылкі і аператары дынамічнага размеркавання памяці; дадаткі к стандартнай бібліятэцы.

Мова C++ шмат у чым з’яўляецца надмноствам Сі. Новыя магчымасці C++ уключаюць аб’яўленні ў выглядзе выразаў, пераўтварэнні тыпаў у выглядзе функцый, аператары new і delete, тып bool, спасылкі, пашыранае паняцце нязменнасці аб’ектаў, падстаўляльныя (убудавальныя) функцыі, аргументы па змаўчанні, пераазначэнні, прасторы імён, класы (разам з усімі спалучанымі магчымасцямі, такімі як наследаванне, функцыі-члены, віртуальныя функцыі, абстрактныя класы і канструктары), пераазначэнні аператараў, шаблоны, аператар развязання прасторы імён ::, апрацоўку выключэнняў, дынамічнае атаясамленне і многае іншае. Таксама, мова C++ ў многіх выпадках стражэйшая за мову Сі ў дачыненні да праверкі тыпаў.

У C++ з’явіліся каментары ў выглядзе падвойнай касой рысы (//), якія былі ў папярэдніку мовы Сі — мове BCPL.

Некаторыя асаблівасці C++ пазней былі перанесены ў Сі, напрыклад ключавыя словы const і inline, аб’яўленні ў цыклах for і каментары ў стылі C++ (//). У пазнейшых рэалізацыях Сі таксама з’явіліся магчымасці, якіх няма ў C++, напрыклад макрасы vararg і палепшаная праца з масівамі-параметрамі.

Магчымасці, не звязаныя з ААП У гэтым раздзеле апісваюцца магчымасці, непасрэдна не звязаныя з аб’ектна-арыентаваным праграмаваннем (ААП). Аднак, многія з іх набываюць асаблівую важнасць іменна ў спалучэнні з ААП.

Апісальнік inline азначае, што функцыя з’яўляецца добрым кандыдатам на аптымізацыю, пры якой у месцах звароту да функцыі кампілятар уставіць цела гэтай функцыі, а не код выкліку. Прыклад: inline double Sqr(double x) {return x*x;}. inline з’яўляецца не дырэктывай (ўказаннем), а толькі парадай кампілятару — кампілятар не абавязан падстаўляць цела для ўбудавальных (inline) функцый, але можа, зыходзячы з даных настроек аптымізацыі, выконваць падстаноўку цела для функцый, якія не пазначаны як inline. Апісальнік volatile выкарыстоўваецца ў апісанні зменных і кажа кампілятару, што значэнне пэўнай зменнай можа быць зменена спосабам, які кампілятар не ў стане адсачыць. Для зменных, пазначаных як volatile, кампілятар не павінен ужываць сродкі аптымізацыі, якія змяняюць становішча зменнай у памяці (напрыклад, перамяшчаць яе ў рэгістр) ці разлічваюць на нязменнасць значэння зменнай у прамежку паміж дзвюма прысвойваннямі ёй значэння. Замест функцый malloc і free (якія пакінуты толькі для зваротнай сумяшчальнасці), уведзены новыя аператары new і delete. Калі T — адвольны тып, то new T выдзяляе памяць, дастатковую для размяшчэння аднаго аб’екта тыпу Т, магчыма, задае значэнне аб’екта ў гэтай памяці, і вяртае указальнік тыпу Т* (напрыклад, Т* p = new T). new T[n] выдзяляе памяць, дастатковую для размяшчэння n аб’ектаў тыпу Т, магчыма, задае кожны аб’ект у гэтай памяці, і вяртае указальнік тыпу Т* (напрыклад, Т* p = new T[n]). delete p — знішчае аб’ект, на які спасылаецца указальнік p, і вызваляе вобласць памяці, выдзеленую для яго раней аператарам new T. delete [] p — знішчае кожны аб’ект у масіве, на які спасылаецца указальнік p, і вызваляе вобласць памяці, выдзеленую для гэтага масіва раней аператарам new T[n]. Аператар delete правярае, што яе аргумент не NULL, у адваротным выпадку ён нічога не робіць. Пры стварэнні і выдаленні асобнікаў (аб’ектаў) класаў з дапамогай new і delete кампілятар устаўляе выклікі канструктара і дэструктара класа (гл. ніжэй).