Začnimo s preprostimi stvarmi


C++ bomo obravnavali kot objektno usmerjen programski jezik. V začetnih poglavjih se s tem ne bomo posebej ubadali. Objektno usmerjene tehnike programiranja bomo spoznali v zadnjih poglavjih.

CELO KOMENTARJI SO V C++ BOLJŠI

Primer programa ------> CONCOM.CPP

Oglejmo si datoteko  CONCOM.CPP in spoznajmo nekaj novih stvari.

Komentar C++ začne z dvojnim znakom "//" kjerkoli v programski vrstici in se konča s koncem te vrstice. Seveda lahko uporabljamo tudi starejši zapis komentarja, ki smo ga spoznali pri ANSI-C . Vendar je novi način bolj primeren, saj se nam praktično ne more zgoditi, da bi pomotoma zakomentirali del vrstic s programsko kodo. Stari način je še vedno uporaben za krajše kode znotraj programskih vrstic.

Pri tem  omenimo, da je na splošno pametno, da za imena spremenljivk uporabljamo smiselne besede, ki same po sebi že dokumentirajo program.

KLJUČNI BESEDI const IN volatile

V našem zgledu opazimo dve novi ključni besedi, ki sodita v standard  ANSI-C . Ključno besedo const uporabljamo za definicijo konstant. Konstanta v vrstici 9 je tipa int, ima ime START, inicializirali smo jo na vrednost 3. Prevajalnik ne bo dovolil spremembe vrednosti  START, ker je deklarirana za konstanto.

Ključno besedico const opazimo tudi v glavi funkcije print_it  v vrstici 23. S tem povemo, da je formalni parameter z imenom  data_value v funkciji ves čas konstanten. kakršenkoli poskus spremembe tega parametra bi prevajalnik javil kot napako. S takimi drobnimi izboljšavami lahko prevajalniku omogočimo, da išče napake v našem programu.

Tudi beseda  volatile  sodi v standard ANSI-C. Spremenljivko, ki jo tako deklariramo, lahko spreminja tudi kakšen zunanji mehanizem, morda zaradi aparaturnih prekinitev (hardware interrupts). Zato take spremenljivke prevajalnik pri optimiziranju programske kode ne sme izločiti.

Ostale posebnosti programskega zgleda zaenkrat ne glejmo. Obravnavane bodo kasneje.
 

OPERATOR VELJAVNOSTI  (SCOPE)

Primer programa ------> SCOPEOP.CPP

V programu  SCOPEOP.CPP spoznamo še en konstrukt, ki je nov v C++.  Imamo globalno spremenljivko index  in še istoimensko spremenljivko v funkciji  main() . V vrsticah 11, 13 in 16 uporabljamo dvojno dvopičje (::), ki pove sistemu, da na tem mestu uporabljamo globalno spremenljivko z imenom  index, definirano v vrstici 4, in ne lokalno spremenljivko, definirano v vrstici 8. Tako torej lahko dostopamo do globalnih spremenljivk. Priporočamo pa, da takega načina ne uporabljamo prepogosto, saj postaja naš program nepregleden. Raje uporabljajmo spremenljivke z različnimi imeni!

 

KNJIŽNJICA  iostream 

Primer programa ------> MESSAGE.CPP

Oglejmo si program MESSAGE.CPP . Tu je definiranih nekaj spremenljivk, katerih vrednosti izpisujemo v vrsticah od 17 do 20 in v vrsticah od 23 do 26. Uporabljamo stavek cout , ki povzroči izpis na standardni izhod (normalno zaslon računalnika). Stvar je samo podobna  znani funkciji  printf() , saj nam ni potrebno navajati, kakšen tip podatka izpisujemo.  cout ni funkcija, kar bomo spoznali kasneje.

Podobno kot C tudi C++ kot jezik nima sam po sebi vhodno-izhodnih operacij, pač pa definira knjižnjico tokov (stream library) z vhodno-izhodnimi funkcijami. Del te knjižnjice vključuje v naš program vrstica 2.

Operatorju << pravimo včasih tudi  operator "put to"  oziroma vstavitveni operator. Ta pove sistemu, da naj izpiše vrednost spremenljivke ali konstante, ki operatorju sledi, sistem pa naj sam odloči, kako bo to napravil. V vrstici 17, zahtevamo najprej izpis niza, zatem pa še izpis vrednosti spremenljivke index. Sistem sam ugotovi tip izpisane spremenljivke (oziroma podatkovne strukture) in to izpiše brez vodečih oziroma zaključnih presledkov. Sistem sam odloči, kako bo oblikoval izpis.

V splošnem lahko znotraj programa v jeziku  C++ poljubno mešano uporabljamo stavke cout in printf().

Vrstice 23 do 26 ponazorujejo dodatne možnosti oblikovanja izpisa. Vrednost index je izpisana v desetiškem, osmiškem in šestnajstiškem formatu. To dosežemo s posebnimi operatorji (stream operators), dec, oct, oziroma hex, ki spremenijo osnovo izpisa za vse nadaljnje izpise v dani tok. Privzeta (default) oblika izpisa je seveda desetiška.

OPERATOR cin

Poleg tokovnega objekta  cout imamo tudi tokovni objekt cin  ki ga uporabljamo za branje podatkov s standarnega vhoda (običajno tipkovnice). Tok cin uporablja operator >>, ki mu pravimo tudi operator "get from"  ali operator ekstrakcije. Ima podobne lastnosti kot  tok cout. Preprost primer uporabe toka cin kažejo vrstice 28 do 30. Tudi tu imamo na voljo posebne operatorje  dec, oct, in hex, s katerimi definiramo številsko osnovo vhodnih podatkov. Privzeta številska osnova je seveda desetiška.

Dodatno imamo še tokovno objekt  cerr, s katerim posredujemo na izhod podatke o morebitnih napakah.  Tokovi, cout, cin, in cerr, ustrezajo tokovnim kazalcem  stdoutstdin, in stderr, ki jih uporabljamo pri programskem jeziku C.
 

TOKOVI IN DELO Z DATOTEKAMI

Primer programa ------> FSTREAM.CPP

Poglejmo program FSTREAM.CPP, ki uporablja tokove za delo z datotekami. Nekatere objekte, ki jih uporablja ta program, zaenkrat še ne bomo razumeli.

Program odpira eno datoteko za branje, tretji tok pa je odprt za tiskalnik. Vhodna in izhodna datoteka sta pri programih v jeziku C tipa FILE, tu pa imamo za vhod na voljo tip  ifstream in za izhod tip ofstream, kar ponazorujejo vrstice   8 do 10. Pravzaprav je  ifstream razred C++ ,  infile pa je objekt iz tega razreda. Več o tem kasneje.

Edina razlika s tokovi v prejšnjem primeru je, da so ti že avtomatsko odprti.  Tu pa bomo morali tokove šele odpreti, lepo pa je tudi, če jih pred zaključkom programa vse spet zapremo.

To je pravzaprav prvi primer objektno usmerjenega programiranja. V vrstici 17 pravimo objektu  infile, da naj se odpre, Zatem mu v vrstici 44 rečemo, da naj  prebere en znak. Končno v vrstici 52 zahtevamo, da naj se taobjekt zapre.  "Piko" uporabljamo pri objektih podobno, kot jo uporabljamo pri strukturah v programskem jeziku C. Najprej imamo ime objekta, za "piko" pa sledi ime akcije, ki naj jo izvede objekt. Več o tem kasneje. Z objektoma outfile in printer rokujemo na enak način.
 

DEFINICIJE SPREMENLJIVK

Primer programa ------> VARDEF.CPP

Poglejmo datoteko VARDEF.CPP in spoznali bomo dodatne možnosti, ki jih nudi  C++ za bolj jasno in razumljivo programiranje. Pri C++ so, podobno kot pri ANSI-C, globalne in statične spremenljivke ob deklaraciji avtomatično inicializirane na 0. Zato sta spremenljivki  index v vrstici 4 in goofy v vrstici 27 avtomatsko inicializirani na 0. Seveda ju lahko eksplicitno inicializiramo tudi na neko drugo vrednost. Globalnim spremenljivkam pravimo včasih tudi zunanje spremenljivke (external), ker so izven vseh funkcij.

Automatične spremenljivke, ki nastopajo znotraj funkcij, niso avtomatsko inicializirane in je njihova začetna vrednost naključna!!! Zato spremenljivka  stuff v vrstici 8 nima regularne vsebine. V vrstici 11 ji je prirejena vrednost spremenljivke  index.

REFERENCE  C++ 

Pozor na znak & (ampersand) v vrstici 9. Ta definira  another_stuff kot referenco, kar je v C++ novost v primeri s C. Referenc naj ne bi prepogosto uporabljali.  Referenca je sinonim za spremenljivko  stuff. Če spremenimo vrednost stuff , se s tem spremeni tudi vrednost  another_stuff , saj obe imeni kažeta na isto spremenljivko. Ko je enkrat referenca inicializirana, je ne moremo spremeniti, da bi kazala na neko drugo spremenljivko. (Referenca se v tem razlikuje od kazalcev, ki so po naravi spremenljivke). Smisel referenc bomo spoznali kasneje!
 

DEFINICIJE SO IZVRŠLJIVI STAVKI

Če se spomnimo jezika C, se nam bo zdel stavek v vrstici 16 čuden, vendar je v C++ povsem legalen. Kot lahko kjerkoli pišemo izvršljive stavke, lahko pri C++ kjerkoli tudi pišemo definicije spremenljivk. Tako smo tu definirali spremenljivko  more_stuff in jo inicializirali na vrednost13.  Tako definirana spremenljivka ima svojo veljavnost (scope) od mesta definicije do konca bloka, v katerem je definirana. V našem primeru torej velja do konca funkcije main(). Spremenljivka goofy je podobno definirana in uveljavljena malo kasneje v vrstici  27.

Smiselno je, da tako definiramo spremenljivke v bližini njihove uporabe, saj tako hitro spoznamo njihov pomen.

NEKAJ O DEFINICIJAH IN DEKLARACIJAH

Besedi definicija in deklaracija imata pri ANSI-C in C++ različen pomen. . Deklaracija podaja prevajalniku informacije o tipu ali funkciji, ne pove pa nič o sami kodi izvršljivega programa. Definicija pa po drugi strani določa nekaj, kar bo obstajalo v izvršljivem programu. Bodisi so to spremenljivke ali programska koda.

Če deklariramo struct, smo prevajalniku samo podali vzorec, kako pomniti podatke, ko bomo kasneje definirali spremenljivke takega tipa. Ko definiramo spremenljivke nekega tipa, pravzaprav deklariramo njihova imena ter definiramo pomnilniške lokacije za njihove vrednosti. Ko definiuramo spremenljivko, jo torej hkrati deklariramo in definiramo.

C dopušča večkratno  definiranje iste spremenljivke z danim imenom. C++ pa redefinicije spremenljivk ne dovoli.
 

BOLJŠA ZANKA for

Pozor na stavek  for, definiran v vrstci 20. Ta zanka je bolj jasna kot tiste, ki jih poznamo pri  ANSI-C, saj je indeks definiran v sami zanki.

Spremenljivka count2 je definirana in inicializirana v vsakem prehodu zanke in dealocirana na koncu vsakega prehoda.
 

PREDNOST OPERATORJEV

Prednost operatorjev je pri C++ enaka kot pri  ANSI-C. Nekaj posebnosti je pri takoimenovanem prekrivanju operatorjev, kar bomo spoznali kasneje.
 


Kazalo  Sestavljeni tipi