__БЕЗКН__
-{C++}- је виши програмски језик који је првобитно развијен у Беловим лабораторијама (лабораторији телекомуникационе компаније -{Bell}-) за објектно оријентисано програмирање у пројекту под руководством Бјарнеа Строуструпа током 1980-их као проширење програмског језика -{C}-, па му је оригинално име било „-{C}- са класама“ (). Због велике потражње за објектно оријентисаним језицима и способностима, стандард за програмски језик -{C++}- ратификован је 1998. у стандарду -{ISO/IEC 14882}-.
Историја C++-а
Почетком осамдесетих година у Беловим лабораторијама Бјарне Строуструп, дански научник, радећи на проширивању језика C развио је суштински нов језик кога је назвао C са класама.Закључио је да је Simula имала веома добре функције за развој великих програма, али је тај језик био преспор за коришћење у пракси. BCPL () је био брз али превише ниског нивоа за развој великих програма. Строуструп је изабрао C као базу, јер је C био генерално оријентисан, брз и у широкој употреби. Почео је да ради на побољшању програмског језика C додајући му функције сличне онима које има Simula. Такође, утицај су имали ALGOL 68, Ada, CLU и ML. Аутор је желео да побољша језик C развојем подршке објектно-оријентисаном програмирању. У 1983. години тај назив је промењен у C++.
Строуструпов C са класама је на почетку додао C компајлеру могућности као што су класе, наслеђивање, јако типизирање, редне функције и подразумеване вредности аргумената. Строуструп је 1982. почео да развија наследника C са класама, који је назвао "C++" (++ је унарни оператор инкрементирања у језику C), након што је разматрао неколико других имена. Додате су нове могућности, међу којима су виртуелне функције, име функције и преклапање оператора, референце, константе, заузимање меморије (new/delete), побољшану проверу типова, и коментаре у једном реду у стилу језика BCPL са две косе црте (//). Даље, Строуструп је развио Cfront, нови самостални компајлер за C++.
Језик C++ се разликује од обичног C-а пре свега подршком објектно-оријентисаном програмирању. Међутим, у њему има и низ нових могућности, које нису објектног карактера, због којих је писање програма који нису објектне природе удобније реализовати у C++-у него у C-у.
C++ је данас неспорно један од најмоћнијих, али и најкомплекснији програмски језик. Због компактности програма, брзине извршавања и преносивости представља незаменљив алат сваког професионалца. Због ових особина заузима једно од доминантних места у свету професионалног програмирања.
Назив
Према Строуструпу назив C++ симболизује еволуционарни напредак од C-a. Назив је осмислио Рик Масцити. Када је Масцити био неформално интервјуисан о настанку имена 1992. године, одговорио је да је назив настао у духу програмирања, јер оператор за инкрементацију (++) симболише напредак. Тада је било уобичајена пракса да се тако означава побољшана верзија софтвера.
Развојна окружења Интегрисано развојно окружење обједињава све кораке односно фазе развоја софтвера у јединствену целину што олакшава писање и тестирање програма.
Неки од најпознатијих интегрисаних развојних окружења, чије се коришћење истовремено препоручује у оквиру предмета C/C++ програмски језик, су: Microsoft‘s Visual C++ (Windows) Code::Blocks (Windows, Linux) Netbeans C/C++ (Windows, Linux)
Синтакса језика C++ C++ има додатне резервисане речи у односу на C, а такође има и дефинисан логички тип податка bool који у C-у не постоји. У језику C++ као додатак имамо следеће најчешће коришћене службене речи:
asm bool catch char class delete explicit export false friend inline mutable namespace new operator private protected public template this throw true try typename using virtual
Логички тип bool У C++-у за величине логичког типа могу се уместо 0 и 1 користити вредности true (тачно) и false (нетачно). Логичка константа false је једнака нули, а свака друга вредност се третира као тачна. Када се true конвертује у цео број резултат је 1. За опис променљивих логичког типа користи се резервисана реч bool.
Пример C++ програма Анализирајмо следећи пример у програмском језику C++.-{R|// This program outputs the message "Hello, World!" to the monitor
#include <iostream> using std::cout; using std::endl;
int main() { cout << "Hello world!" << endl; return 0;
Линија 1 представља коментар. Коментари су написани у корист програмера који анализирају код, и обично се користе за сумирање, идентификацију сврхе или појашњење сегмената кода.
Линија 3 је предпроцесорска наредба или директива којом дајемо инструкције компајлеру да желимо да користимо -{iostream}- библиотеку. Библиотека -{iostream}- садржи скуп унапред дефинисаних операција које можемо да укључимо (-{#include}-) у наш програм.
Линија 4 је декларација (using declaration). У оквиру библиотеке -{iostream}-, постоји тачно одређени сегмент (именски простор -{std}-) где су смештене дефиниције операција -{cout}- и -{endl}-. Зато је неопходно коришћењем -{using}- декларације указати компајлеру да унутар одељка под називом -{std}- (скраћеница за стандард) пронађе дефиниције за -{cout}- и -{endl}- које користимо у линији 8.
У линији 6 декларишемо -{main()}- функцију.
Линије 7 и 10 указују компајлеру који део програмског кода припада -{main()}- функцији. Све линије кода које се налазе између отворене витичасте заграде у линији 7, и затворене витичасте заграде у линији 10 представљају део -{main()}- функције.
У линији 8 се налази -{cout}-, специјални објекат за обављање излазних операција у секвенцијалним медијима као што су екран, датотека итд. Симбол -{<<}- је оператор излаза (output operator или insertion operator), који указује компајлеру да све што следи након симбола треба бити одштампано на екрану/конзоли. -{endl}- је специјалан симбол који курсор пребацује у следећи ред конзоле.
Линија 9 је повратна наредба (return statement). Након егзекуције програма шаље се повратна вредност систему која указује да ли је програм извршен успешно или не. У овом конкретном примеру, наредбом return оперативном систему се враћа вредност нула -{0}- што значи да је програм извршен без грешака. Модерни компајлери аутоматски праве повратну наредбу. То значи да чак и ако немамо повратну наредбу унутар наше главне функције -{main()}-, и даље ћемо на екрану имати информацију да ли је програм извршен успешно или не.
Референце у језику C++ Референцна променљива је псеудоним, алиас, што у ствари представља други назив за постојећу променљиву. Након што је референца једном иницијализована, могуће је приступити променљивој или преко њеног назива или коришћењем референце.
Поређење показивача и референци Референце се често мешају са показивачима, међутим постоје три главне разлике између показивача и референци, а то су: У програму не може да постоји null референца. Увек мора да важи претпоставка да је референца повезана са легитимним тј. активним делом меморије односно складишта (storage). Једном иницијализована референца не може бити промењена да референцира другу променљиву или објекат. Супротно референцама, показивачи могу да буду промењени и да у различитим временским тренуцима показују на различите променљиве односно објекте. Референца мора бити иницијализована приликом креирања, за разлику од показивача који могу бити иницијализовани у било ком тренутку.
Креирање референци у C++-у О имену променљиве можемо размишљати као о лабели која је се односи на локацију променљиве у меморији. Ако кренемо корак даље, о референцама можемо размишљати као о другој лабели која се односи на ту меморијску локацију. Стога је могуће приступити садржају променљиве или преко назива променљиве или преко референце. Претпоставимо да имамо следеће променљиве у програму: -{ int i = 17; double d;}- Можемо затим, на основу дефинисаног правила, декларисати референцу за променљиву на следећи начин: -{ int& r = i; double& s = d;}- Ознака & (амперсенд) се у C++-у чита као референца. Стога, прву декларацију можемо прочитати као "r је целобројна референца променљиве i" а другу као "s је реална double референца променљиве d".
Примена референци
Референце се користе када подаци похрањени у параметрима функције треба да буду видљиви и изван те функције (нпр. у главној функцији). Нпр. функција -{da_li_je_paran}- сабира елементе који припадају низу -{niz[]}- и испитује да ли је збир (-{zbir}- ) паран. Параметри -{&zbir}- i -{&rezultat}- су означени као референце, стога су подаци који они садрже видљиви изван функције -{da_li_je_paran}- (у главној функцији).
-{R|#include <iostream>
void da_li_je_paran(int niz[], int &zbir, int size, bool &rezultat) { for (size_t i{}; i < size; ++i)
zbir+= niz[i];
if (zbir% 2 == 0)
rezultat= true;
int main() { bool rezultat; int zbir{}; int niz[]{3, 6, 7, 8, 4, 8, 3, 2, 6, 7}; da_li_je_paran(niz, zbir, std::size(niz), rezultat); std::cout << zbir << '\n'; std::cout << std::boolalpha << rezultat << '\n'; return 0;
C++ и објектно-оријентисано програмирање C++ потпуно подржава објектно-оријентисано програмирање, укључујући четири основна концепта објектно-оријентисаног програмирања: енкапсулацију, апстракцију, наслеђивање и полиморфизам.
Класе Основна сврха C++ програмирања је да се дода објектна оријентација C програмском језику. Класе () су централна одлика C++-а која управо подржава објектно оријентисано програмирање. Њих у контексту објектног језика C++ треба схватити као специфичан, кориснички дефинисан тип података који се користи да опише реално постојеће објекте. Класе обухватају атрибуте али и акције које служе да симулирају те реално постојеће објекте. По синтакси се декларација класе може најближе повезати са начином декларисања структура података. У складу са принципима ООП класе за разлику од структура, осим података садрже и функције чланице (). Подаци и методе унутар класе се називају чланице класе. Класе се користе са циљем да се специфицира форма објеката. Објекти () се могу схватити, ослањајући се на синтаксу, као инстанце () декларисаних класа. Конкретна структурна променљива је инстанца декларисане структуре. Исто тако, објекат је инстанца декларисане класе. Ову везу класа и објеката треба имати увек у виду јер се у терминологији често занемарује потпуно различит карактер ова два термина. Класе су дакле шеме објеката, а објекти су конкретни подаци у меморији рачунара са припадајућим функцијама дефинисаним у одговарајућим класама.
Конструктори и деструктори Конструктор је функција чланица која има исто име као и класа. Улога конструктора је да изврши иницијализацију података чланова класе. За разлику од програмског језика Java, где се такозвани „објекти отпаци“ аутоматски бришу коришћењем такозваног garbage collector-a, у C++-у је неопходно написати функцију која мора да обрише алоцирани меморијски простор из хип меморије. Подразумевајуће функције чланице класе које служе у ову сврху се називају деструктори. C++ има могућност да се при позиву конструктора изврши такозвано копирање објеката. Типови конструктора који имају могућност извршења оваквих операција се називају конструктори копирања.