C++

објектно-оријентисан програмски језик

C++ je viši programski jezik koji je prvobitno razvijen u Belovim laboratorijama (laboratoriji telekomunikacione kompanije Bell) za objektno orijentisano programiranje u projektu pod rukovodstvom Bjarnea Stroustrupa tokom 1980-ih kao proširenje programskog jezika C, pa mu je originalno ime bilo „C sa klasama“ (engl. C with classes). Zbog velike potražnje za objektno orijentisanim jezicima i sposobnostima, standard za programski jezik C++ ratifikovan je 1998. u standardu ISO/IEC 14882.

C++
Zvanični logo
Izgovara seCe++
Modelvišeparadigmalni: proceduralni, imperativni, funkcionalni, objektno-orijentisani, generički, modularni
Pojavio se1985. god.; pre 39 godina (1985)
Autor(i)Bjarne Stravstrup
Dizajner(i)ISO/IEC JTC 1 (Joint Technical Committee 1) / SC 22 (Subcommittee 22)]] / WG 21 (Working Group 21)
Aktuelna verzijaC++20 (ISO/IEC 14882:2020)
Datum aktuelne verzije15. decembar 2020. god.; pre 3 godine (2020-12-15)
Operativni sistemivišeplatformski
Veb-sajtisocpp.org

Istorija C++-a uredi

Početkom osamdesetih godina u Belovim laboratorijama Bjarne Stroustrup, danski naučnik, radeći na proširivanju jezika C razvio je suštinski nov jezik koga je nazvao C sa klasama. [1] [2]Zaključio je da je Simula imala veoma dobre funkcije za razvoj velikih programa, ali je taj jezik bio prespor za korišćenje u praksi. BCPL (engl. Basic Combined Programming Language) je bio brz ali previše niskog nivoa za razvoj velikih programa. Stroustrup je izabrao C kao bazu, jer je C bio generalno orijentisan, brz i u širokoj upotrebi. Počeo je da radi na poboljšanju programskog jezika C dodajući mu funkcije slične onima koje ima Simula. Takođe, uticaj su imali ALGOL 68, Ada, CLU i ML. Autor je želeo da poboljša jezik C razvojem podrške objektno-orijentisanom programiranju. U 1983. godini taj naziv je promenjen u C++.

Stroustrupov C sa klasama je na početku dodao C kompajleru mogućnosti kao što su klase, nasleđivanje, jako tipiziranje, redne funkcije i podrazumevane vrednosti argumenata.[3] Stroustrup je 1982. počeo da razvija naslednika C sa klasama, koji je nazvao "C++" (++ je unarni operator inkrementiranja u jeziku C), nakon što je razmatrao nekoliko drugih imena. Dodate su nove mogućnosti, među kojima su virtuelne funkcije, ime funkcije i preklapanje operatora, reference, konstante, zauzimanje memorije (new/delete), poboljšanu proveru tipova, i komentare u jednom redu u stilu jezika BCPL sa dve kose crte (//). Dalje, Stroustrup je razvio Cfront, novi samostalni kompajler za C++.

Jezik C++ se razlikuje od običnog C-a pre svega podrškom objektno-orijentisanom programiranju. Ali, u njemu ima i niz novih mogućnosti, koje nisu objektnog karaktera, zbog kojih je pisanje programa koji nisu objektne prirode udobnije realizovati u C++-u nego u C-u.

C++ je danas nesporno jedan od najmoćnijih, ali i najkompleksniji programski jezik. Zbog kompaktnosti programa, brzine izvršavanja i prenosivosti predstavlja nezamenljiv alat svakog profesionalca. Zbog ovih osobina zauzima jedno od dominantnih mesta u svetu profesionalnog programiranja.

Naziv uredi

Prema Stroustrupu naziv C++ simbolizuje evolucionarni napredak od C-a.[4] Naziv je osmislio Rik Masciti. Kada je Masciti bio neformalno intervjuisan o nastanku imena 1992. godine, odgovorio je da je naziv nastao u duhu programiranja, jer operator za inkrementaciju (++) simboliše napredak. Tada je bilo uobičajena praksa da se tako označava poboljšana verzija softvera.

Razvojna okruženja uredi

Integrisano razvojno okruženje objedinjava sve korake odnosno faze razvoja softvera u jedinstvenu celinu što olakšava pisanje i testiranje programa.

Neki od najpoznatijih integrisanih razvojnih okruženja, čije se korišćenje istovremeno preporučuje u okviru predmeta C/C++ programski jezik, su:

  • Microsoft‘s Visual C++ (Windows)
  • Code::Blocks (Windows, Linux)
  • Netbeans C/C++ (Windows, Linux)

Sintaksa jezika C++ uredi

C++ ima dodatne rezervisane reči u odnosu na C, a takođe ima i definisan logički tip podatka bool koji u C-u ne postoji. U jeziku C++ kao dodatak imamo sledeće najčešće korišćene službene reči:


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

Logički tip bool uredi

U C++-u za veličine logičkog tipa mogu se umesto 0 i 1 koristiti vrednosti true (tačno) i false (netačno). Logička konstanta false je jednaka nuli, a svaka druga vrednost se tretira kao tačna. Kada se true konvertuje u ceo broj rezultat je 1. Za opis promenljivih logičkog tipa koristi se rezervisana reč bool.

Primer C++ programa uredi

Analizirajmo sledeći primer u programskom jeziku C++.

// 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;
 }

Linija 1 predstavlja komentar. Komentari su napisani u korist programera koji analiziraju kod, i obično se koriste za sumiranje, identifikaciju svrhe ili pojašnjenje segmenata koda.

Linija 3 je predprocesorska naredba ili direktiva kojom dajemo instrukcije kompajleru da želimo da koristimo iostream biblioteku. Biblioteka iostreamsadrži skup unapred definisanih operacija koje možemo da uključimo (#include) u naš program.

Linija 4 je deklaracija (using declaration). U okviru biblioteke iostream, postoji tačno određeni segment (imenski prostor std) gde su smeštene definicije operacija cout i endl. Zato je neophodno korišćenjem using deklaracije ukazati kompajleru da unutar odeljka pod nazivom std (skraćenica za standard) pronađe definicije za cout i endl koje koristimo u liniji 8.

U liniji 6 deklarišemo main() funkciju.

Linije 7 i 10 ukazuju kompajleru koji deo programskog koda pripada main() funkciji. Sve linije koda koje se nalaze između otvorene vitičaste zagrade u liniji 7, i zatvorene vitičaste zagrade u liniji 10 predstavljaju deo main() funkcije.

U liniji 8 se nalazi cout, specijalni objekat za obavljanje izlaznih operacija u sekvencijalnim medijima kao što su ekran, datoteka itd. Simbol << je operator izlaza (output operator ili insertion operator), koji ukazuje kompajleru da sve što sledi nakon simbola treba biti odštampano na ekranu/konzoli. endl je specijalan simbol koji kursor prebacuje u sledeći red konzole.

Linija 9 je povratna naredba (return statement). Nakon egzekucije programa šalje se povratna vrednost sistemu koja ukazuje da li je program izvršen uspešno ili ne. U ovom konkretnom primeru, naredbom return operativnom sistemu se vraća vrednost nula 0 što znači da je program izvršen bez grešaka. Moderni kompajleri automatski kreiraju povratnu naredbu. To znači da čak i ako nemamo povratnu naredbu unutar naše glavne funkcije main(), i dalje ćemo na ekranu imati informaciju da li je program izvršen uspešno ili ne.

Reference u jeziku C++ uredi

Referencna promenljiva je pseudonim, alias, što u stvari predstavlja drugi naziv za postojeću promenljivu. Nakon što je referenca jednom inicijalizovana, moguće je pristupiti promenljivoj ili preko njenog naziva ili korišćenjem reference.

Poređenje pokazivača i referenci uredi

Reference se često mešaju sa pokazivačima, međutim postoje tri glavne razlike između pokazivača i referenci, a to su:

  • U programu ne može da postoji null referenca. Uvek mora da važi pretpostavka da je referenca povezana sa legitimnim tj. aktivnim delom memorije odnosno skladišta (storage).
  • Jednom inicijalizovana referenca ne može biti promenjena da referencira drugu promenljivu ili objekat. Suprotno referencama, pokazivači mogu da budu promenjeni i da u različitim vremenskim trenucima pokazuju na različite promenljive odnosno objekte.
  • Referenca mora biti inicijalizovana prilikom kreiranja, za razliku od pokazivača koji mogu biti inicijalizovani u bilo kom trenutku.

Kreiranje referenci u C++-u uredi

O imenu promenljive možemo razmišljati kao o labeli koja je se odnosi na lokaciju promenljive u memoriji. Ako krenemo korak dalje, o referencama možemo razmišljati kao o drugoj labeli koja se odnosi na tu memorijsku lokaciju. Stoga je moguće pristupiti sadržaju promenljive ili preko naziva promenljive ili preko reference. Pretpostavimo da imamo sledeće promenljive u programu:

int i = 17;
double d;

Možemo zatim, na osnovu definisanog pravila, deklarisati referencu za promenljivu na sledeći način:

int& r = i;
double& s = d;

Oznaka & (ampersend) se u C++-u čita kao referenca. Stoga, prvu deklaraciju možemo pročitati kao "r je celobrojna referenca promenljive i" a drugu kao "s je realna double referenca promenljive d".

C++ i objektno-orijentisano programiranje uredi

C++ potpuno podržava objektno-orijentisano programiranje, uključujući četiri osnovna koncepta objektno-orijentisanog programiranja: enkapsulaciju, apstrakciju, nasleđivanje i polimorfizam.

Klase uredi

Osnovna svrha C++ programiranja je da se doda objektna orijentacija C programskom jeziku. Klase(class) su centralna odlika C++-a koja upravo podržava objektno orijentisano programiranje. Njih u kontekstu objektnog jezika C++ treba shvatiti kao specifičan, korisnički definisan tip podataka koji se koristi da opiše realno postojeće objekte. Klase obuhvataju atribute ali i akcije koje služe da simuliraju te realno postojeće objekte. Po sintaksi se deklaracija klase može najbliže povezati sa načinom deklarisanja struktura podataka. U skladu sa principima OOP klase za razliku od struktura, osim podataka sadrže i funkcije članice (member functions). Podaci i metode unutar klase se nazivaju članice klase. Klase se koriste sa ciljem da se specificira forma objekata. Objekti (object) se mogu shvatiti, oslanjajući se na sintaksu, kao instance (instance) deklarisanih klasa. Konkretna strukturna promenljiva je instanca deklarisane strukture. Isto tako, objekat je instanca deklarisane klase. Ovu vezu klasa i objekata treba imati uvek u vidu jer se u terminologiji često zanemaruje potpuno različit karakter ova dva termina. Klase su dakle šeme objekata, a objekti su konkretni podaci u memoriji računara sa pripadajućim funkcijama definisanim u odgovarajućim klasama.

Konstruktori i destruktori uredi

Konstruktor je funkcija članica koja ima isto ime kao i klasa. Uloga konstruktora je da izvrši inicijalizaciju podataka članova klase. Za razliku od programskog jezika Java, gde se takozvani „objekti otpaci“ automatski brišu korišćenjem takozvanog garbage collector-a, u C++-u je neophodno napisati funkciju koja mora da obriše alocirani memorijski prostor iz hip memorije. Podrazumevajuće funkcije članice klase koje služe u ovu svrhu se nazivaju destruktori. C++ ima mogućnost da se pri pozivu konstruktora izvrši takozvano kopiranje objekata. Tipovi konstruktora koji imaju mogućnost izvršenja ovakvih operacija se nazivaju konstruktori kopiranja.

Konstruktor klase je specijalna funkcija članica klase koja se izvršava svaki put kada se kreira nova instanca neke klase. Konstruktor će imati isti naziv kao i sama klasa, dok povratni tip funkcije neće biti čak ni void. Konstruktori su veoma korisni u cilju postavljanja početnih (inicijalnih) vrednosti određenim podacima članovima. Komplementarnu ulogu konstruktorima u C++ programima imaju destruktori. Destruktori su funkcije koje se, kao i konstruktori, pozivaju automatski, ali u ovom slučaju pri prestanku postojanja objekta tj. pri njegovom destruktuiranju. Najčešći zadatak destruktora je dealociranje memorije i reinicijalizacija promenljivih (npr. brojača objekata određene klase). U programu se destruktor funkcije lako uočavaju jer im ime počinje znakom "~" (tilda), a sledi naziv klase kojoj destruktor pripada. Destruktor, kao i konstruktor, ne vraća nikakvu vrednost, pa se deklariše bez navođenja tipa. Destruktor je od velike koristi za oslobađanje resursa pre izlaska iz programa, kao što je na primer zatvaranja fajlova, oslobađanje dinamički zauzete memorije itd.

Pokazivači na C++ klase uredi

Objektima neke klase je moguće pristupiti korišćenjem pokazivača. Jednom deklarisana, klasa postaje validni tip podatka na koji možemo usmeriti pokazivač. Deklarisanje pokazivača na klasu može biti izvršeno na sledeći način:

Rectangle * prect;

где ће prect бити показивач на објекат класе Rectangle. Показивач на класе се користи на исти начин као и показивач на структуре. Да би се приступило члану класе коришћењем показивача на класу, користи се оператор приступа -> на исти начин како се овај оператор користи код показивача на структуру. Такође, као при раду са свим осталим показивачима, неопходно је иницијализовати показивач пре самог коришћења.

Nasleđivanje uredi

Nasleđivanje je jedna od najvažnijih osobina objektno orijentisanog programiranja. Ono omogućava kreiranje vrlo složenih klasa krećući se od osnovnih klasa, što olakšava kreiranje i održavanje aplikacije. Ovo takođe obezbeđuje mogućnost ponovnog korišćenja napisanog koda što ubrzava samo pisanje aplikacije.


U C++-u klasa može biti izvedena iz više od jedne klase, što znači da može naslediti podatke i metode iz više baznih klasa istovremeno. Da bi definisali izvedenu klasu, koristimo listu izvođenja kojom se specificiraju bazne klase.

U C++-u je omogućeno višestruko nasleđivanje. Višestruko nasleđivanje omogućava da izvedena klasa nasledi članove više od jednog roditelja. Iako višestruko nasleđivanje na prvi pogled deluje kao jednostavno proširenje jednostrukog nasleđivanja, ono uvodi puno novih problema koje mogu značajno da uvećaju kompleksnost programa.

Jedan od problema višestrukog nasleđivanja je dvosmislenost, koja se javlja u slučaju kada bazne klase sadrže funkcije sa istim nazivima. Drugi, i mnogo ozbiljniji je problem „dijamanta“ koji nastaje kada neka klasa nasleđuje osobine dve bazne klase, a te bazne klase su izvedene iz iste osnovne klase. Ovo vodi do pojave takozvanog dijamantskog oblika nasleđivanja.

Mnogi relativno noviji jezici kao što su Java i C # ograničavaju klase na jednostrukom nasleđivanju, ali dozvoljavaju višestruko nasleđivanje interfejsa. Glavna ideja onemogućavanja višestrukog nasledstva u ovim jezicima je činjenica da ono jednostavno čini jezike previše složenim, a na kraju izaziva nove problema umesto da rešava postojeće. Mnogi autori i iskusni programeri veruju da višestruko nasleđivanje treba izbegavati po svaku cenu zbog mnogih potencijalnih problema koje ono donosi. Međutim, postoje situacije kada je višestruko nasleđivanje najbolje rešenje, ali u tim slučajevima ga treba koristiti ekstremno promišljeno.

C++ standardna biblioteka uredi

C++ standardna biblioteka (C++ Standard Library) je skup klasa i funkcija koje su napisane na izvornom jeziku. C++ standardna biblioteka obezbeđuje nekoliko generičkih kontejnera, funkcija koje angažuju i manipulišu ovim kontejnerima, objekte funkcija (functors), generičke stringove i tokove (uključujući standardni ulaz/izlaz, a i rad sa fajlovima), kao i standardne funkcije za obavljanje svakodnevnih zadataka kao što su pronalaženje kvadrata, koren broja itd... Svojstva C++ standardne biblioteke su smeštena u imenskom prostoru std. C++ standardna biblioteka se može podeliti u dva dela:

  • Standardna biblioteka funkcija (The Standard Function Library): Ova biblioteka se sastoji iz funkcija opšte namene koje su samostalne i koje nisu deo klasa, a nasleđena je iz C-a.
  • Biblioteka OO klasa (The Object Oriented Class Library): Predstavlja kolekciju klasa i odgovarajućih funkcija članica.

Standardna C++ biblioteka sadrži sve elemente C biblioteke, uz male izmene koje obezbeđuju sigurnost upotrebe tipova podataka (type safety).

Standardna biblioteka funkcija se sastoji iz sledećih kategorija:

  • Ulazno/izlazne funkcije (I/O)
  • Funkcije za rad sa stringovima i karakterima
  • Matematičke funkcije
  • Funkcije za rad sa vremenom i datumom
  • Funkcije za dinamičko upravljanje memorijom
  • Ostale funkcije

Standardna C++ OO biblioteka definiše dodatni skup klasa koje pružaju podršku mnogobrojnim svakodnevnim aktivnostima, uključujući ulaz/izlaz, rad sa stringovima i procesiranje brojeve. Ova biblioteka se sastoji iz:

  • Standardnih C++ klasa za ulaz/izlaz
  • Klasa za rad sa stringovima (string)
  • Klasa za rad sa brojevima
  • STL kontejnerskih klasa
  • STL algoritama
  • STL funkcijskih objekata
  • STL iteratora
  • STL alokatora
  • Klasa za upravljanje izuzecima
  • Biblioteka za lokalizaciju
  • Biblioteka za raznoraznu podršku

Šabloni uredi

Šabloni predstavljaju osnov generičkog programiranja, koje uključuje pisanje koda u smislu da je funkcionalnost koda nezavisna od korišćenih tipova podataka.[5]Šablon je u stvari formula za kreiranje generičkih klasa ili funkcija. C++ kontejneri, kao što su iteratori, su primer generičkog programiranja korišćenjem koncepta šablona. Šabloni se mogu koristiti za definisanje klasa i funkcija.

Šablon tj. template u C++-u je jedan apstraktni recept za pravljenje konkretnog koda. Jedan isti šablon omogućuje da se generiše puno različitih verzija odnosno instanci šablona. Ovo se postiže pomoću šablonskih ulaznih parametara (tzv. „argumenata“), koji funkcionišu za šablone na isti način kako obični parametri funkcionišu za funkcije. Ali, obični parametri su predviđeni za konkretne objekte tj. konkretne vrednosti podataka, a parametri šablona su predviđeni za tipove podataka i klase. Mehanizam koji C++ nudi za proizvodnju instanci šablona je vrlo važna osobina C++-a, koja ga razlikuje od mnogih programskih jezika. Ovaj mehanizam omogućuje automatsku proizvodnju koda, što bitno povećava efikasnost kodiranja. Osnovna forma definicije šablona funkcije ima sledeći oblik:

{template <class type> ret-type func-name(parameter list){
 // body of function
} }

gde je type naziv tipa podatka ili klase koja će biti korišćena od strane funkcije. Ovaj naziv može biti korišćen unutar tela tj. definicije funkcije. Simbol type (uglavnom se koristi oznaka T) je

type parameter, odnosno „tipski parametar“. Ovaj tipski parametar može biti bilo koji ugrađeni ili složeni tip podatka.

Generalno gledano, deklaracija šablona funkcije je ista kao i obična deklaracija funkcije, osim što se ispred stavi specifikacija template<...>, a tipski parametar T se zatim može koristiti umesto običnih tipova kao u sledećem primeru:

{template <class T>
T squareF(T tV) {
    return tV*tV;
} }

Standardizacija C++-a je donela niz promena, a jedna od najbitnijih je uvođenje STL-a, Standard Template Library. STL je kolekcija šablona klasa i funkcija dizajniranih da omoguće bolju upotrebu kontejnerskih objekata kao što su: vektori, liste, setovi, mape, itd. Klase koje mogu biti definisane iz ovih šablona se naravno nazivaju kontejnerske klase.

Reference uredi

  1. ^ „History of C++”. Pristupljeno 28. 11. 2017. 
  2. ^ „Bjarne Stroustrup's FAQ: "When was C++ invented?". 
  3. ^ Stroustrup, Bjarne. „A History of C ++ : 1979− 1991” (PDF). Arhivirano (PDF) iz originala 2. 2. 2019. g. Pristupljeno 18. 7. 2013. 
  4. ^ „Bjarne Stroustrup's FAQ – Where did the name "C++" come from?”. Pristupljeno 16. 1. 2008. 
  5. ^ „C++ Templates”. 

Spoljašnje veze uredi