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 stdout,
stdin, 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.