You are on page 1of 542

Az opertorok precedencija

s asszociativitsa
A tblzatban elbb opertorok magasabb precedencival rendelkeznek, mint a k-
felbukkank. A C+ + szablyai szerint egy kifejezs zrjeln bell tallhat
a program az opertorok precedencijnak sorrendjben vgzi el gy, hogy
a legmagasabb rang opertorral hajtj a vgre majd sor-
rend szerint folytatja. tv. egyoperandus plusz (+) s minusz (-) a precedencia-lista maso-
dik szintjn szerepelnek. vagyis - teljesen logikusan - az aritmet ikai
ket, amelyek az ldik szinten kaptak helyet. A msodik szinten tallhat & opertor a "c-
me" opertor, mg a g, szinten lthat ugyanilyen jel a bitenknt i AND opertora,
A 2, szinten lthat " a mutat ltal cfmzett tartalom kiolvasst vgzi, mg a 4. szinten lt
hat ugyanilyen jel a szorzs, Amennyiben a vgrehajtsnak sorrendjre nem
utalnak zrj elek, gy az azonos precedenciaszinthez tartoz a program jobbrl
balra. vagy balrl jobbra haladva hajtja vgre a tblzatban megadott nak megfelelen,
Szint Opertorok Kirtkelsi sorrend
1 (magas) ( ) :: balrl jobbra
2 [ l -> ++ -- balrl jobbra
typei d keyword, typecast
3 * & ! - + ... -- ... - jobbrl balra
aizeof new delete
4
* ->*
balrl jobbra
5
/%
balrl jobbra
6
, -
balrl jobbra
)
balrl jobbra
8 < <= > >= balrl jobbra
9 ='" I ", balrl jobbra
10

balrl jobbra
11 balrl jobbra
12 balrl jobbra
13

balrl jobbra
14
"
balrl jobbra
15
? ,
jobbrl balra
16 = *= /= ... = -= %= jobbrl balra
=;&=A=I=
ACsaC+ +
kulcsszavai
Kulcsszavak
and' (&&) false'
and_e,,' (&,, ) float
.,m
'0"
auto friend'
bitand' (&) goto
bitor' ( I)
"
bool' inl ine'
break
'ne
case long
catch' mut able'
char namespace
class' new'
campl ' (-) not ' (l)
const not,eq' ( I,,)
const, cast ' operator'
continue or' (I I )
default or, eq' (I ,, )
delete' private'
do protected'
double public'
dynarnic, caet' register
else reinter-
on=
pret, cast'
explidt' return
export' short
extern eigned
, Csak a C++ nyelvnek rsze,
s izeof
size, t
static
statiC, cast'
struct
switch
template'
this'
throw'
true'
try'
typedef
typeid'
typename'
union
unsigned
us!ng'
virtual'
void
volatUe'
wchar, t
while
xor' (A)
xor, eq' (A;; )
17 throw
18 (alacsony) , operator)
balrl jobbra
balrl iobbra
Azok a kulcsszavak, amelyek utn zrjel szerepel,
a zrjelben tallhat opertor szinonimi.
Adattpusok a C+ + nyelvben
TIpus 16 bit 32 bit Tartomnv
uneigned short int 2 bjtos 2 bjtos O-tl 65 535-ig
short int 2 bjtos 2 bjtos -32 768-t6l32 767-ig
uneiqned long int 4 bjtos 4 bjtos O-tl 4294967 295-ig
long int 4 bjtos 4 bjtos -2147483 648-t612147 483647-ig
int 2 bjtoe 4 bjtos (16) :-32768- tI32767 - ig;
(32) :-2147483 64 8- tl 2147483 647 - ig
unsigned int 2 bjtoe 4 bjtos (16) : O- t165 535 - ig; (32) : Q-tl 4 294 967295-ig
s i ze_ t 2 bjtoe 4 bjtos (16) : 0 - t165 535 - ig; (32) : Q- tl 4 29 4 9672 95 - ig
char 1 bjtoe l bjtos 256 karak ter
wchar_t 2 bjtoe 2 bjtos 65535 karakter
bool l bjtos 1 bj tos Tr u e vagy False
float 4 bj t os 4 b jtoe 1, 2*10>1
t13,4"10" ig
double 8 bjtos 8 b jtoe 2, 2 *10-"'- tl 1, 8*10'''- i g
l ong d ouble 10 bjt o s 10 bjtos 3 , 4 *10"" -t6l l, l *10"" -ig
TARTALOMJEGYZK
I. rsz
l. ra
Bevezets a C+ + programozsi nyelvbe
lpsek
a programozshoz ....... .
A C++ nyelvjrsai (C++, ANSI C++, ISO C++ s a Windows)
A fordt teleptse s belltsa
Telepts a CD-r61 . , ................ .
A Borland C++BuilderX fordt belltsa ...... .
Fordt.'s a Borland C++BuilderX-szel
A fordtprogram s a
Fordts s linkels
3
.4
.5
. ..... 6
.. 6
..... 8
..... 9
......... 10
.10 Fordts az integrlt krnyezetben
linkels .......... . .......... 11
A fejlesztsi ciklus. , ..
HELLO.CPP - Az els6 C++ programunk
Fordtsi hibk ...... .
Krdsek s vlaszok
Gyakorlatok
Kvz
Feladalok
Vlaszok a kvzkrdsekre .
2. ra Egy C++ program rszei
lehet j vlaszts a C++ nyelv.
Procedurlis, strukturlt s objektum-kzpont programfejleszts .
. ..... II
13
15
16
16
17
17
17
. 19
21
A C++ rwelv s az objekmm-kzpont programozs . 22
Begyazs (encapsulation) . . . . . . . . . . . . . . . . . . . .. . ......... .. .... 23
s jrahasznosts .................... . . ....
Tbbalaksg (polimorfizmus) .... . .. . . .. . . . ..
. 24
Egy egyszeru program rszei .......... .
. 24
Az #indudc utasts viz.<;glala .... . .. . . . . . . . . . 25
Elemzs soronknt. . ... 26
Megjegyzsek ................................ 28
A megjegyzsek tipusai ................... .. ... ..... .. . . ... 28
Megjegyzsek hasznlata egy programban . 29
iv I Tanuljuk meg a C++ programozsi nyelvet 24 ra alatt
Fgg"nyek . . . . . . . . . . . . . . . . . . . . ............... 30
Fggvnybvsok . . . ........ . .. . . . ....... 31
Fggvnyek hasznlata ....... . ........ ............ . 32
Fggvnyparamterek hasznlata . . . . . . . . . . . . . . . . . . .. . 33
Krdsek s vlaszok . . . . . . . . .. 34
Gyakorlatok . . . . . . . . . . . . . . . . . . . . . . . . . . .. 3S
Kviz ..
Gyakorlatok
Vlaszok a kvrzkrdsekre
... 35
... 35
... 35
3. ra Vltozk s llandk
Mi az a vltoz? . . . . . . . . . . . . . . . . . . 37
Mem6riafoglals .. . ... , . . . . .. .... . . , . . 38
A'L. egt:s'L. szmok (Integer) mrete . . . . . . . . . . . . . . . .... 39
signed s unsigned ........ ... . . . . . . . . . . . . . . . . . . . . . 40
l a p v e t vltoz6lpusok .......... . . . . . . . . . . . . . . . . 41
Egy v{lltoz meghatrozsa . . . . . . . . . . . . . .... 42
A kis- s nagyl>culk eltr6 jelemsr61 . . . . . . . . . . . . . . . . . . . , 42
Kulcsszavak. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .... 43
Egynl tbb vltoz megadsa egyszerre ................. .. . . .... 44
rtC:kck hozz rendelse a vltozkhoz . . . . . . . . . . . . . ....... 44
typedef . .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .... 45
Mikor hasznljunk short s mikor long tpust ... . . . . . . . . . . ...... ,47
El6jel nlkli egszek tlcsordulsa ................................ 47
Az el6jeles egszek krbefordulsa .......... , . . . ........ .. ... ...... 48
llandk . . . . . . . . . . . . . . . . . . . . . . . . . ............... .. , ........ 49
Uterlis llandk ........................ ... . ... . ... . . ..... ... 49
Nevestett (symboJic) llandk .............. . ................... 50
Iland6 bevezetse a #define ku1cssz6val ..... .. , . . . . . . . . . . . . 50
lland bevezetse a const ku1csszval. ...... . ..................... 51
Felsorolt (enumemted) llandk ............ . . , . . . . , , .... ...... 51
Krdsek s vlaszok
Gyakorlatok
Kvz
Feladatok .
Vlaszok a kv'L.krdsekre ..
................... . ................. 52
.. ... . ... . .......... . 53
. ... ... 53
...... . .. . .. . . .. . 53
.... ...... 54
4. ra Kifejezsek s utasftsok
Utastsok
res helyek ..
sszetett utastsok
Kifejezsek
.55
.. 56
.. 56
.. 57
Tanuljuk meg a C++ programozsi nyelvet 24 ra alatt v
Opertorok ..................... .
rtkad opertor ............... .
. .. 58
. .... 58
Matematikai opertorok ................................. 59
Matematikai s rtkad opertorok kombinlsa . . . . . . . . .. 60
Nvels s cskkents. . . 60
(prefix) s uttag (pOStfL'0 opertorok .............. . .... 61
Precedencia, avagy a vgrehajtsi sorrendje ........ 63
Egymsba gyazott zrjelek sszetett kifejezsekben. . .... 64
Relcis opertorok ........ 65
Az if utasts . . . . . 66
...
sszetettebb if konstrukcik ....... . . 68
Kapcsos zr6jelek hasznlata egymsba gyazott if utastsok esetn .. 70
A logikai opertorokr61 . . . . . . . . . . . . . ................. 73
Logikai S .. . . 73
Logikai VAGY. . . . . . . . . . . . ........ 74
Logikai NEM. . . . . . . .. .. . . . . . . . 74
Relcik precedenciiija .... 74
az igazsg termszetren . . . . . . . . . . . . . . . . 75
Krdsek 6s v<laszok ....... . . . . . . . . . . . . . . . . . . . . . . .. 76
. Gyakorlatok . . . . . . . . . . . . . .. . ... 76
Kvz .. . ......... 76
........ . . . ......... n
Vlaszok a kvzkrdsekre .
5. ra Fggvnyek
Mi is az a fggvny? ................... . . .. . . . . . .
A fggvnyek deklarlsa s definilsa
. ...... 77
79
.81
.81 Fggvnyek deklarlsa .
Fggvnyek definilsa
Fggvnyek megadsa: sszegzs
... .. .. 83
.. ... . . . .. . ... ..84
Vltozk hasznlaca fggvnyeken bell ........... . ........ 85
Helyi vltozk ............... . .
Globlis vltozk ............... ... ...... . . .
A fggvnyek argumenrumai ....... . . . .
Fggvnyhvs mim paramter ....... . .... . .... .
A paramterek egyben helyi vltozk is ..... . .. . .
rtkek visszaadsa ... . ....... .. . .
.... . .. ...... 86
..88
..89
..89
. . . .. . . 90
. ... 92
r-ggvnyek alaprtelmezett paramterei ................ . .. 95
Fggvnyek tlterhelse .. . ........... . . ....... 97
Inline fggvnyek .. .. . ......... . . ......... 98
A fggvnyek s a verem . . . . . . . .... . . . ... 101
Krdsek s vlaszok .......... . .. . .... . . . .... . ........ 103
,
vi I Tanuljuk meg a C++ programozsi nyelvet 24 ra alatt
Gyakorlatok ....... . . .
Kvz ...
Feladatok
Vlaszok a ... .... . .
6. ra Vezrlsi szerkezetek
Ciklusszervezs ..... .
A ciklusok 6se: :I goto utasts
104
...... 104
. 105
105
. .... ..... 107
.... ..... 107
Mirt ne hasznljuk :I goto utastst? ...... ... . . ... ........ 108
A while ciklus ....... . ............. .
llonyolulcabb while UUlstsok ........ .
A <.:ontinue s a break ......... ....... .. .
while(1) - vgtelen klusok
A do .. . while ciklus .......... .
A for ciklus .. . ......... .
lnidali zd6, vizsglat, lptets.
sszeteuebb for ciklllsok ............ .
Halmozott inidaliz:d s lptets .. .
res UUlstsok a for ciklusfejben .. .
res for ciklus .... ...... ......... .
Egymsba gyazott ciklusok
A switch utasts ....... .
Krdsek s vlaszok .... .
Gyakorlatok ......... .
Kvz ..
Fehldalok ................. .
Vlaszok a kvzkrdsckre ... .
II. rsz Osztlyok
7. ra osztlvok
Mi a tpus? . . . .......... . .
j tpus ltrehozs,l
Osztlyok s tagok ..... . .
Osztlyok deklarlsa
Osztlyok nevezkIana ..
Objekrum definilsa .
Osztlyok s objektumok
Osztlyok Ulgjainak elrse:
Privt s publikus hozzfrb
Osztlymetdusok
Konstruktorok s clestru!-.. 'l( :;
....... 108
........ 109
. .. 111
.. 113
. 114
. 117
...... 117
....... 119
....... 119
. ..... ...... 120
. . . . . .. .. ..... 122
. . ...... 123
. . . . . . . . . . 124
. 126
. .... 127
........ "127
.. ..... .. 127
. ...... 128
...... 13]
.. ..... 132
. ... . . . ... ... 132
............... 133
...... 134
.... . ..... ..134
...... 13;
......... 135
.... ..... ....... 136
.. ... 138
_- .... ltrehozsa s trlse .. 140
Tanuljuk meg a C+ + programozsi nyelvet 24 6ra alatt I vii
Alaprtelmezett konstruktorok ............... . ... .
A fordt Jtal biztostott konstruktor .... ... ... .. . ... . .. .
Krdsek s vlaszok
Gyakorlatok.
.... 141
.... 141
. ... 144
. 144
Kvz
Feladatok
. . ....... 144
.... 145
Vlaszok a kvzkrdsekre ............. .
. 145
8. ra Az osztlyokrl - mlyebben
Konst.1ns tagfggvnyek ........... . . ......................... .. 147
Fellet s megval6sts ............ . ................... . .. . .. J48
Hov tegyk az osztly-deklarcit s a metdus-def'incikat? ............ 149
Helyben kifejtett (jnline) megval6sts ... .... . ............ .... , .. 150
Osztlyok beillesztse ms osztlyadattagjaiknt ...... .. ..... 152
Krdsek s vlaszok ......... ......... . .. .. ... ....... "1 57
Gyakorlatok. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 158
Kvz . . . . . . . .. .. ... .. . . .. ..... 158
Feladato k . . . . . . . . .. . .................. 158
Vlaszok a kvizkrdsekre ...... . .. ....... . ... . .. ... .. .... 159
III. rsz
9. ra
Memriakezels
Mutatk
A mutatk s hasznlatuk megrtse ........ .... . . . . .. . . .
A memriadm trolsa a mutat kban
Mutatnevek .......................................... .
A kzvetett elrs opertor, avagy mutatk kzvetett hasznlata ...
Mutatk, cmek s vltozk. . . . . . . . . . . . . . . .... .. .
Adatok manipullsa a mutatk hasznlatval ............ .
A mutatkban trolt cmek vizsglata .. .. . . . .. .
Mirt j mutatkat hasznlni? .................. . . . .
A verem (stack) s a dinamikus memria (heap) .......... . .. .
A new kulcssz hasznlata
A delete kulcssz hasznlata ..
.... 163
..167
... . 1<>9
.. 1<>9
.. 170
.170
.172
.. 174
. . .. 175
.. 176
.177
Amemriaszivrgs elkerOlse . . . . . . . .. .. . . . . . . . .. . . . . .. 179
Krdsek s vlaszok ............. . . .. ........ ... . .. .... 180
Gyakorlatok. . ............ ... . . ... . .. .. . .. . . .. . ..... 181
Kvz
Feladatok
Vlaszok a kvzkrdsekre
. 181
.. ... .. ... . . . .. .... ... . ..... 181
.... 182
vi I Tanufjuk meg a C++ progral'TJOlsi nyeMrt 24 ra alatt
10. ra A mutatk kifinomult hasznlata
Objekrumok ltrehozsa a memriban
Objektumok trlse o o
Adattagok elrse mutatkon keresztl
Adauagok a dinamikus memriban
.......... ........... ... IM
. ... . . .... . .... .... .... . ..... 184
o o o o o o o o o o o o o o 185
...... ................. 186
A this mutat . o o o o o o
o o o o o. o o o o. 0 188
Gazdtlan vagy mutatk ........ .
. ...... .. ... .. ...... 190
Konswns mutatk o o o. o 0'0 o. o. o,. o o o 191
Konstans mut:ltk s konstans tagfggvnyek. o o ., o o , , o o , o o o o o 191
Konstans this mutatk ......... o o o o o o o o o , 93
Krdsek s vlaszok ........ o o o 193
Gyakorlatok. . ................ o o o o 194
Kvz o o o o o o o o o o 194
P<:!ladalok o o o o o o o o o 194
Vlaszok ti kvzkrdsekre o o o o o 194
11. ra Hivatkozsok
Mi :IZ a hiv:ll.koWs (referencia)? ... o o o o o 195
Hivatkozsok ltrehozsa .......... o o o o o o o 196
A opertor alkalma7.sa hivatkozsokra o. o o o o o o o o 197
A swap() javtsa mutatk segtsgvel o o o o o o o o o o 203
A SW:lp() jabb megvalslsa hivatkozsokkal o o o 204
Kvz ...... o o o o o o o o o o 210
Feladatok . . . .. o o o o o o o o o o o o o 210
Vlaszok a kvzkrdsekre o o o o o o o o o o o o o o o o o 211
12. ra A hivatkozsokrl s mutatkrl - mlyebben
Hmkonyabb a cm szeri nti paramtertads .. o o o
Mutassunk konstansr.i ........ o
Hivatkozsok, mint a mutatk knyelmes alternatvi.
Mikor hasznljunk hivalkozsokat, s mikor mutatkat?
Ne adjunk vissza mcgszCnt objektutnr3 mulat hivatkozst!
A dinamikus mcm6rialerleten ltrehozott objekUlmra
o. o o o o o o o o 213
o o o o o o 217
. ...... 219
.. 221
............... 222
mutat hivatkozs visszaadsa o o o o o o o o o 223
Mutat, mutat, ki a mulat? . o o o
Krdsek s vlaszok .. o o
Gyakorlatok .. o
Kvz o o o o o o o o o o o o o o o o o o o
Fcladatok o o
Vlaszok a kvzkrdsekre
............... 226
o o o o 227
0227
0227
o o 0228
o o 0228
Tanuljuk meg a C++ programozsi nyelvet 24 ra alatt ix
IV. rsz
13. ra
Halad eszkzk
A fggvnyek kifinomultabb hasznlata
Tlterhelt tagfggvnyek.
Alaprtelmezett rtkek hasznlata
Hogyan vlasszunk a tlterhels s az alaprtelmezett
rtkek h:lsznlata kztt?
Konstruktorok tlterhelse
.. . 231
... 234
.... 236
..... 236
.. 237 Objektumok inicializlsa
A msol konstruktor
Krdsek s vlaszok
Gyakorlatok.
.. . . .. . . .... . .. 237
Kvz
FeJadalok
..... . ..... 242
.. 243
243
.243
Vlaszok a kvzkrdbckre .. ... .. .. .. . . .. . . . ..... 243
14. ra
Opertorok tlterhelse
Hogyan terhel hetnk tl operulorokat .
rjuk meg az inkremenul6 fggvnyt ...... ... .
A postfix (Ul6tag) inkremenu:i l operihor tllerhelse
A prefix s a postl1x kzui kl nbsg
operator+ ...... .
Az operator+ therhelse .
Az opertortlterhels korltai
Mit clszerti tlterhelni?
operator"
Konverzis opertorok
Az intO opcdtor . .
Krdsek s vlaszok
Gyakorlatok .
Kvz ...
Feladalok
Vlaszok a kvzkrdsekre .
15. ra Tmbk
Mi az a tmb? . ... . .... .. .. . .. .
A tmbk elemei .
Tmbk tlrsa
Kertsoszlop hibk .
Tmbk
ObjekUllntmbk ........... . .
Tbbdimenzis tmbk ...... . . . .
. 245
247
248
. ........ . .... 248
. 251
. .. 252
... 254
.254
.254
.258
.260
. 261
.. . 262
. .... . 262
. ....... .. 262
. . .. 263
....... 265
. . . ... 266
. .. 268
268
269
. ... .. ..... .... 270
. .. ... . ...... 272
x I Tanuljuk meg a C+ + programozsi nyelvet 24 ra alatt
Tbbdimenzis tmbk inidalizlsll
Nhny sz II memrial1asznlalr61 ........... .
Mutattmbk . . .......... .. ... .
Dinamikus memriban trolt tmbk deklarlsa
Tmb mutatja s mutatk tmbje ...... .
Mutatk s tmbnevek .............. .
Dinamikus memriban ltrehozon tmbk trlse
Karaktertmbk .....
Az strcpyO s az strncpyO fggvnyek
Karakterlnc-osztlyok ... .
Krdsek s vlaszok . .. .
Gyakorlatok.
Kvz
Feladatok
.273
.. ... 275
........ 276
.... 278
.. .... 278
.. .. .. .... 279
.. 281
. . . . ..... 282
.......... . . 284
.. .. . .. ..... 286
.. ..... 287
.. 287
....... .... . . ...... 287
.. .. . . ..288
Vlaszok a kvizkrdsekrc ........... . ............. .. ..... 21J8
V. rsz
16. ra
s tbbalaksg
Az
Mi az az . . . . . . .................... ..... . ......... 291
s szrmaztats ....... . .......... . .. . . . . ...... 292
Modell ezzk az az llatok Orszgval. . . . . . . . . . . . . . . ... 293
A .';zrmaztats szintaxisa . . . . . . . . . . . . . . . . . . . . . . 294
Privt vagy vdett? . . . . . . . . . . ... . ......... 296
Konstnlktorok s destruktorok ...... .. .. . .. ... . .. . ...... 298
Paramterek tadsa a bziskonstruktornak .......... . ..... 300
Fggvnyek fellbrlata . . . . . . . . . . . . . . . . .. . .. .. ... ... ...... 305
Tlterhels vagy fellrs? ........ . . . . . . . . . . . . . . . .... 307
A bzisosztly metdllsaimlk elfedse . . . . . . . . . . . . . . . . . . . . 307
A bzismetdlIs meghvsa .... . . . . . . . . . . . . . . . . 309
Krdsek s vlaszok . . . . . . . . . . . . . . . ..... 31 1
Gyakorlatok. . . . . . . . . . . . . . . . . . . . . . . . . . . . 311
Kvz... ... .. .... ... .. .... .. .. . ... .. 311
Feladatok ...... . ...... 311
Vlaszok a kvzkrdsekre .............................. 312
17. ra A tbbalaksg s a szrmaztatott osztlyok
A vinulis fggvnyekkel megval6ston tbbalaksg ...... . ......... 313
Hogyan II virmlis fggvnyek ............ . . . . . . . . . 318
Nem juthaL,>z innen amoda. . . . . . . . . ....... 319
Szeletels (slicing) . . . . . . . . . . . . .. . .. ........ 320
Virtulis destruktorok .. . . . . . . . 322
Tanuljuk meg a C+ + programozsi nyelvet 24 6ra alatt I xi
Virtulis msol konstruktorok
A virtulis fggvnyek klL5gei ..... .
Krdsek s vlaszok ........ .
Gyakorlatok.
Kvz
rdadatOk
Vlaszok a kvzkrdsekre .
18. ra A tbbalaksg kifinomult hasznlata
... . 322
... 326
. .... 126
..327
..... 327
..... 327
. ..... 8
Problmk az egyszeres rkl6dssel ....... . .. . . .329
.. 334
.. 338
.. .. 342
345
Elvont adattpusok. . . . ........... . ..........
res virtu,lis fggvnyek ....... ... ....... . .. . ...... .
Az res viltulis fggvnyek megva16ststl .......... . .. .
Az elvonatkoztats sszetett hierarchija ..
Mely tpusok elvontak?
Krdsek s vlaszok
Gyakorlatok.
Kvz ....
FeJadatok
Vlaszok ti kvzkrdsekre ........ . . . . .. . . .. . .
19. ra Lncolt listk
Lncolt listk s egyb struktrk ....... .
Esetlanulmnya lncolt listk hasznlatrl
A felel6ssg truhzsa ..
Az alkotrszek
Mi a lncolt listk tanulsga?
Krdsek s vlaszok
Gyakorlatok. . ....... .
Kvz
Feladatok
Vlaszok a kvzkrdsekre ......... . ..... . .. ... . . .. .
VI. rsz
20. ra
Klnlegessgek
Klnleges osztlyok, fggvnyek, mutatk
Statikus tagvltozk .
Statikus tagfggvnyek
Egymst tartalmaz osztlyok ............... . .... .
A tartalmazott osztly tagjainak elrse
A tartalmazott osztly elrsnek korltozsa
....... .349
350
. 351
. 351
. ........ 351
.352
. ... 353
. 355
.355
........ 355
364
365
366
366
.366
....... 366
... 369
. ...... 372
.... 374
. . .. . . . . 380
. . . . . 380
Xli , Tanuljuk meg a C++ programozsi nyelvet 24 6ra alatt
A tartalmazs kltsge ... .. . , . . . . . . . . . . 381
rtk szerinLi s hivatkozs slerinti msols. . .. ... ... . . , . . . .. 381
Barti viszonyban osztlyok ....... . . ......... 381
Barti viszony fg&'Vnyek kzlt ............... . .. . . . . ..... 382
Fggvnymutark ....... , . . . . . . . . . . . . . .... . 382
Rvidtett rsmd . . . . . . . . . . . . . . . . . .. 386
Fggvnymutatk tmbje . . . . . . . . . . . . . . . . . . . . . . .. . .. 386
Fggvnymutatk tadsa ms fggvnyeknek .. . ..... 389
A type(k:r hasznlata fggvnynmtatkkal ........... . ............ 391
Tagfg&>vnyekre vonatkoz mutatk . . . . . . . . . . . . . . . . . . . . . .. 394
Tagfggvnyekre vonatkoz mutatkhl ll tmbk ....... . ..... 397
Krdsek s vlaszok .. . . . . . . . . . . . . . . . . ........ 400
Gyakorlatok . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . .. 400
Kvz. . . . . . . . . . . ....... . .................... . ......... 400
Feladatok . . . . . . . . . . . . . . . . . . . . . . ... . ...... 401
Vlaszok a kvzkrdsekre . . ..................... . ......... 401
21. ra Az
Az s a fordt ......... .. .......... . ................ 403
A kztes llapot mentse . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 404
A #denne direktva hasznlata. . . . . . . . . . . . . . . . . . . . . . . . . . . . .... 404
A . define hasznlata lland6kkal kapcsolatban . . . . . . . . . . . . . . . . . .. 405
A -*define s az '#ifdcf hasznlata vizsglatok vgzsre. . ........ 405
Az #else direktva .............................. ..... .... 406
Beszrs s annak vezrlse .. . . . . . . . . . ........... .......... 407
Szimblumok definilsa a parancssorban .......... . .... . .......... 109
A rnegszntetsc .. . . . ................ 409
Feltteles fordts ......................... . ... . .... . . . ........ 409
Makrknt megvalstott ........ . .
Mi ez a rengeteg zrjel? .....
Makrk, fggvnyek, sablonok
Karakterlncok kezelse .......... .
. ........ 410
........... 41 1
.. . .......... 413
. ............... 414
A szvegg ala kt (slringizing) opertor. . . . . . . . .. . . . . . . . . .414
Az opertor. . . . . . . . . . . . . . . . . . . . . . . . ... 414
meghalrozoa makrk . . . . .. . . . . . . . .. . . . . . .. . .. . .. 415
Az aS5ertO beptett makr . . . . . . .. ........... . ..... . .116
Nyomkvets az assertO makr6 segtsgvel .418
A makrk mellkhatsai ....... . . ................ 418
Osztlyinvarinsok ............ . . ... 420
Kztes rtkek kiratsa ...... . . ... ... 425
Nyomkvetsi szintek
Krdsek s vlaszok
Fe1adatok .
.. ... .... .. ... . ... . . .. . . . . .. ... 426
...................... .432
.... .. ......... ... . . ..... . ...... . .... . . 4.l3
Tanuljuk meg a C+ + programozsi nyelvet 24 6ra alatt I xiii
Kvz , ...... . ........ 433
Gyakorlatok . , ...... . .. ... .... ..433
Vlaszok a kvzkrdsekre .. . ............ ........... . ........ 434
22. ra Objektum-orientlt elemzs s tervezs
A fejlesztsi ciklus . . . . . . . . . . . . . . . . . . . , . , 435
riaszt6rendszer szimulcija ... ..... . ............ , . . . . , 436
Konce[Ki6lelV .......... ... ... .. .. . .. ........ 437
Elemzs s az ignyek felmrse ........ ........... . ........... 437
Magas s alacsony szinnl teJVezs ....... . .... .. ... . . ... .... 438
Egyb objektumok . . . . . . . . . . . . . . . . . . . . . . . . .. 439
Milyen osztly.link lesznek? . . . . . . . . . ............... 4,,9
Hogyan jelezzk a ri:lsztsokat? . . . . . . . . . , . 440
Esemnyhurkok . . . . . . . . . . . . . 441
PostMaster: egyesettanulmny . . . . . . . . . . . .... . . ' , 443
Mrj ktszer, vgj eb'Yszer . . . . . . . . . . . . . . . . . . . . . . . . , ... 444
Oszd meg s uralkodj. . . . . . . . . . . . . . . . . , ... 444
zenetform;'itum . . . . . . . . . . . . . . . . . . ........ . , .. , ...... 445
Az osztlyok kezdeti telVC ....... . ....... .. . . , ...... 446
Egy vagy tbb kiindulpont hier'dfchia .. . ........ . .......... 447
Interfszek tervezse .................. . . . ... ... , .. . . ....... 449
Prototpus ltrehoz.1S:l ................. . . . . . . . . . . . .. 450
A 8O/80-as szably .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 451
A PostMasrerMessagc os;t.t{ily tervezse . . . . . . . . . . . 452
Az interfsz. . ..... . ..... . , . .. , .... 452
Progmmozs nagy csoportokban ......... , .... , . . . . . . . ... 454
A tervezsi folyamauaJ kapcsolatos szempontok. . . . . . . . . . . . . ....... 454
TelVezsi dntsek. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .... 455
Mikor hozzunk dntseket? ..... . . . . . . . . . . . . . . . . . . . . . . 455
Munka a . . . . . . . . . . . . . . . . . . . . . . . . . . . 456
Krdsek s vlaszok .... . ........... .. , . . . 463
Gyakorlatok. . . . . . . . . . . . . . . . . . . . . . . . . . . . ..... 463
Kvz .. . .... , . . . . . . . . . . . . ..... , . . . .. ...... 463
Feladatok . . . .. ........ ... . . . . . . . . . . . . . 464
Vlaszok a kvzkrdsekre ..... .... . .. .. . .. , . . . ....... 464
23. ra Sablonok
Mik azok a sablonok? ........ . . . . . . . . . . . . . . .. 465
A sablon pldnyostsa . . . . . . . . ... .. . ' . . .. . ..... , 466
A sablon defincija . . . . . . . . . . . . .. . ...... , . . ........ , 466
Sablontpus hasznlata . . . . . . . . . . . ..... .. . ' . . . . . . . , 474
A szabvnyos sablonknyvtr . . . . . . . . . . . . . . . . , 480
xiv I Tanuljuk meg a C++ programozsi nyelvet 24 6ra alatt
Krdsek s vla.o;zok
Gyakorlatok ..... .
Kvz . . ...... ........ .
Feladatok
Vlaszok a kvzkrdsekre
.... . .... .. ......... . 481
.. .. .. .. .. .. .. 481
.. .. 481
..... . . ... 482
..... " ..... ".482
24. ra Kivtelek, hibakezels s nhny tancs
Programhibk, tvesztsek, k6dmegromls . . . . . . . . . . . . . . . . . . . ... 483
Vratlan esemnyek kezelse . . . . . . . . . . . . . . . . . . . . . . . 485
Ki vtelek . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 485
Hogyan val6sitsuk meg a kivlelkezelst? . . . . . . . . . . . 486
A try s catch blokkok hasznlata ..... 491
A kivtelek elkapsa ................ . . . . . . . . . . . . . . . .. . .. 491
Tbb catch megadsa. . . . . . . . . . . . . . 492
Hivatkozs elkapsa - tbbrtsg a kivlelkezelsben ..... . . .... .. 492
Hogyan rjunk professzionlis m i n s programokat? . . . 496
Zr6jelek . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ....... 497
Hossz sorok . . . . . . . . . . . . .. .. . . .......... 498
A switch utastsok. . . . . . . . . . . . . . . .. . . . . .... . . 498
A program szvege ................. .. 498
Azonost6nevek . . . . . . . . . . . . . . . . .. . .... . .. .. . . . . ...... 499
A nevek betO"zse s a nagybetuk krdse . . . . . . . . . . . . . . . . 499
Megjegyzsek . . . . . . . . . . . . . . . . . . . 500
Hozzfrs . . . . . . . . . . . . . . . . . . . . . . . . 501
Osztlydefind6k . . . . . . . . . . . . . . . . . . . . . . . 501
Beemelend6 ll omnyok .. .. .. . .. .... . ... .. . ... . . . ...... 501
assenO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 502
const ... . .. . ... . ........ . . . . . . . . . .. . . . . .. . . . 502
Tovbbi forrsok . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 502
Hol kapunk segtsget s tancsokat . . . . . . . . . . . . . . . . . . .. 502
Ajnlott olvasmnyok . . . . . . . . . . . . . . . . . . . .... . 503
Krdsek s vlaszok . . . . . . . . . . . . . 504
Gyakorlatok. . ........ 504
Kvz. . . . . . . . . . . . ..... 504
Fe1adatok . . . . . . . . . . . . . . . . . . ....... 504
Vlaszok a kvzkrdsekre . . . . . . . . . . . . . . . . . . . . . .. 504
VII. rsz
A fggelk
B fggelk
Trgymutat .
Fggelkek
A binris s a hexadecimlis szmrendszerek ..... . .. . ...... 507
Gyakran hasznlt kifejezsek. . . 519
531
A
Jesse Liberty szmos szoflverfejlesztssel kapcsolatos knyvet rt mr, amelyek kztt
akad nhny kiugran is. Ez utbbiak a CH nyelvvel illetve
a technolgival kapcsolatosak. 6 a vezet6je a Ubeny Associates [nc. cg-
nek, amely egyedi programok fejlesztsvel , tancsadssal s oktalssal foglalkozik.
David B Horvath eCCp) tancsad Philadelphiban, Pennsylvaniban L Tbb
mint 15 ve dolgozik az informatikban illetve egyetemi tanr nhny
helyi ilIerve tvoktatssal m(kd6 egyetemen. Az ilala oktatott t rgY'd.k
a C++ nyelvvel, a Unix/Linux opercis rendszerrel, valamint adatbzisokklll kapcsola-
tosak. Diplomjt szervezeti dinamikbl szerezte a University of Pennsylvanin 1998-
ban. Tbb nemzetkzi szeminriumot s szakmai sszejvetelt vezetett mr SZ<1kmai
egyesletek s vllaltok sz!imra.
David a a Unix for the Mainframe (Prentice-Hall/PTR) cmu knyvnek, Jesse
Libeny trszerzojeknt pedig rszt vett a Sams Teach Yourself C++ for Unux in 21 Days
cmu kiadvny rsban. Szintn o rt egyes fejezeteket a kvetkezo muvekbol: Unix
Unleasbed Red l-hit Linux Unleashcd (tbb kiads), Learn Shell
Programming in 24 Hours, Linux Unleashed Fourth Edition, Linux Programming
Unleashed Second Edition. Emellett szmos SZllkcikke jelent meg klnbzo magni-
nokban.
David ri s oktattevkenysge mellett aktv kzssgi ember s nkntes feladato-
kat is vllal szakmai szervezetekben. Ha pp nem a el6u Ol s
knyvet r, akkor kertszkedik, Zlatja magt egy kd forr vzben, vagy nyomdafest-
ket nem hobbikkal Oti el az icl6t. Idestova 17 ve h zas s van nhny kutyja
meg macskja (ezek szma folyamatosan vltozik). Aki trsalogni szeretne vele,
az a cppin24@cobs.com cmen ri el. Reklmleveleket kretik me1l6zni!
xvi I Tanuljuk meg a C+ + programozsi nyelvet 24 ra alatt
Ajnls
Ajimlom ezt a k6l1yuet Edythe-nek, akilo7 az C/etet kaptam; Staccy-nek, aki megosztja
azt ve/em; Robillllak s Nachelllek, akik rtelmet adnak neki.
- Jesse liberry
Ajimlom ezt II k6/1yuettestvremnek Andy-nek sfelesgllek Peg/lck msodik hzass-
gi vford/lljl/k alkalmbl (2004. jlius 13.). Igazbl az eskl1vojtiMI1 akll/1am t-
adlli Ilekik (>gy dediklt pldnyt, de ellltz6doll a projekt.
- David B. HOIVa/h
Ksznetnyilvnfts
Minden knyv kivl6 alkalmal teremt arm, hogy ksznetet mondjunk benne azoknak,
akik nlkl garantltan nem jll volna ltre. Esetnkben a Staccy, Robin s Rachel
Liberty llnak az len.
Ezen kvl szeretnk ksznetet mondani mindazoknak, akik a kiadk-
Sams, Que, O'Reilly, \'('rox - munkatrsaiknt segtenek abban, hogy eddigi ffitlveim
megjelenhessenek. A Sa ms Kiad valamennyien kivl munkl vgeztek,
m kln szeretnm kzlk kiemelni Carol Ackermant, Chrisly Fr..mklint s Paul
Striclandel. Szintn hlval ta!lozom Rieh Halpertnek. Vgezetl szeretnm megk-
sznni Mrs. Ka1is munkjt, aki 1965-ben, hatodik oszt{llyos koromban megtantolIa
nekem, hogyan kelJ keHes szmrcndslerbcn sszeadni s kivonni, mikzben sem 6,
sem mi nem tudtuk, hogy ez pontosan mire is j.
-Jesse liben)'
Mindazok mellett, akiknek Jesse az imnt ksznetet mondoLL valjban mg sokan le-
hetnek II Samsnl, akiket kifclejtcttlink. cz ton is elnzst szeretnk krni. J-
magam Songlin Qillval s Lorella Yatcs-Slel dolgoztmn ezen ;1 projekten.
Ez a knyv termszetesen nem jhetett volna ltre a csa!{I c.!orn, killnskppen pedig
felesgem Mary tmogatsa s megrtse nlkl. Sajnos a knyvr.'is mr csak ilyen.
Az embernek leginkbb estnknt meg htvgn van ideje s hangulata az alkotshoz,
amikor a csalddal kellene lennie. Ilyenkor jn aztn a de most nem tudok vele-
lek menni, mert a knyvn kell dolgoznom" szveg.
-/)cwid B. Horoath
Tanuljuk meg a C++ programozsi nyelvet 24 ra alatt I xvii
Kfvncsiak vagyunk az n vlemnyre!
Mint a knyv olvasja, n, kedves olvas a mi kritikusunk. ppen azrt nagyr.!
rtkeljk az n vlemnyt. Tudni .szeretnnk, ha valamit jl csinltunk, s persze a7.t
is, Ita nem. Tudni szeretnnk, milyen ms teriilctekr61 olvasna szvesen knyvekct eb-
ben a sorozatban, s termsZdesen rmmel fogadunk minden egyb megjegyz.<;l is.
A Sams s a Kiskapu Kiad rmmel meghallgatj:t mindenki vlemnyt. Kt:rjlik rja
meg neknk, mi az, ami tCtsZett nnek vagy ami nem tetszett ebben a knyvben, hi-
SZen ez na!.'Yban segtheti tovbbi munknkat , s azt, hogy egyre jobb kny-
veket adjunk ki.
Ug)'clllakl...'orjCJ/lIOSl wk r,mjl/k megjegyezni, hogya knyv rmta!mva! kapcsolaros 11/11-
szaki /...0rdsekbclI lfal!?clII /leli! rudullk segrelli. A SC/ms Kiad6nak IIg)'l/I/C/kkor U(1/1
egy Felhaszn/i SzolgItClf rszlegc, amcly (I lII)'Vve/ kapcso/alos krdseker meg-
kapja, s esetleg II/egulaszolja.
Ha r neknk, krjk adja meg a knyv pontos dmt s szerz6jt, az n nevt, e-maii
dmt s esetleg telcfonszmt. Amennyiben mdunkban ll, me!,'Vizsgljuk a felvetst
vagy problmI , illetve megoszt juk aZI a s a szerkeszt6vel.
A knyv eredeti angol ki:tdjt:l feedback@samspublishing.com cmen rheti el.
Ha hagyomnyos levt:lben kvnja a Sams Kiad6t megkeresni, levelt a c-
men vrjuk:
Email: feedback@samspublishing.com
Maii: Michael Stephens
Associate Publisher
Sams Publishing
800 East 96th Street
Indianapolis, IN 46240 USA
Magyar kiadssal kapcsolatos megjegyzseit krjk a kiadoElkiskapu . hu cmre kldje.
A Sams egyb kiadvnyaival kapcsolatban krjk ltogasson el
www.samspublishing.comcmre. Ha ezzel a konkrt knyvvel kapcsolatban keres
valamit a SAMS webhelyn, a krjk az eredeti kiads ISBN szmt
(0672326817) gpelje be.
A magyar kiads weboldalt s anyagait a Kiskapu Kiad webhelyn
(www.kiskapukiado.hu) tallja meg.
BEVEZETS
Ennek a knyvnek az a clja, hogy 5egtsgvcl <IZ olvas megtanulhasson C++ nyel-
ven programozni. A ktet 24 tan6rnak megfeld anyagot tartalmaz, s
rszletes ttekintst az olyan mint a be- s kimenet kezelse,
a ciklusok szervezse, a tmbk hasznlata, az objektum-kzpont programozs vagy
a sablonok (template). Mindez elengedhetetlen ahhoz, bo!:.')' valaki C++ nyelven mk-
d alkalma7..sokat mdjon fejleszteni. A leckkben szmos a tananyagot illusztrl kd-
rszlet tallhat6, :lmelyeknl mindig megadtuk azt is, hogya prog'.lrn futtatsnak mi
a kimenel. A fontos szintaktikai elemeket kln is igyekeztnk kiemeh,i, hogya knyv
utlag, referendaknt is hasznlhat legyen. Valamennyi ra anyaga nh{my krdssel
s gyakorlattal vgz6dik, ezzel is segtve :L tanultak gyakorlatba v,116 temelsl. A ko-
rbbi kiadsokb61 hi{myzott az ebben a kiadsban minden lecke vgn felbukbn6
kvz, amelyhez termszetesen a hel yes vlaszokat is megadjuk.
Kinek rdemes elolvasni ezt a knyvet?
a az is megtanulhalja a C++ nyelv has:miilat{ll, akinek semmifle ko-
rbbi programozsi tapaszmbta nincs. Mi mindenl az clcj6r61 kezdnk elmagyaclzni,
vagyis nem csak magt nyelvet tantjuk meg, hanem a C++ programozssal
kapcsolatos koncepcibl, alapelveket is. A szintaxist mindig pldkkal illusztrnljuk,
a bemutatott k6dok mikdst pedig szksg esetn akr soronknt elmagyarnz7.uk.
ppen ezrt gondoljuk gy, hogy ez a knyv nagyszeni trs lehet egy a C++ nyelv bi-
rodalmban tell utazshoz. Akr rendelkezik az olvas korbbi programozsi tapaszta-
latokkal, akr teljesen bzunk benne, hogy e ktet vilgos szerkezete meg-
knnyti majd szmra a tanulst.
Nem kellene el6bb megtanulnom a C nyelvet?
Ez a krds b'Yakorlatilag elkerlhetetlenl merl fel, hiszen a C++ bevallottan nem
ms, mint a C nyelv tovbbfejlesztse. Kell-e teht ismernnk magt a C nyelvet ahhoz,
hob'Y megruk a v ltozatot"? Stroustroup, a C++ nyelv alkotja s szmos ms
is egyetrt abban, hogy nem csak hogy nem kell ismernnk a C-l, hanem bi-
zonyos helyzetekben kifejezetlen is, ha nem tudunk rla semmit.
ugyanis, hogya korbban C-ben progl'"dmoz6knl kialakulnak bizonyos "rossz
szoksok", amdyeknek C++-ban mr nem tudnak "hdolni", s amelyek kezdetben
gtoljk az tJlsban. Ennek a knyv megrsa sorn mi sem
)o( I Tanuljuk meg a C+ + programozsi nyelvet 24 ra alatt
fcJtteleztk az olvasr61, hogy ismeri a C nyelvet Persze ha valaki mgis, akkor sincs
semmi veszve. Nekik azt ajnljuk, hogy fussk t az e1s6 nhny fejezetet, csak hogy
kpbe kerljenek, aztn kapaszkoc\janak meg valami szilrd objektumban, mert hama-
rosan az ltaluk ismert nyelv olyan kiterjesztbeit fogjk ltni, ame\yekr61 eddig nem is
:lmoc1tak.
Mirt rdemes megtanulni a C+ + nyelvet?
Ez megint egy igen gyakori krdse, 561. ll!llb-.tn olyasvalan szokott utna jnni hogy
H V&tiI is az X nyelv lJ lagljabb s legnalJyszen7bb, s hamarost/Il gyis levltja ti C++-I".
Erre a rvid vbszunk krlbell hogy .Nem addig van az!". Rengeteg olyan
nyelv vol! m:lr, amir61 egy id6ben mindenki tudta, hogy le fogja vltani a COBOl-t, mg-
is ebben a pillanatban is thh milli sornyi olyan COBOl kd van, ant "komoly" szerve-
zetek rendszereiben aktvan hasznlnak. (Mi tbb, foly:mlatOsan jabb sorokat is irnakD
Krlbell ugyanez a helyzet a C++-szal: kdsorok milliit rtk ezen a nyelven, 86t, mg
mindig rjk 6ket. A msik nyoms indok, amirt mindenk6ppen rdemes megtanulni
l C++-t az, hogy br vannak . jabb s nyelvek, az(:rt ezek bevallOlwn sokat me-
rtettek a C++-bl. Mind :1 Jav:1 mind a CI:t sz{unos .. C++-szal eb'Ycz6 nyelvi elemet tartal-
maz, viszont ezeknek a nyelveknek az els.1jttsa tbb ponton jval nehezebb.
Aki teht ismeri az j 6st, az knnyebben boldogul majd a leSZ:.'rmazot-
takkal is. De akr tovbb is mehetnk: a C++ ismerete nem csak a Java vagy a C .. elsa-
jttsa sorn vlhat el6nynkre, hanem az awk, a Perl na s persze a C tanulsa kz-
ben is. A legfontosabb lnyez6 ezen a tren az, hogya C++-szal olyan hordozhat kl:-
pessgeket sajlthatunk el, amelyeket aztn mindenfle platformon, s az informatik:li
piac legklnbz6bb terletein kamatoztalhatunk, legyen lZ PC, valamilyen nagy telje-
Unix rendszer, vagy egy egsz adatcentrumot megtlt6 mainframc.
Lehel, hogy a kd, amit rtunk nem lesz hordozhat, vagyis nem Tudjuk vltoztats nl-
kl tvinni egyik rcndszcrr61 a de a ruds, amit llllla megszerezlnk, biztos:'ln
az lesz.
A knyvben hasznlt jellsek
A knyvben a kvctkez6 speciCIlis jellseket fogjuk hasznlni.
Az ilyen jelzs szvegdobozok olyan informcit tartalmaznak. amelyek birtokban
hatkonyabb kdot tudunk rni, vagy mi magunk hatkonyabban tudunk dolgozni.
Tanuljuk meg a C++ programozsi nyelvet 24 6ra alatt I xxi
Figyelem!
Az ilyen keretes rszekben olyan problmkra vagy mellkhatsokra hvjuk
fel a figyelmet, amelyek bizonyos helyzetekben gyakran felmerlnek.
TudIa hogy ... ?
Az. ilyen dobozokban tippeket, trkkket mutatunk be, illetve az aktulis tmhoz
kapcsold informcikat kzlnk.
Az ilyen tblzatokban tmren
sszefoglaljuk mindazokat a tancso-
kat, aranyszablyokat, amelyek
az ppen trgyalt tmhoz kapcso-
ldnak. Ilclyes teht, ha odafigye-
J nk ezekre.
Helytele.
Helytelen, ha figyelmen kvl hagy-
juk ezeknek a felsorolsoknak a tar-
talmt.
Ha ezt a szimblumolltjuk, akkor a melletre szveg vabmilyen ppen bemuta-
[ott program kimenett tartalmazza.
Ez a jel mUlat ja az ppen trgyalt pldakd elemzsnek kczdetC:t.
A knyvben ezen kvl klnfle berutipusokat is hasznlunk:
Hogy knnyen meg lehessen klnbztetni a folyszvegec a kdoktl, utbbi-
akat specilis monospace betkszlettel szedtk. Az olyan szavakat s karakte-
reket, amelyek a kd rszt kpezi, de hivatkozs vgett a foly6szvegbcn is
szerepelnek ugyanennek a bettpusnak a vltozatval rtuk.
Az j vagy fontos fogalmakat szintn egy specilis jelljk.
A knyvben tallhat6 valamennyi kdban megszmoztuk a sorokat I-I a teht egy
sor mgis hinyzik a sorszm, az annak a jele, hogy tl6g oda az
sor, vagyis amit ltunk, az csupn egy sor folytatsa. Ilyenkor a kt sort begpe-
lsnl termszetesen egyesteni kell, vagyis egy sorba keU gpelnnk.
xxii I Tanuljuk meg a C++ programozsi nyelvet 24 ra alatt
A CD tartalma
A knyvhz mellkelt CD-n a lalljuk:
V,llamennyi a knyvlX!n fomlskdol.
Egy szabadon hasznlhat integrlt fejlesz16i krnyezetet ODE) s
fordtprogramol,a Borland C++BuilderX-el. Br a knyvben vala-
mcnnyi kdot kipr6blluk ezzel a fordft6programmal, fontos megjegyezni, hogy
maga a ktet nem a sz61. A bemutatott kdokat brmely stabil
C++ fordt6valle lehel fordtani. Szintn fomos hangslyozni, hogy nem minden
fordtprogram kell6cn friss, vagy az rvnyben [vei szabvnyokhoz, gy
egyes k6dokkal helycnknt s id6nknt gondunk lehet, mikzben a tbbi kifo-
g5swlanul makdik. Mivel a piacon szmtal:m fordt6program s azoknak mcg-
szmllhatatlan vltozata 1(;!111Ct fel, termszetesen nem v511alkozllatunk ezek
teljes ttekintsre.
Az 6rk vgn szerepl6 gyakorl atok kzl szmosnak a megoldsl.
I. RSZ
Bevezets a C++
programozsi nyelvbe
1. ra Kezd lpsek
2. ra Egy C++ program rszei
3. ra Vltozk s llandk
4. ra Kifejezsek s utastsok
5. ra Fggvnyek
6. ra Vezrlsi szerkezetek
1. RA
lpsek
Ebben az 6rban a lesz sz6:
Hogyan teleptsnk egy fordtprogramot s hogyan haszn: ljuk azt
A C++ nyelvt1 programfejleszts lpsei
I !ogyan gpeljk be, fordtsuk le, s linkeljk CH programunkat
Elkszlelek a programozshoz
A C++ nyelv filozfija - akrcsak a lbbi objektum-orientlt nyelv (ilyen pldul a Ja-
va iS) - , megkveteli, hogy a munka megkezdse tervezznk. Az olyan egyszeru
fe!adatok persze, amilyenekkel a knyv nhny fejezetben tallkozhatunk, nem
ignyelnek tl nagy Az olyan sszetett feladaloknl azonban, ;'l!nc-
lyekke1 egy igazn profi programoz nap mim nap tallkozik, a tervezs mr ltfontos-
sg. Minl rszletesebb a terv, annl lesz a feladat megvalstsa
a megadott s a klL<;gkeretet is figyelembe vve. Egy j terv ezen kvl segt
a rninimalizlsban s megknnyti a karbantartst is. Becs-
lsek szerint a szoftverfejleszts kltsgeinek 900/o-t a hibakeress s a karbantarts
adja. A tervezs nagy mrtkben cskkenti ezeket a kltsgeket, amely az-
tn a teljes projekt kltsgvetsn is meg fog ltszani.
41 J. rsz Bevezets a C+ + programozsi nyelvbe
Egy program tervezsekor az krds, amit fel kdl tennnk a Mi
az a problma, amil meg szeretnnk oldani? Minden problma megoldshoz meg-
behatrolt clt kell mint ahogy ezt a knyv legaprbb pldinl is
megtesszk.
A msodik krds, amit minden valamire val progmmoz feltesz magnak: Megoldha-
f ez a/dadal eg)'edi program r.sa nlkl is? Egy rgi program jrah'lsznostsa, t-
dolgoz,sa, vagy egy mr meglv6 kereskedelmi szoftver sokszor jobb megoldst nyjt-
hat egy problmra, mim mindent teljesen kezth:::ni. Aki ilyen alternatvkat k-
nl gyfelei sz:hnra, sose mamd munka nlkl. Egy kllSghatC:konyabb megolds ma
kulcs lehel egy elnk !.rul ajthoz, ajnllevl t:gy mt:gbzshoz.
Hl! mgis j szoftver rsba vgjuk a fejsznket, a kltsgek akkor is lefa-
mgllat6ak, amennyiben felhaszn:'iljuk a mr korbban megrt fi.lggvnyknyvtrakat s
oszt(tlyok:tt (objektumdefinci6k knyvtlra). A fejleszts sebessge ezekkel radik,Hsan
nvclht:t(5, amely rszben magyarzat cl C++ npszerO"sgre is.
Tudta hogy, .. ?
IBM - OeveloperWorl<s portl
Noha az IBM DeveloperWorks portl- http://www.ibm.com/developerworks/ - el-
a Java-hoz nyjt segtsget, mutat nhny remek pldt a fggvny-
knyvtrak megosztsval kapcsolatban is,
Felttelezem, hogy az olvas megrtette a megoldand probitmi s az mindenkpp
j szoftvert ignyel. Vgjunk ht bele a tervezsbe.
A C++ nyelvjrsai (C++. ANSI C++. ISO C++ s a Windows)
C++ egy programozsi nyelv. A Windows, a Unix (mint pldul AIX, Solaris, HP-UX,
stb.), a Linux, s II Mac OS X ezzel szemben operci6s rendszerek. Bizonyra ;IZ olvas
gy szeretn megt:tnulni a C++-t, hogy kso"'bbi programjai architektrt61 s opercis
fggetlenl
A TlnLlljuk meg a C++ programozsi nyelvet 24 ra alatt knyvben ennek megfele-
nem tteleznk fel sernrnit a hasznlt operci6s rendszert A knyvben
az ANSI/ISO C++-t - vagy ms nven a szabvnyos C++ nyelvet - trgyaljuk. Ez egy
nemzetkzileg elfogadon vltozat, meJy brmely architektrn s brmely kr-
nye7.etben hasznlhat.
Aprop6
Mi az ANSI? Mi az ISO?
Al ANSI az Ameri kai Nemzeti Szabvnygyf Intzet (American National Standards
Institute) rvidtse, mg az ISO a Szabvnyosts Nemzetkzi Szervezet
(International Organization for Standardization). a szab-
l, 6ra Kezd61psek 15
vnyostsrt az Amerikai Egyeslt llamokban s az egsz vilgon.
A szabvnyokon nyugv nyelv hasznlatnak nagy hogy mindenki ugyanazt
a lerst s ugyanazokat a szablyokat kveti.
_-\ knyv pldaprogramjai az. ANSI/ISO C++ szabvnyt kvetik s csaknem brmelyik
fordl6programmal le kell tudnunk fordtani Keveset hivatkozunk majd ablakok-
1"3, listadobozokra, grafikra s ehhez hasonl dolgokra, I::zck ugyanis nagy mrtkben
ruggnek az opercis rendszert61 s a hasznlt fejleszt6i
A vgeredmnyt mindig az alaprtelmezett kimeneten kapjuk. Hogy ez mOkdjn, val-
szim11eg kzlnnk kell a fordtval, hogy kamkteres felletre kvnunk alkalmazst rni.
Ez a helyzet a Ha rland C++l3uildcrX-szd is. Nhny fordt - tbbnyire a grafi kus felletre
rtak (\Vindows, Mac, stb.) - ezt gyors (quick window) vagy egyszeru (simple window)
ablaknak nt:vc:.::i , esetleg egys:.::enen csak konzolos alkalm:lZ.sknt hivatkozik tiL
A knyvben mi mindvgig l11:lgt a fordt6progr:l mot (compi ler) hasznCIljuk. E:.:: az
a progmm, ami lefordtja az emberek szmra olvashat6 forrskdot gpi kcinI. A vg-
eredmny egy trgykcl llomny (object file) lesz. A linker szir,t{:n I::gy program, mely
a trgyk6d l!om:'inyokat sszef(izve hozza ltre magt a futtathat prognunot.
A knyvhz tartoz CD-n tallunk egy ilyen fordtprogramot. A kvetkez6 rszben J
psr61-1psre bemUIatjuk, hogyan kell telepteni a Borland CH BuilderX-eL Ez egy
Windows alapO integrlt krnyezet (Integr:lted Development Environment -
IDE), mely szolgltatsaiv<il megknnyti a fejlesztst, hiba keresst, slb. Terms:.::etesen
hasznlhatunk ms - akr Windowst61 fggetlen - fordtt is. Ez csak r'.ljlunk ll.
A fordft teleptse s beUftsa
A knyvhz mellkelt CH BuilderX integrlt fejleszt6i krnyezet Microsoft Windows
operuds rendszer alatt futtathat.
Amennyiben nem ilyen krnyezetben dolgozunk, nyugodtan ugorjuk t ezt a rszt. Eb-
ben az csetben keresnnk kell egy, az opercis rendszernkhz elC:rhet6 fordtt.
Az opercis rendszer dokumentcija vagy a szllt cg tovbbi rszletekkel szolgl-
hat a hasznlhat fordtprogramokkal kapcsolatban.
Ha Windowst hasznlunk, teleptsk a Borland C++ fordtt s a hozz tartoz fejlesz-
krnyezelet. A knyv brinak ksztshez mi is ezt hasznltuk. Maga a gmfikus
fellet sokaknak lehel, hiszen tallkozhattunk vele Borland Compiler, Borland
CHBuilderX, CHBuHderX, vagy C++BuilderX IDE nven is, dc ez valjban mind
ugyanaz a termk.
s i l. rsz Bevezets a C++ programozsi nyelvbe
Telepts a CD-rol
Helyezzk be a CD-t a meghajtba s vrjunk, amg elindul az automatikus telepts.
Ha el nem trtnne meg, indtsuk el a CD-n tallhat6 install . exe programot.
Az install. html s a readme . txt tovbbi informcikkal szolgl a program legfris-
sebb kiadsrl. Amint elindult a te1ept6program, kvessk az albbi lpseket:
l. Kattintsunk a Next gombra.
2. Fogadjuk el a Fclhaszn:l :si feltteleket.
3. Kattintsunk a Next gombra (hagyjuk alaprtelmezeuen).
4. Vlasszuk a Full Install Sel pontot (Teljes telepts), s kattintsunk a Next-re.
5. Vlasszuk ki a telepts cl knyvtrt (az alaprtclmczctl val6sznl1leg megfele-
16) s Next-re.
6. Vlasszuk ki az ikonok helyt (aL alaprtelmezett itt is megfelel6
lesz) s kaltintsunk a Next-re.
7. Vgl pedig kattintsunk az Install-ra. Vrjuk meg amg a telepts
Termszetesen a progr-drnunkat mg regisztrl ni is kell. A Borland-tl egy llomnyt
kapunk, melyet be kelJ msolnunk a program knyvt rba (egyszen.en kvessk az e-
mai lben kapott egyszen. lpseket). Ezzellulajdonkppen mris hasznlhat a prog-
ram, de mg elvgeznnk rajta nhny belltst.
A Borland C++BuilderX fordft b.llftsa
Tndlsuk el a C++BuikJerX-szct, .1 kveLkez6kppcn: kattintsunk a Start gombra, majd
a Minden program pontra. ILL keressk ki a Borland C++ 13uilderX pontot majd legv-
gl kattintsuk a program ikonjfl r-.I. Ha mindent jl csi nltunk, akkor elindul a
krnyezet. Most az alapbc{llItsokkal fogunk foglalkozni, amelyeket termszetesen
brmikor mdosthatunk :1 mensorban tallhat Tools menponlra kanimva.
Az l. l -es bdra pillantva lthat, hogy a menS{)f alatt kt sorban helyezkednek cl
gombok. Ez al eszkztr. Az egnnutatt az egyes gombok fl hzva rvid lerst ka-
punk az adott gomb f\Jnkcijll r61. Az fels6 sor els6 ht ikonj{lVal az albbi mtiveleteket
rhetjk el balrl jobbra haladva: j fjl ltrehoz{)sa (iu kszthetnk j projekte, [5jl
megnyitsa projekt megnyitsa), fjl ism(:telt megnyitsa (a lemezen tallhat
llomny beolvassa), forrs bezrsa, aktulis fjj mentse, az sszes fjl ment{!sc, il-
letve a nyomtats. Az 10101 felirat fjl ikonra kaUintva fordthat juk le a forrst s k-
szthetiink futtathat llomnyt, a zld nyl pedig elindtja az elkszlt progr.a-
mot. A gombok megFelel6it a mensorban is megtallhatjuk rvid keress utn.
Szmos ikonnl szerepel a projekt sz. A projekt egy csomag, amely sszefog tbb
egymshoz taltoz A C++Buil derX .cbx menti a projektfjlo-
kat. A legtbb a knyvben projekt csupn egy llomnybl ll, ami kiss r-
1. 6ra KezdI lpsek I J
Lelmctlcnnck tt1nhet. Ugyanakkor tbb tucat vagy akr tbb szz forrskdllomnnyal
rendelke:d:i projekt esetn igen hasznos ez a szolgltats, teht rdemes mcgtanulni
a hasznlatt.
; [lDo<:uo><"" .. ,,/C .... <PV
-

:;0.0'" !"" [Tolo<t !\'" 1 . .. "'1"''''
,-
,,-
.....
...
-
'II M .
"' .
11:-..""",-:ld- - ,

..
..
ii]FioI,'L-




i

,.
,..,,,'"
-
",
.

o.
-l-,T
-
1.1 bra
, \ C++BuilderX hllcgrll Mrnyazel (IDE)
A alaprtelmezsknt be van kapcsolvn a hibakeress Mi
eZL a knyvben csak fogjuk haszn lni, de addig is rdemes vele megismerkedni.
A Borland fejlcszrkrnyezete beptett rendelkezik. Kattintsunk
az j fj l ikonra, maj d pedig a Source File (forrsfj D flre. Ez a szolgltats egy fj l
szerkesztsre szolgl. Tbb llomnyesetn szintn az j fj l ikonra kell kattinta-
nunk, azonban ekkor a Console Application-t (szveges alkalmazs) kell vlasztanunk,
melyet a Projekt fln tallunk. Ha hasznljuk a varzslt, akkor az is elkszti sz-
munkra a keretrendszert. Ha azonban kikapcsoljuk, akkor forrskdszerkesz-
t ablakot kapunk.
Mentsk a projektet s minden hozz kapcsold l!omnyt egy kln knyvtrba.
A projektllomny . cbx mg a CH forrskdot taltalmaz llomnyok
epp. rdemes megjegyezni, hogya mentskor automatikusan
. cpp kiterjesztsselltja el a forrsIlomnyokat. Az ppen szerkesztett fjl mentshez
kauintsunk az aktulis fjl mentse ikonra.
a l I. rsz Bevezets a C+ + programozsi nyelvbe
Fordts a Borland C++BuilderX-szel
A projekt va!,')' egyedi fjl fordtshoz s a binris llomny sszeszerkesztsf:hez kat-
linL'mnk a Make Projekt ikonra. Nhny fordt ezt a OliTveletet kt lpsben oldja meg:
d6bb fordtanunk kell aztn szerkeszteni. A legtbb integr lt krnyezet ugyanakkor eZt
mr egy lpsben hajtja vgre. A program - krnyezeten belli - futtatshoz
kallinLsunk a Run Project ikonm, hibakeresshez haszn;ljuk a Debug Project ikont.
Ha egy programot hibakercs6vcl fUllalunk, akkor az 1.2 brhoz hasonl6 kp fogad
minket. Ebben az esetben a hetedik sorra !ltot!am be s egszen odig lefutott
a program.
r.,: t . C 1000;....,"" <pp h@!E

, ..
....
,-
.-

tH"e:i - '!il."ilio ....
,. .
;, ..
.. .

(It""'" .....
'"
..
.,
/\1, ID !!!I-..."'"
x...., ... ;
.iit..
' ." ... ----
.
-
... _ ... -.
8:::.
'._<
. ... L ... ..... ..,.
... -c >ot ..... <Mr "1'11 1

-


_ ...... _ .....0
... ..... 0'
"
-
,
' 1 '
--
.-
'ol
,



"
-

li
,,'
._-_., -
. - II


.
, . .s 'a
"' .. ... c_ ...... ,......,.... ___ ....... ' ........ ,
---

1.2 bra
A Borland C++BuildO/X
Amint a kperny6nkn megfigyc1het6, a barna csk jeh:i, hogy melyik le.5z a
programsor, a piros kr pedig maga a trspont. A Lrspontnl ideiglenesen megll
a program futsa. Hibakeress esetn rdemes mr a gyans sornl trspomot
elhelyezni. TrspontOl :IZ adott sor bal szlre kattintva helyezhetnk el. A 5tep ikon
segtsgvel egy sol1lphetnk a futtatsban, mg a Continue ikon folytatj ..
a program futtatst a trspontig vagy a program vgig. A tbbi ikon se-
gtsgvel msms vizsglhat juk a programunkat. Ezek az ikonok az ab-
lak aljnl tallhatak, Hasznos szolgltatsa ennek a krnyezetnek az automatikus for-
dts s szerkeszts, amennyiben ezt futtat.'s vagy hibakeress e16tt nem tettk meg.
,. ra Kozd6 lpsek 19
A Help men Aboul menpont jban tallhat a krnyezet verziszma, mely
1.0.0.1786. A Help men Help Topics (Sg tmakrk) menpont jban C s
C++ refer encit ta llunk. rdemes krlnlni itl is.
Tudta hogy ... ?
Kmyezetfgg sg6
A bemutatotl krnyezet egyik hasznos tulajdonsga a krnyezetrzkeny
sg. Kattintsunk egy kulcsszra s nyomjuk meg az F1 gombot. Egy j ablak nyl ik
meg informcikkal az adott parancsrl.
A fordft6program s a szvegszerkeszt
Egy fordt6progmm gyakran sajt beptett rendelkezik. C++ llo-
mnyok szerkesztC:shez hasznlhat juk eZt, vagy brmely ker<:!skedelmi dc
akr egy irodai programcsomagot is. Mim .I%t mr korbban emltellk, a Borland for-
dtja rendelkezik beptett 13nnilyen szvegs;:.erkeszt6t is v lasztunk,
fontos, hogy tudjon formzs nlkli, egys;:.eru s;:.veget menteni. Garantltan haszm l-
hat pldul a Windows jegyzeumbje, a DOS-os EdiL parancsa, a Brief,
<IZ Epsilon, az EMJ\CS s a vi. S;:.mos irodai szvegszerkeszt6 - WordPerfect, Word,
stb. - szintn ad egyszeru szvegfjl kne mentsre.
Figyeleml
Legynk 6vatosak
Amennyiben irodai szvegszerkeszt t hasznlunk, fontos, hogy formzs nlkli l-
lomnyknt mentsk a kdot, mert br mi el tudjuk olvasni , a fordtprogram nem
tud majd vele mit kezdeni.
A szvegszerkeszt6vel ksztett llomnyok forrskdok s C++ nyelvben. cpp, . exx,
. ep vagy. e kiterjesztssel brnak. A knyvpJdiban llomnyok kiterjeszt-
se . epp, hiszen el az alaprtelmezett a Borland fordtjban.
Aprop
Forrsk6dok kiterjesztsei
A legtbb c++ fordt nem trdik a kiterjesztssel, de amennyiben nem lltot-
tunk be mst, alaprtelmezs szerint j nhny . epp-t fog hasznlni.
10 II. rsz Bevezets a C+ + programozsi nyelvbe
Hasznljunk egyszeru szveg szer-
kesztsre kpes vagy
a fordt beptett
Hasznljuk ki a
nyjtOll<l
A forrnsk6dokat . c, . ep, vagy O ki-
tcrjesztsek valamelyi kvel mentsk
eL (A Borland fordtjnl . cpp
az al aprtelmezett.)
TanulmnyozllIk t az ltalunk hasz
n(t!l fordtprogram s linker doku-
ll1!.:nt{u..:iJt.
Fordfts s linkels
Ne hasznljunk olyan szvegszer-
amely specilis formzka-
raktereket is ment. Ha mgis szeret-
nnk ilyent hasznlni, akkor minden-
kpp ASCII szvegknt mentsk
a forrskdot.
Noh:1 ,I forrs kd szmos ember szi'lmra kicsit knaimik azrt tagadhatatlan,
hogy emberi szem szmra oh'ashat szveg. A forrskd teht nem program, kzvet-
lenl nem futtathat.
Aprop
Fordfts a parancssorbl
Hogya rorrsk6db61 ruttathat programot kszItsnk, szksgnk van egy fordtra.
A paramterezsi m6d fordftnknt vltoz, igy rszletekkel a program dokument-
dja szolglhat.
Ha parancssorbl kvnjuk futtatni a fordtt a krnyezet helyett, akkor
a hasznlt programtl s opercis az albbiakat kell begpclnnk:
Borland fordt esetn - bcc32 <fjlnv> -o <futtt!that llomny neve>
GNU esetn - gxx <fj lnv> -o <futtathat llomny neve>
Cygwin fordftnl- gH <[jlnv> -o <futtathat llomny neve>
Linux alatt - 9H <fjlnv> -o <futtlJthllt llomny neve>
UNIX alatt - CH <f.jlnv> - o <futtathat llomny neve>
Fordrts az tejleszt6i krnyezetben
A legtbb modern fordt6 integrlt krnyezetet is nyjt. Egy ilyen krnyezet-
ben a Build vagy Compil e menpont kivlasztsval vagy a
nci61enyomsval el az alkalmazs fordtsa. A C++BuilderX-ben egyszeruen
kattintsunk a Make Project ikonra.
1. ra lpsek I II
Linkels (sszeszerkesztsi
Miutn lefordtottuk a forrskdot, ltrejtt a trgykd. Ez mg mindig nem fuUathat.
Ahhoz, ho.gy futtathatv tegyk, le kell futtatnunk a linkert.
Egy tipikus - C++-ban rt - futtathat program egy vagy tbb trgykd llomny s
egy vagy tbb fggvnyknyvtr sszeszerkesztsvel, gynevezett linkelsvel jn
ltre. Fggvnyknyvtr szrmazhat a fordtprogram kszt6jtl, forrsbl, de
rhatunk ilyent akr mi magunk is. Maga a fggvnyknyvtr hasznos fggvnyek, elj-
rsok s osztlyok amelyekre hivatkozhatunk a programunkban. A fgg-
vny egy olyan kdrszlet, amely valamilyen konkrt feladatot valst meg. sszeadhat
pldul kt szmot, vagy kirhat valamit a kperny6re. Az osztly egy j tpus defind-
ja. Egy osztlyban az adat s a rajta vgrehajthat egyarnt jelen vannak.
A knyvben mHjd rszletesebben megismerkednk az osztlyokkal.
Egy futt<1that llomny ltrehozsnak tipikus lpsei a
1. Forrskd ltrehozsa s elmentse . cpp kiterjesztssel.
2. A forrskd lefordtsa trgykdd{t
3. A t,rgykd s b{trmely ms - a futtatsl10z szksges - fuggvnyknyvtr ssze-
szerkesztse futtatlmt6 ll omnny.
A Borland krnyezetben a Make Project fordt s linkel egy lpsben. Egy-
egy modul klnkJn is lefordthat, ehhez kattintsunk a jobb egrgombbal a projekt
ablakban a modul nevre, majd a Build Tools-n<'il vlasszuk ki a BCC32-t (mely maga
a C++ fordt). Amennyiben a Iinkelst szeretnnk sajt vgrehajtani, kattint-
sunk jobb egrgombbal a projekt nevre, majd a13uild Tools-nl vlasszuk ki
az ILINK,,2-t (ez a krnyezethez mellkelt linker)
A fejlesztsi ciklus
Ha minden program prblkozsra tkletesen akkor a fej lesztsi cik-
lus egyszeruen gy nzne ki: programrs, a forrskd lefordtsa, linkels s futtats .
Sajnos azonban csaknem minden prognlm - mg a is - tartalmazhat-
nak s tartalmaznak is hibt. Nhny problma mr a fordtsnl jelentkezik, egyesek
a linkelsnl, de olyan is szp szmmal akad, amelyekre csak a program futtatsakor
deru l fny.
nSyntax error" (nyelvi hiba) hiba fordtskor jn ehi Ez azt jelenti, hogy hibt
vtettnk a nyelvtanban. Tallkozhatunk ezen kvl "warning" (figyelmeztets)
hibval is . Ilyenkor hogy tnyleg hibztunk, de a fordt el tudta kszte-
ni a trgykdot, men valahogyan rtelmezte a hibs kdot is, csak pp gyansnak ta-
12 11. rsz Bevezets a C++ programozsi nyelvbe
llta. Linkelsi hibazenetet leggyakrabban hinyz fggvnyknyvtrak va!,'Y elg6pelt
fggvnynevek okozhatnak, Azok a hibk, amelyekkel a program fuUatsa kzben ta-
llkozunk, logikai hibk,
Teljesen lnyegtelen, hogy milyen hibba botlunk, ki kell javtani a forrskdot,
utna pedig jra le fordtan i, jr.! kelllinkelni s j ra le kel! futtatni az alkalmazsun-
kaL Ezt a folya matot mutatja be az 1.3-as ;bra. L1that6, hogy in egy ciklusr61 van sz.
Nagyon ritka az a program, amelyik hibtlanul fordthat, s radsul
mg hibtlanul is fut.
Start
Igen Fordftsi
hibk?
Igen Futsi
'----'-<. hiba?
N,m
Ksz
1.3 bra
A C++ program/ej/esz/s lpsei
1. ra lpsek 113
HEllO.CPP - Az els C+ + programunk
A C-vel rokonsgban ll programozsi nyelveket oktat knyvek krben mr hagyo-
mny, hogya Hello World szavak kiratsa az program. Ezt a hagyomnyt - me-
lyet Kernighan s Ritchie C szl knyve indtott el - mi scm kvnjuk meg-
szaktani.
Aprop
j program ltrehozsa
C + +8uilderX-ben j projekt ltrehozshoz kattintsunk a New Source File-re (j
forrsIlomny ltrehozsa). A knyv pldihoz mindig a Console Application-t (sz-
veges alkalmazs) vlasszuk. A projekt ltrehozsa utn elkezdhetjk a munkt
a
Gpeljk be dZ prog,dmot a Ha
snk szerint nem vtettnk mentsk, fordtsuk le, linkeljk ssze - amennyiben
a fordt6 ezt nem teszi automatikusan - s pr6bljllk meg elindtani.
II J Jell0 World szavak jelennek meg. )elenesetben nem maga II program a lnyeg, ha-
nem az, hogya fejlesztsi ciklust s a fordtt megismerjk. Pr lecke utn teljesen vil-
goss v{tlik majd a program
Aprop
Nhny sz a knyvben tallhat forrskdokrl
Az albbi forrskdban a sorok az adott sor szmval Ezek csupn hi -
vatkozsok megknnytse vgett vannak ott. Az 1.1-es li sta O. sora pldul gy nz
ki begpelv"e:
#include <iostream>
A sorszmok teht megknnytik a magyarz szveg rtelmezst. Egyes
krnyezetekben - ilyen pldul Borland is - szint n tallkozhatunk sorszmozssal,
de ezek nem rszei a forrskdnak.
A knyvben minden program sorszmozsa a o. sorral mert maga
a C++ nyelv is O-rl kezd a szmozst. A korbban bemutatott krnye-
zetben a szmozs de ha ezt valaki zavarnak tallja, nyugodtan ki-
kapcsolhatja. Ezt a lools men Editor Options menpont jban tallhat Une
Numbering kikapcsolsval tehetjk meg.
A knyvben tallhat sszes forrskd a mellkelt CD lemezen is megtallhat,
mgpedig a programot bemutat blokk fejlcben nven.
14 11. rsz Bevezets a C+ + programozsi nyelvbe
\.\ usta - hallo.cpp. az eII6 C+ + __
o: 8include <iostrcaffi>
1.
2 , int main()
,.
4 : std : : cout "Hello World!\n";
5 : ret.urn O,
,.
Gy6z6djnk meg rla, hogy hibtlanul gpcltk be a kdot, klns tekintettel az spe-
ci{llis r.isjdckrc. A 4. sorban tallhat6 egy tidmytst jelkpez. Angol kioszts bi!-
lcntyuzcten nyomjuk le egyszerre a Shiftet s a v(.!ssz6t. (Magyar kioszts esetn hasz-
nMjuk az AltGr s a billenty{ikombinci6t.) A 4. sort pomosvesszO:vel fejezzk be, fi-
gyeljnk r.
Aprop
Nevek s nvterek
Az std: : cout parancs kt rszbl ll: std s cout.. A cout -tal frathatunk ki va
lamit a Ez rsze az alapcsomagnak. Minthogy azonban sok ember r j
fggvnyeket s objektumokat a C++-hoz, knnyen hogy ugyanazt
az azonosltt hasznljk ms clra. Hogy ezeket megkmnbztessk, meg kell ad-
nunk a hasznlni kivnt nvteret vagy vltozatot is. Jelen esetben teht Igy kzl
jk, hogy az std csomagban cout objektumot szeretnnk hasznlni.
Fontos, hogy pontosan a fordtprogram dol.:umentci6jnak megfelel6en jrjunk el.
A legtbb fordt - gy a Borland is - aUlomatikusan sszeszerkeszti a t.'rgykMot-
vllgy trgykdokat - futtatbat lJomnny, de ha ms fordtt hasznlunk, minden-
kpp olvassuk el a lersl. Ha hibazenetet k:lpunk, nzzk meg alaposan, ho&')'
ugyannt gpdtk-c be, mint ami a korbbi l.l-es progmffi k6djban lthat. lIa nem
a l3orhll1d fordt6jt hasznljuk, tovbbi hibazeneteket k:tphatunk. I [a O. sorra a rend-
szer a find iostream
H
hibt adja fordtskor, akkor II fordt nem tall ja a meg-
felelO: fejlcllornnyt. Ennek a helyt a fordt konfigurds !1omnyhan vagy kr-
nyezeti v ltozk segtsgvel llthatjuk be. Ha a fordt II 2. sornl nem tallja
a main () fi.lggvny prototpust, akkor egy int ma i n () ; sort kelJ a msodik sor el
beszrni Ebben az esetben ezt a knyv sszes pldjnl meg kell tennnk. A legtbb
fordt nem ignyli ezt (a 130rland sem), de nhny igen.
A mdosts utn gy nz ki a programunk:
o: tinclude <iostrearn>
1 .
2 : int main() ;
3 : int main!)
4: {
5: std :: cout "Hello World!\n';
6 : return O;
7 .
1. ra lpsek 115
Prbljuk meg lefordtani a hello. cpp llomnyt s futtassuk le. Ha mi ndent jl csi -
nltunk, kirj a a hogy:
He l lo Worl d!
lia sikerlL, akkor gratullok, sikeresen begpeltk, lerordtottuk s lefuttattuk
C++ programunkat. Szinte hihetetlen, de csaknem minden profi C++ programo-
z s7:mra ez volt az program.
Fordftsi hibk
Szmtalan oka lehel a fordtsi hibknak. A leggyakoribb az e!gpels vagy ms apr
hiba. Nhny fordt nemcsak a hibra mut.1t r, de arra is, hogy az a forrskdban hol
van. Nhfiny akr mg javtiisi tanccsal is szolglhat
Nzzk meg, hogy reag l a fordt6tlk egy sZ{lI1dkosa.n elhelyezelt hibm.
Ha a HELlO.CPP hibtlanullefutot! , (Igy n(:zzk meg, mi trtnik, ha trljk a 6. sorbrm
tallhat kapcsos zrjelet. A programunk az 1.2 programlism msa kell, hogy legyen.
1.2 Ua .. - Plda a forditai hibra (hallobad.cppl
o : #include <iostream>
1.
2 : int main()
3 .
4 : std : : cout "Hello World! \n' ;
5 : rctllrn O;
Fordtsuk j ra a programot. Az albbihoz hasonl hibazenetet fogunk kapni:
"hellobad . cpp : E2134 Compound statement mi s .s i ng } in function main (
at line 7
A hibazenet - noha kiss rej tjclesnek - kzli, hogya problma a forrskd v-
gn tallhat. A 7-es sorra hivatkozik, hiszen az lenne a sor a
ben. Sokszor a hiba kzvetlen a problma kzelben tal lhat. Amennyiben a fordt
pontosan azonost nli nden problmt, megprblja kijavtani forrskdot.
Aprop
Emlkeztel a knyv forrskdjaival kapcsolatban
Ne feledjk, hogy a knyvben a forrskdok sorai tallhat sorszmozs csu
pn referencia. A szmozs - akrcsak nhny fordt esetn - , O-rl indul. Ms
fordtk - gy a Borland is - viszont kezdik a szmozst.
1s l l. rsz Bevezets 8 C++ programozsi nyelvbe
Krdsek s vlaszok
Kerds: Mi (l klnbsg az egyszef s az irodai Mztt?
V/asz: Az egyszeru egyszenl szvegfjlt kszthetnk. Semmi olyan
specilis jel vagy nem kerl bele, amely az irodai szvegszcrkeszt6nl igen.
Az egyszenl szvegfjlok nem tartalmaznak automatikus sortrst, flkvr, il letve dall
betUket stb. Termszetesen az irodai szvegszerkeszt6kkel is menlhetnk egyszen1 sz-
veg formtum az esetek nagy rszben, de krtiltekint6en kell eljrnunk.
Krds: Afordt6m bepftcfI sz6vcgszerkeszfvel rendeU.tazik. llasznljam inkbb az t?
Csaknem minden fordt kpes szi nte brmilyen szvegszerkeszl{Svl::1 rt forr.1s-
kd lordtsr:1. A beptett tbbnyire az, hogy felgyorst ja a fo.::jlcsz-
ciklust. Komolyabb fordtk sszkomfortos szerkesz16felletle! rendelkcwck, mely
a fejlcszt6i krnyezet elhagysa nl kl segt megoldani ;_ fordtsi s trgyk6dszerkesz-
tsi problmk:lt, de sokszor tallunk gyors segtsget is. Termszetesen a klnll
szerkeszt6nek is megvmumk az el6nyei. Rendelkezhet pldul olyan kiegsztsekkcl ,
amellyel a fcjleszt6i krnyezet nem. De az is el6fordulhat, hogy mr rnegszoktuk s
hatkonyabb a 111lJnkavgzs vele, mint a beptett szerkcszt6vel.
Krds: FilJye/men kVlllhagyhatom a fordt6 fi8yellllczlelseit?
Vlasz: Nem. Swkjuk mcg, hogya figyehneztet6 i.lzent:tek is hibflk. A C++ fordtja
minden esetben szl, H111ikor olyan dolgot cseleksznk, amely nem ajnlott. Tegyi.lk
meg a szksges lpseket, hogya figyelmcztctsek is e1ttlnjenek. A hibazenet azt je-
lenti, hogya fordt a forrskMunkat nem ILldja gpi k6dd alakt.ani. A figyelmeztets
azt jelenti, hogy sikerlt ugyan lefordtani, de nem biztos, hogy gy, ahogyan mi sze-
rettk volna.
Krdes: Mil jeleni az, hogyfordirs; id?
Vlasz: A fordtsi id6 az az id6, amikor a fordt fut. A Iinkelsi - vagy szerkesztsi-
a<:, amikor a li nker fuI. A futsi pedig amikor maga a programunk
Gyakorlatok
Ebben a szakaszban oly:m kvzkrdseket s gyakorl6feladatokal gytljtnnk ssze,
melyek segtenek megszilrdt.ani az elsajtton tuds!.
l. ra 17
Kvfl
1. Mirt fomos projektet hasznlni?
2. Mi a hibakeress clja?
3. Mirt rdemes olyan fordtt hasznlni, me!y tmogatja a nemzetkzi
sZbvnyokat?
4. Milyen segdprogramokkal $zerkeszthet6 a forrskd?
Feladatok
A feladatuk teszik az nll gyakorlst. Nincs egyetlen helyes megoldsuk.
1. Pr6bljuk ki a krnyezet gombait s menit. Mit csinlnak? Knnyebb
teszik az letet? Vagy ppen megneheztik?
2. Pr6bljuk meg lefordtani, sszelinkeini s lefull:!lni a krnyezethez
mellkell pldkat. Vessnk egy pillantst a forrskdra, hogy kitalljuk mirt s
hogyan keletkezik a vgeredmny.
3. Pr6bJjuk ki a Borland - vagy brmely ms - fordt parancssoros vltozatt.
Knnyebb szerkeszleni, fordtani, linkelni, futtatni ms eszkzkkel? Vagy
az integrlt krnyezet knnyti meg a helyzetnket?
Vlaszok a kvfzkrdsekre
1. A projekt sszefogja a futtathat ,11lomClnyhoz szksges komponenseket. Egy
aJk,llmazs sok-sok f:jJt de projektbe sszefogva egytt
kezelhetek, t l{IlJmtak.
2. A hib:lkeress clja termszetesen a hibk (bug) felkutatsa. il yenkor olyan logi-
kai hibkat keresnk, melyek a program fordtst nem befolysoltk ugyan, ele
az mgsem aZlleszi, amjt a programoz elkpzelt.
3. Az egyszeru vlasz: kveti a szablyokat. A fordttl elvrhat, hogy minden
esetben ugyangy viselkedjen. Taln nem is gondoln a kedves Olvas, de mg
a benzinkutakrl s az autk benzintankjr61 is szabvny rendelkezik. Ha min-
den gyrt sajt feje utn menne, akkor nem lenne biztos, hogy A gyrtmny
autba B gyrtmny benzinkton mdunk tankolni.
4. Brmilyen programot hasznlhanmk, amely kpes ASCll szveget
menteni. Hasznlhat juk az opercis rendszerhez mellke[t (DOS
alatt az edit, Uni..Vlinux alatt a vi s az EMACS, Windows alatt a Jegyzettmb),
kereskedelmi alkalmazst (mint pldul a BrieO, integrlt fejleszt6i krnyezetet
vagy akr egy irodai is. A lnyeg csupn az, hogy tudjon for-
mzs nlkli szveget menteni.
2. RA
Egy C++ program rszei
Ebben az rban a esik majd sz:
Mikor megfelel6 vlaszts a C++ nyelv
Milyen rszekbl ll ssze egy CH program
llogyan al kotnak egszet a rszek
Mik a fggvnyck, s mire hasznlhat6k
Mit611ehet j vlaszts a C+ + nyelv
M;:mapsg il legtbb profi C++-ban dolgozik. Ennek az az
oka, hogy ezen a nyelven gyorsan mgis kis mretG programokat rhatunk,
ehhez pedig egy robus:ltus s platformok kztt knnyen hordozhat kr-
nyezet ll rendelkezsnkre. A ma hasznlatos fejlcszt6eszkzk segtsgvel kifejezet-
ten sszetett s hatkony kereskedelmi alkalmazsokat rhanlOk viszonylag egyszeru-
en, m ennek ra van: meglebetsen alapos ismeretekkel kell rencleJkeznnk a C++
nyelv szolgltatsir61.
20 II. rsz Bevezets a C++ progfllmoz.si nyelvbe
Mfls programozsi nyelvekhez kpest a C++ viswnylag fiatalnak szml. Persze az is igaz,
hogy maga a programozs is mindssze hatvan ves mltra tekinthet vis.<;za, de a C++
mg ezen a skltin scm szmt rginek. Az nyelv megszletsc ta a progrdllloti'ls
mdszertana igen jelents fejl6dsen esett t, amelynek egyik lpfse ppen a C++ volt.
Ez a nyelv ugyanis trtnetileg a C nyelv tovbbfejlesztsnek Mivel pedig
maga a C is minJssze 30 ves, vilgos, hogy a C++ sem lehet ennl
fl. programozk kez<.!(!llx:n ,l legegys7.erub gpi urastsokkal, vagyis gpi kd-
ban dolgoztak. Ennek a nyelvnek az utastsai egyes(!k s nullk hossz sorozataibl
llnak, ami mdon nem tl knnyen kezc1hel6. Hamarosan megszOlettek tehl
az els6 assemh1cr(!k, amelyek ember szmm is olvashat reprezenlflcikat, gyneve-
zett nmemonikokat rendeltek a gpi utastsokhoz. Il yen volt pldul az ADD vagy
a MOV, amely(!k egy-egy konkrt gpi k{x.! mOvc1elnek meg. Id6vel aztn
ki<llakultak az gynevezett maglIs programnyc1ek is, mint amilyen a BASIC
a eOUOL. Ezek a nyelvek m(lr tettk, hogya progr.unozk olyan a szavl\k 6s
mondatok kz es6 kifejezsek segtsgvel alkoss k meg progmmjaikat, mir1t p6kl(lUI
Let I = 100 (legyen az T tartalma 100). Ezeket:1 magas szinn1 rmlvdewkcl az-
tn az gynevezett rtelmez6k (inlerpereter) vagy fordtprogramok (compiler) vissza-
fordtottk gpi nyelvre. Az interpcrclerek, mint pldul a I3ASIC megval6st:,:ai
.olvass kzlx:n" fordtj:'ik le gpi nyelvre II magas szinn1 utasitsokat, majd azonnal
vgre is hajtjk azokal. Itt teht a begpch kd gyakorl atilag lIzonnallefut.
A fordtprogramok (compiler) ezzel szemben elbb vgigulv:lssk a teljes forrsk-
dot, s abh61ltrehozn:1k egy 511om(tnyt (objecl code). A feldol-
gozsnak ezt :lZ lpst nevezik fordtsmk (compiling). A fordt teht egy l:rgy-
kd llomnyt (object file) llft amit ti msodik a (linker) ala-
kit full:ltllat progmmm:i. A futtathat progmm az az :illmny, amit aztn az open'\ci6s
rendszer segtsgvel lefutlatharunk. (Zrjelben taln rdemes megjegyezni , hogy
aZ itt emltett lrgyk6dnak (object code) semmi kze sincs a knyvben ksob trgya-
land objektumokhoz.)
Mivel az interprcterek kzvetlenl vgzik II gpi kdra alaktst s a vgrehlljtst,
a programoz szmra rendkvl knye\mesen hasznlhatk. fl. fordtprogl1lmok ez-
zel szemben kiss k6nyclrnetlenek, hiszen csak tbb l6p6sben
lthat a futtathat llom{my. H,l ;lzonban jobban megvizsgljuk a dolgot, kiderl,
hogya knyelem elvesztse haszonnal is jr: az gy ltrehozott gpi kd sok-
kal gyorsabban fut, mint amilyen sebessggel az incerpreterek kpesek.
A programozk clja hossz veken t az voll, hogy kis mret, gyorsan fut
programokat alkossanak. A programnak azrt kellett kicsinek lennie, mert drga VOll
a memria, a sebessg s hatkonysg pedig azrt volt alapkvetelmny, mert a h6s-
korban a szmtsi teljestmny sem volt klnsebben olcs. Aztn ahogya szmt-
gpek egyre kisebbek, gyors:tbbak s olcsbbak lettek, s ahogya memriarak is
visszaestek, a kapcsolatos is megvltoztak. Manapsg
2. ra C++ rszei 21
a programoz munkabre sokkal de sokkal magasabb, mim az t foglalkoztat vllal-
kozs ltal hasznlt brmelyik szmtgp ra. Ennek ma az igazi rtkel
a jl megrt s knnyen karbantarthat programkd jelenti, nem a hardver. A .jl meg-
irt" bizonyra nem kell magyarzni, a pedig :IZt jelenti,
hogy ha a szoftver szolglt:llsaira tmaszkod vll alkozs ignyei megvltowak, ak-
kor a programot klnsebben nagy beruhzs vagy nl kl t lehessen rni,
vagy szolgltatsainak krl ki \chessen terjeszteni.
Procedurlis, s objoktum-k2pont programfojleszts
A procedurli s vagy djr-ds kzpont fejleszts alapelkpzelse szerint a progr.un nem
egyb, lrlint a adatokon vgrehajtand sorozata. A stmkturlt prog-
ramozs nagy tallm:1nya ezeknek a a rendszerbe szervezse, szisztema-
tikus megkzeltse volt, mgpedig azz<l l a cllal, hogya programukk<ll nagy mennyi-
Sglt adatot is knnyen s tlthat mdon lehessen kezelni.
Amgy ez az tlet egy:'iltaln nem j, hiszen ha jobban belegondolunk, semmi msrl
nincs sz, mint az meg s umlkodj" elv digitlis alkalmazsrl. H:l teht egy
olyan feladattal tallkozunk, amelynek a megolds.a tlsgos:m sszetett :lhhoz, hogy
egyszeruen s knnyen mdon le tudjuk rni azt, akkor elkezdjk logikai
rszfeladatokr-.t bontani, s ezt egszen addig folytlltjuk, :lmig a rszek mr kell6en
s ltal:'inosak, s gy knnyen rthet6ck.
Nzznk egy pkh'l. I-la az a feladat., hogy ki egy vllalat valamennyi :l lk:ll -
mazottjnak liagkeresctt, akkor a dolog sszetettnek
Ugyanakkor nl!mi gondolkodssal a kvetkez6 rszekre bonthat juk a megoldand
problmI:
1. Ks:dtsilnk egy !istl, ami tartalmazz.1 az sszes dolgoz brt.
2. Szmoljuk meg, hny alkalmazottja van a cgnek.
3. Adjuk ssze :l fizetseket.
4. Osszuk cl egymssal az imnt kapott kt szmot.
A vllalatnak nyilvn V:ln valamifle adatbzisa, amelyben a dolgozk adatait trolja,
teht a fizetsek sszegzshez a rszlpseket kell vgrehajtanunk:
l. Nyissunk meg egy adott dolgozhoz tartoz bejegyzst.
2. Emeljk ki az adacszerkezetbl a fizets rtk\.
3. Adjuk hozz a kiolvasott rtket annak a vltoznak a tanaimhoz, :Imely
az sszeget fogja tartalmazni.
4. Nyissuk meg a dolgoz bejegyzst.
22 11. rsz Bevezets a C+ + programozsi nyelvbe
A dolgozi adatok kiolvassnak teljesen hasonlan a kvetkez6 rszlp-
sekre bonthat:
1. Nyissuk meg a dolgozk adatait tartalmaz fjlt.
2. Ugorjunk a kiv{llasZLoU dolgoznak rckordra.
3. Olvassuk fl az adatokat a
sszessgben elmondhat, hogya strukturlt programozs nyjtotta megkzelts
a mai napig rendkivl fontos s hasznos paradigma az sszetett feladatok megolds-
val kapcsohttban.
Ezzel egy(iu azrt marddLak mg jcskn megoldand problC:mk. Ahogy nvekszik
a feldolgozand adatok mennyisge, egyre nehezebb s nehezebb lesz mt!gbirk6zni
az adatok s az eljrsok sztvlasztsval. Minl tbbfle aka-
runk vgezni egy adathalmazzal , annl zavarosabb lesz :l vgeredmny.
A procedurlis megkzeltst alkalmaz6 fejleszl6k azon kapjk maguklH,
hogy mr megint kitalltak egy (lj megoldst ugyanannak a rgi problmnak a kezel-
sre. Erre szoktk krkben azt mond,mi, hogy az ilyen programozk wjra
flfedezik a kereket", s ez az, aminek az ell entte az jrahasznosthat kd. Az j ... .J.-
hasznosts alaptlctc mindssze annyi, hogy a programokat lehet6sg szerint olyan is-
mert tulajdonsgokkal rendelkez6 ltalnos pit6elemekb61 kell sszerakni , amelyeket
szksg eset.n egyszeruen lx:emelhetnk a .sajt kdunkba anlkl, hogy jra mcg kel-
lene azokat rmmk, vagy akr csak meg kellene vizsg:'ilmmk a szerkezetket. Ter-
mszetesen ez a megkzelts sem tlj, hiszen a val6s objektumokkal dolgoz m6rnkk
is pont ezt a mdszert alkalmazZ{Ik. Ha egy villamosmrnknek egy kszlk elkszt-
shez szksge van egy tranzisztorra, nem azzal fogja kezdeni, hogy flfedezi a tran
zisztort, hanem bemegy a raktrba, lecmeli a pokr61 a megfelel6 alkatrszt, vagy ha na-
gyon mus7-j, akkor mdost rajta egy kicsit. Furc.sa kimond.mi , de az objektum-kzpon-
t prog,dm07-s fltallsig ezt a megkzeltst a programozk nem alkalmaztk.
Az objektum-kzpont paradigma lnyege mindssze annyi, hogy az adatokat s a ve-
lk dolgoz eljrsokat egy egysgnek, egy objektumnak tekintjk, amelynek nevet
:lclunk, s amely klnt"le tulajdonsgokkal s viselkedsformkkal rendelkezik.
A C+ + nyelv s az objektum-kzpont programozs
A C++ nyelv teljes egszben tmogatja az objektum-kzpont paradigma alkalmaz-
st, IniVel tartalmazza. azt 3. hrom alapszolgltatst, amelyekre pcve ez megvalstha-
t. Ezek a begyazs (enclIpsulation), az rkl6ds (inheritance) s a tbbalaksg
(polimorfizmus; pulymorphism).
2. ra Egy C+ + program rszei 123
Begyazs (encapsulation)
Amikor egy villamosmrnk egy j eszkzt pt, gyakorlatilag sszeforraszt nhny k-
szen kapott 'Ilkatrszl. Az j eszkz bizonyosan tartalmazni fog pldul ellenllsokat,
konden7.1itorokat s tranzisztorokat. A tranzisztor egy eszkz, amelynek vannak bzo-
nyos tulajdonsgai s viselkedsformi. A mrnk ezt az eSlkzt munkja sorn anl-
kl hasznlhatja, hogy pontosan ismernie kellene annak a bels6 felptst, vagy
kdsi mechanizmusait. Egyszeruen csak annyival kclllisltban lennie, hogy az
alk:ltrsz mire j. Ahhoz, hogy ez a dolog ebben a formba n ;1 tranzisztor-
nak mint alkatrszLpusnak tkletesen meghatrozott visclkedsformkkal s rulajdon-
sgokkal kell rendelkeznie. Egy bizonyos, jl krlhalrolhat funkcit kell megval6s-
tania, de azt teljesen. Ha egy dolog egy funkcit teljes egszben kpes elltni, azt r-
viden l:x::;igyazsnak nevezzk.
Az objektum-kzpont metodolgill szhasznlatval lve a lranzisl'.tor tulajdonsgai be
vannak gyazva a tranzisztor objektumba. Ezek a bizonyos Lldajdnnsgok s funkcik
teh:h nem szanaszt hevernek vala hol az ramkrk dzsungelben, hanem a szerkezet
egyetlen helyre sszpontosulnak. Pontosan addik aztn az az elf5ny, hogy tran-
zisztort hasznlni az is tud, aki ncm is ismeri annak a bels6 vagy relptst
A C++ nyclv a begyazs mcgvalstst II fel h:lsznl6 ltal definilt tpusok, az gyne-
vezett osztlyok hasznlatn kcreszl'lteszi lehetcv. Egy j61 tgondolt s felptett osz-
tly miutn ltrehoztuk pontOSan gy mint egy teljesen begyazott egyed.
Egyetlen egszknt haszml1mtjuk, de nem kell tudnunk, hogy mi van benne pontosan,
s az hogy A mechanizmus a felhasznl6 el6tl lt.1lban teljesen
rejtve maradh:ll, C&1k aZI kell tudnia az hogy pon{osan mire val az adott
elemtrpus, s hogyan kell azt hasznlni. Az osztlyok ltrehowsr6l II 7. rJ
anyagban lesz sz6 rszletesen.
s
Az 1980-as vek vgn aCiLibanknl dolgoztam, ahol az volt a feladatom, hogy fej-
lesszek ki egy eszkzt, amivci az gyfelck otthonrl intzhetik banki gyeiket. Mivel
gyors:1n pi:1crn akamtnk kerlni ezzel a szolgltatssal, nem a scmmib6l kezdtem cl meg-
tervezni a kszlket, h,mcm egy mr dologbl, nevezetesen a tdcfonb! indul-
tam ki, s annak a kpessgeit fcjlcsztctLem tovhb a bank ignyeinek megfcleWen. gy
is fogalmazhatnk, hogy amit vgl megcsinltam, az egyfajta telefon volt, de nhny
extr-.!. szolgltatssal kiegsztve, hiszen a megval6sts sorn vgig tmaszkocltam a mr
meglv6 funkcikra, pldul a Ivsok kezelsre, viszont ahol kellett, ott tovbbfejlesz-
tettem azokat. Kicsit tmrebben jrahasznostottam II telefon meglv6 funkciit.
Ugyanez! a dolgo! a C++ is tudja, hiszen az keresztl tmogatja a k6dok j -
mhasznostst Egy j tpust, vagyis egy j osztlyt ugyanis ltrehozhatunk egy mr
24 11. rsz Bevezets a C+ + programozsi nyelvbe
meglv6 alapjn is. Ilyenkor azt mondjuk, hogy az j alosztly t a rgib61 szrmaztat juk,
az ltala kpviselt felhasznli tpust pedig szrmaztatott tpusnak (derived lype) nevez-
zk. Ezzel a S7..6ha.sznlattal lve teht az n .felspcizen
H
telefonom nem egyb volt,
mint egy a kznsges telefonok osztlybl szrmaztaton j telefontpus. Szrmaztats-
nl az j osztly rkJi a rgi ntinden tulajdonsgt, de annak funkciit jakkal is kieg-
szti. Az rkl6dsr61 s annak hasznlatrl a 16. rban lesz majd sz rszletesen.
Tbbalaksg (polimorfizmus)
Egy okos telefon ugyanabban a helyzetben nha mshogy viselkedik, mint egy kzn-
sges kszlk. Ha hvs fut be, akkor a hagyomnyos telefon egyszen1en meg-
csrren. /\7. okos kszlk ezzel szemben bekapcsolja a kperny6 vilgtst, ma jd em-
beri lmngon kzli "lIv{\sod van kedves gazdm". A dologban a legrdekesebb n,
hogy mindehhez a leJefontrsasgnak semmi kze sincs. Hvskor ugyanaz
a jt'l fUl be a buta 0s okos telefonba, csak az erre :IdOlt v51as7.Uk tr el egym(\stl.
Az egyik csng, ;1 msik beszl, vagyis mindkett6 ppen a "megfelela dolgot" esini lja
a jelre.
Az cffi:le viselkedsformk
H
megvalstst :l C++ is tmog!ltja n gynevezeu
tbbalak.sgon (polymorphism) keresztl. A progr.unokban fggvnyek s osztlyok
egyarnt mUlathmnak tbbalaksgOl, ami nagy vonalakban annyit jelent, hogy egy
prug ..... .unban lIgyan: .... a nvvel egy fggvny vagy osztly tbb klnbz6 megval6s-
lfisa is ltezhct, 6s ezek minden helyzetben ppen a megfelel6 dolgot csinljk. A tbb-
:Ilaksgrl, s annak kifinomult hasznlatrl a 17. s 18 rban lesz sz b6vebben.
Egy egyszeru program rszei
Az ds6 r.ban mr ltlunk egy egszen egyszeru C++ progmmol. Ez volt a he110.epp,
amelynek cgyszcrGsge dlenre smos rdekes pt6eleme van. Ebben a szakaszban
kzc1ebbr6l is megvi"_'>gljuk a program felptst. A progmm k6dja, amit ill csak
a knyelem vgett ismuek meg a 2.1 Listban lthat.
2.1 Lista - A hel10.COD Droqram ellYSZersae ellenre k1vlan alkalmu IHIV C+ +
program pft6elemeinek bemutatsra
o: <iostream>
"
2 : int main ()
3 : t
4: std :: cout 'Hello World!\n';
5 : return O;
6 ,
2. ra Egy C++ program rszei 125
Hello World!
A O. sorban beemeljk a program k6djba az iosLream fjl tal1alml. A fordt-
program szempontjbl ez gyakorlatilag ugyanolyan, mintha begpeltk volna
a hello.epp fjl elejre az iostrcam nevl fejlcll omny teljes taltalmt.
Az #include utasfts vizsglata
Amikor elindtjuk a rordtprogramoL, az el6szr is meghv egy msik programot,
az gynevezett (preprocessor). Az el6fddolgoz6t soha nem kell kzzel
indta nunk, ezl a fordtprogram mindig megteszi helY(;Hnk.
A O. sor karaklere egy kett6skeresZl (#), ami nem m,s, mint egy az eI6felc1olgo-
znak szl jelzs. Az el6feldolgoz ugyanis els6 kzellsben semmi egyebet nem
tesz, mim vgigolvass,1 a forrskdot, s olyan sorokat keres benne, amelyek
Ha wll ilyent, akkor al utna szerepl6 utastsoknak
mdosuisokat vgez a fornskdon. Amit teht a fordtprogram tnyle-
gesen megkap, az mr ez a mdostott vltozat lesz.
Az teht olyasmi, mint knyvnl a szerkeszt6, csak ez fordt;\si id6ben
6s forrskdot szerkeszl. Ezt az aUlOl11atikus a fent emltett
el6feldolgosi direktvkkal (preprocessor directive) vezrelhetjk.
/\ kellskereszt utn sz, az include egy ilyen, az e16feldolgoznak szl
utasls, amely aZl mondja: "Ami most kvetkezik, at; cgy fjlmk a neve lesz. Keresd
meg ezt a fj lt, vedd a teljes tartal mt, s szrd be ide, ahol n vagyok." Ha a fordt6-
progJ<ltllUnk jl van belltva, akkor megkeresi a kztt megadott
iostream nevu fj lt abba n a knyvtrban, ahol a fordt fejlcllomnyai (header file)
ta llhatk, s becmeli a Larlalml a forrskdba. Ezeket a fj lokat szoks amgy "h fj-
loknak" vagy "include fjloknak" is hvni, a neviik pedig rendszerint . h kiterjesztssel

Aprop6
A fejlcllomnyok kiterjesztseirl
Gyakori, hogy az j ANSI szabvnynak fejlclJomnyoknak semmifle ki-
terjesztsk nincs. Ugyanakkor a "trtnelmi hagyomnyok" miatt a legtbb ford-
tprogram ktfle vltozatot is tartalmaz Az egyiknek a rgi, a msi k mr
az j szabvnyhoz igazodik. Ha pldul megvizsgljuk, hogy az imnt emltett
26 11. rsz Bevezets a C+ + programozsi nyelvbe
i ostream llomnnyal mi a helyzet, igen nagy kt vltozatot
is tallunk majd belle. Mi ebben a knyvben mindig az j szabvnynak megfelel
vltozatokat fogjuk hasznlni, hiszen a msik garnitra elavultnak szmt.
Ugyanakkor ha valaki egy rgebbi kiads fordtprogramot hasznl, akkor knyte-
len a hagyomnyos rsmdot alkalmazni, vagyis ebben az esetben a O. sor helyes
alakja a
<iostream.h>
Az i ostream Onput-output-stream) fejlcllomny :I COUl hasznlata mi aU
van szks(:gnk. Ez az az utas1"t{ls, amivel a kperny6re tudunk rni dolgokat.
Figyeljk meg, hogya cout-ot egy s td : : jeJz6, ami a fordtprogram szm-
ra azt jelenti , hogy a szabvnyos be/ kimeneti knyvt ml kell hasznlnia. Hogy ez a do-
log pontosan hogyan is m('ikdik, s mi is az, ami ilyenkor a httrben trtnik, majd
az elkvctkez6 6r{lk sorn fog kiderJni. maradjunk annyiban, hogy
az std , : cout az lIZ objektum, ami a szabvnyos kimenetet kezeli, testvre {X..odig,
az std : : cin, ugyanezt teszi, csak abemencttel.
Amint azt mr emlt ettem, H nulladik sorban i ncl ude direktva hatsa pontosan
ugyanolyan, mimha a k6cl elejre bcgpeltk vol na az iost erarn ll omny teljes tartal-
mt. A.mikor a fordtprogram megkapja a forrsfjll, ;lbban mr Olt van ez a t::ut:l loln.
Elemzs soronknt
A program tnylegesen a 2. sorban ahol rgtn egy main () nevli fggvnyt
IMunk. Minden C++ programban kell lennie egy il yen ncvl.1 fggvnynek. A rggvny
gy l talban vve nem egyb, mint egy k6drszlet, :unely egy van tbb m('iveletet hajt
vgre. A fllggvnybe n foglalt vgrehajtst szoks a f.iggvny vgrehajts-
mik vagy meghvsinak is nevezni, s taln az sem tl meglep6, hogy fggvnyek is
mcghvhatnak ms fggvnyekel. A main () mindazonltal a fggvnyek kzlt speci-
lis helyet foglal el , mivel ez a program belpsi pontja. Ez azt jelenti, hogy amikor el-
indtunk egy lefordton programot, akkor a rendszer automatikusan a main () fggvny
vgrehajts;val kezdi a sort.
A main () megadsnl - akrcsak az sszes tbbi fggv(>nynl- meg kell mon-
danunk, hogy az milyen tpus rt(:ket fog visszaadni. Ezen a ponton a main () megint
klnlegesnek szmt, mivel ktelez6en egsz (integer) rtkkel kell visszatrnie. Ezt
a tpust a CH nyelvben az int kulcssz jelzi, de err6! majd csak a harmadik rban lesz
sz. Ami pedig a visszatrsi rtkeket illeti , a 4. rban tanulunk. majd
a kifejezsek s utastsok kapcsn.
2. ra Egy C++ program rszei 127
Tudta hogy ... ?
rtkek visszaadsa?
A main () fggvny ltal visszaadott egsz rtket maga az opercis rendszer veszi
t. Ez azrt hasznos, mert ez az egyetlen szm bizonyos hiballapotok
}elzsre. Ez amgy teljesen ttalnosan hasznlt mdszer a termelsi vagy ktegelt
feldolgozst rendszerekben. A dolog a gyakorlatban gy nz ki, hogya program
ltal az opercis rendszernek visszaadott hibakdol egy msik program vagy szkript ki
tudja olvasni, s meg tudja tenni a lpseket, hogy rtestse a kezelket. (Ha
pldul egy kifejezetten nagy adatfeldolgozsi folyamatrl van SZ, akkor
zeneteI kl d egy szemlyhvra, termszetesen szigoran az jszaka kells kzepn.)
Minden fggvny trzse egy nyit kapcsos Lr6jellel kezd6dik, s - nem tl meglep6
mdon - ennek <I zr prjval Amint lthat, a mi main () tUggvnynk
nyit 6s zr kapcsos z{lfielei a 3. s a 6. sorba kerltek. Minden, :uni e kztt a kt
z.'i rjel kztt lnllhat, a fggvny rsze. A kapcsos :dlr6jclek egybknt programblok-
kok jellsre hasznhlLOsak. Nlen esetben a fggvnyt/..set, mint nll egysget ha-
troljk, dc ks6bb egyb blokkfajtkrl is olvashatunk majd.
Programlmk veleje a 4. sorban lthat. Itt a cout objektum segts(:g(:vd a k6pcrny6re
kldnk egy dv:d zenetet. Az objekrumokrl rszletesebben majd a 8. rban lesz
sz. Most d 6gedjnk meg annyival, hogya coul s cin objektumok <I C++ progr:amok-
ban adottak, azokat a fordtprogr"'dm hozza llre, v .. gyis neknk c-S;;lk has7.nl-
nunk kell 6kct. A cout a rsra, a cin a olv:lssr::1 v:ll 6.
Nos, akkor vizsgljuk meg kzelebbr61, hogyan is kell hasznlni pontosan ezt a bizo-
nyos cout objektumot. EI6szr is rjuk le magnak a cout-nak a nevt, azt!in ur!ina
rgtn a kimenet !i tirnytsmk opertort (<<). Utbbi nem egyb, mint kt egyms
ut n rt ki sebb-nagyobb jel, vagyis senki ne keresse a bil1entyl.1zeten. Brmi , :unit ez
utn az opertor utn nlnk, a progmm futsa kzben kikerl a Ha egy
szveget - vagyis egy karakterlncOl- akanmk kiratni, ne felejtsk el
lek kz zrni azt (Igy, l.llninl az a 4. sorban is lthat. f igyeljk meg, hogy magt a ki -
mnd szveget nyomtathat karakterek alkotjk, a sor vgn azonban van egy rde-
kes jel , az a bizonyos \n . ez nem egyb, mint az jsor kar::lkter, vagyis egy olyHn nem
nyomta that jel, ami arra utastjH H cout objektumot, hogy emelj en sort :l
A vgeredmny teht az lesz, hogya Hello World! mondat kl n sorb;ll1 jelenik meg.
Az 5. sorban az opercis rendszernek O rtket Hdunk vissza. Egyes rendszereken ezt
a szmot sikeres vagy sikertelen vgrehajts jelzsre swks hasznlni. 1\ megegyezs
szerint nulhl ti sikeres, az rtk a sikertelen vgrehajtst jelenti. Ugyanakkor
hozz kell tennnk, hogy a modern, grafikus felleuel elltott opercis rendszerek-
ben ezt a szolgltatst gyakorlatilag semmire nem hasznljk, gy az ebben a knyvben
bemutatott valamennyi program nulla rtkkel fog visszatrni.
A main () fggvny kdja a 6. sorban r vget a zr kapcsos zr6jell e1.
28 11. rsz Bevezets a C+ + programozsi nyelvbe
Megjegyzsek
Amikor runk egy progmmot, rendszerinlteljcsen vilgos s magtl hogy mit
is akarunk megvalstani egy adon kdrszleltel. Az emberi termszet azonban mulat-
sgos dolgokat kpes produklni. Ha megnzzk ugyanazl a kristlytiszta kdot egy
hnap mlva, gyakr-.m megesik, hogy mr nem rtjk, mi is folyik ou, vagy legalbbis
hoss7..an kell gondolkodnunk, hogy megrtsk a sajt alkotsunkal. Ez a jelensg pedig
teljesen ltal:nosnak mondhat, hiszen minden valamire val kdban ott van valahol
ez a bizonytalansg. Persze azt nem lehet el5re megmondani, hogy hol lesz, de hogy
oU lesz valahol, az biztos.
Pontosan ennek a kezcll:sl:re tall tk ki a megjegyzseket, amelyekkel nem csak ma-
gunkat segthetjil k meg, hanem msok szmr;] is knnyebben rthet'v tehetjk
az ltalunk rt kdokat. A megjegyzs egyszeruen olyan szvegrsz, amit a fordtprog-
ram figyelmen kvl hagy, e amelynek tartalma alapjn knnyen elclnthet6, mi is fo-
lyik ppen a programnak azon a rszn.
A megjegyzsek tipusai
A megjegyzs tehftt olyan rsz a forrskdban, amelyalefordtott program mO"kdst
nem befolysolja, viszont mankt jelenet annak, aki meg akarja rteni a kdot. A C++
nyelv ktfle megjegyzs hasznlatt tesz lehet6v. Az egyiket kt perjel (J / )
mcg. A tovbbiakban ezt a tpust C++ stlus megjegyzsnek fogjuk hvni. Ennl a t-
pusnl a kt perjel ami utastja a fordtprogramot, hogy az adott sorban :1 jel utn
hagyjon mindent figyelmen kvl, egszen a sor vgig.
A msik tpllS megjegyzs kezdett egy perjel s egy csillag Ct") jelzi, mgpedig eb-
ben:l sorrendben, a vgt pedig egy csillagot perjel ( .. t) mutatja. Az ilyen meg-
jegyzsnl a fordtprogram minden, a kt emltett jelzs kz es szvegrszt figyel-
men kvl hagy. Ezt a megjegyzstpust a tovbbiakban C stlus megjegyzsknt fog-
juk emlteni, mivel valjban a C nyelv hagyatknak tckinthet6. Ha ezt a tpust hasz-
nljuk, akkor gyeljnk r, hogyaforrskdban minden nyit ; .. jelnek meg kell le-
gyen valahol a zr" I prja.
Szmos C++ programoz csak a C++ stlus megjegyzseket hasznlja, a C stlust pe-
dig kizrlag akkor, ha a forrskd egy blokkjt tmenetileg zemen kvl akarja he-
lyezni. Ezt a mdszert szoks .kikommentezsnek" is ncvezni. Fontos megjegyezni,
hogy az gy hatstalantott kdrszlet tartalmazhat C++ stl usti, vagyis kt perjelicI kcz-
d6d6 megjegyzseket is, de C stnusakat nem.
2. ra Egy C+ + program rszei 129
Figyelem!
Kdrszlet zemen Idvl helyezse
Igyekezznk eljrni, ha C stlus megjegyzs segtsgvel akarunk
tmenetileg hatlyon kvl helyezni egy blokkot a forrskdban. Ha ugyanis ez
a kdrszlet ms C stllus megjegyzseket is tartalmaz, akkor megeshet, hogy
csak egy kisebb rszletet sikerl kiiktatnunk, nem pedig azt a blokkot, amit eredeti
leg szerettnk volna. elmondhat, hogya C stlus megjegyzsek
nem gyazhatk egymsba. Hiba van ugyanis a kdban kt nyit I " jelnk, a for-
dtprogram logikja szerint a *j bezrja az sszes megnyitott meg-
jegyzst. Az ilyen hibk elkerlsben nagy segtsgnkre lehet egy j grafikus fej -
krnyezet, amely ms sznnel jelzi a megjegyzsbe tett rszeket, flhwa gy
a figyelmet az esetleges tvedsekre. Szintn j hr, hogya ,.flsleges" zr" 1 je-
leket a legtbb fordtprogram hibnak tekinti, s megll.
Megjegyzsek hasznlata egy egyszenl programban
A megjegyzsek semmiben sem befolysoljk a lefordlott k6dol. A megjegyzsekt61
sem a program, sem annak fordtsa nem les:! lassabb, hiszen a rordtprogmm egysze-
ruen figyelmen kvl hagyja 6ket. A megjegyzsek hasznlatra nllltat pldt a 2.2 tis-
tban lthat program.
2.2 Usta - Megjegyzsolc hasznlsta (comment.cpp)
o: <i ostream>
1 .
2 : int
3 : {
4 : 1* Ez egy C stlus megjegyzs
5 : ami addig tart, amig a fordt
6 : meg nem tallja a zr csillag-perjel * I
7 : std : : cout "Hell Vilg ! \n";
8 : /1 Ez egy e++ stlus megjegyzs . ami a sor vgig tart
9 : sto. : : cout "rtt a megjegyzs vge!";
10 :
11 : /1 Egy sor llhat egyetlen perjel l el inditott mcgjegyzsb6l is
12 : 1* Ugyanez igaz a C sti l us megjegyzsekre is */
13 : r"eturn O;
14 :
Hell Vilg!
I t t a megj egyzs vge !
30 I L rsz Bevezets a C+ + programozsi nyelvbe
A 4. s 6. sorokban l:tlhat megjegyzseket a fordtprogram teljes egszben Ilgyel-
men kvl hagyja. Ugyanez: igaz termszetesen a 8. , ]"t. (:s 12. sorokban lLhat6 sz-
vegrszekre is. A 8. sorban indul megjegyzst a sor vge rja, vagyis ennek jelzsre
nincs szksg. Ugyanakkor a 4. s 12. sorokban lthatk rgi stlusak, tehl itl szk-
sg van az explicit lez.rsrd.
A megjegyzsek olyasmi, antivel kapcsolatban a progmmozknak csak egy kis
csoportja tekinthet6
ltalnossgban elmondhat, hogy br az "olvawkznsgnk" bizonyra ismeri ma-
gt a C++ nyelvet, vagyis elvben el tudja olvasni, amit rtunk, azrt <ll emberek igen
kis hnyada rendelkezik ezzel <I gondolatolvass kpess6gvel. M:1gb61
a kdbl nyilvn egynehm1en kiderl, hogy mi az, ami II programban trtnik. A j
tm::gjegyzsnek az a dolga, hogy vilgoss tegye az olvlls6 szmr d, mU:rt pom az tr-
tnik, ami.
Fggvnyek
Br a main () is egy fggvny, azrt ,I fggv(:nyck egy meglehet6sen swk<ltlan fajtjt
kpviseli. Amint azt mr llldjllk, a main () az, amit az operci6s rendsz:er el6szr meg-
btv, amikor a programunk elindlll. Ezzel aztn kezdett veszi a kd vgrehajtsa,
amelynek sorn a main () egyb fggvnyeket hv meg, s persze a main () ltal indi-
tott fggvnyek is hv haLnak ms fggvnyeket.
Maga a main () mindig egsz, vagyis int tPllS rtkkel tr vissza. Amint azonban
az rk sorn ltni fogjuk, ennek a tbbi fggvnynl nem flttlen kell
gy lennie. Egy fggvny a legklnbzbb visszatrsi nkekkel rendelkezhet, 56t
az sem kizrt, hogy egyltaln nem ad vissza semmit a hv6 flnek. A program kdjt
a rendszer sorrl sorra h:-dadva hajtja vgre egszen addig, amg egy fggv6nyhvshoz
nem rkezik. Ilyenkor a vgrehajtsi sorozat fonaln egy elgazs keletkezik, a rend-
sz:er leflJtt3tja a fggvny trzsben megadott kdot, majd a vgrehajts a fuggvnyh-
vs utni soron folytatdik.
Ez a logika amgy nem idegen a mi ndennapi sem. Kpzeljk el pl-
dul, hogy narckpet ksztnk. Lerajzoljuk a fejnk krvonalt, majd berajzoljuk
a szemeket meg az orrot, de akkor hirtelen a ceruznk hegye. Ilyenkor a meg-
kezdett mveletsorba egy elgazst kell iktatnunk, s vgre kell hajtanunk a . hegyezd
ki a ceruzt" fggvnyt. A fggvny trzsben a rszlpsek tallhatk: sz-
pen abbahagyjuk a rajzolst, flllunk, odastlunk a kihegyezzk a ceru-
2. ra Egy C++ program rszei 131
zt, visszamegynk a helynkre, aztn ott folytat juk a rajzolst, ahol abbahagyruk. (Na
ja, az arckpnkn marad egy ksza vonal ott, ahol a hegy kiLrLt, de ezt majd egy
msik fru,'\'ny elimzi.)
Fggvnyhlvsok
A fggvnyeket lekimhetjk amolyan specilis szolgltatsoknak. Amikor a f6program-
nak szksge van egy ilyen szolgllatsra, akkor meghvja a fggvnyt, majd
annak lefutsa utn ott folytatja a vgrehajtst, ahol az abbamamdt. Ezt a lo-
gi kt szemllteti a 2.3 Lista.
r 2.3 um - fggvnyhlv bemutat .. lcallfunc.cpp)
o: *i nclude <i oat r earn>
1 .
2 : II bemut atsa
3: II Ozenet mcgjclenitse a kperny6n
4 : void DemonstrntionFunction{)
5: {
6 : std : : cout "A DemonatrationFunction foggvnybcn vagyunk\n ";
7 : )
B.
9 : II A main() fQggvny - kir egy Qzenetet , majd
10 : II meghivja a fggvnyt ,
11 : II pedig kir egy msodik zcnct et
12 : int main{)
13 : (
14 : : cout "A fMin fOggvnyben vagyunk\n"
15 : DcmonstrationFunction() ;
16: std : : cout "Ismt a main-ben vagyunk\n";
17: return O;
18 :
lCImiinII J
A main fggvnyben vagyunk
A Demonstrat ionFunction fggvnyben vagy\mk
Isrn6t a main-ben vagyunk
- -.
l
A Demons trationFunction (l fggvny kdjt a 4-7. sorok tartalmazzk. Ez a kd-
rszlet a program elklnlt rsze, vagyis le van benne rva, mit kell csinl ni, de amg
meg nem hivjk a fggvnyt, addig nem csinl senunit. A hvs a 15. sorban lthat,
mel ynek hatsra a fggvny kir a kperny6re egy tjkoztat szvegel, majd visszatr
a hvhoz.
32 11. rsz Bevezets a C++ programozsi nyelvbe
A progr.Hn tnyleges kezdete a 12. sorban lthat. A 14. sorban a main () fggvny kir
a egy zenetet, amelyben kzli, hogy most ppen a main () vgrehajts-
nl tart a program. A lpsben, vagyis a 15. sorban a main () meghvja
a DemonstrationFunction () fggvnyt. Ennek hatsr.! lcfutm.k a Demonstration-
Function () trzsben lert utastsok, ami jelen esetben mindssze egyetlen k6dsort
(6. sor) jelent. Ez kir egy jabb zenetet, amelyben jelzi, hogy a most pp
a meghvott fggvny belsejnl tart. A 7. sorban aztn a Demonst rat ionFunct ion ( )
vget is r, s a vezrls visszakerl a hvhoz, vagyis esetnkben a main () fggvny-
hez. A vgrehajts a fggvnyhvst kzvetlenl soron, vagyis esetnkben a 16.
sorban folytatdik, ahol a main () kirja az utols zenetet, s maga is vget r.
Fggvnyek hasznlata
Egy fggvny vagy egyetlen adattal lr ViSSZ:l, vagy vissz,nrsi rtke void, ami azt je-
lenti, hogy nem ad vissza semmit a bvnak. Ha pldul runk egy fggvenyt, ami kt
egsz S7.rl1l1Ot tud sszeadni, akkor <lZ sszeget nyilvn clszen." a visszatrsi rtkben
elhelyezni. Ilyenkur teht a fggvnynk egsz (inI) tpusO visszatrsi ltkkel rendel-
kezik. Ha ugyanakkor van egy olyan fggvnynk, ami csupn egy zenete r ki , de
amgy nem csin:'t1 semmi emltsre melLl, akkor nyilvn nincs mit visszaadni a hv
flnek. A fggveny visszatrsi rtke teht ilyen esetben clszcn.len void.
A fiiggvnyek mindig egy fejlcbl (4. sor) es egy trzsbl (5-7 sarok) llnak. A fejlc
tartalmazza a viss7.atrsi rtk tpust, a fggvny nevl, valamint a param-
terek (ha vannak) listjt. A pammterek adhatunk :1t egy fgg-
vnynek kllle rtkeket, amelyekkel a mUkdst vezrelhetjk. Visszat/Ve
az immi , egyszeru sszeadst fggvnynkhz nyilvn clszenl ennek pamm-
terknt tadni a kt sszeadaoclt. Egy ilyen fggvny fejlce teht a
nzhet ki:
int Sum (int a, int b)
TiSZlzand az a fggvnyparamter megadha cSllp:'in egy deklarci,
amelyben azt rjuk e16, hogy milyen tpus adatot kell a hv flnek :'itadnia. A fgg-
vny hv{\sakor tnylegesen tadott rtk neve argumentum. Ezt a kt fogalmat szmos
progmmoz6 szinonimaknt hasznlja, mg msok knosan gyelnek a elnevez-
sekre. Mi ebben a knyvben az - ktsgkvl knnyebb - megoldst fogjuk v-
lasztani, vagyis hol par.lmlelt, hogy argumentumot runk m<ljd.
A fggvny nevt s paramtereinek listjt (vagyis a fejlcct a visszatrsi rtk tpU5<1.
nel kl) egyttesen a fggvny szignatrjnak nevezzk. A fggvny trzse egy nyit
kapcsus zrjellcl nulla vagy tbb utastsbl ll s egy zr k .. pc.sus zrjel-
lel vg7.6dik. A fggvny ltal munkt a kt zrjel kzti utastsok jelen-
tik. rtket visszaadni a return utastssal tudunk, amely egyben be is fejezi a fgg-
2. ra C++ rszei 33
fut!;t, akrhol legyen is a k6djban. l-la egy fggvnyben egyltaln nem szere-
pel ez az utasts, akkor automatikusan void lesz a visszatrsi rtke. gyeljnk r,
hogy a return utn valban olyan tpus rtk szerepeljen, mint amilyent a deklarci-
ban visszatrsi tpuskm megadtunk.
Fggvnyparamterek hasmlata
A 2.4 Listban bemutatunk egy fggvnyt, amely kl egsz szmot vesz t
a paramterknt, sszeadja azokal, majd az eredmnnyel - amely szin-
tn egsz rtk - tr vissza a hvhoz.
2.4 Ua .. - Egy bemen6 paramterekkel randalk .. 6 agyazer4l1lggvny llune.eppl
o: nincl ude
1 .
2 : int Add (int x, int y l
3 : {
4 : std :: cout "Itt az Add ( ) fggvny, a kvctkcz6 rtkeket kaptam "
_ x s y ' \n ' ;
5: return (x+y) ;
6 .
7 .
8 : int mai n()
9 : (
10 : s td : :cout "A main() fo.ggv nyben
11 : std :: cout " \nMeghivjuk az hdd() fggvnyt\ n';
12 : st d :: cout "A visszaadott rtk : " Add (3 , 1) ;
13 : std :: cout " \nIsmt a ma in() fggv nyben vagyunk. \n" ;
14 : std : : cout "\nKilpnk ... \n\n" ;
15 : rcturn O;
16 :
monat
A main () fggvny ben vagyunk!
Meghivjuk a z Add() fggvnyt
It t az Add() fggvny , d rtkeket kaptam 3 s 4
A visszaadott r t k: 7
Ismt a mai n () fgg"vnyben vagyunk.
Kilpnk . .
Az Add () fggvny meghatrozsa a 2. sorban Lthat, hogy kt cgsL': rt-
ket vr paramterknt, majd egyetJen, szintn egsz rtkkel tr vissza. Maga
a program a 10. sorban ahol kir egy tjkoztat zenetet.
34 11. rsz Bevezets a C+ + programozsi nyelvbe
A 12. sorban a mai n () egy zenet ksretben kirja az Add () fggvny ltal vissza-
adott rtket. Ez az rtk az Add (3 , 4 J hvs hatsra keletkezett, ami szintn a 12. sor-
ban lthat. A vgrehajts a pontrl gazik el gy, hogya hvs utn vgrehajtott
a 2. sorban lthat. A fggvnyen bell a neki tadott kt rtket az x s
y vltozk reprezentljk. A kd ezeket sszeadja, majd az eredmnyt az S. sorban
visszaadja a hv flnek.
Ez az a visszatrsi rtk (7), ami a ] 2. sor hatsra a is megjelenik.
A mai n () ezutn a s 14. sorokban kir egy-egy zenetet, majd maga is kilp,
visszaadva ezzel a vezrlst az opercis rendszernek.
Krdsek s vlaszok
Krds: Mi a szerepe az #include utastisllak?
Vlasz: El. egy az (preprocessor) sz[ direktva. Az el6feldolgoz
egy olyan program, .l mi! a fordt hv meg automatikusan minden egyes fordtsi meg-
kezdsekor. Ennek a mkdsr lehel vezrelni ezckkel a direktvkkal. Konkrtan
az Itinclude aZl jelcnti , hogy az e[6feldolgoznak be kell sz(unia az adott helyre
az #include lll, n megadotl fjl lcljes ugyanllgy, mintha azt mi magunk g-
pdtk volna be oda.
Krds: Mi az klllbsg a II s a 1* lpllSI meg;egyzseM Mz6tt?
Vlasz: A keu6s perjellel indtott megjegyzs a sor vgn automatikusan vget r.
A perjel s csillag kombimdval jelzett ezzel szemben a zr p{lfig, vagyis az els()-;
tart. Ne felejtsk el, hogy az ilyen tpus megjegyzsnek "mag{ltl" so-
ha nincs vge, az mg a fggvnyeket lezr kapcsos zr6jelen is {ltnylhal. Minden-
kppen ki kell rnunk teht a zr -; kombinci6t, klnben fordtsi hibt kapunk.
Krds: Mi klnbzlel Illeg egy j es egy rossz megjegyzst?
Vlasz: Egy j megjegyzs azt mondja el a kd olvasjnak, hogy mirt pont az tn-
nik az adott helyen, anti, vagy ltalnosabb esetben informcit s7.o1gltat arrl , hogy
az adott kdblokKnak mi a clja, mi az a feladat, amit meg akalUnk vele oldani. Rossz
megjegyzs pldul az, amelyik azt prblja megmagyarzni, hogya k6d eb')' adott so-
m mit csinl. A k6dsorokat gy kell megrni, hogy azok magukrt beszljenek, s
a megrtskhz ne kel!jen semmil yen tovbbi magyarzat. Az igazsg az, hogya for-
rskdok dokumentlsa amolyan nll tevkenysg, amit maghoz
a nyelvhez hasonlan tanulni kell.
2. ra Egy C++ program rszei 135
Gyakortatok
Most, hogy mr tudunk ezt-azt a C++ lljon itt nhny megvlaszoland kr-
ds s megoldand feladat, amelyekkel megszil rdthatjuk a fordtprogrammal kap-
csolatos eddigi tudsunkat.
Kvfz
l. Milyen tpus a main () fggvny visszatrsi rtke?
2. Mire valk a bpcsos z rjelek'
3. Mi a klnbsg a fordtprogram (compiler) s a (interpreter)
kztt?
4. Min olyan fontos il kdok jrahasznostsa?
Gyakorlatok
1. Vegyk H 2.1. Listllban bemutatott kdot, s bontsuk kett a 4. sorllban hthat
gy, hogy az egyik sorban a Hell a msikban a Vilg sZt rassuk ki.
Trtnt valami vltozs a kimenet form<tum(lbHn? Hogyan oldhat juk meg, hogy
a kt sz kln sorban jelenjen meg?
2. Prbti ljuk meg lefordtani sajt rendszernkkel a 2.1 Listban lthat kdot de
gy, hogy az include dostream> direktvllt trjuk I/inc1ude
<iostream. h> alakr.L Ezzel kiderthetjk, hogy az ltalunk haszn{ll t fordt-
program elfogadja-e mindt alakot, vagy ha nem, akkor melyikkel hajland
kdni. Ennek ,lZ informcinak mg nagy hasznt vehetjk.
3. Pr6bljunk meg lefordtani egy kdit az integrlt krnyezet (IDE) segt-
sgvel, majd parancssorbl is. Van-e brmi klnbsg a keletkezett binris ll o-
mnyok kltt?
Vlaszok a kvlzkrdsekre
l . A mai n () fggvny mindig egsz (int) rtkkel tr vissza.
2. A kapcsos zrjelek egy programblokk elejt s vgt jellik. Ilyenek kz kell
zrni pldul egy fggvny trzst, de lteznek ms fajta blokkok is.
3. A fordtprogram (compiler) a teljes forrskdot lefordt ja gpi k6dra, eJ-
kezden vgrehajtani azt. A (interpreter) ezze! szemben so-
ronknt halad vgig a kdon, s minden utastst azonnal vgrehaj t.
4. Nos, min hasznlunk fl tbbslr bizonyos e1kpzelseket az let ms terlete-
in, nem csak a programozsban? Azrt, mert ez gy sokbl knnyebb, gyorsabb
s bizonyos helyzetekben olcsbb is, mint jra s jra megrni ugyanazt a kdot,
vagy megcsinlni ugyanazt. Az az igazsg, hogy az informci megosztst s
a helyes gondolkodst is tantani kell.
RA
Vltozk s llandk
.. lisz sz ebben az rban:
.gyan vezethetnk be j vltozkat ill etve ;.lland6k:it.
H adharunk Jtkeket a vltoz6knak t!s hogyan v:llozlitLhatjuk meg.
rhat juk ki egy vltoz rtkt a kpernyre.
a vltoz?
lZ nz6pontjbl a vltoz6 egy Lerl et a szmtgp Jnf;!mrijtlban, flhol
II1II u.rolhawnk, amelyeket visszaolvashalunk.
",: .. ez pontosan mit is jelent, meg kell ismernnk v:damennyi rc

mem6rijnak A szmitgp memrijt gy tekinthetjk,


__ '-<Jfozatt, amelyek egyetlen hossz sort alkomak. Minden egyes cella (vagy
sorszmozva vao. Ezeket a sorszmokat nevezzk mcm6riacmeknek.
38 11. rsz Bevezets a C+ + programozsi nyelvbe
A vltozknak azonban nem csak cmk, hanem nevk is van. Ltrehozhatunk pld,ul
egy myAge vltozt. 1\ vltoznk nem ms, mint az egyik cel1 rd hivatkoz cmke,
amely alapjn a cella knnyedn anlkl , hogy ismernnk a mcmriacmet.
A 3.l.bm ennek az elkpzcJsnek a vizulis vzlata. Ahogy az brn lthat, bevezet-
tnk egy myVariabl e nev(} vJtozt, amely a 103-as memriacmen kezd6dik.
myVariable
vltoronv
rnmm
RAM
elm
'00
'"
'"
'03
",
'"
'"
3.Ubra
A mcm6rl# Il/z/llls ml1Rfelcl6Jc
Aprop6
Mi is az a RAM?
A RAM a Random Acces Memory (vletlen elrs memria) rvidftse. Ez az az
elektronikus memria, amelyet a szmftgp a program vgrehajtsa sorn hasz-
nl. A szmtgp kikapcsolsakor a RAM-ban trolt minden informci elvsz.
Amikor a programunkat futtat juk, az a merevlemezen tallhat fjlbl a RAM-ba tl -
Ugyanfgy a vltozk is a RAM-ban jnnek ltre. Amikor a programozk a me-
mrit emltik, valjban a RAM-ra gondolnak.
Mem6riafoglals
Amikor C++-ban meghatrozunk egy vltoz6t, a fordtval nem cs:.k a nevt kell k-
zlnnk, hanem azt is, hogy milyen cpus informcit fogunk :.bban trolni: egsz
sz,mm, kamkt.ereket, s gy tovbb. Ez a vltoz tpllsa. A msik kifejezs, amellyel ez-
zel kapcsoJmosan tallkozhatunk, az adaffpus. A vltoz tpusa meghatrozza a ford-
t szmra, hogy mekkont ten:.iletet foglaljon le a memriban a v ltoz ertkIlek tro-
lshoz.
Mi ndegyik cell a egy bjt mren. Ha a ltrehozoct vltoz kl bjt mren, kt bjtm
van szksge a memriban, azaz kt ceUra. A vllQZ tpusa (pldul: int) hatrozza
meg a fordt szmra hogy mennyi memrit (h ny memriacell t) kell lefoglalnia
a vlt oz s;dI1llra. Mivel a szmtgp bitek s bjtok formjban fejezi ki az rtkeket,
s amemria mrett is bjtokban mri. Nagyon fomos megrtennk ezeket a fogal-
makat s otlhonosan mozognunk kzttk.
3, ra Vltozk s llandk 139
Az egsz szmok (Integer) mrete
Egy char tpus vltoz (karaktNck trolsilm hasznljuk) szinte mindig egy bjt
hosszsg Egy short int a legtbb szmtg6pen kt bjtosj egy l ong i nt ltalibiln
ngy bjtos, az im trpus v1t07- (short s l ong nlkl) pedig kctt6 vagy
bjt hossz lehet. Ha Windows 95/ 98, Windows XP vagy Windows NT/2000/2003
rendszereken dolgozunk, ngy bjtos inl mrettd szmolhatunk, feltve, hogy
j fordtprogramoL hasznlunk.
m ezt nem szabad kszplmznek venni, mivel nem biztos, hogy minden rendszeren
gy Csak annyit tudhatunk biztosan, hogy l!gy short int mrete kisebb
vagy ugyanakkora mim egy int mrete, valamint hogy egy inL mrete kisebb vagy
ugy,makkor mint egy long int mrete. A adatok krdse mr egy eg-
szen ms trtnet, l:rr61 is hamarosan szt ejtnk.
A 3.1 Lista segtsgvcI mcgCIJlapthatjuk ezeknek a tipusok nak a pontos mrett
az adott szmtgpen, az adott fordtprogramot hasznlva.
3,IIilIta - A .... 611.pItja _PUSH ..- 'siz.',.pp)
o: <iostroam>
"
2 ,
int main ()
{ ) ,
4 ,
5 ,
6 ,
7 ,
8,
9,
10:
ll :
12 :
13 :
14 :
15 :
16 :
17 :
18 :
std : : cout "Egy int t ipus vltoz6 mretc :\t \t" ;
std : : cout sizeof(int)
,
bjt.\n";
std : : cout "Egy short tipus vltoz6 mretc : \t";
std: : cout sizeof(short)
,
bjt . \n";
std: :cout "Egy short tipus vltoz mrete : \t";
std: : cout sizeof(long)
"
bjt.\n';
std: : cout 'Egy char tipus vltoz mrete : \t\t";
std : : cout sizeof(char)
"
bjt.\n' ;
std: : cout 'Egy 0001 t pus vlt.oz mrete : \t\t";
std: : cout sizeof(bool)
,
bjt . \n' ;
std: : couL 'Egy fl oat tipus vltoz mrcte : \t\t';
std: : cout sizeof(float )
.
bjt.\n' ;
std: : cout "Egy double tpus vltoz mret e : \t";
std: : cout s1zeof (double)
.
bjt . \n ' ;
19 : return O;
20 :
40 II. rsz Bevezets a C+ + programozsi nyelvbe
Kimenet
Egy int tipus vltoz mr ete: 4 bj t .
Egy short tipus\ vltoz mrete : 2 bjt.
Egy short t pus vl toz mrete : 4 bjt.
Egy char tipus vltoz m6retf! : 1 bjt.
Egy bool tipus vltoz m rete : 1 bjt.
Egy float tipus vl toz mrete: 4 bjt.
Egy double tipusu vl toz mrete: 8 bjt .
Aprop
A futsi eredmny lehet
Az olvas sajt szmtgpn futtatva a programot eredmnyt kaphat.
A 3.1 Lista legtbb eleme azonnal lthet6. Az egyetlen jdonsg ti kdban az 5. s 15.
sor kitt tallhm sizeof () fggvnyhvsok sorozata. Ezt a fggvnyt a fordt6prog-
r:.lmunkkal k.apotL knyvtr tartalmazza s annak az objekwmtpusnak a mrct6L adja
vissz,!, amelyet. pHramterknt tadunk neki. Pldaknt az 5. sorban az int kulcsszt ad-
tuk t a sizeof () fggvnynek. A sizeof () hasznlatvalmegllaptotluk, hOh'Y
az adott gpen az int eh'Yenl6 hosszsg a long tpussal, mivelmindkett6 ngy bjtos.
signed s unsigned
Az sszes tpusnak kl fajtja van: el6jeles (signed) s el6jel nlkli (uns i gned).
knt szksgnk van negatv szmokra, nincs. Az egsz tipusokat (short s
long) az unsigned kulcssz nlkl el6jelesnek tekinti a fordt . A s igned egsz tpusok
lehetnek negatvak s pozitvak egyarnt. Az unsigned cgs:.::ck mindig pozitvak. Ne
feledjk: a signed az alaprtelmezett az tpusoknL
Mivel a vltoz bjtokban (ennlfogva bitckben) meghatrozott mrete mind
a signed, mi nd az uns igned egszek esetben ugyanakkora, egy nlkli egsz
tpusban ktszcr akkora rtket tudunk trolni, mint egy egszben. Egy
unsigned short tpus vltoz O s 65535 kztt tudja brzolni a szmokat. Egy
signed short ripus vltoz ltal brzolt szmok ICle negatv, ennlfogva II signed
short s 32767 kztti szmokat trolhat.
Tudta hogy ... ?
Bitek a signed s unsigned tpusok esetben
Az egszeknl egy bitet maghoz az trolshoz hasznlunk.
nlkli tpusok esetben ezt a bitet is szmok trolsra hasznljuk. Ha megfigyel-
jk, akkor lthat a signed s unsigned esetekben a trolgat rtkek szma azo-
nos, a klnbsg teht csak az brzols mdjban van.
3,6ra Vltoz6k s lland6k 141
vltoztfpusok
Szmos egyb vltoztpus van mg a C++-ban, amelyek nem .:;orolhatk az eddig tr-
gyait egsz tpusok kz. llyenck pldul a s karakter tpus vltozk
A (float) vlLOzk l(lrtszmok formjban rtkeket, azaz
vals szmokat trainak. A karakter (char) tpusok egy bjtot foglalnak magukban, s
a 256 ll ASCII illetve kiterjes .... tetL ASCII karakterkszlet karaktereinek troI-
srd
Az ASCll karakterksz/el szmtgpes l1asznlalra szabvnyostoLl karakterek halmaza,
Az ASCII mozaiksz6 az American Standard Code for Information Interdlange rvidt-
se. Csaknem valamennyi opercis rendszer tmogatja az ASCII kdk(:s:.dct h<lszn{t!att,
persze sok ms nemzetkzi karakterkszlethez hasonlan.
A C++-ban hasznlt vltoztpusokat a 3.1 Tblzat foglalja ssze. A t{lbh1z,lt tartalmaz-
za a vltoz tpust. vrhat mrett, s hogy milyen tpustl rtkek trolsra szolgl.
A trolt rtkeket a v ltoztpus mrete hatrozza gyhogy ne felejtsk el a 3.1
Lista kdjnak kimenetvel sszevetni.
r 3, 1 Tblzat - Vhoz6tlpu.ok
Tpus Mret rtkek
unsigned short int 2 bjt 0-65535
short int 2 bjt 32768-,32768
u!1signed long im 4 bjt 0-4294967295
long inl 4 bjt
int. 4 bjt 214748364&-2147483647
unsigned int <I bjt 0-4294967295
char 1 bjt 256 fle ka rakter
bool 1 bjt igaz vagy hamis
float 4 bjt
double 8 bjt
Br sokan gy tartjk, hogy ez rossz programozi gyakorlat, dc a char tpus vltoz-
kat hasznlhat juk nagyon kis egsz szmok trolsra is.
I
42 11. rsz Bevezets a C++ programozsi nyelvbe
Egy vltoz meghatrozsa
Vhoz6t annak tpusnak megads.'ival, majd egy vagy tbb sz6kzt a vlto-
z nevnek lersval, lt:z{irva k.szthelnk, illetve hatrozhatunk
meg. Egy v,1ltoznv csaknem brmilyen tartalmazhat , de nem. rvnyes
vltoznevek pldul a kvetkez6k: x, J23qrsnf, myAge. A j vltoznv kifejezi,
hogy azt a v;ltozt !lure is hasznljuk. A megfelelS m:veket hasznlva knnyebb vlik
a progmm folyamatnak megrtse. A kvetkezO: utasts egy myAge nev egsz tpu-
Sli vltoz6t hatroz meg:
int myAge;
Ne feledjk, hogya CH rzkeny a kis- s nagybetuk kzli klnbsgre, azaz a myAge
s a MyAge kt vltozt jell. ltalnos progr.:unoz6i gyakorlatknt pr6bl-
junk olyan v,lItoz61l\.!veket :Idni, amely llta! arra, hogy milyen clra hasznljuk az adott
vltozt. A eletKor s a mcnnyiAzAnnyi vltowneveket knnyebb megrtennk s
eml(:keznnk rjuk, mintha xJ4, v<lgy egeszErtek neveket adtunk volna nekik.
De nzznk egy hosszabb pldt Pr6bljuk meg kitallni az els6 pfir sor alapjn, bogy
mit csinlnak az albbi kdrszletek.
1. plda:
main()
(
unsigned !:lhort X;
unsigned short y ;
unsigned int z ;
z = x * y;
2. plda:
main()
(
unsigned short Szelesseg;
unsigned short Hosszusag ;
uns i gned int Terulet;
TerOlet = Szelesseg * Hosszusag ;
A kis- s nagybelk eltr
A CH rzkeny a kis- s nagybetk kzti klnbsgre. Magyarul a s
a a fordtprogram megklnbzteti. Az age s <lZ Age vltozk en-
nek s mindkettejkt61 klnbzik az AGE vl toz.
3. ra s llandk 43
Aprop
Ne zavarjtok betimet!
Nhny fordt megengedi a kis- s nagybetk kzti klnbsgttel ki kapcsolst.
Ne essnk. ebbe a kisrtsbe; a programunk nem fog ms fordt kkal, s
a tbbi C+ + programozt is sszezavarj a a forrskdunk.
Sok programoz szeret csupa vltowneveket hasznlni. Ha a nv kt szbl
ll (pldul my car), kl elterjedt konvenci szeri nt nevezbetjk el my_car vagy
myCar. Ez utbbit teve jellsnek (carne! notatioo) nevezzk, mivel a nagybetk gy
nznek ki, mint a ppok. Tekimhctjk gy is, hogy ezek a nvadsi szoksok .Uni."("
s .Microsoft" strlusok. Azok a progmmoz6k, akik Unixon tanujlak, s hosszan dolgoz-
tak Unix krnyezetben, az stlust vlasztjk. Ezzel szemben a Microsoft rendszeren
nevelkedett fejleszt6k igyekeznek a msodik vltozatot hasznlni. A fordt6progr:lmot
mindez persze nem igazn rdekli, csak legyenek a vltoz6neveink
Kulcsszavak
Nhny sz foglalt II C++ szmra, ezek nem h,lsznlhatk vltoz6nevl;!kk6nt. Ezek
azok a kuksszavak, :Imelyeket a fordt hasznl a progmlllunk
vak pkl(lul az :l1{lbbiak: if, while, for s main. ltalban vve minden rtelmes vl-
toznv bizonyosan nem kulcssz.
A vltozink L:lrtalmazh:lmak kulcsszavakat a nevk rszeknt, de nem ll hatnak csak
abbl. Az olyan vltoznevek mint pldul main_nag vagy forEver megengedettek, de
a main vagy a for nevek nem.
[ HoIyn
Ilalroz7.uk meg a vllOZl a
nak majd nevnek megadsval.
HasznMjunk beszdes vltoz6neve-
ket.
Ne feledjk, hogya C++ rzkeny
a kis- s kzti
sgre!
DerL<;k ki, hogy sajt
kn az egyes vltozk mekkora me-
mriaterlet foglalnak, s mekkora
rtkeket trolhat unk bennk.
Ne has;m:ljunk v: ltoz6nvkm C++
ku1csszavakall
Ne hasznljunk el6jeJ nlkli
kat negatv szmokhoz!
I
44 11. rSZ Bevezets a C++ programozsi nYeNbe
Egynl tbb vltoz6 megadsa egyszerre
Egynl tbb azonos tpus vltoz61 is ltrehozhatunk egyetlen ha a vl toz
tpu.!:ia utn vessz6ve\ elvlasztva rjuk le az egyes vltozneveket. me egy plda:
unsigned int myAge, myWeight :
long area, width, l ength :
Ilkt el6jel nlkli egG2 vltoz
Ilhrom long tpus vltoz
L<1that6, hogy a myAge s a myWeight vltozkat egyarnt cl6jel nlkli egszknl ha-
troztuk mg. A m.!:iodik sor hrom nll 6 long tpus V{lltozt hatroz meg arca,
widht, length nevekkel. A tpus (long) mindhrom vltozhoz hozzrcndel6dik, azaz
nem keverhet jk a tpusokat a vltoz6k meghat rozsnl.
Aprop6
Hogyan frjunk hasznos megjegyzseket
A magyarz megjegyzsek elhelyezse a vltozk meghatrozsa utn ugyanazon
sorban j gyakorlat. Nemcsak minket emlkeztet a vltoz cljra, hanem tmpon-
tot nyjt a tbbi programoz szmra is ezzel kapcsolatban mg akkor is, ha neve
erre esetleg nem utal.
rtkek hozz rendelse a vltoz6khoz
A vltozknak a hozzrendel6 opertor (=) segtsgvel adhatunk rtket. Ennek meg-
felel6en a Wi dht vlt oznak az albbi mdon adhat juk az 5 rtket:
uns i gned short Widht ;
Wid th - 5:
sszekapcsol hat juk a kt lpst s kezd6rtket adhatunk a v: ltoznak II meghatro-
7.skor gy:
unsigned short wi dth c 5;
A kezd6nk megadsa nagyon hasonlt az egyszeru rtkadsr-.J. , s az egsz tpus
vltoz6knl alig va n klnbsg a ken kZLt. ami kor az ll andkrl fogunk
beszlni , ltni fogj uk, hogy nhny elem esetben ktelez6 II megadsa,
mivel ks6bb m r nem tudunk rtket hozzrende1ni.
A 3.2 sta bemutat egy fordtsm ksz programot, amely egy tglalap terlett szmtja
ki, majd kirj a a a kperny6re.
3.2 Lista-A __ ak _ (lII8VIIr.cpp)
0 , II A v lato26k hasznl atnak bemuta tsa
l , l i nclude <iostream>
2 ,
3 : int main()
4 ,
5 ,
6 ,
7 ,
unsigncd short int Width
Length" 10 ;
3. ra Vltozk. s ll andk. 145
5, Length ;
8: II ks zi t egyeloj e l nlkl i egsz vl toz6t , kezdortkknt
9 : I I a szl essg s a hosszsg szorzatval fel tl t ve
10 : unsigned short int Ar ea " Wi dth * Lengt h:
11 :
12 : std: : cou t .. Sz les sg : Width \ 0 ;
13 : std: : cout 'Hossz s g : Lengt h s td : : end l :
14 : std::cout ' 'l'erlet : Area std: : e nd l ;
1 5 : return O;
16 :
menet
Szl essg : 5
Hosszsg : 10
Terlet : 50
Elemzs
Az sorban beemeljk a cout utasts haszmlat{jhoz szksges iostream fggvny-
knyvtrat az inclllde utasits segitsgvel. A program a 3. sorban
Az 5. sorban a wi d th nev(!' v ltozt nlkli egsl.knt hatroztuk meg,
tkt S-re Jltottuk. Egy msik egsz tpust is meghat{lroallnk Lengt h nven, cic nem
adtunk neki A 6. sorban rendeltk hozz a ]0 rtkel.
A tizedik sorban al. Area nev(!' egszet hatroztuk meg, a Width s
Height v{l ltozk szorzatt adtuk. A 12-14. sorig a vltoz rtkeit rtuk a kimenetre.
Megemltjk mg, hogy az endl kulcssz sortrst vlt ki.
Aprop
Sor lezrsa
typedef
Az endl kifejezs a sor lezrsrt felel (end-L s nem end-egy). ltalban gy ejt-
jk: "end-ell".
frasztv, unalmass s ami ennl is fontosabb lehetsges hibaforrss vlik
az unsigned short int folyamatos lerogatsa. A typedef kulcssz hasznlatval szina-
nilllt kszthetnk egy mr llleglv6 tpusra, amelyet a vltoz tpusnak Illeghatro-
zsnl hasznlhatunk.
46 11. rsz Bevezets a C+ + programozsi nyelvbe
Fontos megklnbztetnnk az j tpus l6trchozst61. (Ezt a 7. 6rb'ln az alaposzt-
lyok trgyalsnl fogjuk megismerni.) II typede f hasznlata gy trt(:nik, hogy
a t ypedef kulcssz utn rjuk a tpust, majd a tpus j nevt. Pldul a
typedef unsigned short int USHORT
utasts egy j tipusnevel hoz ltre, amelyet mindenhov lerlJatunk, ahol unsigned
short int-nek kellene szerepelnie. A 3.3 Lista a 3.2 Lista kdjnak olyan talaktsa,
amelyben tpusmeghatroz{lsknt az USHORT nevet h<lsznljllk az unsigned short int tl-
pllsnv helyett
3.3 Ulla - A typedef ....... __ 'typedef.eppl
1 : II A typedef kulcssz hasznlat4nak bemutatsa
2: tincludc <ios t renm>
3 ,
4: t ypedef unsigned short int USHORT:
5 ,
6 : int mainO
7 : {
8 ,
9 ,
USHORT
USHORT
width
Length;
10 : Lengt h = 10 ;
5,
11: OSHORT Arca Wi dth * Length;
I ltypedef meghat rozs
12 : t d : : cout "Szleasg: ' Width "\ n ' ;
13 : std : : cout ' Len'ijlt h std : : endl ;
14 : !:ltd : : cout "Terlet : " Area std : : endl ;
15 : return O:
16 :
ICiIllll1ll
Szlessg: 5
Hosszsg : 10
Terlet : 50
Aprop
Nem lnyegtelen, ha szksgnk van rjuk
A fenti kdot lefordtva nhny fordt figyel meltet zenetet dob "konverzi sorn
lnyeges szmj egyek veszhetnek el" felkiltssal. Ez azrt van, mert a 11. sorban
ltrehozott kt USHORT tpus vltoz szorzata nagyobb lehet, mint amekkort egy
unsigned short trolni tud, s ha ezt a szorzatat az Area vltoz6ba tesszk,
az a szm csonktsval jrhat. A fenti esetben ezt az zenetet nyugodtan figyel-
men kvl hagyhatj uk.
-
A 4. sorban a Lypedef segtsgve! meghalroztuk az USHORT lpust, amely az uns ig-
ned short int tpus szinonimja. A program egybknt megegyezik a 3.2-es Listban
bemuratottal, s a kimenet is ugyanaz.
.3. ra s llandk 147
gy is gondolhatunk a typedef -re, nlintha az az alapjul szolgl meghatrozsI
(unsigned short int) helyeuesten brhol, ahol lerjuk (USHORT).
Mikor hasznljunk short s mikor long tpust
A kezdd C++ programozknak gyakran okoz fejtrst, hogy !lukar kell egy vltozI
shon ill etve long tpusknt meghatrozni. A szably, miutn megnettk, egszen
egyszeru. lia a legcseklyebb esly van arra, hogy a krdses vltozban trolni kvnt
nk tl nagy lesz a v31loz tpushoz kpest, hasznljunk nagyobb mren1 tpust.
Ahogya 3.1. Tblzatban lthaltuk, az unsigned short lpusCJ egszek, felttelezve hogy
2 bjl mrctt1ek, 65535-ig tudjk brzolni a szflmokat. A signed short tpusak ermek
a felig . Az unsigned long egszek elkpeszl6cn nagy szmokalludnak trolni
(4294967295), de mg mindig elgg korltozottak. lia ennl is nagyobb sz{irnok trol-
s ra van szksgnk, hasznljtmk float vagy double tpusokat, ezeknl viszont elve-
sztjk a pontossg egy rszt. A lebeg6pol11oS s dupla hosszsg lpllsok hatalm,ts
szmok trols1rn kpesek, de csak az 7 illetve 19 szmjegy lnyeges a legtbb
rendszeren. Ez azt jelenti, hogy az ezek utni sz,mjegyeket ;t sz;'i mtg(:p lekerekti.
nlkli egszek tlcsordulsa
Az a tny, hogy az unsigned long tpus egszek nem kpesek trolni bizonyos n-
keknl nagyobbat , csak ritkn okoz problml. De mi van akkor, ha kifutunk a mem-
riaterletl:>l?
Amikor egy el6jel nlkli egsz elri a maximlis rtkt, krbefordul, s jrakezdi, ha-
sonlan mint az autk ki lomterrja. A 3.4 Lista azt mutatja, mi trttlik, ha tl nagy
rtket pfb:1lunk egy short tipus egsz vltoz6hoz rendelni.
3.4 llIta - Bemutatja. mi t6rt6nlk. h8 11 nagy rtket pnlb6l k _rendoIni oI6jo1
n6lkll11 og6u riltoz6h .. (toobiau.cpp)
o: #includc <iostrcam>
l ,
2 : int main()
3 ,
4: unsigned shor t int smallNumber;
5: smallNumber 65535 ;
6 ,
7 ,
8,
9,
10 :
ll :
12 :
!ltd: : cout small
smaIINumber++ ;
std: :cout small
smaIINumber++ :
std : : cout 'smaII
return 0,
number:


number :

smallNumbcr std : : cndl;
smallNumber std : : cndl;
smalINumber std : : endl;
1
48 11. rsz Bevezets a C+ + programozsi nyelvbe
small number: 65535
small number: O
small number: l
A 4, sorban a smallNumber vltozt short im-knt hatroztuk meg, ami a fultat
sz:'untgpcn 2 bjt hosszsg. Ez azt jelenti, hogy legfeljebb O s 65535 kztti sz-
mok trolsra alkalmas. Az 5. sorban a maximlis rtket rendeltk a vltozhoz,
amelyet a 6. sorban ki is rattunk.
A 7. sorban megnve[tk a smallNwnber vl toz rtkr, azn hozz1iadtunk l-et . A n-
vt:l6 opedtor a ++ (gy millt a C++ nevben: inkrementli san a C-b(1).
A smallNumber vltoz rtknek most elvileg 65536-n:lk kell ene lennie, de
az unsigned short egszek nem tudnak 65535-nl nagyobb rtket t[lrolni. A vlToz6
taltalma gy krbefordul, vagyis O-ra lL Ezt mttuk ki a 8. sorban.
A 9. sorban a smallNurnber rlkt jbl megnveltOk, az j rtke 1 lett , amelyet
szintn kirartunk.
Az egszek kmefordulsa
Az el6jeles egsz abban klnbzik az el6jel nlkli hogy a rt-
kei nek fele negatv. A hagyomnyos kilomter6m helyet kpzeljnk el egy olyat,
:Imely forog a pozitv- , htrafel a negatv szmok esetn. A nulltl mrt egy ki-
lomter tvolsg lehet l s -1 is. Amikor kifulunk a pozitv szmokbl, rgtn a legna-
gyobb negatv szmf:1 ugrunk, s innen szmolunk visszafel nullig, A 3.5 Lista azt
mutatja, hogy mi trtnik, ha hozzadunk l -et az unsigned short egsz tpus v!(O-
z6nk ImximJis rtkhez.
3.5 Us" - B ...... tja, ml trtnik, ha tl nagy rtket pnlblunk hozz6rendelni al6101 ..
oglZ vhoz6hoz jtoobigs.cpp)
o: Jlinclude <iostream:>
1.
2 : int main()
<I: short int
5 : smallNumber = 32767 :
6: std: :cout 'smal l nWllber:' smallNumber std : : end!;
7 :
8: std: :cout 'small number:' smallNumber std: :endl:
9 :
3. ra Vltozk s llandk ( 49
10 : std: : cout "smal l number : ' sma l lNumber std: : endl;
l l : return O;
12 :
smal ! number : 32767
smal l number : - 32768
small number : - 32767
r
A 4. sorban a s mallNumber neV vltoz6t ezttal signed shan tpus egszknt hatroz-
tuk meg, (Ha kln nem adjuk meg, hogy nlklit szeretnnk, automatikusan
jeleset kapunk.) A program ub'Yangy folytatdik, mint az esetben, de ered-
mny egsz ms. I !ogy j61 megrtsk II fenti eredmnyt, tudnunk kellene, hogy egy
jeles egbz ponlosan hogyan is brzo16dik bit szinten, vagyis k6L bjtot elfoglalva.
A lnyeg mindazonltal az, hOh'Y habr pont gy llHlkdik, mint egy n lkli
egsz, az egsz a legnah'Y0bb pozitv nkh61 a legkisebb m.:gmv rtkbe
fordul t. A -32767-r61 cskkent jk az rtkl, -32768-at kapunk, tovbb cskkenlve
32767-et, 32766-ot, s igy tovbb.
llandk
A vlloLkhoL hasonlan ,lZ < lland6k is adaltroJ6 memriat eriil etek. m amg a v lto-
zk rtke V[t llOzhal, addig, ahogy m{tr bizonyra rjttnk, aL ll,mdk nem.
Meghalrozskor az llandnak kell adnunk, aztn m, r nem ren-
delhetnk hozz j rtket. Miutn egy {t ll and megkapta a ere-
d6en az ltke lland.
A C++ ktfle llandt ismer, ezek: nyelvi lland (li tera!) s nevestett lland
(symbolic).
Literlis llandk
A literli s lland egy olyan rtk, amit egyenesen a programk6dba runk, ahol arra
szksgnk van.
i n t myAge " 39 ;
A myAge egy int tipus vltoz, a 39 pedig egy nyelvi lland. A 39-hez nem rendelhe-
tnk rtket, s nem is vltoztathat juk meg azt.
50 II. rsz Bevezets a C++ programozsi nyelvbe
Nevestett (symbolic) llandk
A nevestett llandk olyan llandk, amelyeket a nevk azonost, akrcsak a vltoz-
kat. A vl tozkkal ellenttben azonban az rtkk a bevezetst kvet6en nem vlLaz-
tathat meg. Ha van egy programunk egy tanul ok s egy oszt alyok vllOz6val,
az osztlyok sz.,"mnak segt.<;gvel ki tudjuk szmtani , hny lanulnk van, ha tudjuk,
hogy minden osztl yba 15 tanul jr:
tanulok os ztalyok * 15;
Aprop
Az opertorunk
A opertor a szorzst jelli. Az opertorokrl szt ejtnk.
A fent i pldban a 15 nyelvi konstans. A kdunk knnyebben karb:tntarthat6 s olvas-
hat volna, ha ezt az rtket egy nevestett llandv:tI helyeuestennk.
= oS7.talylet$zam:
Ha a gy dnten&nk, hogy megvltoztatjuk a tanulk szmt az egyes
osztlyokban, megtehetjk azon a helyen, ahol bevezettk osztaletszam llandt, anl-
kl, hogy a programban [m1shol brmit is vt'tl toztatnunk kellene. igy ni ncs az a kock-
zat, hogy esetleg valahol elfelejtjk trni , ami azt.'n nehezen kinyomozhat logikai hi-
bt eredmnyez.
lland bevezetse a #define kulcsszval
Ha a rgimdi, veszlyes, rszben helytelen mdon szeretnnk lbndt bevezetni, gy
tehetjk meg:
ndefine osztal ylet8zam 15
igy hatroztuk meg az llanclkat a rgi C vltozatokban. AztflO az ANSI szabvliny be-
vezette const ku1csszt a C nyelvbe is. Figyeljk meg, hogy a osztalyleL'i7..am lland-
nak nincs rgztett tpusa (int, cha r stb.). A #defi ne egy egyszeru szvegbehelyette-
stst csinl. Valahnyszor az el6feldolgoz6 a osztalylctszam szval tallkozik, a 15 r-
tket teszi :il helyre a k6dszvegben.
Mivel az el6feldolgoz a fordtprogram el6tt fur, a fordt soha nem ta llkozik az l-
landnkkal , a 15-s szmot ltja hdycne.
3, 6ra Vltozk s 51
lland bevezetse a const kulcsszval,
Hab,r a IIdefine is mt1kdik, a C++-ban van egy jobb, kevsb egszsgtelen s sok-
kal zlsesebb mdja a konstansok bevezetsnek:
const unsigncd short int = 15 ;
A remi plda szimn egy osztalyletszam nevestett llandt vezet be, dc ebben
az esetben az lland6nak tpusa is van: unsigned short int.
Tovbb tart ugyan begpelni , de a hasznlata d6nnyel jr. A legfontosabb k-
lnbsg, hogy az lland tpussal rendelkezik, gy a rordt knyszert bennnkel,
hogy a tpusnak megfelele> mdon
Felsorolt (enumerated) llandk
A felsorolt lland6k ii llandk halmaz.t jelentik. Meghatrozh:llunk pldul egy felsoro-
lst SZIN nven, majd meg:ldhatjuk, hogy erulek tfle rtke lehet: PIROS, KEK, ZOLD,
FEHER s FEKETE.
Nyelvtanilag 3 felsoroiL llandk bevezetse a kvetkez6kpp nz ki: hasznljuk
az enum kulcssz6t, II tpus nevt, majd kapcsos zrjelek kzt: rjuk elv-
lasztva a lehetsges nkekcl. me egy plda:
en\lm SZIN ( PIROS , KEK, ZOLD, FEHER , FEKETE ) ;
A fenti utasts kt feladatot hajt vgre egyszerre:
l. Egy felsorolst vezet be SZIN nven, azaz ltrehoz egy j tpust.
2. Ltrehoz egy PIROS nevesten llandt O rtkkel, egy KEK nevestett
lland6t 1 nkkcl, egy ZOLD nevestett ll andt 2 rtkkel, s gy tovbb.
Minden felsorolt llandnak megfeJel teht egy egsz rtk is. I [a kln nem adjuk
meg, akkor az ,\lland a O rt.ket kapja, a tbbi pedig mindig eggyel nagyobb
az Az llandknak persze adhatunk egy meghat:rozott rtket is. Il yenkor ha
vala melyiknek az rtkt nem hatrozzuk meg explicit m6don, akkor az az el6tte le-
v6nl eggyel nagyobb rtket kap. Lssuk mindezt egy pld:n keresztl:
cnurn Szin { PIROS=lQO, KEK, ZOLD=500, FEHER, FEKETE=700 J;
A PIROS rtke 100 lesz, a KEK rtke 101, a ZOLD rtke 500, a FEHER rtke SOl , v-
gl pedig II FEKETE nev 700.
Ermek a megoldsnak az az hogy nvvel hivatkozhatunk az amgy jelents nl-
kiHi sZmokrd, jelen esetben 1 vagy 700 helyett azt rhat juk, ho&'Y FEKETE vagy FEHER.
52 11. rsz Bevezets a C++ programozsi nyelvbe
Bevett szoks, hogy mind a hagyomnyos, mind felsorolt llandk neveit csupa
rjuk. Ez ltsra is nyilvnval v teszi, hogya nb, amit olvasunk, egy
lland, s nem valamilyen vltoz, amelynek megvltoztathatnnk az rtkt. A ford-
tprogram maga klnben nem sokat azzal, hob')' kvetkezelesen nevezzk-e
el a vltozkat s az IJandkat, ezzel teht csak a sajt s embertrsaink lett
knnyt jk meg.
Krdsek s vlaszok
Krds: Hu ti short illf lpusok tlilcsordu/halnak. mi/111em hasz n/unk nllIdig /ollg
tpl/sli (xUtozkal?
V/asz: Mind a short mind a long egsz tipusok t1csordulhatnak, de n long tpus
egszek ezt sokkal nagyobb szmok esethen teszik csak. Ugyanakkor a legtbb g-
pen a hossz egszek ktszer annyi memrit fogb lnak. Nyilvn, ez ma mr kisebb
problma, mim rgen, mivel a legtbb szemlyi s7!tmtgp memri ja tbb millinyi
(ha nem millirdnyi) bjllJl ll.
Krds: Mi /r/llik, ha lelx!gfipon/os tpllS helyett ep,C-szhcz ref/ddtil/k Ifzedcsjc8gyel
nmdelkcz szmot, //Iint p/dlll az albbi sorba II :
int aNumbcr z 5.4;
Vlasz: Egy j fordtprogr::un ugyan egy figyelmeztetst az effle megoldsokra,
de az rt kads ilyen mdj.t megengedett. A hozz rendelt szmot a fordt ilyenkor
egssz csonkolja. gy teMr ha az 5,4 rtket rendeljk egy egsz rpus vltozhoz,
annak rtke egyszt!ruen S lesz. gyeljnk r , hogy ez a adatveszrssel jr, va-
gyi s ks6bb hiba prbljLIk meg az tplts(t vltoznk rtk61 cgy lebt!g6p()nIOS
lpusba thelyezni, annak az rtke is 5 lesz.
Krds: Mirt ne haszllljllnk Ilye/vi OiterlisJ llwuJkati mit1 kell nevesftelt l/clI/-
dk bevezclsvel tltentlllk a drga
VlCIsz; lia sok helyen hasznljuk ugyanazt az rtkeL egy progmmban, akkor a neve-
stdt kons\;\nsok segL<;gvcl az sszes megvitoZlalltaLjuk gy, hogy
egyetlen helyen rrjuk az rlC:ket. A neveslett llandk radsul elruljk magukrl,
hogy mksodk. ltalban pldul nehz lehel rjnni, hogy egy szmot mirt is szo-
rozumk mt!g ppen 90-nel, dt! ha azt olvassuk valahol a kdban hogya derekSzog
sokkal knnyebb dolgunk van.
3. 6ra s llandk 153
Gyakorlatok
Most mr kiprblhatjuk a vltozk s llandk Vlaszoljunk erre a n-
hny krdsre, s csi nlj unk feladatokat, hog)' meger6stsk a fordtprogram
dsvel kapcsolatos tudsunkat.
Kvz
1. Mirt nlkli vltoz6kat hasznlni helyett?
2. Mi a klnbsg a kezdrtk megadsa s a vltoz meghatrozsa kztt?
3. Azonosak-c II DOG, dog, Dog, s a doG vltoz6k?
4. Mi a klnbsg a IIdefine s a const ut.1stsok kztt?
Feladatok
1, Egsztsk ki rt 3.1. Li stban programot gy, hogy az sszes, a 3.1. tllb-
lzalbar1 vltoz6tpusr tarta lmazza. A kapolt rtkek lehetnek
azoktl, amelyek a tblzatb,lll szerepelnek!
2, Gondolkozzunk el azon, hogy mlyen szmokkal s egyb informcival tal<1l-
kozunk mindennapi letnk sorn, Milyen tpus vltoz6kban lenne a legjobb
ezekcllrolni? Milyen beszdes neveket adhatnnk ezeknek a vll llozknak?
3. Ha van tapasztalt programfcjlesa6 ismcr6snk, krdezzk meg t6le, hogy mi-
lyen vltoz6elnevezsi stratgilll haszn:ll? Ha elg sok ismer6snk van, tapasztal-
ni fogjuk, hogy klnbz6 mdszereket alkalmaznak. Krdezzk meg 6ket,
hogy mirt. Lehet, hogy meglep6dnk majd a vlaszokon,
1. Az nlkli egszek nagyobb pozitv smok trolsra alkalmasak, mint
az Ugyanakkor nem vehetnek fel negatv rtkeket. Programozknt
a mi feladatunk eldnteni , hogy melyik a l(:!gjobb vlaszts egy konkrt probl-
ma megoldsra.
2. A meghatrozs (definci) az, amikor adunk egy tpust s egy nevet egy
hasznhli kvnt vltoznak. A kczd5rtk megads.1 (jniciali zci6) ezzel szem-
ben az rtk hozz rendelse a7. adon vltozhoz. A meghatrozs s a kez-
d6rtk megadsa szerepelhet ugyanabban az utastsban is.
3. Nem, nem azonosak. A C++ klnbsget tt!sz a kis- s a nah'Ybetk gy
mindegyik rsmd kJnbz6 v ltozkat jelent :1 fordt6progmm sz.imm. Azt,
hOh'Y milyen elnevezsi konvencit hasznlunk, neknk, vagy a Illunkacsopor-
runknak kell eldntenie.
4. A IIdefinc egy <ll.: eJ6feldolgoz6nak szl6 utasts, :Imely nvvel helyettesti
a meghatrozot! rtkeket (nyelvi lland6kat). Hatsra az e16feldolgoz6 a nv
miden d6fordulsi helyre behelyettesti a megadott t:rtket. A const min6st6vd
bevCl.:clett vltoz ezzel szemben csak Cgy helyen fordul e16, s van tpusa is.
4. RA
Kifejezsek s utastsok
Ebben az rban a kvetkez6krllesz sz:
Mi az utasts?
Mi a kifejezs?
Mtlveletek opertorok kal
Ig:lZ vagy hamis - logikai
Utasrtsok
Utastsokbl idnytjuk a program futst, rtke1hetnk ki kifejezl!sckct, vagy specilis
esetben (null) nem hajtunk vgre :;emmit. C++-ban minden utastst zr.
me egy plda egy nagyon egyszeru utastsra:
x = a 1" b ;
A matematikval ellenttben ez nem azt jelenti, hogy x egyenl6 a s b sszegvel, ha-
nem azt, hogy a s b sszegt rendeljk x-hez. Rviden: a s b sszegt helyezze el
a program x-ben. Noha ltszlag kt hajtunk vgre ezzel az utastsS<'lI, mg-
56 11. rsz Bevezets a C++ programozsi nyelvbe
__ ----=-1.::-=---==='--'-==== _ ________ _
is csak egynek szmt, ezrt csupn egy pontosvcssz6vel zrjuk le. A hozzrendelsi
opertor a jobb old:llon tallhat kifejezs eredmnyt hozzrendeli a baloldalon tall-
hat elemhez.
helyek
A szkz, a vzszintes tabultor s az jsor karaktereket gynevezett res karJkterek
(whitespace). A fordt automatikusan fib'Ye\men kvl hagyja az felesleges res helyeket,
b'Y egy szkz helyre nyugodtan rhatunk tabul<1tort vagy jsor karaktert is. Az res ka-
rakterek els6.sorTh1n az olvashat6sgot javtjk, a fordt nem foglalkozik velk.
A korbban bemutat.ott l1kadsunk:
rhat akr gy is:
x .a
b
Noha a msodik megolds is hibtlan, mgis butasg. A tabulls fegyver. Meg-
alka lmazsa eset" megknnyti a forrskd olvasst s karbanlartst, ha
nonban SS:lCviSS7';:1 hasznljuk teljesen rthetetle" zagyvasg lesz az eredmny. Maga
a C++ amgy a jzan tl6 kpessgnkrc bZ"';:1 a dolgot.
Pontos megjegyezi, hogy az res kamklerek lnyegesek egy vltoz, vagy egy fgg-
vny nevben, dc ne m LlgyHnazt jelentik, mint Cgy kznsges kamklerlncban.
A secondsPerMinute pldul teljesen m:1st fog jelenteni, ha seconds Per Minute for-
mban rjuk le, (!kkor ugyanis a fordt hrom vltozknl fogja kezelni.
sszetett utasftsok
Minden olyan helyen, ahol szerepelhet egy egyszeru utasts, hasznlhatunk sszetett
utastst (compollnd staternent) is. Az sszetett utasts nyit kapcsos zr6jellel n{" kez-
d6dik, s zr z:1r6jellel "}"
Minden utasts zrul, dc maga az sszetett utasts nem, amint
az a pldban is lthat:
temp'" a ;
a b-
b " temp;
Ez a kd az a s b vltozk tartalmr cserli fel.
4. ra Kifejezsek . uta. lt. ok 157
Minden nyit kapcsos zr6jelnek le-
gyen zr prja.
Minden utasts pontosvessz6vel z-
rul.
Forrsk6dunkban pr6bljuk meg r-
telmesen hasznlni <lZ res karaktere-
ket gy, hogy :. zok ;:rvlsk annak
olvashat6sgl.
Kifejezsek
sszetett utastsaink sose It::gyenek
tl hosszak, hogy tlth:rt6 mar dd-
jon a kd.
A kifejezs olyan ul:l s\.1s a C++-b:lll , amely rtket ad vissza. Minder' ulasl: s
teh5t, de o{:! m minden ut,lst:1s kifejezs.
Sok kdrszlet mcglcp6 m<lon kifejezsknt viselkedik, ak: rCSilk a kvr.:Lkc:.::6 hrom
plda:
3 . 2 /1 visszaad ja a 3. 2 rtket
I
PI
SecondsPerMinutc
/1 lebeg6pontos l land , mel y a 3.14 et adjo vissza
II t ipus kons t ans , maly a 60-at adja vissza
Tekintve, hogya PI egy konstans, amely 3. 14-gyel egyenl6, illetve a SecondsPer -
Mi nut e szintn konstans s 60-al mindhrom utasts egyben kifejezs is.
Az x = a i' b nem csupn sszeadja az a-t s b-t, valami nt hozzirendeli az eredmnyt x-
hez, dc visszaadja az x rtk! is. Ez :L igy szi ntn kifejc:d:snek szmt. Mivel
pedig kifejezs, szerepel het egy nkad opertor jobb oldaln a kvetkez6kppen:
y _ x = a i' b ;
A vagy C: rtkad opertor (=) a baloldalon rtkel fellrja
a jobb olda lon Tallhat kifejezs nkvel.
Az opcl1U1dus egy matematikai kifejezs, ami azt az objektumot jelenti, amelyen
az opertor segtsgvel valamilyen hajtunk vgre. Az imnt bcmutHoTt kd-
sor pldul az albbiak szerint hajtdik vgre:
A program sszeadja a s b nkt.
A kifejezs eredmnyt hozzrendeli x-hez.
A hozzrendels Ilunt kifejezs eredmnyt hozzrendeli y-hoz.
58 11. rsz Bevezets a C+ + programozsi nyelvbe
Ha a, b, x s y egszek vallak s a nke 2, b rtke pedig 5 VOll , akkor x s y rtke
egyarnt 7 lesz. A 4.1 Listban bemutat juk nhny sszeteU kifejezs hasznlatt.
O: ,j nclude <iostrearn>
" 2 : int main()
3 : {
4 : int a=O, b"O, x..,O,
5 : std: :cout 'beforc a : a b : b;
6 : std:: couL x: . x y : ' Y std :: endl ;
7 : a " 9 ;
8 : b " 7;
9 : y _ X " a+b;
10: std: : cout 'after a: ' a b :' b;
11:
12 :
13 :
std: : cout x: " x
return O;
beforc a , b: x: y : 35
after a: 9 b: 7 x : 16 y : 16
y !:ltd : : endl:
A 4. sorban s inicializljuk a vltozkat. Az 5. s 6. sorban kiratjuk az c*
tkeiket. A 7. sorban az a rt6kt 9*re v{lltoztatjuk, a 8. sorban a b rtkt pedig 7*re.
A 9. sorban kisz:.moljuk a s b sszegt s hozzrendeljk azt x*h(!z. Miutn az x=a+b
kifejezs kirtkelse megtrtnt, ennek eredmnyt hozzrendeljk y*hoz.
Opertorok
Az opertor olyan jel, amely utastja a fordtt a megfeJel6 elvgzsre.
opertor
Az rtkad opertor baloldaln tallhat kifejezsI ball1knek (I*va]ue), a jobb oldali
operancJust pedig jobbnknek (r*value) nevezzk.
Aprop
Konstans csak jobbrtk lehet
A konstans jobbrtk, fgy nem szerepelhet rtkads baloldaln.
x ,, 35 ; /1 gy helyes
35 = x; /1 ez helytelen , konstans nem s zerepelhet baloldalon
4, ra Kifejezsek s utasftsok 59
Abalrtk (l-value) a kifejezs bal oldabn szerepelhet, mg ajobbrtk (r-value) a kife-
jezs jobb oldalra kerl. Jegyezzk meg, hogy ntinden balrtk szerepelhetnek egy
kifejezs jobb oldaln is (vagyis lehet jobbrtk is), de fordtva mr nem fel ttlen igaz
az llts. Pldul az x =5 ; helyes, mg az 5=x; hel ytelen.
Aprop
Mirt figyeljnk a bal- s jobbrtkekre?
Bizonyra felmerlt az olvasban a krds, mirt kell megtanulnunk effle furcsa ki-
fejezseket mint balrtk meg jobbrtk? Nos, az egyik ok az, hogy a fordtsi hiba-
zenetek megrtshez ez is fontos. Ha nem rtjk e kt fogalom kzti klnbs-
get, nha nem fogjuk tudni, hogy mi is a problma oka. Azt is fontos t ltni, hogy
nem fogalmazhatunk meg akrhogyan egy adott kifejezst. Vannak helyes s hely-
telen alakok, amelyek els olvassra logikailag egyformnak
Matematikai opertorok
sszesen t matematikai openhor van: sszeads (+). kivons C- ), szorzs C*), oszts
CJ), s maradkos oszts (%). A C++ a C-hez hasonlan azon kevs nyelvek egyike,
ahol nincs beptett hatvnyoz6 opertor ex az Y-adik IHltvnyon). Ehelyett fggvnyt
kn:J a felad::lt megolclflsra.
Az sszcad{ls, a kivons s a gy viselkedik, ahogy vrjuk. Nem gy azonban
az oszts.
Az egsz szmok kzti oszts kicsit klnbzik a matematikban mcgszokottJ. Nor-
m{tlis esetben ha a 2"]-et elosztjuk 4-gye!, akkor egy vals szmot kapunk (a v,116s sz-tlln
egsz- s ll) . Az egsz tpus v,ltoz6k azonban nem rendelkeznek trt-
rsszel, gy ebben az esetben a C++ levgja a gy azt n a 21/4
kifejezs C++-ban dolgozva 5-t ad eredmnyl.
A mamdkos oszts vagy modulo opertor Ct) a fenti egszoszts maradkt adja
vissza. 21 % 4 pldul l-et ad, hiszen 21/4 =5 s a manldk 1.
Aprop
Amaradkos oszts rl
,,21 % 4"-et huszonegy modulo ngynek olvassuk. A modulo az a amelyet
a maradkos oszts opertora vgez el. A modulo vgeredmnye az oszts
maradka (modulus), ami pldnkban 1.
mdon a mamdk meghatrozsa igen hasznos lehet. J plda erre, ha egy adOlt
egy msik ntinden tizedik futsm akarunk vgrehajtani.
Vilgos, hogy minden 1O-zel oszthat szm lO-es maradkos oszts esetn nulla mara-
dkot ad. gy pldul nullt ad eredmnyl a 20 % 10, a 30 % 10, s gy tO\;bb.
60 II. rsz Bevezets 8 C+ + programozsi nyelvbe
A lebeg6pontos oszts ugyanb'Y viselkedik, mintha 7_-;ebszmolgppel hajtannk
vgre, vagyis a C++-ban ez az "igazi" oszts. Ezzel a mvelettel helyrell a vilg rcndje,
vagyis 21/4.0 - 5.25. Ha brmely operandus lebeg6pontos, akkor az eredmny is le-
beg6pontos lesz.
Matematikai s rtkad opertorok kombinlsa
Gyakr::ln cl6fordul, hogy egy vltoz rtkhez hozz szeretnnk adni egy msik sz-
mot s az eredmnyt az eredeti vltozba visszarni. Pldul Im a myAge vltozt szc-
retnnk kCH6vel nvelni, akkor azt gy is rhatnnk:
int myAqc ,. 5 ;
int temp;
tcmp myAge + 2 ; II sszeadjuk az 5-t 65 a 2-t majd ' mentjo.k"
II a temp vltoz6ba
lnyAge .. temp ;
II amelyet aztn itt vis.nahelye:r.ul1k a myAge vltoz6ba
Lssuk be, ez elg nyakatekert s helypazarl6 megold(ls. C++-ban Szerencsre egy v l-
toz egyszerre szerepelhet a hozzrendelsi opertor mindkt oldaln:
myAge myAge ! 2;
Ugye mennyivel szebb?! Matematikban ez a kifejezs rtelmellen, de C++-ball azt je-
lenti, hOgy nveljk meg kett6vel a myAge vltoz rtkt, majd rendeljk azt hozz
maghoz a myAge vltozhoz.
Meg - noha kezdetben kevsb tlthat - rsmd II kverkez6:
myAge += 2;
Az nhozzrendel6 sszeads opertor d (+=) (self-assigned addition) hozzadj:1 a jobb
oldalt :l balhoz s az eredmnyt hoz7.rendcli a baloldalhoz. Szban
oper:.'itornak hvjuk, vagyis jelen pldnkat myAge plusz-egyenl6 olvassuk.
lia pldul a myAge rtke 4 volt, akkor a fenti mvel!;:t utn 6-r;\ v ltozik.
opertor egybknt brmely matematikai opertorbl hasonlan k-
kivons ( -=), szorzs (*=), oszts CI,;), valamint a mamdkos OSZls (t=).
Nvels s cskkents
Leggyakmbban egyet adunk hozz egy vltozhoz vagy vonunk ki bel6le. Az eggyel
nvels az inkrementls, az eggyel tnn6 cskkents pedig a dekrementls.
A C++-b:1I1 ezek a sajt opertorral rendelkeznek.
Az opertor (H) eggyel nveli a vltoz rtkt, a opertor (--) pe-
dig eggyel cskkenti. Pldul ha a c vltozt nvei ni szeretnnk, azt a
teheljk meg:
C++ ; II a c rtkt megnveli eggyel
___________________ ---' 4::.. ::ra =- "Kife =je"z", "=k." s,-ut """s"lt",::ok.,l __ s,-l -----C'.
A fenti sor vgeredmnyt tekintve ezzel
c '" c + l;
illetve mint ahogya korbbi pldk mutatjk akr ezzel is:
C += 1 ;
Tudta hogy ... ?
Honnan sznnazik a C+ + elnevezs?
Mirt is hfvjk C+ +-nak azt a nyelvet. amit ppen tanulunk? A C+ + nem teljesen
j nyelv, hanem a C nyelv tovbbfejlesztse, egy szinttel val6 HnvelseM,
Eltag Iprefi x) s uttag Iposlfix) opertorok
Mind II CH), mind pedig a (--) opertor d6tagkEnt
(prefix) s ut6tagknt (poslflX) egyarnt Prefix esetn (a jelentse: el6) az oper-
tort II vltoz el rjuk (pldu] ++mYAge), mg postfix haszn51al eseln ( a jelen-
tse: ut) az operlorr II vllOZ neve utn rjuk (pldf u] myAgc++).
utastsoknl ltalban mindegy, hogy melyik alakot h:lsznljuk. Ha azon-
ban az inkrcmentl6 vagy dekrementl6 kifejezs egyben rtkads rsze, mr egylta-
I:n nem mindegy, hogy .ell" vagy . hrul" van az opertor. A prefix operitor ugyanis
a hozzrendels el6u ki , mg a postnx csak hozz:'rendels utn.
A dolog logikja rviden: prenx esetn nveljk a vltoz6t s utna eZI hasznl-
juk az rtkadsnl, esetn viszont elbb kiolvassuk az rtket, elvgezzk
az rtkadst s csak utna nveljk a vltoz tartaimt eggyel.
Elszr L-waros lehet, de nzzk csak az albbi pldt, ahol x eredeti rtke legyen 5:
int a ,. ++x;
A fordt a lln1velet hatsra nveli az x-et (6 lesz) s utna eZl kapjuk
az a vltozban. Vgl teht mindkt vltoz rtke 6 lesz.
Ha viszom gy pr6blkozunk:
int b '" x++ ;
akkor ill a fordt fogja az x rtkt, beleteszi a b vltoz6ba, majd pedig nveli t!ggycl
az x-el. Kvetkezskpp a b rtke 6 lesz, az x rtke viszont 7. A 4.2 Listban jelen
van egyszerre mindkt tpus.
62 11. rsz Bevezets a C+ + programozsi nyelvbe
4.21i1ta - prefix l POIIfiX ....-t.....-x.cpp)
o: II 4.2. Lista
l : II Opertorok pr e fix s postfix hasznlatnak
2 : II bemutatsa
3 : 'include <iostrearn>
4 .
5 : int maln()
6 : f
7 .
8 .
9 .
10 :
11 :
12 :
13 :
int myAge : 39 ;
int yQurAge : 39 ;
II r tkek bellitsa
s t d : : cout
std : : cout
myAge++;
!+y ourAgc ;
s t d : : oDut



" I am: \ t" myAge "\tyears old . \n" ;
"You are : \t" you rAge "\tyears old\n";
II postf ix nvels
II pref ix nOvels
"One y ear ... \n";
s td: : oout 14: "I am:\t" myAge " \tyear s old. \ o';
s Ld : : oout 15 : "You a r e : \t " y our Agc " \tycars old\ n ";
ot d : : oout 16 : "Another year passes \ o" ;
std : : oDut 17: " I am:\ t " myAgc++ "\tyears o l d .\n ";
std : : oout 18 : "You a r e : \ t" ++yourAQe "\tyears o l d\n ";
st d: : oout 19 : "Let ' s print it aga in. \ n " ;
sLd : : cout 20 : "I arn : \t " myAge "\tycars old . \n" ;
std : : oout 21 : ' You are : \t " yourAge "\tyeilrs old\n" ;
22 :
23 :
return 0,
I arn 39 years old
You arn 39 years old
One year passes ...
I am 40 year s old
YOU are 40 years old
hnother year passcs
I am 40 years old
You are 41 yea rs o l d
Lct' s print i t agai n
I am 41 ycar s o l d
You ure 41 yea rs ol d
A 7. s 8. sorban kt egsz vltozt deklarlrnnk s belltottuk mindkett6 rtkt 39-
re. l1keiket a 9. s 10. sorokban rat juk ki.
A Il. sorban prenx mdon nveljk a myAge vl toz6t, a you rAge vltoz6t a 12. sorban
pedig postfL'{ mdon. A vgeredmnyeket a 14. s 15. sor itatp ki. egyarnt 40.
4. ra Kifejezsek s utasftsok 163
A 17. sorban a myAge vl toz rtkt nveltk a kirats alatt postflx mdon, emiatt
szi ntn 40-et rt ki s csak nvekedell az rtke. Ezzel szemben a 18. sorban
prefLx nvelst hajtottunk vgre a yourAge vltozn, a kerld rtk ennek
41 lett.
Vgl a 20. s a 21. sorokban ismt kiratmk a kt vltoz nkt. Mindkt vltoz ese-
ln megtrtn a nvels mindkt esetben gy a myi\ge s a yourAge is 41 letl.
Aprop
Ha hromflekpp csinihatom ugyanazt, melyiket vlasszam?
C++-ban az elmondottak alapjn hromfle mdon nvelhet jk egy vltoz rtkt
eggyel: A=A+l , A+=l vagy AH. Mrmost joggal krdezheti az olvas, vajon me-
lyiket s mirt az rdemes hasznlni.
A processzor felptse miatt j ideig az A+=l hatkonyabb volt az A=A+l-nl, il-
Ietve az A++ hatkonyabb volt az A+=l-nl. Egyes helyeken ez ez mg
ma is igaz, de az optimalizlst fordtk manapsg igen hatkony gpi kdot
lHtanak
n szemly szerint a t- + opertort szoktam hasznlni, ha nyilvnvalan eggyel sze-
retnm nveini egy vltoz rtkt. Ha valami ms rtkkel szeretnm nvelni, ak-
kor a += opertort hasznlom, mg tbb vltoz sszegzse esetn a = s t oper-
torokat alkalmazom a "klasszikus" mdon.
A helyzetekhez igazod megoldsok szmomra tlthatbb
teszik a forrskdot.
Precedencia, avagy a vgrehajtsi sorrendje
A precedencia a vgrehajt,si sorrendjt jelenti.
Egy olyan sszetett utasts, mint az

felveti a krdst: az sszeadst vagy a szorzsl hajtjuk vgre Ha az sszeadlst,
akkor az eredmny 64 lesz, ha pedig a szorzSl, akkor 29, vagyis a dolog egyltaln
nem mindegy.
Minden opt!rtor renclelke:lik precedencia s:nttcl. (A rszletes lista a knyv elejn ta-
llhat.) Esetnkben a szorzs pldul magasabb rang mint ai sszeads,
gy a helyes vlasz a 29.
Ha kt opertor ugyanolyan precedencival rendelkezik, akkor balrl jobbra haladva
haj tjuk vgre a Pldul az
x = 5 + 3 + 8 * 9 + 6 * 4;
esern a 57:0fzsok rtkekXlnek ki 8"9-72, 6*4-24.
64 11. rsz Bevezets a C+ + programozsi nyelvbe
Ezutn a kifejezs gy nz ki:
x - 5 + 3 + 72 + 24 ;
Balrl jobbra haladv;t ,tZ sszeadsokkal: 5 + 3 ... 8, 8 + 72 = SO, 80 + 24 ... 104,
Figyelem! Nhny oper{ILor esetn - ilyen pldul a hozzrende1s is - jobbrl balld
trtnik a kirtt':kcl6ds.
Mi a helyzet, ha a precedencia sorrend nem megfelel6 szmunkra? Nzzk eZt a peldt;
TbtalSeconds - NumHinutesToThink + NumHinutesToType 60
Ennl a kifejezsn(Ol nem a NumMinutesToType szeretnnk hatvannal megszo-
rozni, majd hozzadni a NumMinutesToThink rtkl, hanem el6bb elvgezni
HZ sszeadst, majd pedig a szorL.st.
A z{jrjelezssel il yen esetben fellbrlhat a precedencia. A zrjelben !v6 elemek
brmely matematikai opertorr.tl szemben els6bbsget 6[veznek. A mi pldnk ennek
megfelel6en gy nz ki;
TotulSeconds = (NumMinutesToThink + NumMinutesToType) 60
Tudta hogy ... ?
Zrjelezs
Bizonytalansg asaMn btran zrjelezznk. A program nem lesz lassabb s a fordl-
tsi id nvekedse is elhanyagolhat.
Egymsba gyazott zrjelek sszetett kifejezsekben
sszetett kifejezseknl el6fordllllm, hogy kell gyaznunk zr6jelprokat.
Az pldnknl m:tr.ldva tegyk fel , hogy nem csak a msodperceket kell kisz-
molnunk.
TotalPcrsonSeconds
(Peoplel nTheOffice +
( ( (NumMinu tesToThink
PeopleOnVacation) )
+ NumMinutesToType ) 60)
Ezt a bonyolult kifejezst bell1'61 kifel haladva rtkeli ki a fordt,
a NumMi nutesToThink viL07:t adja hozz a NumMinutesToType-11OZ, mert ez a leg-
zrjelpr. Az sszeget megszorozza 60-nal. Ezutn a Peopl e lnTheOffice rt-
kt hozzadja a PeopleOnvacation-hoz. Vgl pedig az emberek szmt sszeszoroz-
za a msodpercekkel.
A plda megint felvet egy rdekes krdst. Ezt a kifejezst a szmtgp knnyen fel
tudja dolgozni, de emberknt nehz tltni, megrteni vagy mdostani. Az kife-
jezst gy is rhauuk volna nhny ideiglenes vltozr bevezetvc;
4. ra
TotalMinut es : NumMinutesToThink + NumMinutesToTypc;
TotalSeconds : TotalHinutes 60 ;
TotalPeople : Peoplel nTheOffice + PeopleOnVacation;
TotalPersonSeconds = TotalPeople * TotalSeconds;
s utasftsok 65
Ez a p&lda hosszabb s tbb ideiglenes vltozt hasznl, mint az de sokkal
knnyebb megrteni. A 60-at szimbolikus konstansra cserlve &s az egszet egy ma-
gyarz6 megjegyzssel elltva knnyen s ka rbantarthat forrskdot kapunk.
Tudta hogy ... ?
Az igazsg termszete
A C++ korbbi vltozatai az igaz s hamis rtkeket egszknt brzoltk,
az ISO/ANSI szabvny azonban bevezetett rjuk egy j tpust, a bool-t. Ennek kt
rtke lehet: IGAZ vagy HAMIS.
Minden kifejezs kirtkelhet logikailag. Azok, amelyek matematikailag nullt ad-
nak hamisak, minden ms viszont igaz.
Rgebbi fordtk long int-knt kezeltk a bool tpus!, melyek gy 4 bjtot foglal -
tak. Az. ANSI kompatibilis fordtk a legtbbszr mr csupn 1 bjton troljk
a bool tpus vltoz6t.
Relcis opertorok
Relcis opertorok segts6gvel kt szmrl eldnthetCS, hogy vagy az
egyik kisebb a msiknl. Minden relci I-et (igaz) vagy O-t (hamis) ad vissza. Relci-
s opertorokrl a 4.1. Tblzat nyjt ttekimst.
Ha a myAge rtke 39, a Y0\.lrAge pedig 40, akkor:lZ opertorr:l l elc.lnthc-
hogy vajon egycnl6ek-e?
myAge == yourAge ; II ugyanaz a rnyAge s a yourAge rtke?
A kirtkels vgn nul1:'it - vagyis hamisat- kapunk, men a kt vltoz rtke nem

myAge > yourAge; II d myAge nagyobb a yourAge-nl?
szi ntn nullt - vagy hamisllt - ad.
Figyeleml
Hozzrendels vagy egyenisg?
Szmos kezd C+ + programoz sszekeveri a hozzrendel opertort (=) s
az egyenlsg opertort (= =), amely aztn sok alaUomos hiba forrsa lehet.
A gondot az jelenti, hogy a relcis opertor vgeredmnyt hozzrendelhetjlik egy
vltozhoz! Teljesen szablyos pldul, ha a = b > c vagy a o=c b == c kifeje-
zseket hasznlunk. A fordt figyelmeztethet. ha pldul hozzrendelst irtunk,
amikor az egyenlsgnek tbb rtelme lenne. Ilyenkor gondolkodjunk el, mert nem
biztos, hogy tnyleg azt rtuk, amit vgre volna hajtatni.
56 11. rsz Bevezets a C+ + programozsi nyglvbe
I lat relcis opertor van: (="'), kisebb ), nagyobb ( , kisebb vagy
=), nagyobb vagy (>-=), illetve a nem (! =). A 4.1 Tbhzat
ad ttekintst, hasznlatukat is bemutatva.
4.1 T6b181- __ -
Nv Opertor
egyenl6seg
oem !-
nagyobb >
nagyobb vagy >-
kisebb <
kisebb vagy <-
Az ff utasfts
Plda
100 - - 50,
50 -- 50,
t OO!- SO;
5O!- SO;
100 > 50;
50 > 50;
100 >- SO;
50 >- 50;
100 < 50;
50 < SO;
tOO <- SO;
50 <- 50;
A plda kirtkelse
hamis
igaz
igaz
hamis
igaz
hamis
igaz
ign
hamis
hamis
hamis
igaz
Alapesetbe n a programunk sorrl fut , vagyis .lbban a sorrendben hajtja vgre
az utastfIsokat, ahogyan azok a fOmlskdban szerepelnek. Az if utasts azonban le-
hetCvl: teszi felt.telek vizsglatt - pldul kt v lt oz - s a
fgg6en gazik el s fut lovbb a program.
Egy plda az if pal".mcsra:
if (kifejC2.sl
utasits :
A zr6jclen bell bnnilyen kifejezs lehel, dc leggyakrabban relcis kifejez6s1 ta l-
lunk. [la a rtke O, akkor hamisnak s a szmtgp nem fu ttatja le
az utastsr. Ha nem nulla az rtke, akkor ig:lznak s lefut az utasts, Nzzilk
a pldt:
it (bigNumbcr > smallNumbcr)
bigNumber " smallNumber :
Ez a kdrszlet sszehasonltja a bigNumber-t S:il smallNumber-t , Ha a bi gNumber
nagyobb, akkor a mflsodik sor fut le, gy a bigNumber nkt a smallNumber rtk-
vel tesszk
4. ra Kifejezsek s utastsok 167

Az else g
Felttelvizsglatkor sokszor hasznlunk az igaz g mellett egy hamis gat is.
A korbban bemutatott mdszerrel kln-kln vizsglhatnnk a feltteleket. Noha
mgis kicsit knyelmetlen megolds. Az else kulcssz hasznlatval lnye-
gesen olvashatbb a forrsk6dunk:
if (kifejezs)
utas ts;
e lsc
utasts;
A 4.3.Lista az else kulcssz hasznlatt mutatj<1 be.
4. 3 usto - Az 01 .. ""_ 6 hasznlatnak bemutatsa (H ..... cppl
o : 114.3. Lista - Az else kulcssz hasznl ata
1 : fflnclude <iost r eam>
2 .
3 : int main()
, .
S : int first Number secondNumber ;
6 : <ltd : : cout Please enter a big number , ';
7 : s td: : cin f irstNumber ;
8 : std : : cout \nP1ease enter a sma11er number : ';
9 : s td: : cin secondNumber ;
10 : if (UrstNumber > secondNumber)
11 : std: : cout '\nThanks !\n ';
12 : e l se
13 : std:: collt '\nOops . The sccond is bigger ! " ;
14 :
15 : rcturn O;
16 :
Pl ease ent e r a big number : 10
Pl ease ent er a smal1er number. : 12
Oops. The second i s bigger !
M,s szmkkal ms eredmnyt kapunk:
Please ent e r a big number : 12
Please enter a smaller number: 10
Thanks!
A 10. sorban tallhat if utasts kirtkelse utn, ha az igaz, akkor a ll., ha viszont
hamis, akkor a 13. sorban folytatdik a program futsa. Ha a 12. sorban tallhat else
ss l l. rsz Bevezets. C+ + programozsi nyelvbe
gat kivesszk, akkor a l,). sor mindig lefut, fggetlen1 a relci igaz vagy hamis vol-
ttl. Ebben az esetben az if uLasts a 11. sorban vget r. I [a nincs az el se g, akkor
a 13. sor fut le
A parancsokat kapcsos zr6jel prok kz foglalt kdblokkokkal is helyeucsthetjk.
Megismerkednk egy jabb utasMssai
Az std : : cin utasrts segftsgvel olvashatunk be C+ + alatt a
adatokat egy vl toz ba.
if (kHejczs)
utasts;
kvctkez6 utasts ;
Ha a kifejezs igllZ, akkor ldut az utasts majd pedig <1Z if uL{tni utasts. Ha ha-
mis, gy az cJs6 nem fui le, hanem egyb61 a sorra ugrik
Ne feledjk, ;\ pontosvessz6vellczrt utasts helyre kapcsos z.'irojelekkel hatrolt,
sszetett ulastssorozatot is rh.ltnnk.
sszetettebb if konstrukcik
rdemes megjegyezni , hogy brmilyen kifejezs szerepelhet U!astskent az if s
az else akr egy .i f vagy else is. A kvelkcz6 pldban bemutanmk
egy sszctett if szerkezetct:
if (kiCejczsl )
(
iC (kHcjezs2)
utastsl:
el!lc
(
if (kifejezs3)
elflc
else
utasits4 ;
utasits2 ;
utasits3 ;
Ez a kiss ormtlan kdrszlet a kvelkez6t jelenti: ha a kifejezsI s kifejezs2
is igaz, akkor az utasitsl-ct hajtjuk vgre. Ha a kifejezsl igaz, a kif ej ezs2
hamis s II kifejezs3 igaz, akkor az utasits2 fuI le. Ha kifejezsI igaz, de
a kifejezs2 s kifejezs3 hamis, akkor az utasits 3-at fUlIatjuk. Vgiil pedig ha
4. ra _sok 69
az kifejezs hamis, akkor az utasits<l fut le. Amint ez a pldbl is ltha-
t az sszctctt if utastsok nha elg zavarak tudnak lenni.
Az sszetett dntsi szerkezetek hasznlatm mulal pldt a 4.4 Li sta.
4.4 Liota -lIIIZOIOiIO ogym6sba gYUOIt H -... I-H.cpp)
O, II 4 .4 Lista - sszet ett, egymsba gyazot t if utasitsok
l : <iostream>
2 ,
3 : int mai n ()
4 ,
5: II Beolvasunk kt szmot
6 : Illetroljuk 6ket a bigNumber s littleNumber vltoz6kba
7 : II Ha a bigNumoor nagyobb, mint l littleNumber ,
8 : II megnzzk, hogya kct t6 maradk nlkl oszthat-e egymssal
9 : I I ha i gen , megn;o:;o;k , hogy ugyanaz-e l kt szm
10 :
11: int f i rstNumber, sceondNumber ;
12 : atd : : eout "Enter two numbcrs . \nFirst , ";
13 : std" cin firstNumber ;
14 : std , : eout "\nSecond : . ;
15 : std , : cin sccondNumber ;
16 : std : , eout " \n\n";
17 :
18 : if (firstNumbcr >_ secondNumber)
19 : {
20 : if ( (firstNumber 11 secondNumbcr) ::= O)
21 ,
22 : if (firstNumber == sccondNumber)
23 : std :: eout "They are the same!\n" ;
24 : else
25 : i::ILd : : eout ' They are evenly divisible!\ n ' ;
26 :
27 :
28 :
29 :
30 : else
else
std:: cout "They ara not evenly divisible!\n" ;
31 : std:: cout "Hey! The second one is largcr!\n' ;
32 : return O;
33 :
- Enter two numbers .
First: 10
Second: 2
They arc evenly divisiblc !
70 II. rsz Bevezets a C++ programozsi nyelvbe
Ms szmokkal ms vgeredmnyt kapunk:
Enter two numbers .
First, 2
Second : 2
They arc the same!
Enter two numbers .
First : 3
Second : 2
They arc not evenly divisible !
S
A kt bekr! szmOl sszehasonlt juk. Az - 18. sorb;lfl (a!;llh:lt - j f ut::l stssal el
len() ri zzi.ik, hogy az szm nagyobbe, mint msi k. Amennyiben nem, gy::l 30.
sorban tallhat ebe gm ugrik a programunk,
Ha igt!n, akkor a 19. sortl folytatdik a programunk. A msodik if utasts a 20. sor
ban hogy az szm oSZlhal6e a msodikkal mamd(!k nlkl. I-I a igen, ak
kor a 22. sorlxlI1 talll1:l l if utastssal eldnt jk, hogya kt szm egyenI6e, s :Hl
n:lk megfel el6cn kirmjuk a zenetet.
Ha nem teljesl a 20. sor felttele, ::Ikkor 27. sorb:m tallhat else gra ugrik a vezrls.
Kapcsos zrjelek hasmlata egymsba gyazott utasftsok esetn
Amennyiben csak egy utastst kvnunk vgrehajtlmi, gy az i f utn elhagyhat6
a kapcsos zrjel:
i r (x > y)
if (x < z)
)( = y ;
/1 Ha x nagyobb y-nl
/1 s x kisebb mint z
/1 akkor x-et rtkt hozzrendeljk y-hoz .
Nagy s sszetett egymsba gyazott utastsok esctn ugyana kkor ez I I megold:s je
megnveli :l hiba lehetsgt. Ne feledjk, az res k:uakterek hasznlata
knnyebbsget jelent a programoz6nak, de a fordt figyelmen kviJ l hagyja, Zr6jele
zs hinyban knnyen hogy nem a Hhez rjuk az else gat,
amely gy logikai hibt fog eredmnyezni. Erre lthatunk pk!;1t a 4.5 Listban.
4. ra Kifejezsek s utastsok I 71
4.5 Usta - Hoavan teszik dthatv a kaDCSOS Zlir6ie1ek dntsi szerkezeteket
(bracos.cpp l
0 , /1 4 . 5 program - Bemutat juk, hogyan t es zik tlthat6v
1 , /1 a kapcsos zrjelek az if mve l eteinket .
2 , Hi nclude <i ost ream>
3 .
4 , i nt main()
5.
6 : int x ;
7 , std: , cout "Enter a nunIDer less than 10 or greatet" than 100 , ";
8 , s t.d " cin x;
9 , std " cout " \n ";
10 ,
11 : if (x> 10)
12 : if (x > 100)
13 , std : , cout. "More t.han 100 , Thanks! \n " ;
14 : else / / nem helyen else
15 : st.d :: cout. "Less than 10 , Thanks ! \n" ;
16 :
17 : return O;
18 :
Kimenet
Enter a number less than 10 or greater than 100 , 20
Less than 10, Thanks!
-
A program egy lQ-nl kisebb vagy 100-n{11 nagyobb szmot vr. Amennyiben megkap-
ja, gy megkszni. De a jelek szeri tlt a programunk nem ezt csinlja.
Ha a 11. sorban igaz a kifejez6snk, akkor a 12. sorban foly tat juk a futtatsL Ekkor
a kapott s:lm lO-nl nagyobb. Te nns:wtesen a 12. sorban is tallhat egy feltrelvizs-
glat, ami igaz rtket ad, ha lOO-nl nagyobb a megadott szm. Ebben az esetben
a 13. sortl folytatdik ,l program futsa.
Ha a megadott szm kisebb lO-nl vagy azzal, akkor az felttel hamis, teht
a 16. sor f"lH Ic. Ha a megadott szm kisebb lO-nl, akkor az albbi kimenetet kapjuk:
Enter a numb er less than 10 or great e r than 100 , 9
A 14. sorban tallhat else gat a 11. sor felttelvizsglathoz szerettk volna hasznl-
ni, valjban azonban a 12. sor t"elttelvizsglathoz tartozik. Ez bizony egy alattomos
logikai hiba a programunkban.
n II. rsz Bevezets a C+ + programozsi nyelvbe
A fordt nem jelez fordtsi hib,lt, hiszen hibtlan C++ progmmunk, de mgsem csi-
nlja azt, amit szerettnk volna. Radsul mindaddig nem is jelentkezik a hiba, amg
100-nl nagyobb szmot adunk meg.
sszessgben teht sikerlt egy igen faramuci hibt Maga a kd nyelvi
szempontbl helyes, ezrt fordt si hibt nem kapunk. Ugyanakkor rszben mgis azt
csinlja, amit akartunk, vagyis ha valaki teszteini kezdi, akkor el6szr csak az csetek
kis hnyadiiban tapasztalhatja a hibs ffillkdsl. Amg nem adunk meg WO-nl na-
gyobb szmot, minden a legnagyobb rendben van.
Aprop
Neknk fontos az tlthat6sg, nem a gpnek
Jegyezzk meg: res helyeket a sajt rdeknkbe rdemes hasznlni, nem a fordt
miatt. A fordt nem foglalkozik vele, hogy szp-e az if utasts. Olyan formtumot
kell hasznlnunk, amely knnyen megrthet, tlthat szmunkra. Persze kicsit
bosszant lehet, ha a programunk nem gy viselkedik, ahogy azt a behzsok alap-
jn vrnnk.
A 4.6 Listban javtotluk a hibt a megfele16 helyeken dheJyezell kapcsos zr6jelekkel.
4.8liata - H ..... h_nliulc _ Iul ..... ,6r6ie101cet ff_
(propolbra.os pp)
o, /I 4.6 program - bemutatJ uk a kapcsos zrjelek helyes hasznlatt
1 : II if utas.itssal
2 : *.include <ios t ream>
J ,
4 , int main!)
5 ,
6 : int x;
7 : std : : cout ' Ent er u number less than 10 or greater than 100 : ' ;
B : std: , ci.n x;
9 : std: : cout '\n";
10:
11 : Lf(x>lO)
12 : (
13 : if (x > 100)
14: std:: cout ' More tha n 100 , Thanks!\n' ;
1 5 :
16 : else II most
17 : std: : cout "Less than 10, 'I'hanks ! \n" ;
18 : return O;
19 ,
Enter a number less than 10 or greater than 100 , 20
4. ra Kifejezsek s utesftsok 173

A 12. s l;. sorban elhelyezett kapcsos zrjelekkel e1niik, hogya 16. sorban tallha-
t else g most mr a 11. sor if-jhez kapcsoldik, pp ahogy szerettk volna.
lia a felhasznl 20-al gpel be, akkor a 11. sorban igaz lesz a felttel, viszont a 13. sor
felttele hamis, gy nem I.nunk ki semmit. Tkletesebb lenne a progmffiunk, ha egy
else gat helyeznnk el a 14. sorban, gy tjkoztatva a felhasznl61 :1 hiba okrL
Aprop
Oefenzfv programozs
A knyv pldaprogramjai mindig egy-egy - ppen trgyalt - pldra vilgrtanak r.
hiszen nem llt szndkunkban a felhasznli hibk teljes kezel-
se, vagyis ezek a k6dok nem "bombabiztosak", Egy professzionli s programnl
azonban minden hibalehet6sgre fel kell kszlni s megfelelen kell azokat kezelni.
A logikai opertorokrl b6vebben
Gyakr.U1 nem csak egy relci igaz vagy hamis mivolt:'l",J vagyunk kvncsiak, hanem
tbbre. Pldul ig<lz-e, hogy x nagyobb y-nM s y nagyobh z-nl? A programnak el kell
tudni:. dnteni, hogy igaz-e vagy hamis, s ennek megfelelc5en cselekedni.
Kpzeljnk el egy olyan kifinomult riasztrendszert, amely az :llbbiak szerint mGk-
dik: Ha az ajtl ki nyitjk S elmli este 6 ra S ez NEM nnepnapokon VAGY htv-
gn trtnik, akkor hvja a rend6rsgcL A C++ hrom logikai opertol':c' Ichet/5v teszi
ilyen fclttclrcndszer kirtkelst is, ezeket <I 4.2-es tblz.1tban foglaltuk ssze.
4.2 T6bIat-LotIlkII
Opertor Jells Plda
ES (AND) && kifejezsi && ki fejezs2
VAGY (OR) I I kifejezs l I I kifejezs2
NEM (NO'I) !kifejezsl
Logikai
A logikai S kt kifejezst rtkel ki. Ha igaz, akkor az S vgeredmnye is
igaz lesz. Pldul ha hesek vagyunk S van pnznk, AKKOR meg tudunk ebdelni.
if ( (x 5) && (y __ 5) )
74 11. rsz Bevezets a C++ programozsi nyelvbe
Az plda akkor lesz igaz, ha x s y is ttel minden ms esetben hamis,
Az S kifejezs csak akkor ad igaz rtket, ha mindkt kifejezt:s igaz.
Jegyezzk meg, hogya logikai S kifejezsnl kt & jelel kell rnunk!
Logikai VAGY
A logikai VAGY szintn kl kifejezst rtkel ki. Ha brmelyik igaz, a kifejezsnk vg-
eredmnye is ign lesz. Pldul ha van pnznk VAGY hiteJkrtynk, AKKOR ki tudjuk
fizetni a szmlt. Nem szks{:ges egyszerre a pnz s :\ hitelkrtya, persze az scm je lent
probJmt, ha mindkclt6vel rendel keznk.
if ( (x ==5) I I (y"'''' 5) )
Ez plcb az x, akr az y rtke 5. Gyakorlat il ag hi! llZ x ltke 5, akkor
a fordt sosem vizsglja az y-l.
Fontos: a logikai VAGY kifejezsnl kl I jelel runk!
Logikai NEM
A logikai nem igu3t ad, ha a kifejezs hamis s h:lIniS31, ha a kifejezs ig:lZ.
if ( !(x =,.5) )
Ez igazat ad, ha az x lt ke nem t. Teljesen gy viselkedik, mintha ezt rnnk:
if{x! =5)
Relci6k precedencija
A relcis s logikai opertorok kifejezsknt viselkednek a C++-ban. l -et (igaz) vagy
O-{tl (hamis) adnak eredmnyl. Akrcsak a matematikai operroroknl, itt is a prece-
dencia hatrozza meg, milyen sorrendben rtkel6dnek ki. Ezt fontos ismerni pld{tul
az albbi utasts helyes megfogalmazshoz:
i f ( x > 5 && Y > 5 I ( z > 5)
A pldban a programoz6 cl6bb az S kapcsolatO{ szerene volna kirtkelni, utna pe-
dig a VAGY kapcsolatot. V:lgy esetleg pp fordtva?
Ha pldul x rtke 3, y s z rtke 10, akkor az el56 rtelmezs szerint IGAZ az llrs
(z nagyobb lO-nl, ezn az figyelmen kvl hagyja a fordr x s y rtkeit). Ezzel
szemben a msodik esetben HAMIS az l1fts. (x nem nagyobb 5-nl, vagyis teljesen
hogya VAGY feltlel teljesl-e).
4. ra Kifejezsok s utasftsok 175
Habr a precedencia hatrozza meg a kirtkelsl, zr6jelezssel megvltoztathat
a sorrend s az utasts is llthat6bb lesz:
if ( (x :> 5) && (y :> 5 II z > 5) )
A korbbi ltkeket behelycltestve HAMIS lesz a felttel, hiszen x nem nagyobb 5-nl,
gy az S nem lehet IGAZ. Az S-nl mindkt oldalnak igaznak kell lennie. Hiba sze-
retnk egy telt, ha nem j az ze, nem esszk meg.
Aprop
Csoportosfls zr6jelezssel
rdemes plusz zr6jelekkel csoportositani a kifejezseket. Ne feledjk, a cl egy
olyan program ltrehozsa, amely knny olvasni s tltni.
az igazsg
C++-ban a O reprezentlja a hamis rtket, minden ms pedig igaz logikai rtknek fe-
lei meg. Szmos C++ programoz ki is hasznlja ezt az i t-es szerkezeteiben, me erre
egy plda:
if (x) II ha x igaz (nem nulla)
x =: O;
EZl teht valahogy gy ken olvasni, hogy "ha x rtke nem nulla, akkor lltsuk null!"'",",
Itl persle kicsit csalt unk, s valjba a al:lkot kellett volna hasznlnunk:
if (x ! = O)
x =: O;
II ha x nem nulla
Igazbl mindkt megolds helyes, de az utbbi taln knnyebben tlthat, rdemes
inkbb logikai ki=nkel=sre hasznlni a CH ezen tulajdonsgt, semmint egy vltoz
nem nulla n=k=t vele,
Az albbi kt sor jelentse szintn azonos:
if ( !x)
if (x =:=: O)
II ha x hamis (nulla)
II ha x nulla
A msodik utastst ezzel egyll va lamivel knnyebb megrteni s hiszen sokkal ki-

7s l l. rsz Bevezets a C+ + programomsi nyelvbe
Krdsek s vlaszok
Krds: Mi,-t haszllljakfe!esleges zi'je!ezst, lia gyis a precendia hatrozza meg
az opertorok ki,tkelsl?
Vlasz: Noha 3 fordtprogram termszetesen ismeri a precedencijt s a progmmoz
megtal111lhatja azt, megfele16 zrjelezssel azrt sokkal knnyebben tarthat juk karban
a programjai nkat
Krds: Ha a relcis opertorok l1J.>e l-et llagy O-t ad, a t6bbi ltJ.'Cl lIli/t tekillf-
ji/k igaznak?
V/asz; Relcis opertorok l-et vagy O-l adnak vissza, de minden kifejezs ad vissz:!
rtket, gy akr az if ut:lstsban is me erre egy plda:
if ( (x .. fl ... b) =" 35 )
Ez egy szablyos CH utasts_ A bels6 zrjelben hozz::'irende1s mg akkor is
lefut, ha maga a feltle1viuglat hamis eredmnyt ad.
Krds: II tabulto/; a szkz s az 1jsor milyen. hatssal V(lIl a p rogral11unkra?
Vlasz: A tabultor, a szkz s az jsor - ezeket nevezzk res karaktereknek - nem
befolysoljk a program mkdsl, csupn olvashatbb teszik a forrsk6dllnkat.
Krds; A negatv szmok igaz vagy h(,llllis logikaI /1ket jelentel/ek?
Vlasz: Minden nem nulla szm - legyen az pOZitv vagy negatv - igaz rtkknt
viselkedi k.
Gyakorlatok
MOST, hogy mr rudunk egyet s mst a kifejezsekr6l s az utastsokr61, vlaszoljuk
meg a kvzkrdseket s a !"'Yakorlatok segtsgvel mlytsk el a megszerzett tudst.
Kvfl
l. Mi a klnbsg az XH s a HX kztt?
2. Melyik ms nyelvekben gyakori opertor hinyzik a CH -bl?
3. Mi a klnbsg a 001- s jobbrtk kztt?
4. Mit csinl a modll lo opertor?
4. ra Kifejezsek , uta'fi,ok! 17
Feladatok
1. rjunk egy programot, amely a hrom tanult mdon (a"' 3+1, 3+=1 t; aH) nveli
egy vltoz rtkt. Fordtsuk [e, linkeljk s futtassuk. Ms leLt a mretk? sz-
leltnk a futsi sebessgben klnbsget?
2. Gpel jnk be egy matematikai kifejezst az integrlt krnyezetben.
Pozicionljuk a kurzort a valamelyik matematikai opertorra s nyomjuk meg
az Fl Mennyire hasznos a kapott informci?
3. rjunk egy programot, amiben egyszerre nvelji.ik prefix s pOSlftx mdon egy
vltoz rtkt egy lpsben (++x++). Lefordul? Van rtelme? Mi trtnik, ha
egyszerre hasznljuk a nvelst s a cs6kkentst?
Vlaszok a kvfzkrdsekr.
1. Az ut6tagknl val (posrfix) nvels. Ekkor kiolvassuk <l vltoz rt-
kt s utna nveljOk. A msodik eltagk6nt Llirtn6 (prefix) nvels. Itt elbb
nveljlik az rtket s a mr nvelt rtkel olvassuk kL
2. A hatvnyozs opentorn hinyzik. Van r fggvny, amely elvgzi, cl e opertor
nincs.
3. A bal6rtk az baloldaln, mg a jobbrtk m: jobb ol-
daln jelenik meg. Minden balrtk lehel jobbnk is, de a legtbb jobbrtk
nem szerepelhet a baloldalon.
4. Az egsLOszts maradkl adja vissza.
5. RA
Fggvnyek
I,\ir6llesz sz ebben az rban:
Mi a fggvny s milyen rszekbl ll
Hogya n deklarlhatunk s definilhatunk fggvnyeket
Hogyan adhatunk t paramtereket egy fggvnynek
Hogyan adhatunk vissza rtket egy fggvnyb6!
Mi is az a fggvny?
llggvny ahtpvct6cn egy alprogrdlll, amely bizonyos Iln1veleteket tud vgezni adato-
'o s e nnek eredmnyeknt egy rtket tud visszaaclni. Minden C++ programban van
gaJbb egy fggvlmy, nevezetesen a main () . Ez az a pont ugylmis, ahol a program
elkezcl6dik. A main () termszetesen maga is hvhat ms fggvnyeket,
az ltala meghvott fiiggvnyek is hvhatnak jabbakat, s gy tovbb.
'flden fggvnynek egyedi neve van a programon bell. Ha a vgrehajts elrkezik
:: ilyen nvhez, akkor a mve1el'iOfOn egy elgazs keletkezik: a vgrehajts a fgg-
len folytatdik, majd innen egszen addig tart , amg el nem
I
III I. rsz Bevezets a C++ programozsi nyelvbe
r egy return parancshoz, vagy a fggvny k(x1jnak vghez. Amikor a fggvny
visszatr a hvhoz, a vgrehajts a fggvnyhvst els6 parancson folytatdik.
Ezt a vgrehajtsi smt az 5.1. brd szemllteti. Egy jl megtervezett fggvny egyetlen,
jl krlhatrolhat feladatot hajt vgre. Ez rviden aZl jelenti, hogya j fggvny
egyetlen dolgot tud, de azt nagyon jl, aztn ha ezzel vgzett, akkor visszatr a hvhoz.
Az sszetett feladatokat fel kell bontanunk egy-egy fggvt:ny formjban megva-
lslhat alfelacbtokra, aZI,n ezeket az elemi fggvnyeket keH cgyenkr1t a
sorrendben meghvni. Ez a tervezsi mdszer a kdot knnyebben s "igy
knnyebben k:lrbantanh,lIv teszi.
Ebhcn a knyvben nagyon gyakran fogom emlegetni a karbantanhatsgoL
Ennck az az oka, hogy - amint azt korbban is emlteltem - rmmapsg a progr::lmfej-
lesztsben az igazn nagy kIL<;{:get nem is ;mnyira az alkalmazs megrsa, hanem an-
nak a karbantartsa, folyamatos frissts: jelenti.
Main O
{ UtlsfIM;
tunel ():
Utasits:
func2 O;
IJI.IsItH;
lune4 ():
} Utasits:
5.1. bra
tunel
AmiJ.'Or a program e,gy j/lggocnyhlXjs/lOZ rkezik, a vgl"l!Ilajts a jl1gg/Jlly kdjllak e{s
sorra ugrik, ml/jd a lli.sszatTris utll a fgg/Jll)'lIus Iltlli so"al folytatodik.
Itt szeretnm fl hvni a figyelmet arra az eg{:sz egyszen1 megllaptsra is, mely szerint
a kdolssal kapcsolatos problmk igen nagy hn}'"".Jda stil ris problma
(ilyen pldul a sorkezdetek beljebb wirisa). Maga a fordt ugyan
nagyon hajlkony, de knnyen olvasni a szpen szerkt::sztett k6dot lehet.
5. ra Fggvnyek I SI
A fggvnyek deklarlsa s definilsa
:ld6u meghvharnnk egy fggvnyt, deklarlni majd definilni kell azt.
fggvnydekhuci6ban megadjuk a fordtprogramnak a krdses fggvny nevt,
t:>SZatrsi rtknek, valamint paramtereinek tpust. A fggvny deklarci-
szoks prototpusnak (prototype) is 1vni, mivel ez csak egy formai lers, ami
fUggvny trzst nem tartalmazza.
defuci ezzel szemben azt rja le, fiknt kell il fggvnynek milyen m-
-eteteket kell vgrehajtania. Ahhoz, hogy egy fggvnyt brmely ms fggvnyb61
.eghvhassunk, legalbb deklarlnunk kell azt va lahol az hvs m
-.-grehajtand kdot csak a dcfind tartalmazZa.
Fiiggvnyek deklarlsa
, rordt6progmmmal maga a gyrt is szllt szmos megrt f'ggvnyt. Ezeknek
o.1eklariicii termszetesen szintn kszen vannak azokban a bizonyos fcjlcllom-
T.'Okban, amelyeket az ti nc1ude paranccsal mdunk beemelni a sajt k6dunkba.
Egy fru,>vny prototpus:! egy olyan pontosvessz6vel vgz6d6 utasts, amely t:lrtal-
1ll3zza a fggvny nevt, valamint visszatrsi rt k nek tpust s par.:unte-
reinek listjt. A paramterlista - elnevezsnek - ,I par<lmterek
neveit s tpust tart'llmazza. Ez egyes elemekel iu vlasztja el egymstl. Egy
ruggv ny prolotpusnak szerkezett szemIIleli az 5.2. bra.
paramtertrpus
/ "Y/ter neve
uoslgoed short iot FlndArea (lot length. int width) ;
'--VJ
VIsszatrsi rtk tpusa nv paramterek pontosvessz6
. 2. bra
q:yfriggvimydeklanici6 rszei
.\ fggvny defincijnak s deklarci6jnak pontosan meg kell egyeznie a nv, s
2 felsoroll paramtertlpusok tekintetben. Ha nem ez a helyzet, akkor fordtskor hibt
.bpunk. rdemes ugyanakkor megjegyezni , hogy egy fggvny prototpusnak nem
82 11. rsz Bevezets a C++ programozsi nyelvbe
fltrlen kell tanaimaznia a paramterek neveit, csak a tpusok megadsa k-
Ennek a fggvnydeklarci teljesen
long FindArea{int, int) ;
Ez a protOTipus egy FindAread ( ) fggvnyt deklarl, amely long t!pus rtkkel
tr vissza, bemenetknt pedig kt egsz paramter v;r. Br a fggvny ilyetn
sa szintaktikailag helyes, nem valami j uet, hiszen ha megadjuk a paramte rek nevei t
is, az adott esetben sokkal teheti , hogy pontosan is van sz. Egy
szintn helyes de tgondoltabb deklarci teht a kvetkez6kppen nzhet ki:
long FindArea(int lcnqth. int widthI ;
gy sokkal egyrtelmabb, hogy mi is ez a fggvny, s milyen paramtereket kell neki
megadnunk milyen sorrendben. Figyeljk meg, hogya fggvnyeknek a legtbb eset-
ben van nkk is. Az 5.1 Listban bemutatunk egy olyan programot,
amely hivatkozik a Fi ndArea () fggvny prototpusra.
I
o: /1 Az 5 .1. Lista a fggvnyek prototipusnak hasznlatt szemllteti
1 : linclude <iostream>
2 ,
3 : inL FindArea (int length, int width) ; II prototipus deklarlsa
4,
s : int main()
6 ,
7: int lengthOf\'ard ;
8: int wiclthOfYlrd ;
9: int areaOf'lard;
10 :
11 : std: : cout "\nHow wide is your yllrd? ".
12 : std: :cin widthOfYard;
13 : std: :cout '\nHow long is your yard? ";
14 : std: :cin lengthOfYard;
15 :
16: arcaOfYard:
17 :
18 : std: : cout '\nYour yard is ' ;
19 : std: : cout areaOfYard :
20 : std :: cout " square feet\n\n" ;
21 : return O;
22 :
23 :
24: int FindAra(int l, int w) 1/ function definition
25:
26 : roturn l .. WI
27 :
How wide is your yard? 100
How long is your yard? 200
Your yard is 20000 f eet
5. ra Fggvny.k 183
A FindArea () fggvny prototpust a 3. sor tartalmazza. sszehasonltva ezt a 24.
sorban dcfinfci6vallthatjuk, hOh'Y mind a nv, mind II paramterek tpusa
megegyezik a kt helyen.
Ha lennnek, fordtsi hiba kelelkezne. Ami azt illeti, formai szempontbl
nincs sok klnbsg a deklarci6 s a definci kztt. Az el6bbi nek pontosvessz6vcl
kell s nem tartalmazhat ja a fggvnytrzsct, cic amgy mindenben egyezik
az utbbival
FigyeljLik meg, hogy II prototpusban a length s a width neveket adtuk a bemen6
paramtereknek, a definci azonban mr az l s w nevekkel dolgozik. vilgo-
san ltszik, hogy a fordt semmire sem hasznlja a deklal"ciban megadott neveket.
Ezek csupn a programol6 szmra jelentenek h<l sznos informcit. Fontos ugyanak-
kor a sorrend. A fggvny bvs<lkor az argumennlmokat ugyanolya sorrendben kell
megadunk, ahogya deklarci s a definci a par:.111ltereket tartalmazza.
Azt is megtehetjk, hogy a fggvny defincijt az els6 el6tti progrmnrszben
helyezzk el. Ez eselnkben aZl jelenti, hogya 24-27 sorokb:m lthat defincit el-
mozgathatjuk valahova a 16. sor el, ahol az els6 hV:IS trtnik. Ebben az esetben f
lslegess vlik a deklarci. Br ez a mdszer kis programok esetben kivl-
an hasznlhat, azrt semmikppen nem nevezhet6. Nagyohb progra-
moknl ugyanis komoly problmkba tkzhetnk, ha II vgrehajts s a lefordthal6-
sg a fggvnyek defincijnak kezd fggni. sszetett kdok esetben
ilyenkor kibogozhatat lan alakulhamak ki s soha nem lehetnk benne biz-
tosak, hogy minden a helyen s a sorrendben van. Sokkal haszno
s.1bb, ha mindent j deklarlunk, hiszen a definicik sorrendjtl val6 fggst gy
automatikusan kikszbljk.
Fggvnyek definilsa
Egy fggvny defincija kt rszre oszthat: tartalmaz egy fejlcet s egy trzseL A fej
lc rulajdonkppen nem egyb, mint a deklarci elismtlse. Annyi klnbsg persze
azrt van, hogy itt mr megnevezni a paramtereket, illetve nincs a sor vgn
lezr pontosvessz6.
84 11. rsz Bevezets a C++ programozsi nyelvbe
A fggvny trzse vagy teste a vgrehajtand utastsok sorozata, amit kapcsos
lek kztt adunk meg, /\ :I fejlc s a fggv(; nyrrzs szerkczett szemllteti az 5.3. bra.
visszatrsi rtk tpusa

unslgned short InI
nyit kapcsos zrjel
I/Utasftsok
paramterek

(inIlengIh, inI wId1h)
relum (length. wIdIh);

visszatrsi rtk
zr kapcsos zrjel
5.3. bra
/igy fl188V1'}II), fcjlt."ociilwk s ItJrzsllck szeM'Zcl
FOggvnyek megadsa: sszegzs ...
Egy fggvny prototpuSlI ami val, hogy ltal mt:gmondjuk II fordtprogramnak, mi
a fggvny neve, milyen tpus rtket ad vissza, s milyen lplIS adatoklH
vr milyen sorrendben. Ez formaitag a kverkez6kppen fest:
visszat6rai_tipus faggvny_neve( [tipus [paramter_nevelI ... ) :
A fggvC:ny definki6ja ezzel szemhen azt tudatja a fordtprograrnrnal, miknt kell
az adOlt fggvnynek A formai lers a fest:
ftlggvny_neve( [tipus [paramter_nevcll ...
(
utastsok;
Br a fggvny prototpusa a visszatrsi nket, a nevet s a paramterek listjt adja
meg, nem kell minden fggvnynek paramterekkel rendelkeznie, illetve ha vannak is
neki paramterei, a deklarciban akkor sem felsorolni ezek neveit, csak a l-
pusukat. A prototpus mt:gadsa mindig pontosvessz6vel vgz&iik.
A fggvny ddincijnak meg kell egyeznie a deklarcival a visszatrsi l:nk s
a pammterek tpusban. Meg kell neveznie valamennyi paramlen, a fgg-
vny trzst pedig kapcsos zr6jelek kz kell zrni. A fggvny trzsben
5.
valameflllyi utastst kvet, de magt a fggvnyt nem zrja ilyen jeL
A definci vgt a zr kapcsos zrjel jelenti.
Ha II fggvny ad vissza valamilyen rtket, akkor a trzsben az utols6 vgrehajtott
utasts egy r e turn lesz. Ez az utasts amgy a trzsben brhol felbukkanhat, vagyis
nem kell a sz6 .'i7.Oros rtelmben az ulolsnak lennie. Minden fggvnynek van
visszatrsi tpusa. Ha a fggvny egyltaln nem ad vissza rtket a hv6nak, akkor
visszatrsi tpusa void.
Nzznk nhny pldt fggvnyek prolotipusnak megadsra:
long FindArea (long l ength, l ong width ) .. II l ong rtket ad vinnza s
II kt bcmcn6 paramtare van
void PrintMessage (int messageNumber) ; / I nem ad Vi::Hi za 6rtket , egy
II bemen6 paramtere van
int GetChoice ( ) ; II agsz rtke t ad vi!;5za , ni ncs bemcn6 puramtere
BadFunction(} ; II egs z rtket ad vi ssza , n incs bemen6 p a ramtere
:-;zznk nhny pldt fggv nyek meghall'rozsm is:
long Az:-ea(long l , long w}
(
return l w:
void Pr intMessage(int whichMsg)
{
if (whichMsg :: o)
atd: : cout "Hello . \n ";
if (whichMsg
-- li
std : : cout "Goodbye . \ n ";
if (whichMsg > II
atd : : cout "I ' m confuaed . \n " ;
Hogy hny s milyen tpust] utasts lehet egy fggvny trzsben, arra gyakorlatilag
nincs semmifle korlt.
Ugyanakkor a jl megtervezett fggvnyck lmlban rvidek. II legtbb tulajdonkp-
pen nem hosszabb nhny sornl.
Vltozk hasmlata fggvnyeken bell
A vltozk fggvnyen belli kezelsnek tbb mdja is van. Amint mr
tbbszr emlteuk, vannak a paramterek, amelyeket a hv ad t
a fggvnynek. Ezek mellett magnak a fggvnynek is lehet sajt vltozkszlete,
amelynek a tagjai a fggvnyre nzve loklisak, s megszlnnck ltezni a trzsn kvl.
Ugyanakkor a fggvnyek hasznlhatnak globlis, vagyis a program egszbl e1rhe-
t vltozkat is.
85
86 11. rsz Bevezets a C+ + programozsi nyelvbe
Helyi
Egy fggvnynek nem csak adhatunk t paramtereket, hanem a trzsn bell
is deklarlhaul11k jabb v;ltoz6kal. Ezek a loklis vagy helyi vlLOzk, amelyek - ne
viiknek - csak a fggvnyen bell lteznek. H<1 a fggvny visszatrt a h
vhoz, ezeknek a vltozknak a tartalma elvsz, azokhoz a tovbbiakban semmilyen
mdon nem lehet hozzfrni.
A loklis vltozkat pontosan gy kell deklar:1lni, mint <lZ ssze tbhil. A fggvnyn(!k
paramterknt t<1dott rtkeket trol vltozk szintn lokilisak s ugyangy hasznl
hat juk 6ket, mintha deklarcijukat a fggvny trzsben adtuk volna meg. A param-
terek s a helyi vltozk hasznlatra mutat egy egyszenl pldt az 5.2 Lista. A kimenet
a progmm hrom utni futtatsnak eredmnyt mutatja gy, hogy mindh-
romszor ms s ms bemen6 pammtcreket adtunk mcg ne ki.
5.2 usta - ... , ... "" .... s helyi ri_ """"' =;..Iata ;..;...:;. lloca ;..;.. Ivo _,_.cpp = , _____ .....
o : linclude <iostream>
"
2 : float Convert (float.) ;
3 ,
4 : inL main()
5 : {
6 , float
floa t
'I'empFer ;
TempCel ; 7 ,
8 ,
9 ,
10 :
std: : cout e nter the i n Fahrenhe i t : ";
std : : ci n TempFer :
I L
12 :
13 :
TempCcl = Convert(TempFer) ;
std : : cout
std : : cout
"'nHere's the temperature
'I'empCel std: : endl;
14 : return O;
15 :
16 :
11 : float Convert(rloat TempFer)
18 : {
19 : float 'I'empCel :
20 :
21 :
22 :
'I'empCel = ('I'cmpFer
return TernpCe l;
32) * 5)/9;
in Celsius : . ;
Pl ease e nt er th, t emperature in Fahrenheit: 212
Here's the temperdt.ure in Celsius : 100
Please enter <he t e mperature in Fahrenheit: 32
Her e 's the tempe rature in Celsius : O
Pl e<lse e nt er the t emper ature i n Fahrenheit: 85
Here ' s the t crnpera ture i n Celsius: 29 . 4444
5.6ra fggvnyek I S7
..... kimenet a program hrom egyms utni futtalsnak eredmnyt mutatja. Ez egyes
funatsok sorn rendre a 121, 32 s a 85 rtkeket adtuk meg neki bemenetknt. A 6.
6 -. sorban egyegy float Ipus vltoz6t deklar:lunk, melyek kzl az egyik a Fah
kifejezett h6mrsklelet trolja, mig a msikban ennek a Celsius-skln ki
fc:,ezen rtke ta ll hat. A felhasznltl a 9. sorban bekrnk egy f ahrenhcitbcn kire-
>ezen h6mrskletet, majd ezt az rtket tadjuk a Convert () fggvnynek.
.-' Ygrehajlib ekkor a Convert () sorra, vagyis a 19. sorra ugrik, ahol ckkhm'-
IUnk egy TempCel nevi! helyi v{ll toz61. Br egy ugyanilyen vfl ltm:6 mr a 7. sor-
'.ln is szerepelt, a nem azonos, A most deklarlt TempCel ugyanis :\ Convert ()
rugg\'nyre nzve 1ok{llis, v'lgyis csak ezen bclLilltezik. A param6lerk6nt lTndott
v ltoz szinl(:n loklis, v;\gyis csupn m5solnt a main () fggvnyben hithal
ruggvnyhvsnl wdotl (:rtknek.
A fggvny par.:lmterl:t ennek rnegfelel6en hvharruk volna akr FerTemp-nek is, :1 he-
nl ... iltoz6t pedig Cel Temp-nek, ugyanolyan tkletesen ml1kdne. Aki nem hiszi, akr
-ndosthatja is a kdot, s rncgnzheLi, hogy lefordts utn ugyangy ml1kdik-e .
.\ helyi TempCel vltoz6b;1 egy olyan nk kerl, ami gy keletkezik, hogya pnr.lm-
tadott 'remFer i!nkl:b61Ievonunk 32-t, az eredmnyt megszorozzuk 5-tel,
"'I'U;d elosztjuk 9-cel. Ezt az nl:ket aztn vissz<l,\dj uk a lv flnek, :unely a l l. sorban
-.:kerl a main () fggvny vltoz6kszlell:hez tartoz TempCel vltozba. Vgezetl
.u. il!rtket a kperny6re a 13. sorb:m .
. " orogramol hromszor futtat juk le. Az rtk, amit tadunk neki a 212, ami nem
..... mint a vz forrspontj;\ Fahrenheitben kifejezve, gy knnyen
.- SY megkapjuk-e a Celsi us skln rvnyes rtket (100). A msodik futtatsnl a vz
::";yspontjval pr6blkozunk, mg I I harmadik egy tallomra vlasztott ltk, amely t-
-.;.L{"'3 bizonyra nem lesz egsz szm. Gy .. korlskppen pr6bljuk meg lefordtani
5.3 Ustban bemutatott programot, s az itt bemutatotthol. hasonlan leszteini a mti-
' dst.
S.3 Lista - Holvlrilm6k 60 DORIIIItorok haunlata 6ov. ho .. a malnll60 a Convertll
fGggrinyak rilloz6lt .... ugyangy hlvjk (locaIvor2.cpp)
' include <ioSLream>
_ . float Convert (float) ;
int main ()
(
float TempFer;
sa lI. rsz Bevezets a C++ programozsi nyelvbe
7 : fl oat TempCel ;
8 ,
9 : s td : : cout Please ente r the t emperat ure in Fahrenheit : .;
10 : std : : cin TempFe r ;
l l : TempCel = Convert( TempFe r) ;
12 : std : : cout \ nHere ' s t he t empcraLure i n eel sJ us : . ;
1] : s t d : : couL TempCe l std :: end l ;
14: return O;
15 :
16 :
17 : float Convert (float Fer)
IS : {
19 : float Cel ;
20 : Cel" ({Fer - 32) 5) / 9 ;
21 : r eturn Cel ;
22 :
l Ia minden igaz, ugyannt az eredmnyt kell kapnunk, mint az imnL
Minden vltoznak van rv nycssgi kre, ami meghatrozza, hogy mikor s a prog-
ram mely rszein hozzf(: rhet6. Azok a vltozk, amelyekct egy programblokkon bel.il
adunk meg, arra a blokkra nzve loklisak. Csak ezen a k6drszleten bell hozzMrhc-
l6k, ha pedig a kikerlt innen, akkor egyszen.1en megsz\1nnek ltezni.
A gl oblis vltozk ezzel szembe n a program brmely ponljrl houfrhet6ek.
Aprop
Ahol csak akarodl
j vl toz6t brmely programblokk brmely pontj n dskl arlhatunk. Ha gy akarjuk,
akkor akr egy i f -es szerkezet kapcsos zr6jelei kztt is. Ugyanakkor ne felejtsk
el, hogy ezek a vltozk csak az adott blokkon bell lteznek.
Globlis
Azok rt vltozk, amelyeket mi nden fggvnyen kivl dekla rllunk globlisak lesznek,
v<lgyis brmely fggvnybl belcrlve ebbe termszetesen <I main () fgg-
vnyt is.
A C++-ban ugyanakkor elkellni a globli s v{l ltozk hasznlatt, Illivel ezek-
kel meglehet6sen kusza k6dot h07.harunk ltre, amit aztn igen nehz lesz karbantarta-
ni. Ennek megfelel6en ebben a knyvben gyakorlatilag globlis vltoz scm
fog l=s persze ugyanez igaz azokra II progmmokra is, amit a knyv szer.li
nem oktatsi cll al rnak.
5. ra FQggvny.k 89
A fggvnyek argumentumai
Egy fggvny argumentuma inak termszetesen nem kell azonos tpusnak lennik,
Ha ppen arra van szksgnk egy problma megoldshoz, akkor teljesen
az a fggvny is, amelyik mondjuk egy egszet, kt long tpus paramtert, meg egy
:-\;J.raktert vr !:>emenetknt.
Fggvnyhvflskor argumcnlumknt brmely a C++ nyelvben rtelmes kifejezst meg-
.dharunk. Ebbe bcll:tartoznak :t konstansok, a matematikai s logi kai kifejezsek, illel-
\-e egy brmely mis fggvny ;Utal visszaadott rtk is. Tegyk fel pldul, hogy van
eg}' li1ggvnynk, melynek a deklarcija a fest:
nt MyFunctioll(int thclntegerParam. bool theBoolean) ;
Ezt szmos klnb7.6 mdon hvhat juk meg, amely lehet6sC:gckb61 i l l csupn hrmat
mutatunk be:
_nt :;0: , X ,. 3, y " 5: II deklarljuk az argumentun,knt ha9znl t
: " MyFunction(x,y);
MyFunction (32, true) ;
/I
;: " MyFunction(23.9, tOO>5);
vltoz6kat
II egy int s egy bool vltoz6t adunk t
II kt lland6t adunk t
II a:;o: els6 rtk 32, a msik igaz
\z utols hvs kirnenelell lekinlve leljes<::n megegyezik a msodikka l. Vgezetl
T".Jk 3 kvctkez6 kt fggvnyt:
_:lt MylntFunction(int x, int y):
001 MyBoolFunction(int x, int y):
:\ ezek utn akr a kvctkez6kppen is meghvhatjuk:
: " MyFunction(MyTntFunction13 , 5) , MyBoolFunction(2,4:
I:t rulajdonkppen az trtnik, hogya MylntFunction(J,S) hvs ltal vissz:1:1doll
s a Myl3oolFunction (2 .4 ) hvs ltal szolgltatott logikai rtkel adjuk t p3-
!""l.mterknt a MyF'unct ion fggvnynek.
fggvnyhfvs mint paramter
B.:r nyelvileg teljesen helyes, ha egy fggvny paramtereknt cgy msik fggvny l-
:3.l \iSS7..aadott rtket hasznlunk fel, a7.rt a7. igazat megvallva ezz<::! a m6clszerrel elg
,rusza kdot lehet alkotni. Az ilyen progf"".J.mat aztn ig<::n nehz nyomkveIni s kar-
:Unrartani. Pldaknt tegyilk fel, hogy a doubleJ: (), tripleJ: (), squaJ:e () s
J. :::ube () fggvnyek valamennyien egy-egy rtket adnak vissza. Ebben az esetben
=\-elvileg teljesen helyes a fggvnyhvs:
.'_""C. 5wer " (doubleJ:(tripler(square(cube(myValuc))):
90 II. rsz Bevezets a C++ programozsi nyelvbe
Hanem hogy itt mi is trtnik pontosan, azon az ember knytelen kiss elgondolkodni.
Vesszk ugyebr a myValue vltoz l1kt s ezt paramterkm tadjuk a eube ()
fggvnynek. Ennek :l visszatrsi rtkt megkapja argumentumknt a square () ne-
v fggvny, amely szimn kisz .. 'lmol valamit. Ezt a vala mit kapja bemenetkm
a tripler () fggvny, amelynek visszatrsi rtkl vgl a doubler () dolgozza fel.
Az. Answer teht a myValue kbe ngyzetnek meghromszorozott majd megkt5zere-
zett rtkr kapja rt(:kl.
Mindezt nem csak lerni nehz, hanem tgondolni is. EIs6 ltsra pldul sokak nem
lesz trivilis, hogyelabb szorozl\mk hrommal s csak aztn emeltnk ngyzetre, vagy
ppen fordtva. Ha pedig hibs a vgeredmny, ember legyen a ta lpn, aki megmond-
ja, hogy a ngy fggvny kzl V'djon melyikben kell keresni a hibt.
Sokkal t l{lthatbb, ha ltrehozunk nhny tmeneti vltOZI, s a
lpsre kljLjuk vgre, valahogy gy:
unsigned long myValue = 2;
unsigned long cubed = cube(myValue);
unsigncd long squared = square(cubed) ;
unsigned long tripled .. tripler (squured) ;
long Answer = doublerltriplcd) ;
II cubed 8
II squared ol 64
II tdpled = 192
II Answer : 384
Ezzel a mdszerrel lehet6sg"k van ci , hogy szksg esetn b5rmely kztes ered-
mnyt mcgvizsgftljLlnk, s azo" sem kell gondolkodni, hogy milyen sorrendben hajtd-
tak vgre <lZ egyes
A paramterek egyben helyi is
A fggvl:nynek tadOft argumentumok a tovbbiakban loklisak a filggvnyre nzve.
Ez azt jelemi, hogy :l rajtuk vgzen vltoztatsoknak nincs semmifle hatsa a fliggv-
nyen kvli kdra. Ezt a szablyt a programozk rtk szerinti tadsnak (passing by
value) nevezik, ami teht szemllctcsen azt jelenti, hogy a fggvny sajt argumencu-
mainak csak a msolatval dolgo:lik, nem az ,eredeti pldnnyal". A helyi msolatokat
aztn a fggvny k6djban mr ugyangy kezeJhetjk, nlinl brmely ms helyi vlto
zt. Az 5.4 List.-'lban bemutatoll k6d ezt a sz:tblyt hivatott bemutatni.
5.4 UIIII- Az __ 6Iod -1,"'IIy".,."",
o: II 5 .4. Lista Az rtk szerinti tads szeml ltetse
l : #include <iostream>
2.
3 : void swap(int x, int y);
4 .
5: int main ()
6: {
7. int x = 5 , Y 10;
B.
9 .
std : : cout "Main . Before swap, x :
y :
swap(x,y) ;
5. ra Fggvny.k 191
x
<<: y '\n' ;
l l : std: : cout 'Main. After swap, x: x
:2 :
:3 :
:4 :
:5:
return O;
:6, void swap (int x, int y)
int temp:
Y' y '\n" ,
:"7:
:8 :
:9 ,
20 :
std: : cout Swap . Before swap, x :
y :
x
y ' \n ';
21 : temp = x,
22 : x = y;
23 : y = temp ;
24 : std: : cout Swap . After 9wap , x : " x
25 :
26 :
- !{ain . Before swap. x: 5 y : 10
S;;ap . Before swap. x: 5 y : 10
:wap . After swap. x : 10 y : 5
".ain . After swap . x : 5 y : 10
y: " y \n' :
Ez a program a main() filggvnyen belllrrehoz kl vlloz6t, majd argumentumknt
mdja azokat:! swap () fggvnynek. Ez - nevnek - felcserli a kt rt-
.. e{. Ami kor 3zonban a main () fggvt:nyhez visszatrve megvi7..sgljuk a hel yzetet, azt
tapasztaljuk, hogy semmi sem vlt ozott,
.J,. \-l tozk a 7. sorban kapnak rt ket. Ezeket a 8. sorban meg is jelentjk a kper-
r:;-6n, aztn a 9. sorban meghvjuk II swap () fggvnyt, amely megkapja beme-
netkm .
J,. program vgrehajtsa teht a swap () k6djval folytatdik. Itt a 19. s a 20, sorban is-
kiratjuk a kl rtkct, amelyek ugyanabban a sorrendben vannak, mint
a ma in () fggvnyben, A 21-23 sorokban megtrtnik a csere, amit a 24, s
:--. sorokban egy jabb kiratssal ellen6rznk. Lthat, hogy amg a swap () kdj t)
bdl . tartzkodunk", addig a kt rtk tnyleg helyet cserl.
fu_!lem a fru"",ny vgrehajtsa utn a program a 11. sorban folytatdik, ami mr is-
r:.er. a main () rsze, s a kt 6rtk megint a rgi . Semmi nem vltozott.
92 11. rsz Bevezets 8 C++ programozsi nyelvbe
Mindebbl vilgosan ltszik, hogya swap () fggvnynek tadott kt vltoz tadsa
csak rtk szerint trtm meg, vagyis a fggvny kt msolatot kapott, amelyek
a swap () nzve loklisak. A 2] -23 sorokban igazbl ennek a kt helyi vltoznak
az rtkt l'serltk meg, amelynek gy a klvilgra semmifle hatsa nincs. A main ( )
tovbbra is az eredeti ll apotol ltja.
Egy fejezetben be fogunk mutatni egy olyan megoldst is, amivel a ma i n ()
szmra is fclcserlbet6 a kt rtk egy mgpedig egy fggvnyhvs segtsgvel.
rtkek visszaadsa fggvnvbl
Egy fggvny egyetlen rtket ad vissza, vagy a visszatrsi tpUS<1 void. A voi d
kulcssz igazbl csak egy jelzs a fordt6prograJtUlak, amely arra utasit ja, hogya kr-
dses fggvnyb61 nem kvnunk semmifle rtket visszaadni.
lia egy fggvnyen bell rtket szeretnnk visszaadni , nincs ms dolgunk, mint
a return kulcssz utn lerni a visszaadni kivnt vltoz nevt, egy kifejezst, vagy
cgy konkrt rtket. fme nhny plda:
return 5 ;
return ( x > 5) ;
retur n (MyFunction cl) ;
rdtve hogy a MyFunct ion ( ) olyan fggvny, amely maga is ad vissza rtket,
hrom femi helyes. A msodik esetben (x>s) a hfv6nak vissza,ldorr rtk ha-
mis lesz, ha x rtke nem nagyobb mint S, esetben pedig termszetesen
igaz. gyeljnk r, hogy ilyen esetekben a kifejezs rtke addik vissza, nem pedig
az x vltoz tartalma.
Amikor a prognlm elrkezik egy r eturn utastshoz, akkor a hv fl visszakapja
az utna megadott kifejezs l:rtkt, a vgrehajts pedig a fggvnyhvs utni soron
folytatdik. A r e t urn utn szerepl6 ilyenkor egyltaln nem futnak Ic, V;l-
gyis a r et urn ga .... ,lntltan a va l kilpst jelenti. Ez egyben:lZt is jelenti,
hogy egy fggvny kdja tbb r eturn utastst is tartalmazhal klnbz6 helyeken.
Csak azt nem szabad elfelejteni, hogy amint a program ;lZ els6 return utastst elri,
a rggvnynek vge. A tbb return utasts haszn lalt szemllteti az 5.5 Listban be-
mutatou kd.
5.5 lista - T6bb lIlIUm .... It egyeUen fOggvHyben !manyqm ..... ppl
o: II 5. 5 . Li s t a - Tbb r eturn utas i t s egye t l en fqgvnyben
1: Il s tatcments
2 : tinc1ude <iostream>
3 ,
4 : i nt Double r (int ArnountToDouble ) ;
5:
6 : int main()
7 : (
3 : int r esult = O;
9 : int input ;
:0:
:1 : std : : cout 'Enter a number between O and '
:'2 : " 10 , 000 to doubl e : ' 0
:3: std : : cin input ;
-..
-' .
:'5 : std : : cout ' \nBcfor c doubl e r is ca lled . . ' ;
:6 , std: : cout ' \ninput : inpu t
:,7 , doubled : resul t ' \0";
:'8 ,
:'9 , result .. Doub ler(input ) ;
20 :
21 : std: : cout "\nBack f rom Doubl e r ... ;
22 : std: : cout "\ni nput : input
23 : doubl ed :' res ult ' \0\0" ;
~ :
25 : return O;
26 :
27 :
2B : int Doubler (int original)
.;9 : {
-O : if (original <= 10000)
~ l : rcturn original ' 2;
32 : else
"] , return - 1.
~ 4 ; std :: cout "'(ou can't get here ! \o' ;
- 5 :
Enter a number bctwccn O and 10 , 000 to double : 9000
Before doubler is called .. .
oput : 9000 doubl ed : O
Eack trom doubl er .. .
: nput : 90 00 doubled : 18000
:::nter a number bc twccn O a nd 10 . 000 t o doubl e : 11000
3efore doubler is cal led . ,
:nput : 11000 doubled : O
3ack from doubler ...
: nput : 11000 doubled : -l
5. ra Fggvnyek 193
94 11. rsz Bevezets a C++ programozsi nyelvbe
A 11-13 sorokban bekrnk a felhasznlrl egy szmot, majd a 16. s 17. sorokban ki-
rjuk azt az eredmny trolsrd hasznlt helyi vltoroval egyn. A Doubler () fgg-
vnyt a 19. sorban hvjuk meg, bemenetkm pedig a fel hasznltl bekrt rtket ad-
juk t neki. Az eredmny a mr emltett result neV1.1 helyi vltoz6ba kerl, majd az r-
tkeket a 21-23 sorokban ismt kiratjuk.
A 30. sorban - amely a Doubler () fggvny k6djhoz tartozik - megvizsgl juk, hogy
a paramterknt tadott rtk nem nagyobb-e mint 10000. Ha nem, akkor a fggvny
a szm ktszeresveltr vissza. I-Ia azonban a megadott szm tzezernl nagyobb, ak-
kor a visszatrsi rtk -1 lesz, amit jelen esetben hibak6dnak is felfoghalunk.
A 34. sorban l{uhat6 kdra a vgrehajts soha nem kerlhet, mivel akr nagyobb ;j pa-
ramterkm tadott rt6k mint 10000, akr ki sebb, a fggvny a 3"1. vagy a 33. sorban
mindenkppen visszatr a hv flhez, vagyis a 34. sorig gar.mtlt.an soha nem jut el.
Ez annyira gy V' In, hogy egyes fordtprogral1lok az il yen helyzetre mg Ogyelmeztet6
zenetet (warning) is kldenek.
Aprop
Fordft6i ilzenetek a manyretums.cpp fordftsa kzben
A manyreturns. cpp program fordftsa sorn egyes a hibazenettel
tallkozhatunk:
"manyreturns.cpp"; W8066 Unrcachable code in function
Ooubler(int) at line 34
"manyreturns. cpp": w8070 Function should retum a value in function
Doubler(int) at linc 35
Az zenet arra figyelmeztet bennnket, hogy az s td : : cout soha
nem hajtdik vgre, mivel a Doubler () fggvny mindenkppen visszatr a hfv-
hoz. elrn azt. A msodik zenet szerint a fordtprogramunk kicsit knyel-
metlenl rzi magt a kialakult zrzavar mian, mivel az utols return utasts
utn de mg a zr kapcsos zrjel tallt vgrehajthat kdot, s ez hatrozot-
tan nyugtalantja. Ezek csupn zenetek (warning), amelyek felbuk
kansa azt jelenti, hogya fordts rendben lefutott, a gpi kd program ellIt, el-
lenben futtatskor nem biztos, hogy azt fogjuk kapni, amit szerettnk volna. Ez ese
tnkben termszetesen nem problma, mi ugyanis ppen azt kapjuk, amit szeret-
tnk volna: azt akartuk bemutatni, hogy Hgyes eJhelyezhetnk egy
programban soha vgre nem hajton rszleteket.
5. 6ra Fggvnyek 195
Fggvnyek alaprtelmezett paramterei
Ha egy fggvny prolorpusban s defincijban szerepel egy paramter, akkor a h-
,6 fl kteles ennek a hvs soctin rtket adni. Radsul az tadott rtkek olyan tpu-
snak kell lennie, mint ami a deklarci6ban szerepd. Ha teht van cgy a
mdon deklarlt fggvnynk
long myFunction{int) ;
akkor annak meghvskor tnindenkppcn t kell adnunk egy egsz rtket, legyen
az egy vho7..6 vagy egy Uand. Ha fl fggvny defincija eltr a deklarcitl, vagy
a hvs sorn nem a rtket adjuk t, akkor fordtisi hiba keletkezik. Ez al6l
egyet.len kivtel van, mgpedig ha a fggvny prOlotpusban (dekla rki6jban) meg-
adunk egy p:mun(:ternek alaprtelmezett rtket. Ez az rtk akkor lp rvnybe, ha
:1 hv nem rendelkezik a krdses paramter ltkrl. Ennek ismeretben az imnt
bemut.nott cleklarcit a kvetkez6kppen al:tkthatjuk l:
long myFunction (int x " 50) ;
Ez a dekl:lrd azt mondj,l, hogy .1 myPunction () neVI. fggvny long rt ket ad
vissza, s egy egsz t: nket vr pammterknL Ha pedig a hv ez ut6bbit nem adja
meg, akkor II p:lmmler alaprtelmezett rtke legyen 50, Mivel :1 deklarciban nem
nevet adni a par<uutereknek, a fenti sort akr a kvctkez6kppen is rhauuk
\'olna:
long myFunction (int = 50) ;
Atl61, hogy :t dekbrd6ban alapltelmezett rt ket adunk meg egy paramterhez,
a fggvny defincija mg semmiben nem vltozik. Esetnkben teht a rnyFunction
konkrt megadsa a kvetkez6kppen kezd6dhet:
long myFunction ( int x)
Ha a hv fl nem :tdja meg az x par-.J mler rtkr, akkor a fordt6progr.un az alapr-
telmezett 50-es rtket rendeli hoz7.. Ez tovbbra sem jelenti azt, hogy II definiciban
s a deklarci6ban a par.Jmternek azonos nven kell szerepelnie, az alllpnelmezctt
nk hozz rendelse ugyanis pozci nem nv alapjn trtnik.
.-\laprtelmezett rtket megadhatunk egy fggvny egyes paramtereihez, vagy akr
3Z sszeshez is. Ez egyetlen korllO?s ezzel kapcsolatban amit be kell tartanunk az,
hogy ha .1 panimterlistban eb'}' elemnek nincs alaprtelmezett rtke, akkor nem le-
het olyan paramter, aminek van,
Tegyk fel, hogy egy fggvny deklarcija a fesl:
long myFunction ( int Paraml. int Param2, int Param3);

96 11. rsz Bevezets a C++ programozsi nyelvbe
Ebben az esetben a Param2 pammLernek csak akkor lehel alapnelmezeu nke, ha
Param3-nak is adunk. Hasonlan Par amI-hez csak gy adhatunk meg ilyen rtket, ha
ugyanczt a msik is. Az alaprtelmezett pammlerrtkek haszn-
latt az 5.6 listban mutatjuk be.
na .. I
o: II 5 . 6. Lista paramterrtkek
1 : II hasznlatnak bemutatsa
2: .include <iostream>
J ,
4: int AreaCube(int length, int width 25 , int hcight 1 ) ;
5 ,
6 : int main()
'7 :
8 : int length ol 100 ;
9 : i nt width .. 50 :
10 : int height = 2;
1 1 : int area :
12 :
13 : area" AreaCube(length, width, height ) ;
14 : std:: cout "First time area equals ' arca '\n":
15 :
16 : area AreaCube(length, width) ;
17 : std : : cout 'Second time area equals' area '\n';
18 :
19 : arca" AreaCube(length):
20 : std : : cout 'Third time area equals' area '\n';
21 : return O;
22 :
23 :
24 : int AreaCube(int length, int width. int height)
25 :
26 : reLurn (length ' width' height) :
27 :
First area equals : 10000
Second t ime erea equals : 5000
Third time area equa ls : 2500
A 4. sorban llhat az AreaCube () fggvny prototpusa, mely szerint ez a fggvny
hrom egsz tpus paramtert vr a hvtl. Ezek kzl a kt utolsnak alaprtelme-
zett rtke is van.
Maga a fggvny egybknt egy tglatest felsznt szmolja ki , a paramterek pedig
ennek az lhosszsgait tartalmazzk. Ha nem adunk meg szlessget (width), akkor
5, ra Fggvnyek 197
az automatikusan 25 Jesz, ha pedig a magassg (height) hinyzik, akkor a progr.lm
az 1 rtkkel szmol, Megtehetjk persze azt is, hogy csak a magassgot nem adjuk
meg. Ilyenkor termszetesen csak erre fog rvnyeslni az l-es alaprtelmezen rtk,
a 2S..l a fggvny nem hasznlja. Ennek a fordtonja ugyanakkor nem lehelSgcs, va-
gyis nem adhatunk meg magassgot anlkl, hogy meg ne adnnk a szlessget is.
A 8-10 sorokban beiltjuk:t magassgot, szlessget s hos,.o.;zsgot trol vltozk
h.;idt. h, height, l ength) rtkt , majd ezeket paramterknt tadva a 13. sorban meg-
hvjuk az AreaCube () fggvnyt. Ez kiszmt ja a felletet, amit a 14. sorban kiiratunk
a kperny6re.
A vgrehajts t!zlltn a 16. sorban folytatdik, ahol ism(:t meghvjuk 37. AreCube ( )
fggvnyt, de ezttal nem adunk meg In:lgassgot. A fggvny ekkor az alaprtelme-
zett rtket fogja hasznMni, ami akiratott eredmnyben vilgosan ltszik.
A \9. sorban ismtelt fggvnyhvs kvetkezik, de ekkor mr sem II szlessget sem
a magassgot nem adjuk meg. A vgrehajts teht immr harmadszor a 26. sorm ugrik,
3hol kt alaprtelmezett rtk felhasznlsval a fggvny ismt kiszmt ja a felsznt.
Ezt aztn megint kirltjuk a
Fggvnvek tlterhelse
:\ CH nye lv lehet6v teszi , hogy ugyanolyan nvvel akr tbb fggvnyt is ltrehoz-
zunk. Ezt a:.! dj{jrst nevezik a fggvny tlterhelsne k (overl oading). Az azonos nv-
vel fggvnyekne k azrt a pammterlistjukban klnooznik kell , vagyis
legalbb egy paramterknek ms lpusnak kell lennie, vagy szm \xlrlmter-
rel kell rendelkeznik. Esetleg Lssunk rgtn egy pldt:
::'nt myFunction (int , int) ;
_:lt myFuncti on (long , long) ;
:nt myFunction (long) ;
:\ :nyFunct i on () fggvnyt itt hrom paramterl ista megadsval terheltk
rul. Az s a msodik vltozat a paramterek tpusban tr el egymstl, mg a har-
madiknak SZ;lm p:1ramtere van.
Hogy a C++ fordtnak melyik vltozatot kel l hasznlnia az egyes hvsok :1lkalmval,
azt ezek az dtcrsek, vagyis a hv,s konkrt mdja dnti cl.

Tlterhelt fuggvnyeknl a visszatrsi rtk tpusa lehet azonos de akr is, amg
.i paramterek listja klnbzik. Ugyanakkor arra is van, hogy a tlterhels
...b.pja a visszatrsi rtk tpusa legyell. A fuggvnyek tlterhelst swks tbbalak-
sgnak (polimorfizmus, polymophism) is nevezni. Az elnevezs magrt beszl, gy ra-
;in nem ignyel tovbbi magyarzatot.
98 11. rsz B8V8Z8ts a C+ + programozsi nyelvbe
A fggvnyek tbbalaksga a nyelvnek al. a kpessge, amely teszi, hogy
egy adott nevet tllerhelve a fggvnynek tbb jelentst lulajdontsunk. Ha ugyanazzal
a nvvel, de paramterlistval hozunk ltre kt vagy tbb fggvnyt , maga a for-
dt akkori is kpes lesz automatikusan eldnteni, hogy melyik helyzetben
van sz a kdban, hiszen a paramterek szma s tpusa alapjn azonostani tudja
a vltozatot. Ha pldul az a feladat , hogy egy fggvnnyel szmtsuk ki sz;i-
mok tlagt, akkor fl tlterhels segtsgvel nem kell kln nevet adnunk minden egy
adattpust vltozatnak, vagyis nem kel1llrehoznunk kln AverageI nts (),
AverageDoubles () s ehhez hasonl nevI fggvnyeket. Hvhat juk valamennyi egy-
szeruen Average () -nek, a fordt pedig mindig tudni fogja , hogy melyik az igazi.
Tegyk fel, hogy van egy fggvnynk, ami brmil yen bemenetet is kap, megslOrozza
azt Csupn a numerikus tpusoknl mamdva ennek a fggvnynek nyilvn
kpesnek kell lennie az int , long, float s double tpusok kezelsre. Ha nem len-
ne a C++-ban Tbbalaksg, eZl csak ngy klnbzi) ncv(j" Cggvnnyel tudnnk meg-
oldani, valahogy gy:
int DoubleI nt (int) ;
long DoubleLong(long) ;
float DoubleFloat(tloat) ;
double DoubleDouble(double) ;
Ugyanez a tlterhels segL'igvel gy fest:
int Doubl e( i nt) ;
l ong Double (long) ;
fl oat Double (fl oat ) ;
double Doubl e (double) ;
Az ilyen kdot nyilv:'i.n sokkal utlag mcgl:rteni v,lgy hasznlni, hiszen
nem kell azzal foglalkoznunk, hogy mikor melyik fggvnytpusl hvjuk meg, a fordt
ezt automatikusan elintzi helyettnk.
Inlino fggvnyok
Amikor megadunk egy fggvnyl, a fordtprogram ltalban csak hozza ltre
a memriban az ennek gpi kdot. Ha meghvjuk a fggvnyt, a program
vgrehajtsban elgazs keletkezik, a processzor:t memriaterlefre ugrik,
s vgrehajtja a fggvny kdjt. Amikor a fggv{my visszatr, a vgrehajts is vissza-
ugrik a hvs helyre, s az azt utastssal folytatdik. Ha teht egy fggvny
tzszer meghvunk, az tz ilyen ugrst fog jelenteni a vgrehajtsban. A fggvnynek
egyeden pldnya van, de azt tz.<;zer hajtjuk vgre.
Az effle ugrlsnak persze van nmi szmtsignye, vagyis ltala nmikpp cskken
progmmunk teljestmnye. Ugyanakkor vannak egszen kis fggvnyek is, :tmelyek
5. ra Fggvnyek 199
akr egyetlen soroyi kclbl llnak. Nyilvnvalan a tel jestmny nvekedst vonja
maga utn, ha egy vagy kl utasts vgrehajtsrt nem kell ezt a bizonyos ugrsi
veletet elvgezni. Amikor a programozk teljestmnYfl beszlnek, ltalban a sebes-
sgre gondolnak, vagyis a fggvnyhvsok kikeriilsvel programunk futsi sebessge
fog nvekedni.
Ha egy fggvny deklarcijban szerepeltet jk az inline kulcssZl, akkor a fordt-
program valjban nem hoz ltre fggvnyt, hanem a megadott kdul bemsolja min-
den olyan helyre, ahol eZI a ltszlagos fggvnyt meghvjuk. Ez egyben azt is jelenti,
hogy a vgrehajtsban semmifle ugrs nem lesz, a progmm gy viselkedik, mintha
a fOggvnyben szerepl6 utastsokat a hvs helyre gpeltk volm. be.
Mindez igazr1 szpen hangzik, m nem rt flhvni a figyelmet az inline fggvnyek
haszn latnak rnyoldalaira sem, is ha egy inline fggvnyt tzszer
meghvunk egy msik fggvnyb61, akkor a k6dja tzszer bemsoldik annak a k6dj-
ba. Ez pedig azt jelenti, hogy br a sebessg bizonyra nvekedni fog, a kd mrete is
ugyanez teszi, mgpedig az inline fggvny fgg6en esetleg olyan mrtk-
ben, amirt mr nem is ri meg ezt a megoldst, hasznlni. Radsul
hogya sebessl:gnvekeds is csak szp lomnak bizonyul.
A manapsg hasznlatos fordtprogr-.tmok igen okosak, rengeteg optimalizlst elv-
geznek maguktl is, ami szinte minden esetbe n szksgtelenn teszi az inline fgg-
vnyek alkalmazst. Ami viszont mg ennl is fontosabb, az a k6drnret s a teljest-
mny sszefggse: II nagyobb kd gyakran lassabban fut, mert nehezebben kezeli
az opercis rendszer.
Aprop6
Helycsere a #define direktfvval
Az inline fggvnyek tulajdonkppen ugyanaz a szerepet tltik be, mint a C
nyelvben a IIdefine segrtsgvelltrehozott makrk.
Ezek utn joggal krdezheti az olvas, hogy - klnsen kezd6knt - mgis milyen
amnyszablyokhoz tartsa magt. Ha van egy kifejezeuen kis fuggvnyiink, amely
mindssze egy vagy kt utastsbl ll, az . potencilis arra, hogy inline-knc
deklarljuk. Ha azonban brmilyen ktsgnk merl fel ennek a hasznossg:lVal kap-
csolatban, egyszenen ne ljnk a lehet6sggcl. Az inli ne fggvl'!nyek haszn latra
mut:H pldt az 5,7 Lista.
o: II 5 .7. Lista - Inline fggvny hasznlatnak bemutatsa
1: finclude <iostream>
2 ,
] : inline int Doubler(int);
4 ,
100 I. rsz Bevezets a C+ +
5 : int main ()
6 : (
7 : int target ;
8 ,
9 : std: : c out 'Enter a number to work wi th : ' ;
10 : std: : cin target ;
11 , std :: cout '\n';
12 :
13 , target " Doubler(target ) ;
14 : otd: : cou t "Targe t : t arget std , , endl;
15 :
16 : target " Doublp.r(target) ;
17 : std:: cout 'Target : target std:: endl ;
lB :
19 : target " Doublcr(target) ;
20 : std: : cout 'Target : ta eget std: : cndl ;
21 : rcturn O;
22 :
23 :
24 : int DoubIer(int target )
25 : (
26 : return 2*target ;
27 :
Enter a number to work with : 20
Targel,. : 40
Target : BO
'I'arget : 160
A 3. sorban" Dou bler () fggvnylolyan inline-km deklarljuk, amely egyetlen
eg(!sz rtkel vr bemeneIknt s szintn egsz rtkkel tr vissza. A deklarci6 am(lgy
pontosan nz ki , mim brmely msik, eltekintve persze a visszatrsi tpus l-
16 inline kulcssztl.
kezdve mindazokon a helyeken, ahol a
t arget = Doubler ( targct} ;
kdsort olyan gpi kd keletkezik, mintha a llna a forrskdban:
target " 2 * target ;
Ez azt jelenti, hogy amikor a programol elindtjuk, mr minden a helyn van, vagyis
nincs szksg ugrsokra ahhoz, hogya fggvny lefusson. Az eredmny gyorsabb, de
nagyobb mrel program.
5. ra Fggvnyek 1101
Aprop
Csak agy tancs ...
A modern fordtprogramok az inline kulcsszt valjban csak laza irnymuta-
tsknt s nem parancsknt kezelik. vagyis ha a fordt egyb szempontok alapjn
gy dnt, akr figyelmen kivl is hagyhatja ezt az hajunkat, s kznsges fgg-
vnyhvst hajthat vgre helyette.
A fggvnyek s a verem
Amikor meghYl.Jnk egy fggvnyt, a progr.Hn vgrehajtsban elgazs keletkezik.
A hv fl tadj:l a paramtereket, majd a fggvny trLSt!vel folytatdik a futCIs. Ami -
kor a fggvny vget r, egy rtket ad vissza a hv6nak (hacsak nem void li visszat(:-
rsi tpusa), a vgrehajts pedig visszatr a hvs utni utastsm. Na dc hogyan is
ez az egsz pontosan?
A fordtprogram v:116j::ban minden egyes programhoz ltrehoz egy gynevezett ver-
met (stack) , Ez nem ms, mint egy specilis clr'.1lefoglalt mem6riaterlet, amelyen ke-
resztl a fggvnyek kpesek egymssal kommuniklni. Veremnek azrt nevezik, mert
rvnyes r <lZ "utolsnak be els6nek (last-in-first-our) elv, vagyis krlbell gy
mint ebdl6ben az egymsra halmozott tnyrok (lsd az 5.4. :brf).
5.4. bra
A verem nem egy6b, mim ByITjtc/luJI/)"c.
Az be els6nek ki" elv rviden annyit tesz, hogy amit uLoljra tettnk a ve-
rem tetejre, azt kapjuk vissza el6szr a kiolvass sorn. Vannak persze msfle kiszol-
glsi sarok is. A legtbb pldul gy mint a sznhzi sarok, vagyis aki ds-
nek jn, az jUl be az hagyja el a sort. A verem ezzel szemben olyan,
mi nt az egymsra dkotl pnzrmk. Ha egymsra rakunk 10 darab rmt az asztalon,
majd prat leemelnk a raksr61, akkor az hrom leemelt rme az utols hrom
fel helyezen pnzdarab lesz.
102 11. rsz Beveie1. a C++ programozsi nyelvbe
Amikor adatot (push) a verem tetejre, akkor a raks nvekszik. Amikor leh-
zunk (pop) onnan valamit, a verem cskken. Ha nem akarunk katasztrft, akkor nem tu-
dunk gy leemelni a veremrl egy elemel, hogy le ne emelnnk az sszes fl(te lev6L is.
A programozssal foglalkoz knyvekben ltalban a k1nyrhalmoL szoks a verem al-
leg6rijaknl emlteni, amivel nincs is kl nsebben nagy baj azon kvl , hogy alapve-
l6en hibs. Valjban sokkal helyesebb amolyan fgg61egescn el rendezett Oksornak
elkpzelni a vermet, amelynek a teleje ott van, ahova a veremmutat6 (stack pointer)
ppen mutat.
Minden egyes t1knak va n egy sorszma, a vcrcmrnutat pedig mindig ezek kzl
:1 sorszmok kzl trol egyel. Minden, ami ez alatt a fik alan - a verem teteje
alatt - helyezkedik el, a veremhez tartozik, s ppen t rol vala mit. Minden, ami fltte
van, res, nem tartozik a veremhez, a tartalma pedig rvnytelen. Ezt az elkpzelst
szemllteti:az 5.5. bm.
Verem
theVarlable 60
My"," 50
YourAge 37
5.5. bra
A veremmlllllf
100
A vermen kr- 11021
}
Veremmutat
1
l
l
l
1
l
1
l
l
1
01 vli tartomny
02 <:0
03
04
05
06
07
08
09
10
A verem tartalma
Alnikor adatot tolunk a verem tetejre, az a veremmutat6 fltti fikba kenil, a vc-
remmutat pedig eggyel (vagy a szksges hosszal) feljebb mozdul. Ha adatot vesznk
Ic a akkor ennek ppen a fordtonja jtszdik le, vagyis a veremmmat lej-
jebb toldik. Ezt az egyszeru jtkszabl y t szemllteti az 5.6. bra.
Verem
IheVarlable eo
MyA,. 50
YOI.IrAge 37
5.6. bra
100
101
102
103
10'
105
106
107
108Q
Veremmutat

Avermen kr-
tartomny
A verem tartalma
A l'Cremll/ultl/6 mozga/sa
5.6ra Fuggvnyek 1103
Amikor progmmunk meghv egy fggvnyt, ltrejn egy (513Ck frame),
amel y egy olyan, a veremb61lefoglalt mret\! terlet, amely a kr-
dses fggvny par.:lmtereinek kezelsre. Ez egy viszonylag sszetett folyamat , r-
adsul a rszletei klnbzhetnek is a fe!ptsCf gpeken, de a lnyege
a
1. A rendszer elhelyezi a verem tetejn a fggvny visszatrsi dmt. Ez az a me-
m6riacrn, ahova a vgrehajtsnak vissza kell ug'J.nia, amikor a fggvny befe-
jezle mtIkdst.
2. A rendszer lefoglal a vennen egy akkor'.! helyet, amely a
rtk trolsra.
3. A hv6 fl elhelyezi a verem tetejn a fggvny valamennyi paramtert.
4. A vgrehajts a fggvny k6djra ugrik.
5. A fiiggvny helyi vltozi deklarlsuk sorrendjben ltrejnnek a vermen.
Visszmrskor ugyanennek a a fordtonja zajlik le.
Krdsek s vlaszok
Krds: Mirt nem hasznllInk kizrolag globlis vltozkat?
Vlasz: Volt amikor a programokban valban kizrlag glohlis vlLozkat hasz-
nlLak. Aztn ahogy nvekedett a szoftverek sszetettsge, egyre nehezebb volt megta-
llni bennk a hibkat. Ennek pedig alapvet6en az volt az oka, hogy a globlis adato-
104 11, rsz Bevezets a C++ programozsi nyetvbe
kat elvileg brmely fggvnyelronthaua, hiszen a program brmely pontjn mdost-
h,lt volt brmi. A hossz vek gyakori ali tapasztalata azt.'n meggy6zte a fejleszt6ket,
hogy az adatokat ami lyen mrtkig csak lehet, lokliss kell tenni, vagyis a leg-
kisebbre le keU azoknak a blokkoknak a szmt, amelyek egy-egy vltoz-
hoz hozzfrhetnek.
Mil1 /Icm befolysolja a liv fCl adatait az, ha egy fiiggvl/Y mdostja a neki
rudoll fXo'amterel..'cr,?
Viilasz:'A filggvnyek paramterei rtk szerin{ addnak t. El lIl( jelenti, hogya fgg-
vny valjban csak az eredeti rtkek msol:Hval dolgozik.
Krds: Mi t(JI1llik akJ.'OI; ha dcklarlom a kl fggvny:
int Area (int width , int length = l);
inL Arca (int size) ;
ez Wlterhelsl/ck vagy sem? ug)'an a pammte1'ck szma, dc az
esetbell az egyiknek vall alapl1clmczett l1ke is.
Vlasz: A helyzet rdekes, ugyanis maga a deklarci rendben van, de ha az Arel
fggvnyt bfirhol egyetlen par:ltnterrel meghvjuk, fordtsi hiba keletkezik, mivel
a rendelkezsre ll lIdatQk alapjfin nem el, hogy melyik form"l gondoltunk
(:unbiguity between AreaCint, int) and Area(int.
Gyakorlatok
Most, hogy mr tudunk mcgtanultunk nhny dolgot a fi.lggvnyekr61 , lljon in nhny
megvfil:lszoland k6rds s megoldand feladat , amelyekkel megszilrdthatjuk a ed-
dig megszerzelt tudsunkat.
Kvfz
1. Mi az abprtelmeLetl paramter-tadCI.<;i m6d fggvnyhivs esetn?
2. Honnan tudja II C++ fordt, hogy melyik vltozatt hvja meg egy tlterhelt
fOggvnynek?
3. olyan hasznosak a fggvnyek? Mirt nem runk helyettk egyetlen mono-
litikus programot?
4. Hny rtket lehet viSS7.aadni egy return paranccsal?
5. ra Fggvnvek 1105
Feladatok
1, Pr6bljuk meg kikommenlezni az 5.5, Listban bemutatott kd
(manyreturns.cpp) utols std: : cout hvst. Mi vltozik a fordt:> sorn? Mi
trtnne, ha betennnk egy return pamncsot az std: : cout urn?
2. Hogyan kell ene kiegszteni az 5.2. listban bemutatott programot
(local var . cpp) gy, hogy Celsius sklr61 is tudjon Fahrenheitre l$zrntani?
Pr6bljuk megvalsltani az tletet!
.,. Egsztsk ki gy az 5.2. Listb:m b(!mutalau programot (local var . cpp), hogy
egsz s lebegoponlos rtkeket is lludjon vltani Fahrenhcitrol Celsius skl-
ra. Hasznljuk a fggvnyek tlterhelsnek lehctosgt!
Vlaszok a kvfzkrdsekre
l. Az alaprtelmez.en m6dsi!cr az nk szeri nti tads ( p ;lS5 hy va lue). Ez azt jck: n-
ti, hogy.! fggvny csupn a paramterek msolatt knpja meg, vagyis az ltala
rajtuk vgzett mdost:1soknak a klvilgra senuniflc hatsa nem lesz,
2. A fordt6program a filggvny meghvsa kor tadott p:U"<unterek listja ab pjn
dnt a leheL'iges vltozatok kzl. A kapott listt sszehasonltja
a lchetosgekkel, s a megfelelot hasznlja.
3. II rggvnyek egyrszt lehet6v teszik :1 mr megrt kdok jrahusznoslsl I
saj{!lunkt s a m:1sok Mtal nl egyar:"i n, msrszt seg tsgilkkel kisebb r.':izek-
re bonthat juk a nagyobb problmk megoldst. Ez utbbi azrt hasznos, mt!ct
jelcnt6sen knnyti a hiba keresst s a k:lrbantartsl.
4. A return segtsgvel csak egyetlen rtket adhatunk vissza. Ez tcrmszetesen
lehel egy bonyolult szmts vgeredmnye is, de a hvhoz csak s kizrolag
egy rt k juthat vissza ezzel a mdszerrel. Arm is lehet6sgnk van, hogy
a konkrt szitllci6tl fgg6en k l n z rtkeket adjunk vissza k l n z
reLurn lItastsokkal, de a fggvnynek ekkor is csak egyellen visszatrsi 6n-
ke lehcl.
6. RA
Vezrlsi szerkezetek
Ebben az 6rban a lesz sz6:
Milyen ciklusok vannak s hogy,ln rdemes hasznlni
Hogyan szervezznk klnfle ciklusokat
Egy :t1Lernatva a mlyen cgybegyazolt if ... else utastsok helyett
Ciklusszervezs
Mlt rn :l vezrJutastsok vltozatrl vOll sz, vagyis az if ... else utast-
sokrl. Sok programozsi feladat gy oldhat meg, hogy ugyanazokkal az adatokkal
tevkenykeclnk jr.! meg jm. EZl az ismtelt tevkenysget itercinnk nevezzk.
Az iterci megval6sitsnak mdszere a ciklusszervezs.
A ciklusok 6se: a goto utasfts
A swmtsrudomny a ciklus egy nhny ulastsbl s egy ug-
rsb61 llt.
A C++ nyelvben (mint ahogy a C-ben is) a cmke egy nv, melyet: (kensponc) kveL
El lehet helyezni cmkt brmely utasts el (batoldaI, s ugrskor erre a cmkre le-
het hivatkozni a goto utasts utn.
1 Da l l. rsz Bevezets a C++ programozsi nyelvbe
Mirt ne hasznljuk a goto utastst?
A C++ programokban riLkn ltunk goto-t, s ez nem vletlen. A goto utastssal el lc-
het ugrani a forrsk(xl brmely rszre, el5re vagy htm. A goto utasts vlogats nl-
kli alkalmazsa gubancos, olvashatatlan programokat eredmnyezett: ezt hv-
juk spagetti k6dnak.
A got o hasznlatnak elkerlsre kifinomult, szigoran szablyozott cikluss7.ervcz6
utastsok szlettek: f o r, while , do ... while. Ezek hasznlata sokkal tC-
szi a prognuum, s ltalb,lIl feleslegess teszi a goto hasznlatt. A globlis vltozk
hasznlatt is hasonl okokbl kerljk: nehz 5kel S7iimon tartani s nyomkvctni.
A while ciklus
A 6.1. Listban bemutatott while ciklus hatsnl a program bizonyos utastsok soroza-
tt ismtli mindaddig, amg a kezdeti felttel ign marad.
o: 1/ 6 . 1 Lista
1 : II A whi le ci kl us
2: lI includc <ios t ream>
] ,
4 : int main()
5 : (
6 , int counter = O: /1 felttel ben l v6 vltoz inicializcija
7 ,
8 : whi l e(coun t er < 5) /1 ellcn6r zs : i ga z-e mg a fe l ttel
9 : {
1 0 : counter H ; II A ci klus magja
l l: std:: cout "S7.ml l6 : " counter "\n":
12 :
13 :
14 : std :: cout "Ksz . A szmll rtke , counter " . \n" ;
15 : rctur n O;
16 :
Szmll , l
Szm116 , 2
Szmll : 3
Szm1l6 : 4
Szmll : 5
Ksz. A szmll rtke : 5
6.6ra Vezrtsi szerkezetek 1109
Ez az egyszeru program bemutatja a while ciklus tnyegt: ha fenntt egy felttel , vg-
reh'ljtdik a dklusmag. Esetnkb<:!n a program a 8. sorban tallhat felttelt vizsglja
meg: kisebb-e a szmll 5-nl. Ha igen, akkor vgrehajtdik a ciklusrnag. A 10. sor-
ban nvekszik egyet a szmll, melynek rtkt a program a ll. sorban ki is rja.
Ha nem teljesl a 8. sor felttele (azaz a s7.1mtl6 mr nem kisebb 5-nD, a program
nem hajtja vgre a 9- 12. sorban ci klusmagot, hanem a 14. sorra kerl a vezrls.
Bonyolultabb whil. utasftsok
A while ciklus elejn vizsglt f<:: lttelben brmilyen sszetett C++ kifejezs Jthat.
Ez tartalmazhat logikai opertorokat is (s: &&, vagy: I I , tag:lds: O. A 6.2 Lista egy
kiss sszetettebb while utastst mutat be.
6.2 lj ... - Egy lSZetottobb whilo ciki .. fcomploxwhilo.cppl
o: II 6.2 LiAtl.l.
1 : II Osszetettebb whi le ciklus
2: <iostream>
,.
4: int main ()
5: {
6.
7.
8.
,.
unsigned short small ;
unsignod loog large ;
const unsigoed short MAXSMAIJIJ",65535 ;
10: std: : cout 'rjon be egy kisebb szmot: '.
ll: std: : cin small;
12: std :: cout 'rjon be egy nagyobb szmot : ' ;
13: std : : cin l arge ;
14 :
15 : std: : cout 'khIebb: small ' .. ' .
16:
11 : II minden iterci6s lpsben hrom felttelt Vizsgl
18 : while (!lmall < large && large> O && smull < Mi\XSMlILL)
19 :
20 :
21 : if (small 1; 5000 == O) II 5000 soronknt kir egy pOttyOt
22 :
23 :
std: : cout . .
24 : small++;
25 :
26 : large-:2 ;
21 :
28 :
110 II. rsz Bevezets a C+ + programozsi nyelvbe
29 : std: :cout "\nKisebb: " small
30: " Nagyobb: " large std: : endl;
31 : return O;
32 :
rjon be egy kisebb szmot: 2
rjon be egy nagyobb szmot: 100000
Kioebb : 2 .....
Kisebb:33335 Nagyobb : 33334

EZ;J program egy egyszen1 jtk. Berand6 egy kisebb s egy nagyobb szm. A kisebb
egyesvel nvekszik, a nagyobb kettesvel cskken. A jtk clja annak kital lsa,
hogy hol tallkoznak. A 10-13. sorban rhat juk be:il szmokat. A 'IH. sor egy olyan cik-
lusfehtelt tal'talmn, mcly esak az albbi hrom felttel teljeslse esern en-
gedi meg a ciklusmag kfutsl:
a sma11 nem n:!gyobb a large-nl
a large pozitv
a sma11 kisebb MAXSMALL-n{11 (ami a kis egszek
A 21. sorban II small SOQO-es maradkt sz.1mtja ki :il program. Ez csak akkor nulla, ha
a small egsz szm tbbszrse 5000-nek. Ne feledjk , hogy ez:! viz..<;gl:!t nem vl-
loztatj:! meg :il sma11 nkt. Amikor az 5000-es maradk nulla, egy pont (.) rdik ki
a kperny6rc, hogy lssuk a folyamat haladst. A 24. sorban n6 a sma11, a 26. sorban
pedig kettesvel cskken ,I large nke.
Ha a h:'irom felttel valamelyike sIiiI, vget r a ciklus, s a progmm futsa a ciklus
vgi z,h6jel utni 29. sorban folytatdik.
hogy az nu1!nk" miatt az <llbbi figyelmezlelst kapjuk:
"complexwhile.cpp: WB012 Comparing signed and unsigned values in
function main() a t line 18
(E16jcles s e16jel nlkli rtkek sszehasonlitsa a main () fggvny
18. sorban)
Knyszerteni lehet az nlkli konstans hasznlatt egy u bettl ooaillesztsvel
(jelen esetben pldul Ou hasznlatvaD.
6. ra V_si sze,bzetek 1111
A continue s a break
Bizonyos esetekben szeretnnk visszatrni a dklusfejhez (a ciklus kezdethez), mg
a tovbbi Ul,lsltsok vgrebajtdnnak. A continue (jelentse: Jo(ylasd)
ts visszaugrik a ci klus elejre .
. \15 esetekben pedig mg szeretnnk kilpni a ciklusbl , hOb'Y a ki lpshez szk-
sges felttelek fennllnnak. A break (jelentse: kit6rs, megszakls) utasts azolmal
elhagyj3 a ciklust, s a cikjus vgi wr6jel utn folytatdik :l progr<lm vgrehajtsa.
A 6.3 Lista ezeket <I Z utastsokat mutatja-be. IH tovbb bonyoldik az el6bbi jtk
A jtkosnak be kell rnia egy kisebb s egy nagyobb szmot, egy szordlszmOl, vala-
mint egy clrtket. A kisebb szm egyesvel emelkedik. A nagyobb sz,1m kellesvel
cskken, kivve, ha a kisebb szm a szorz6szm tbbszrse. Akkor r vget a jtk,
ami kor a kisebb sz.' m (small) meghaladja a(z eredetil eg) nagyobbat (large-ot).
Ha a nab'Yobb szm ppen elri a clnket, akkor megjelenik Cgy elismer6 zcnet, s
a jtk vget r.
A jtkos feladata, hogy mr el6re megadja azt a clrtket, amiL a nagyobb a j-
tk utols lpsben fe lvesz.
o: II 6.3 Lista
1 : II A oreak s a continue bemutatsa
2: hncIude <iostream>
3: using namespace std:11 E fjlban e16kerOl a !Jtd : : cout ,
4: II std:: cin, std :: endl, sto.
5,
6 : jnt muin()
7: {
8: unsigned short small ;
9 : unsigncd long large;
10: unsigned long skip;
11 : unsigned long t arqet ;
12 : connt unsigned short
13 :
14 : cout rjon be egy kisebb szmot : ";
15 : cin small;
16: cout "rjon be egy nagyobb szmot : " ;
17 : cin large ;
18 : cout 'Adjon meg egy szorz6szmot : " ;
19 : cin s kip;
20 : cout 'Adj a meg a tippelt clrt6ke t : "I
21 : cin target ;
22 :
23 : cout "\n" ,
24 :
112 11. nlsz Bevezets 8 C++ programozsi ny.Ml.
25 : II a ciklus 3 fel ttel nek megadsa
26 : whil e (sma ll < l a rge && large> O && small < MAXSMALL)
27 : (
28 , small++ :
29 :
]0 :
31 :
32 :
33 :
34 :
35 :
if (smaH % skip """ 0 )11 ki mara dj on a cskkents?
{
cout 'kimarad : small c< endl ;
continue ;
36 : if (lar ge == t arge t ) /1 Pontosan egyezik aclrt kkel ?
37 : {
38 :
39 :
40 :
41 :
cout 'Clba rtiInk ! ' ;
break;
42: large =2 ;
<13 : II a while ciklus vge
44 :
45 : coul "\nKiscbb : emaIl Nagyobb : " large endl ;
46 , return O;
47 :
rjon be egy kisebb szmot : 2
rjon be egy nagyobb szmot : 20
Adjon meg egy szorzszmot : 4
Adja meg a tippelt clrtket : 6
ki marad : ",
k imar"d : 8
Kisebb : 10 Nagyobb : 8
Ebben a jtkban a jlkos vesztett; a kisebb szm z e l t t haladla meg a nagyol, mie-
l t t az elrte volna a 6-os clrtket.
A 26. sorban helyezkedik el az sszetett ci klusfelttcJ. Ha a small tovbbra is kisebb
ma. dd a large-nl, a l arge nagyobb mrlmd nullnl, valamint a sma ll nem lpi tl
a maximlis e l j e l nlkli rvid egsz szmok mrett, akkor a program belp a ciklus-
magba.
A 30. sorban vizsgljuk meg azt, hogya szorz6szmnak tbbszrse-e sma ll rtke.
Ha igen, akkor a con t i nue parancs hatsra a vezrls a 26. sorra kerl, ezzel elmarad
aclrtk elrsnek vizsglata s a l arge cskkentse.
6. 6ra Vezrlsi szertezetek 1113
A 36. sorban vizsgljuk meg azt, hogya nagyobbik szm egyenl6-e a cJrtkkel.
Ha igen, a jtkos. Megj elenik az zenet s el rjk a br eak utastst.
Ezltal azon nyomban a whi l e ciklustJl, s a progmm futsa a 45. sorban
folytatdik.
vatosa n hasznljuk a cont i nue s a break utastsokat. Nehz megrteni .tzokat
a programokat, amelyek egycgy ci klus hirtelen kilpnek, s egy kicsiny kis
while cikl ust is olvashatatlann lehet tenni nhny szabadosan hasznlt continue s
a break utastssal.
Aprop6
Nvtarak hasznlata
Ez a programplda egy jabb kulcsszt is becsempszett a ltternkbe: using
narnespace, azaz: nvtr hasznlata. Ez arrl rtesti a fordftprogramot, hogy
amennyiben fggvnyhvst tall (mint amilyen pldul a cin vagy a cout ), akkor
kpzelje oda a megadott eltagot (esetnkben ez a std:: ). Ez cskkenti a begpe-
betk mennyisgt.
Mivel sok fordtprogram nem ismeri mg ezt a direktvI, ebben a knyvben nem-
igen fogj uk hasznlni. A Borland C+ + fordt ismeri .
while{ 1 ) - vgtelen ciklusok
Egy while ciklusfejben vizsglt felttel brmil yen sszeteu C++ kifejezs lehet. Amg
nke igaz ( true) , folytatdik a ci klusmag fl,l(ratsa. gy olya n ci klust is lelre lehet hoz-
ni, mely soha nem r vget, ha az 1 szmot hasznljuk a vizsgland felttelben. Mivel
az 1 mindig "ig:lZ", a ciklusb61 soha nem lpnk ki (hacsak nem ri.ink el egy b reak
utastst). Ezt ciklusnak" hvj k. A 6.4 Lista ezt a mdszert hasznlja, melybcn
tzig s71i molunk el.
6.4 Um - V6gte1en ciklus a while(1} legftsltg6vel (whilaforaver.cpp)
o: II 6 . 4 Li sta
1 : II A ' while igaz ' ciklus bemutat6ss
2 , 'incl ude <iost r e am>
3 ,
4 : int main ()
5 , (
6 : i n t coun t er o: O;
7 ,
8: while (1)
9 : {
10 : count e r
11 : i f (count.er > 1 0)
12 : bre ak;
13 :
14 : st.d : : cout 'Szmll , count er '\n' ;
15 : ret u rn O;
16 :
114 11. rsz Bevezets a C+ + programozsi nyelvbe
Szmll: 11
A 8. sorban olyan rel ttel van megadva, amely sosem [esz hamis. A ciklusmag II 10.
sorban megnveli a szmll (counter) vltoz rtkt, majd a ll. sorban megvizsgl-
ja, tlhaladta-e mr a tzet. Ha nem, akkor tovbb folyik az iterci6. Ha viszont II szm-
ll nagyobb tznl, a 12. sorban tallhat break vget vet a ciklus fuLsnak. A prog-
ramvezrls .1 14. sorr.:l kerl , ahol II vgeredmny kirdik.
A program de nem szp. Kitn6 pldja annak, amikor alkalmatlan eszkz-
zel okjunk meg egy fei<ldatol. Ugyanez megv;:dsflhal (Igy is, hogy a szmll rlk6-
nek elJ en6rzst:t oda tesszk, ahov val: a ciklusfej felttelbe.
Figyeleml
lefagysok
A while (1) -hez hasonl vgtel en ciklusok a szmlt6gp lefagyst eredmnyez-
heti, ha a kilpsi felttel soha nem teljesl (vagy nincs is). Csak nagy krltekin-
tssel hasznljunk ilyet, s teszteljk alaposan!
A C++ sz mos utat tesz lehet6v ugyanazon cl elrshez. Az igazi tuds azl jelemi,
hogy rzkkel megta lljuk az adott feladathoz leginkbb
HoIyeo
while ciklust olyan ire-
rci6hoz, 1l1cly egy felttel ign volt-
tl fgg.
Gyakorolunk nmrskletet
a continue s a break
tern.
meg arrl, hogy ciklu-
sunk vgl valban vget r.
A dO ... while ciklus
Ne tegynk kzvetle-
nl a while () utn, mert ez ciklus-
mag nlkl zrja le az utastst (azaz
nem fog
Lehetsges, hogy egy wh ile ciklus magja soha nem fut le. A while ciklusfejben a mag
futtatsa megtrtnik az s ha hamis a felttel rtke, akkor az egsz
ciklusmagot tugorja a program. A 6.5 Lista eZl illw>Zlrlja.
6. 5 Usta - A whilu ciklus magjnak tugrsa (bodyskip.cpp)
o: II 6.5 List a
1: II A whi l e ciklus magj nak ki hagysa,
2 : II ha l hamis
3 : IIincludc <i ost r eam>
4,
5 : int main()
6 ,
7 : int counter;
8: std : : cout "Hny hello legyen? " ;
9 : std : : cin counter;
10 : while (counter:> O)
ll : {
12 : std :: cout ' Hello!\n" ;
13 :
14 :
6. 6,. Vezrlsi szsrl.ezetek 1115
15 : std : : cout 'A szml l lllll : countcr ;
16 : return O;
17 :
Kimenet
Hny hello legyen? 2
Hello !
Hello!
A llsa : O
FUU;lssuk lIj r.1 il prognulloc s adjunk meg nulWt. Jl yenkor ezt Jtjllk:
Hny hello legyen? O
A sz&ml16 llsa : O
A fdhasznlt ar,d szllja fel a program a 8. sorban, hogy adj on meg egy kezdrt-
ket, melyet a szmll (counter) neVtl egsz vltozban troL Ennek rtkr a 10. sor-
ban ellen6rzi, t: s a cikl u..,magb'l1l cskkenti (a 13. sorban) . Az fultati skor a szml-
lt 2-re ll tnlluk be, gy kL<;7.er le is futott;:l ciklusmag. A msodik alka lommal azon-
ban nullt adtunk meg. A 10. sorbeli vi zsg:'i lat eredmnye hamis volt; a szmll nem
volt pozitv. A ci klusmag teht nem futot! le, s egyetlen Hello sem lett kinyomtatva.
Mi a akkor, ha legalbb egy Hello-t mindenkpp szeretnnk megjelenteni?
A while ciklus nem kpes erre, men a feltt:tel vizsglat mg megrnnik, hogy
brmi is megjelenne. Kiknyszerithet a dolog egy if vizsgilattal is, mg a ciklustYd
val belps el6tt:
if (countcr < l ) II Egy mi nimlis rtk knysze ri tse
couuLet:" = l ;
116 11. rsz Bevezets a C+ + programozsi nyelvbe
A programozk ezt Ckludge) hvjk; csnya s nem elegns
megoldsnak.
A do ... whil e ciklus magja a felttelvizsglat fm le, gy legalbb egyszer minden-
k6ppen vgrehajtdik. A 6.6 Lista az program jrafogalmazsa a do ... whi le
klussal.
6.6 usta - Plda a do .. wbile ciklus alkalmazsra Idowhile.cpp)
o: II 6 . 6 Lista
1 : II A do ... whi1e bemutatsa
2 : 'inc1ude <iostream>
3 ,
4 : int ma i n()
5 : {
6 : i nt counter ;
7: std : : cout "Hny hallo legyen? ";
8 : std: : c in counLer ;
9 : do
10 : {
1 1 : std: : cout "Hello\n" ;
12 : counter - ;
13 : while (counter >0 ) ;
14: std : : cout 'A szmll llsa : counter std : : endl ;
15 : return O;
16 :
Kimenet
H ny hello legyen? 2
Hello
Hello
fo. s zmll l lsa : O
Fuuassuk jra a programm s adjunk meg nllllt. Most ezt ltjuk:
Hny hello legyen? O
Hello
A s zmll llsa : l
A felhasznlt arrJ. szltja fel a program a 7. sorban, hogy adjon meg egy kczdrt-
ket, melyet a szmll (counter ) vltozban trol. A do ... while ciklusban a ciklus-
mag a Felttelvizsglat lefut, ily mdon garantlt, hogy legalbb eb'Yszer vgrehaj-
tdik. A 11. sor kinyomtatja az zenetet, s a 12. sorban cskkentett szmll rtke
a 13. sorban kenil Ha a Felttclteljesl , akkor a vezrls a ciklus eJej6re
kerl (a 11. sorra); klnben pedig rcsorgunk a 14. sorra.
6, ra Vezrlsi szarbzetak. 117
A do .. . while ciklusban ugyangy hasznlhat a continue s a break, mint a while
ciklusban. A while s a do ... while ciklusok kz egyeden klnbsg;t fcJtrelvizs-
glat helye.
A for ciklus
A while ciklusok rsa kzben gyakran azon talljuk magunkat, hogy bellnmk egy
szmll vltozt, vizsglgatunk r valamilyen felttelt, s fokozatosan nveljk (vagy
ms mdon vltoztat juk), val:lhnyszor lefut a ciklusmag. A 6.7 Lista erre mutat pldt.
6.7 lla - M6tI OtIY piRa"".a wIllI. clkl.1nI (whil uain.cppl
o : 116.7 LisLa
l: II while ciklus jra
2 : #lncludc <i oetrcam>
3 .
4: int muin()
5 : (
6 : int countel:' " O;
, .
8 : whilc(countcr < 5)
9 : (
10 : countcr++;
11 : std :: cout 'POrgOk ! " ;
12 :
13 :
14 : std: : cout \nA szmll: " counter . \n";
15: rcturn O;
16 :
POrgOk! POrgOk! POrgOk! POrgOk ! POrgOk!
A szmll: 5.
A szmll (counter) v{i! to:.:rt kt nulbra ;; !ltjuk a 6. sorban, majd a 8. sorban
megvizsgljuk, kiscbb-e mg 5-nl. A '10. sorban mcgnvcljk az rt.kt. A 11. sor kir
egy zenetc!; bizonyira cl tudja kpzelni a kedves Olvas, hogy ennl hasz-
nosabb feladatot is ellthat a program a szmll minden egyes nvekedsekor.
Inicializci6, vizsglat, lptets
A for ciklus egyctlen utascsba az inicializcit, a relttel viz,>glalot s a lpte-
tst. A ciklusfejben a for kulcssz utn (egy zrje\pron bell) pomosvcssz6k hal
hatroltan hrom utasts ll.
118 11. rsz Bevezets a C++ programozsi nyelvbe
Az els6 utasts az inicializd6. Brmilyen C++ utasts iderhat, de alapvet6en egy
szmll vltoz ltrehozsa, inicializlsa szokott itt llni. A msodik utasts a felt-
telvi zsglat - brmely helyes C++ kifejezs szerepelhet beIU1e. Ugyanarra szolgl, mint
a while ciklus felttelvizsglata. /\ harmadik utasts a lptets. 1t:llban egy szmhl6
nvelse vagy cskkentse a feladata , de itt is brmi lyen C++ Ul,lsts.
hogy az s a harmadik helyen tetsz6leges C++ utasts llhat,
a msodik helyen viszont egy kifejezsnek kell llnia - egy olyan C++ utastsnak,
amely visszaad valamilyen f!rlkel. A 6.8 Lista bernUlat egy fo r ciklusl.
6.8 Lista - A for ciklus hasznlata (fortoop.cpp)
o: II 6 . 8 Lista
1 : II A (or ciklus
2 : 8include <i ostream>
3 ,
4: i nt mai n ( )
5 : (
6 : int counter l
7 , for (counter., O; counter < 5 1 countcr ++)
8 : std: : cout POrgOk ! ' ;
9 ,
10 , std : :cout ' \nA szmll : " counter . \n" ;
11 : ret urn O;
12 :
menet
POrg:Ok! POrgOk! POrgOk l POrgOk ! POr gOk !
A szm1616 : S.

A f or ciklus a 7. sorban egyesti a szmll6 iniciali7.ci6jt, aIlliak vizsg{,lalt, hogy ez
kisebb-e 5-nl , valami nl a szmll nvelst. A ciklus magja a 8. sor. Termszetesen
blokk is hasznlhat ciklusl11agknl.
Figyeleml
Gyakori for hibk
Gyakori hiba avessz (,) hasznlata pontosvessz (;) helyett a for utastsban.
A fordtprogram ezt jelzi is.
Egy msik gyakori hiba, hogya f or zrjele utn (;) zrjuk a sort.
Ez egy sem csinl eredmnyez. Vannak esetek. amikor ennek r-
telme lehet. gy a fordtprogram erre nem ad hibajelzst.
6. 6ra Vezrlsi szerl<02lI'.k 1119
sszetettebb for ciklusok
A for utastsok igen efS s rugalmas eszkzt adnak a keznkbe. A hrom fggetlen
utasliis (az inidalizci6, a vizsglat s a lptets) igen sok hordoz. A for
ciklus az albbi sorrendben hajlja vgre a lpseket:
L elvgzi az inidalizci mGveleteit
2. kirtkeli a felttelt
3. ha a felttel teljesl, vgrehajtja a ciklusmagot s II lptetst.
A ciklus tovbbi lpseiben a 2. s a 3. lps
Halmozott inicializci6 s lptets
Nem ritka, hogy tbb vilozt is inicializl unk, esetleg cgy sszetettebb logikai kifeje-
zst vizsglunk, valamint, hogy egyszerre tbb is vgrehajtunk.
Az inicializci6 s a lptets helyre tbb C++ ulasls is odarhat, clvlaSZI-
\'3. A 6.9 Lista kt vllol. inidalil.ti6jt l!s ll!ptC::tsl mutatja.
6.9 Ulla - Halmozott utaltiaolc for ciklulfejben lformulti.cpp)
o : II 6 . 9 Lista
l : II bemutatja, hogy hogyan lehet tObb utasitst elhelyezni
2 : II a for ciklusfejbon
3: 'includc <iostream>
4 ,
5 : int lMin()
6 : {
7 : for (int i=O, j=O; i<) ; iH, jH)
8 : s t d : : cout " i : i " j : j std : : e ndl ;
9 : return O;
10 :
Kimenet
i : O j: O
i : 1 j: 1
i: 2 j: 2
A 7. sorban kl vltoz6, az i s a j kap O kezdrtket. A kirtkcIt felttel (i<3) telje-
sl, gy lefut a tiklusmag s kirsm kerlnek az rtkek. Vgl a ciklusfej harmadik r-
szben 1161ptetsek is megtrtnnek, megnvclve az i s a j rtkt.
120 II. rsz Bevezets a C+ + programozsi nyelvbe
A 8. sor vgrehajtsa utn jra s jra kirtkel6dik a felttel , s amg igaz marad, meg-
trtnnek a lptetsek (az i s a j rtke tovbb n6), valamint a ciklusmag is ismtel-
ten lefut. Ez mindaddig folytatdik, amg meg nem bukik a felttel. Ekkor a vezrls ki-
lp a ciklusbl, s a lptets is elmar.!d.
res utasftsok a for ciklusfejben
A for ciklusfej brmely (a kr az sszes) lltastsa elmaradhat. Ezt gy valslhatjuk
meg, hogy nem runk semmit a pontosvessz6k ltal kijellt helyre. Ha oly.m for cik-
lust szeretnnk rni, amely pontosan gy mllkdik, mint egy while ciklus, akkor hagy-
juk el az e1s6 s a harmadik lIIasHst. A 6.10 Lista eZl illusztrlja.
&.10 Lista - NIda a lor _fajben oIhoIyazIoet6 O ............ (fomuII.cpp)
o: II 6 . 10 Lista
1 : II rea utas itsa k El f or ciklufejben
2: #include <iostream>
] :
4: int main()
5 : (
6 : int eount cr = O:
7,
8 : for( : eounter < 5: )
9 : {
10 : counter++ :
11 : std :: cout "POrgOk! ' :
12 :
13 :
14 : std : : eout \nA szmll : ' eountcr . \n' ;
15 : return O:
16 :
POrgOk t POrgOkt POrgOk! POrgOkl POrgOkl
A szmll : 5 .
Bizonyr.! felismeri a kedves olvas, hogy ez ponlosan b')' m k d i k mint egy korb-
ban bemutatott while ciklus. A 6. sorban a szmll (counter) vltoz kezd6rtket
kap. A 8. sorbeli for utasts nem inicializl semmit, m megvizsglja, hogy a szmll
ki sebb-e tnL Nincs lptct6 utasts sem, gy ez a cik!usfej teljesen gy viselkedik,
minlha ezt rtuk volna:
while (counter < 5)
6. ... Vezrisi szer1<ezetek 1121
jra hangslyozzuk, hogy a C++ szmos utat knl egy-egy feladat megoldsra. Ta-
pasztalt C.+ programoz nem rna ilyen for ciklust, de ez jl mutatja a for rugalmas-
sgl. Valjban olyan foz:- ciklusfej is megfogalmazhat (nhny jl elhelyezett
continue s break rvn), melyben mindhrom utasts res." 6.1J LiSla bemutatja,
hogy hogyan.
6. t 1 lista - Egy res for ciklusfej (forempty.cpp)
o: /1 6 . 11 List<l
1: II res utastsok a for ciklusfejben
2 , 'include <iostream>
, ,
4: int main()
5 , (
6: i nt.. counter",O: II initi1'llli7.t'ltion
7: int max:
8 : std: : cout 'Hny hello legyen? ';
9 : std" cin max ;
10 : (or ( ;; ) II a for loop thett doesn ' t cnd
11 : {
12 : if (counter < max) II test
13: {
14 1 std : : cout 'Hello!\n';
15 : countcr++; /1 increment
16 :
17 : else
18 : break;
19 :
20 : return O;
21 :
Kimenet
Hny hello legyen? 3
Hello!
Hello!
Hello!
A for ciklusfej a ki leLL restve. Mind a megadsa, mind a vizsg-
lat s a lptets t lett helyezve mshov. A 6. sorban trtnik meg :lZ inicializci6, mg
a for ciklus el6lt A felttelvizsglat egy kOln:116 if-ben zajlik a 12. sorban, s ha ez
sikeres, akkor a lS. sorban eggyel a szmll rtke. eselben a 18.
sorban break hatsra elhagyjuk a ciklusmagot.
Br ez a program valahol elg bizarr, vannak esetek. amikor pontosan egy for ( ; ; )
vagy egy while (1) ciklusra van szksgnk A switch utasts t.1rgyalsakor ltunk
majd egy sszen1 pldt ezekre a furcsa ciklusokra.
122 11. rsz Bevezets a C++ programozsi nyelvbe
res for ciklus
Annyi minden a for ciklusfejben, hogy nha mr semmi nem marad
a ciklus mag szmrA. Ilyen esetben tegynk egy res utastst (;) a ciklusmag helyre.
A lehet egy sorban a for utastssal , de ezt szem ell tt:veszleni .
A 6.12 Lista rmutat, hogy hogyan rdemes ezt megrni.
6.12 Lista - for cikiul Orel 8 ciklusmaggal (fomullbody.cppt
o: II 6.12 Lista
1 : II Az Qrell uLasit!'l
2 : II elhelyezse ciklusmagknt
3 : 'incluae <ios t ream>
4,
5 : i n t ITIuin()
6 : {
7: tor (int i - O; i<5; sta: : cout ' i: i ++ std : : e nd l. )
8,
9: rcturn O;
10:
-
L o
"
1
L 2
"
3
l , 4
A 7. sorb:m tallhat for ciklus hrom utastst tartalmaz. Az inicializciltrehozza s
belltja az i vltoz6c A felttelvizsglat hogy i kisebb-e tnl, vgl a lptc-
utasts II kirs utn megnveli irtkt.
Nincs semmi egyb a for ciklusmagnak, gy al n . .!s utllStst (;) hasznljuk.
hogy ez nem valami csinosan megteJVezett for utasts, mert a lptet-
si rt:sz messze tllpi feladatkrt. Szebben nzne ki a cikllIs az :L!{lbbi formban:
8 : for (int i = O; i<5 ; 1++)
9 : std : : cout "i: " i endl;
Br mindkt progr.tm ugyanazt csinlja, ez utbbi pldt egyszenibb megrteni. Azt is
tartsuk szem hogy a ciklusfejben llrehoZOll vltozk csak :I cikluson bell ltez-
nek; a ciklus lefutsa utn megswnnek.
6. ra Vezrlsi
Egymsba gyazott ciklusok
A ciklusok egymsba gyazhatak, azaz lehet ciklus egy msik ciklusmagban is. A bel-
ciklus mind;mnyiszor vgigprg, ahnyszor csak a ciklus magja lefut. A 6.13
Lista bemutatja, hogy hogyan lehet egymsba gyazott ciklusokkal egy mtrix elemeit
vgigjrni s kirni.
6.1 3 Usta - Egymsba gyazott for ciklusok (fomested.cpp)
o: II 6.13 Lista
l: II E9ymsba gyazott for dklusok
2: <iostream>
] ,
4 : int m"in ()
S: {
6 : int rows , columns ;
7 : char theChar ;
8: std:: cout "Sorok szma? " ;
9 : std: : cin rO\ll9 ;
10 : std: : COUI: 'Oszlopok szma? " ;
ll : sta: : cin columns;
17. : Gtd :: coul: 'Milyen karakter legyen? ' ;
13 : std: : cin theChar;
14 : for (int i = O; 1<rows; i+t)
15 : {
16 :
17 :
18 :
19 :
tor (int j = O; j < eolumns ; jH)
std: : eout theChar ;
std :: cout ' \ n " ;
20 : return O;
21 :
Sorok szma? 4
Oszlopok szma? 12
Milyen karakter legyen? x
xxxxxxxxxxxx
xxxxxxxxxxxx
xxxxxxxxxxxx
xxxxxxxxxxxx
A progrnm felszltja a felhasznlI, bogy adja meg a sorok s oszlopok kvnt szmt,
valamint a nyomtatand karaklert. AJ. for ciklus a 14. sorban llrehozza s rtk-
kel ltja el az i szmll6t, s mr futhat is a ciklus.
113
aC++
A 16. sorban va n a ciklus' magjnak som. lu indt juk a msik for ciklust. Egy
msik ciklusvltoz (j) is inicializldik, majd indulhat a bels6 ciklusmag. A 17. sorban
kirdik a kivlasztott karakter, majd a vezrls visszatr a belsO' for ciklusfejhez. sz-
revehetjk, hogy a ciklus csak egyetlen utasts (a kivlasztott karakter kirsa).
a felttelt (j kisebb-e az oszlopok megadott szmnl, columns-nD.
Ha ez igaz, akkor kirdik a karakter, s n6 egyet j rtke. Ez mindaddig
folytlltdik. mg j rtke nem lesz az oszlopok szmval.
Anukor a ciklus vizsglata sikertelenl zrul, akkor mjr 12 db x kinyollltaL'lSra
keruit; a vezrls a 18. sarm kerul, ahol egy jsor kamkter rdik ki. A vezrl s ekkor
a ciklusfejhez tl:r vissza, ahol a feltteJvizsgJat zajli k (i kisebb-e a sa-
rok megadott szmnl, rows-n1). Ha ez igaz-knt rtkeJ6dik ki , akkor jra lefut
a ciklusmag s i l:nl: ke.
A kls6 ciklus msodik itercis lpsben is eli ndul a ciklus. Itt j li jm Celveszi
a O kezd6rtkel (t), s jra lefllt a teljes ciklus.
Az egymsba gyazott ciklusoknak teht az a lnyege, hogya ciklus annyiszor
fm vgig, ahny iter.ki6s lpse van a ciklusnak. igy a megadott kamktcr
rdik ki minden sorban.
A switch utasfts
Az if s else ... if utastsok kombincija igen zavar lehet bizonyos
egybegyazson tl. A CH ajnl is egy alternatvt. Az if-fel szemben, amely csak
egyetlen vizsglatot vgez, a switch (jelentse: kapcso/6) Ichct6v teszi, hogy egy vl-
tOZl tetsz6leges szm nkkel vizsglj unk meg. A switch utasts ltalnos alakja
a kvetkez6:
switch (kifejezs)
{
case elsortk : utasts ;
break;
case msodikrtk : utasts ;
brci.l k;
case utols6rtk :
default :
utasts ;
break;
utasts
break;
A kifejezs brmilyen helyes C++ kifejezs lehel, l!s az utasts brmilyen C++
utasts (vagy al.ok b\okk)a) lehet. J\. swit.ch kirtke\i. a kife)C7J"!St , s al. eredmnyt
sorban sszeveti a case rtkekkel. azonban, hogy a kirtl!kell!s csak
egyenlO'sget ta rtalmazhat, relcis kifejezst vagy logikai nem. Ha a case
6. ra Vezrlsi szel1<ezetek 1125
nkek valamelyike egyezik a kifejezssel, akkor az ahhoz tartoz utastshoz ugrik
:I vezrls. A futs a soron kvetkez6 utastsokkal folytatdik egszen a switch blokk
vgig, hacsak e16Ue break Ulastsba nem botlik. J la nincs olyan rtk, amely egyez-
ne a kifejezssel, akkor az opcionlisan megadhat default gra kerl a vezrls .
I la nincs def ault g, sem pedig a kirtkel t kifejezssel rtk, akkor a prog-
ram kilp a switch utastsbl.
Aprop
A programoz hibamentesltse (de-faultozsa)
Mindig rdemes default gat hasznlni a s witch utasrtsokban. Ha ms miatt
nincs is r szksg, a fe lttelezetten lehetetl en rtk tesztelsre s egy hibazenet
kirsra mi ndig alkalmas; ez risi segrtsg lehet hibakeresskor.
Br nem a legtbb programoz a default esethez is tesz egy breaket
a kvetkezetessg, hordozhatsg kedvrt.
rdemes tudato.stani, hogy .unennyiben egy case g vgn nim:s break ut:lsts, ak-
kor a vezrls r.'lcsorog a sorra, a case gra. Ez nha jl jn, de
ltalban hiba. Ha gy dnt a programoz, hogy engedi tovbbcsorogni a ve7,krJ st, r-
demes ezt egy megjegyzssel is dokumentlni, hogy nem pusztn elfelejt6dtt
a break.
A 6.14 Lista bemutatja a switch utasts hasznlatl.
6.14 LiI1a - A swl1ch .... "'. hum" ... (.witchor.cppl
o: II 6 .14 Lista
1 : II A switch bemutatsa
2: <iostream>
3 ,
4 : int main ()
5 : {
6 : unsigned s hort :i nt number :
7 : std: : cout "Adjon meg egy szmot l s 5 kztt:
8: std: : cin number:
9 : switch (number)
10: (
11 : case O:
12 : std:: cout ' Sajnos ez tl kicsi!":
13 : broak ;
14 : case 5 :
15: std:: cout "Remek dOnt s!\n" : II tcsorgunk
16 : case 4:
17 : std: : cout ' J vlasz ts ! \n' : / / tcsorgunk
18 : case 3 :
19 : std : : cout 'Kitun6 ! \ n"; II tcsorgunk
20 : case 2 :
21 : std:: cout 'Mesteri! \n" ; 1/ tcsorgunk
126 .rsz
22 : case 1:
23 : std: : cout "Hihetet.len! \n ;
24 : break ;
25 : default :
26 : std: : <;:out "Tl nagy! \n' ;
27 : break ;
28 :
29 : std: : cout "\n\n" ;
30 : retllrn O;
31 :
- Adjon meg egy szmot l s 5 kztt: 3
Kitun6 !
Mesteri !
Hihetetlen!
Adjon meg egy szmot 1 s 5 kztt : 8
Tl nagy !
A progl1un felszltja I I felhaszn{1161, hogy adjon meg egy szmol. EZL kapj:1 meg
:I switch utasts. Ha a szm nulla, akkor a s ..... itch 11. sora ilh:szkedik a kereseti r-
tkre, S:l ez tl kicsi! zenet jelenik meg, majd egy break utasts vet
vget a switch utastsnak. Ha a megadon nk 5, a program a 14. sorra
ahol egy zenet kirsa utn rcsorgunk a 17. sorr-.. , ahol egy jabb zenet megjelent-
se ll , s gy tovbb egszen a 24. sorig, ahol egy break utasLsba botlik a vcz(: rl s.
Az a vgs6 hatsa ezeknek a programsoroknak, hogya 2, 3, 4, 5 szmok esct(:n tbb
zenet is megjelenik. lia a sz:1m nincs a 0 . .5 intervallumban, akkor tl
nagy, (:s a 25. sor default utastsa hvdik meg.
Krdsek s vlaszok
Krds: Mi alapjnlJlasz/ az if .. . else s II switch J...'z t"ll?
Viilt/sz: Ha egy-kt else gnl lbb szerepel, s mindben ugyanazt a vltozt vizsgl-
juk, akkor megfontoland a switch hasznlata. Ha nem hanem valami-
lyen reldt vizsglunk (pldul a > b), akkor nem lehet a switch utastst hasznlni.
6. ra Vezrlsi szerkezetek 1127
Krds: Mi alapjll vlaszt a while s a d o ... while /Wzlll?
I "/asz: Ha a ciklusmagnak legalbb egyszer mindenkpp le kell fULnia, akkor
a do ... wh ile az ajnlott, egybknt :1 whil e hasznland.
Krds: Mi alapjn /Jlaszt a while s a for Mzi/I?
la/asz: Ha inicializini kell egy szmll vltozI, s minden alkalonmlal meg kell n-
\"el ni, akkor a for ciklus hasznlata javasolt. De ha mr inicializlva van a vltoz, s
nem kell minden lpsben nvelni, a while ciklus jobb vlaszts lehet.
Krds: Melyik CI jobb, a while (l) vagy a for ( ; ; ) ?
I '/asz: Nincs kztk sz:hnottev6 klnbsg.
Gyakorlatok
Ezen az rn megismertnk nhny sszetett vezrlsi szerkezetet. Tudsunk elmly-
tc.!sc vgett vlaszoljunk meg nhny krdst s vgezznk el nhny gyakorlatot!
Kvfz
I. Milyen adattpust rdemes hasznlni a for dklusban?
2. Mi a klnbsg a break s continue kztt?
3. A 6.13 Lista egymsba gyazott for ciklusokaI mut.Holt be. Egymsba lchel-e
gyazni whil e vagy do ... while ciklusokaI is?
4. Mit csinl a break parancs a switch utastson bell?
Feladalok
l. Mdostsa gy a f orl oop. epp programot, hogy lei:>eg6pontos (float) szmot
haszniiijon ciklusvltoz6knl, s nyomtassa is ki az rtkt a ciklusmagban
l
A lptett!skor 1 helyett nvelje az rtkt ,l-del.
2. Mdostsa gy a fornest ed. cpp progmmot, hogy hasznljon for helyett whBe
dklusokat! csak az egyik f or-l cserlje ki while-ra, majd a msikat is1
az is ltszani fog, hogy lpus ciklusok is egybeiigyazhatak.
3. Mdostsa gy a swi teher . epp programot, hogy az egyik case g tartalmazzon
egy ciklust! Lefordthat6-e s fut-e gy a program?
128 1 r. rsz Bevezets a C+ + programozsi nyelvbe
Vlaszok a kvfzkrdsekre
1, A legtbb progmmoz csak egsz szmot hasznl for ciklllsvltoz6knt, de ez
nem a nyelv korltja; lehet szmot, szveget vagy ms adattpust
is hasznl ni.
2. A break parancs hatsra vget r a ciklus, s a vezrls a ciklust kvet-
utastsra kerl. A continue parancs hatsrd a ciklusmag htrdlev rszt
tugorja a program, de a ciklusbl nem lp ki a vezrl s (hacsak a kilpsi felt-
td nem teljesl).
3. Semmi akadlya! Maga a C++ nyelv bels6leg kvetkezetes. Lehel for <:ikl usL
h'lsznlni while ciklusan bell, ezt akr do ... while cikluson bell stb ...
a programoz szabad kezet kap e tren.
4. It. utasthbeli break parancs hatsra a progl"<un kil6p a switch utas-
tsbl. N(:lkcil e az trtnik, hogy az case gt! min-
den p:mlnCS vgrehajt6dik egszen a swi Leh vgig.
II. RSZ
Osztlyok
7. 6ra AJapvet osztlyok
8. 6ra Az. osztlyokrl - mlyebben
7. RA
osztlyok
Ebben az rban a kvetkezl5krollesz sz
Mi a tPllS?
Mi az oszL!ily s :lZ objektum?
Ilogyan hozhatunk ltre j osztlyokat s azokba lllltoz6 objektumok:J.t?
Mi a tfpus?
A tpus egy kategria. Az egyik olyan lllyeges mlajdons:'g, amiben az t!mocr klnb-
zik az tillatvilgt61 az, hogy kpes katcgorizlni a dolgokat. Nem formkat tlunk sz:z-
szmra a sZ:lVannn, hanem ll atokat s fkat. s nem csupn llatokat, hanem azon
bell is gazellkat, l'.si rfokat, elefnlokat, vzibiva Jyokat s gy lOvbb. Az ember rend-
szertanok:lt :llkotott, bcsorol::'isokat, csopoltostsokat, fe[oszLsokat s osz-
tlyoka\. Rviden: n emberek termszetnkb61 addan tpusokban gondolkodunk.
A narancs egy citrusfle, a dlrus egy gymlcs, a gymlcs nvny, a nvny pedig

Hasonlan besorolhatjuk az autkat, a hzakat, a .szemlyeket vagy <IZ alakzatokat.
C++-ban a tpus egy objektumflesg, amely mrettel, llapottal s j nhny kpes-
sggel rendelkezik,
13Z I II. rsz' Osztlyok
Egy CH programoz igny szerint brmilyen tpust ltrehozhat. Ezek a C++ beptet(
tpusaira plnek - ilyen pldul az int, a long, vagy a double - s rendelkeznek
azok minden kpessgvel s
Progf'.lmokat legtbbszr htkznapi problmk megoldsra runk Ilyen pldul
a munkatrsak nyilvnt:lft<sa egy rendszer szimullsa, Noha egyszeru adatti-
pusokkal - egsz vagy kar:akter - is megoldhatunk sszetett problmkat, igazn komp-
lex feladatokat sokk.11 cgyszelUob objekrumokkal megoldani. Ms szavakkal: sokkal
s7.erub a dolgunk egy rend'izer szi.mullsakor, ha egyedi adattipuso-
kal hozunk ltre a szobra, a a termoszltokra b; a Minl job-
ban modeUezzk a val letet tpusokkal, annl knnyebben rhatjuk meg a programot
j tfpus ltrehozsa
mr bemutatwk a C++ beptett tpusait, mint pldul az int (egsz) s
a cha r (karakter). Egy vltoz tpusbl sok minclCl1re kvctkeztethetnk. Pldul ha
a Height (magassg) s wi d Lh (szlessg) vltozkat nlkli rvid egszeknek
deklarljuk, vil gos,m kiderl , hogy O s 65535 kztti rtkeket vehetnek fel (feltte-
lezzk, hogy az nlkli rvid egsz 2 bjtot foglal).
A mrete mellett a vltoz6 kpessgeire is kvctkeztethetnk a tpusbl. Pldul:1 r-
vid egszeket sszeadhatjuk. igy ha a HeighL s Wi dth vltozkat nlkli rvid
egszknt deklarljuk, akkor az sszegket rtkl adhatjuk egy harmadik vltoz6nak.
A vltoz tiplls:ib61 teht :1 derl nek ki:
Amemriaignye
Milyen jel1egll informcit trolhanmk benne
Milyen mavclctcket vgezhetnk rajta
A CH 1chetv(: teszi s:ljttpusok ltrehozst is a problmk megoldsra. j tpuso-
kat osztlyok ltrehozsval deklarlhatunk. Az osztly teht nem ms, mint egy (lj t-
pus defmcija.
Osztlyok s tagok
Osztlyok ltrehozsval deklacilhatak Llj tpusok. Az osztly vltozk - gyakran k-
tpusak - s velk kapcsolatos fggvnyek sszessge.
Gondoljunk pldul gy egy aut6m, mint kerekek, ajtk, lsek, ablakok, stb. sszes-
sge. Mskpp is megkzelthetjk persze a dolgot: egy aut kpes mozogni, lasstani,
gyorstani, megllni s gy tovbb.
7. ra Alapvet osztlyok 1133
Az egysgbe7..rs (encapsulation) nem ms, mint egy dologgal kapcsolatos inf0n11ci--
iknak, s a krdses dolog kpessgeinek egy objekrumba
Az egysgbezrs - ha csak az auts pldra gondolunk - programozi szcmszgb6l
igen hasznos. Minden adat egy helyen van, gy igen knnyen hivatkozhatunk rj uk,
msolhatjuk vagy mdosthatjuk
Egy osztly gyrelei vagy kliensei olyan oszt:lyok vagy fggvnyek , melyek az adott
osztlyt h:lsznljk. Az e!,rysgbe71rns lehet6v teszi a kliensek ho!,'Y a
dsi elv ismerete nlkl is hasznlhassk az osztlyt. Vezethetnk autt p61dul anl-
kl , hogy rtennk, hOb'Yan is mllkdik egy motor. Ugyangy a kliens osz-
tly is hasznlhatja az adolt osztlyt anlkl, hogy beleltna annak Azt
kell csupn tudnia, hogy mit csinl , de azt nem, hogy hogyan.
Az oszt:ly vltoz6tpusok s ms osztlyok kombirlcijb61 ll -
hat. Az osztly vltozit tagv: ltozknak vagy adattagokn:lk hvjuk. Az Car osztly pl-
dul rendelkezhet vltozkkal, mely az lsek szmra, a r.di6 upusra, vagy a kere-
kekre utal s tovbb.
A tagvltoz6k, vagy mskppen az adatlagok az osztlyunk vltozi. A tagvltozk
ppgy rSzei az osztlynak, mint a kerekek s a motor az autnak.
Egy fggvnyei jellemz6cn a tagv:.'ltozk mdosts{tr::t szolg!iln:lk. Rendszerint
tagfggvnynek V:lgy mctdusnak r,evezzk 6kel. A Car osztlyban lehet pldul
II Start () s a Br ak e () fggvny, melyekkel a sebessg nkt lltlultjuk be. A Cat
osztlyb:tn hasonlan trolhaljuk az :'illat Jclkorfh s sly[, a mct6dllsok kztt pedig
a Sleep(), II Meow () s a ChaseMice () szerepelhet.
A tagfggvnyek az osztly fggvnyei. A tagmggvnyek ppannyira reszei az osztly-
nak, mint II tllgvltozk, meghatrozzk, mire kpes az adott osztly.
Osztlyok deklarlsa
Egy osztlyt II cl ass kulcssz6val deklarl link, nyit s zr kapcsos zrjelek kzn
soroljuk fel a tagvltozkat s II tagrggvnyeket. A zr kapcsos zrjel utn pontos-
vessz6t rakunk. gy nz ki pldul a Cat osztly deklar:.'ici6ja:
class Cat
(
public :
) ,
unsigned int i t sAge;
uns i gncd int i tsWeight ;
Meow() ;
134 111. rsz Osztlyok
A eat osztly deklarlsval mg nem foglalunk le memrit, csupn kzljk a ford-
tval, hogy milyen adatokatlrolunk (itsAge s az itsWeight vllOz6k) s aZl, hogy
az osztly tagjai mire kpesek (Meow ()). Ez azt is megmondja a fordtnak, hogya eat
osztly ltrehOl.shoz mennyi memrira van szksg. Jelen esetben - ha az egsz t-
pus 4 bjlnt foglal - a eat osztly 8 bjt mrett1!esz: 4 bjtOl ignyel az itsAge s 4
bjtot az itsWeight. A tagfggvnyek - jelen esetben a Meow () - nem foglalnak k-
ln trhelyel.
Osztlyok nevezktan.
A programoznak termszetesen valamennyi osztlyt, tagfggvnyt s tagvJtoz6t cl
kell neveznie. A 3. fejezetben (Vltozk s konslansok) emltettk, hogy ezeknek
knnyen rthelC1eknek kell lennik .'i utalniuk kell a v ltoz6 cljaira is. A Cat ,
Rectangle (tglalap) s az Employee (alkalmazott) pldul oszllynevek.
Meow ( ), H ChaseMicc () S:l StopEngine () szintn megfelel6 fggvnynevek, hi szen
ut3lnak a fggvr1yek rendeltetsre. Szmos programoz its (v) e I6t:lggall(llja el
a tagvltozit, mi r1t pldul: itsAge, i tsWeight, itsSpeed. Ez a megolds segt meg-
klnbztetni 6kel azoktl a vllozkt61, melyek nem tagvltoz6k.
A C++ klnbsgel lesz .. kis- s kzn, l=ppcn ezrt minden oszt{llyt cl-
szem hasonlan elnevezni. Ha gy tesznk, nem kell azon trnnk a fejnket , vajon
Rectangle, rectangle vagy RECTl\NGLE nven dekla r lnrk-e az oszt[llyt? Nhny
programoz6 pldul hizonyos el6taggal ltja el az osztlyok neveit ( pldul eCat vagy
ePer son), megint msok csupa nagy vagy csupa ki sbert hasznlnak. A knyv pldi-
ban minden oszt(tl y nevt fogjuk rni.
H:lsonlkpp bevett gyakorlat, hogy szmos programoz6 a fggvnyek neveit n:lgybe-
a vltozk nevei t kezdi. Tbb sz6bl 1l 6 vltoz6nevek esetn vagy
alhzsjelet hasznlunk (pldul ChaseJlice) vagy Illinden sz6 nagy-
bet"vel rjllk (pldlll ChaseMice vagy DrawCircle).
Fontos, hogy brmilyen konvencit is kvetnk, az vljk szoksunkk 6s a program-
jainknl ragaslkodjunk hozz. Id6vcl ki31aklll az egyni stlusunk, nemcsak nevekre,
de pldul a behzsokra, a kapcsos zrjelek helyre s a megjegyzsekre vonalko-
zan is. Sz,mos cg s fejleszt6i csoport rendelkezik hivatalos vagy aj nl ott kdol s!
stlussal. Tanuljllk meg 6kel.
Objektum definilsa
Az j tpusunk egy objektumt - pldnyt - hasonl6kpp definiljuk, Illnt pldul egy
egsz tpus vltoz6t;
unsigned int GrossWeight ; II definilunk egy e16jel nlkli egszet
Cat Frisky ; II defini ljunk egy Cal objektumot
Ez a kdrszlet definil egy nlkli egszet GrossWeight (brutt tmeg) n-
ven. Megad tovbb Frisky nven egy a eat osztlyba tartoz, vagyis ilyen tpus
objektumot.
Osztlyok s objektumok
A kedvencnket sosem hvjuk macsknak, minden macska sajt nevet kap. Ezzel emel-
jk a nappaliban htmyl6 kedvencnkct a macska ltalnos icl cja fl. C++-ban ha-
sonl6k6pp gondolkodunk. A eat osztly maga az idea, mg az cgyes pldnyok
az osztlyba tartoz objektumok. Frisky teht a Cat osztly egyik eleme v.tgy pld-
nYd, mely rendelkezik el6jel nlkli egsz tpus Grossweight <Idattaggal.
Az objeknun egyszeruen az osztly egy tagja, amikor pedig egy osztly alapjn llreho-
zunk egy objektumot, :l zl az oszUly p ldnyostsnak hvjuk.
Osztlyok tagjainak elrse
t1'lilltn definiltunk egy a eat osztlyba taltoz6 objeklumol- jelen esetben a Frisky-l
-a pont opertorral 5ivatkozhatunk az adott osztly tagfggvnyeire s tagvltoz6i .... J..
1 la pldul Frisky itsweight vltozjt be szeretnnk lltani 50-re, akkor ezt a k-
tchetjk meg:
Friaky .itsWeight - 50 ;
i lasonl6kpp kell eljrnunk, ha meg szeretnnk hvni a Mcow () fggvnyt:
Frisky .Meow();
C++-b:lll sosem rendelnk rtket, l1:lnem vltoz6hoz. Az albbi sor pkMul
helytelen, amit a fordt6 jelezni is fog, hiszen :lZ egsz tpusho? nem rendelhet jk r-
tkknt :IZ 5-t:
int . 5; II helytelen
lia azonban mr definiltunk egy egsz tpus v ltoz6t, ahhoz ahhoz hozzrendelhet-
jk az 5-t:
int X;
x = 5;
II definiljuk az x- et egszknt
II az x rtk t bel litjuk 5-re
Rviden: troljuk az 5-t az x vltoz6ban, mely egsz tpus. Ugya nezrt helyte-
len a rtkads is:
Cut.itsAge=5 ;
Elbb ltre kell hoznunk egy Cat tpus objeknunot, aminek a tagvltoz6jhoz aztn
mir hozzrendelhetjk ,IZ 5-t:
Cat Frisky;
Frisky. itsAge = 5;
II akrcsak az x-nl;
II akrcsak x = 5;
Privt s publikus hozzfrs
Tovbbi kulcsszavak is egy osztly deklarci6jban. Ezek kzl a kt
legfontosabb ,I public s a private.
Minden adanag s tagfggvny alaprtelmezs szerint privt elres. A pri vllagok
csak s kizrolag az adott osztlybl rhet6ek el. A publikus elres tagokat ezzel szem-
ben brmelyik osztlybl elrhetjk. Ez a megklnbztets famos, br zavar lehet.
l logy vilgosabb tcgyk a hel yzetet, nzzk meg ismt a fejezet egy korbbi pldjt:
clafls Cat
unsigned int itsAge;
unsigncd int itsWeight;
Maow() ;
Ebben:] deklarci6ban az i t sAge, az itsweight s :1 Meow () pr/vM lthatsggal br-
nak, hiszen eZ :lz alaprtelmezett. Ez azt jelenti , hogy ha mskpp nem jclczz.lk, min-
den lag privt.

Ha ennek ellenre megpr6bln5nk elrni az itsAge adaltagol, a fordt hibt
fog jelezni. Az al:'ibbi plcb teht
eat Boots;
Boots.itsAgc:S; II hiba! nem frOnk
Az osztlydefinci6val gyakorlatilag utastouuk a fordtt, miszerint az itsAge,
itsWeight l!s a Meow() tagokat csakis a Cat osztly lagfilggvnyei rhessk el. Ennek
ellenre az elGzG pldban mgis megpr6blruk elrni. Az, hogy Boats egy
Cat tpus objektum, mg nem jelenti azt, hogy Boats privt rszeit is elrhetjk.
Hogya Cat osztly tagjait elrjk, deklarljuk publikusknt:
class Cat
public :
unsigned int
Iln!ligncd int
Meow() ;
Most mr az i tsAge, az itsWeight s a Meow () is publikusak. ppen ezrt
a Baat. i tsAge=S sor is hiba nlkl le fog fordulni.
tervezsi s7..ably, hogy azt adattagak mindig privt Jthat6s.'ggal
rendelkezzenek. ppen emian olyan publikus eljrsokat is ltre kell hoznunk, melyek
elri k (kiolvassk s mdostjk) a privt aclattagokal.
7. 6, ..
Ezek a fggvnyek lehetv tt!szik, hogy klnvlasszuk az adattrols mdjt s
az adatok felhasznlst. Ennek ha brmi megvltozik az adattrolsban,
nem kell jrairnunk azokat a fggvnyeket , melyek ezekkel az adatokkal dolgoznak.
Az elrhetsget public s pr i vat e ku1cSSZ<lVllkkal deklarljuk. Minden blokk a
elrssel kapcsolatos kuks .. 'izig vagy az osztlydeklarci vgig lan. Az osz
t lydeklarci6t zr kapcsos z.1r6jdlel s 7.1UjUk.
Tekintsk az albbi pldt:
e l so!> Cat
public :
} ,
unsigncd int Age:
unsigned int Wcight ;
voi d Meow() ;
eat Frisky ;
Frisky . Age "'" 8 ;
t'risky .weight = 18;
Frisky . Meow{) ;
Vagy nzzk ezt:
class Car
{
public :
voi d Start () ;
void Accelerat e( );
voi d Bukn() ;
void SetYear(int year);
int GetYear () ;
private ,
int Year ;
Cha r Model [255] ;
} ,
Car OldFa ithfui ;
l nt bought;
OldFaithf ul . SetYear(84) ;
bought = OldFaithf ul. GetYaar() ;
OldFaithf ul . St a rt() ;
II a kOvatkez6 5 tag publikus
II az utols kett6 privt
II az ontl ydeklarci vge
II 8 Car osztly egy pldnya
II loklis e16jelcs egsz
II rtkads
II a bought vltoz 84 lesz
II meghi vjuk a !l t art me tdust
A private kulcssz6val teht korllOzhatjuk az adauagok elrst s azt, hogy mikp-
pen mdostharjuk 6kel.
137
38 II. rsz
Osztlymetdusok ltrehozsa
Minden deklariUt osztlymetdust definilni is kell.
Aprop
Tagmetdusok
A tagmetdusok (vagy tagfggvnyek) definfcija az osztly nevvel k e z d d i k
majd kt darab kensponttal, a fggvny nevvel, vgl annak paramtere ivel
folytatdik.
A tagmetdusok (vagy tagfggvnyek) deflnci6ja az osztly nevvel kezdtXlik, majd
kc darab kelli5sponttal, a fggvl:ny nevvd, vgl ann:1k parnml: lcrcivel folyt:1t6dik.
A 7. ] Li stban be mutaljuk az egyszeninek mondhat eat osztly teljes deklarcijt,
:lZ adalwg-hozzMrsi fggvnyeket, ilklve egy ltalnos cl tagfggvl:nyt.
1.1 Liata - Egy egysz8ni _ly oIjui llimpl ....... .,pl
Q.
1,
2 ,
3 ,
1/ Bomutntjuk egy osztly deklarcijt
II s az oszLly eljrsaineok definilst
'includc <iostream>
4 ,
5 : class Cat
6 , {
7: publi c :
8 : int GetAge() ;
II oz az std : : cout miatt szksges
II az osztly deklarci kezdete
1/ a publikus rsz
9 : void SetAge (int agc);
/1 adattagelr si fggvny
II adattagelrsi fggvny
II ltalnos cl fggvny
II privt 9zukasz
10, void Meow() ;
11 : private :
12 : int itsAge; II tagvltoz
13 : J ;
14,
15: /1 GetAge , publikus adattagelrsi fggvny
16 : II visszaadja az itsAqe tag rtkt
17: int Cat : , GetAgc()
18 , (
19 : return itsAge;
20 :
21 :
22 : /1 a SetAge publi kus def i ncija
2] : /1 publikus adattagelrsi fggvny
24 : II mellyel az it sAge tagot mdosLhatjuk
25: void Cat : : Set;a.ge ( i nt age)
26 :
27 : II bell t juk az itsAge vltozt
28: II melyet az age vl tozb l kapunk
29 : itsAge : age ;
30 ,
31 :
]2 : / 1 a Meow met6dus definici 6ja
J] : /1 nincs visszatrsi rtke
]4: / I ni ncsen paramtere
35 : / 1 kiirja a kperny6re . hogy "mcow'
]6 : void Cat : : Mcow()
]7 : (
]8 : std: :cout Meow. \n';
]9 :
40 :
7. ra
41: /1 lt r ehoz za a macska egy pldnyt, belltja az letkort
42: II nyvog egyet , megadja az letkort s jra nyvog
43 : i nt maln()
44 : {
45 : Cat Frisky;
46 : Frisky.SetAge(5);
47 : Frisky.Hcow{) ;
48 : std: : cout 'Prisky i a a cat who is ;
49 : std :: cout Frisky. Get Age() ' years old . \n' ;
50 : Frisky.Meow() ;
51 : return O;
52 :
Meow.
Fri sky is a cat who is 5 years old.
Meow.
Az 5. sorrl a 13. sori g taltiljuk a Cat osztly defincijt. A 7. sorba elhelyeztk
a public klllcsszt, mely jelzi a fordtnak, hogy publikus tagok kvetkeznek. A 8. sor
a Ge tAge () fggvny deklar:lcijt tanalmazza. Ennek segtsgvel r-
hetjk el az itsAge tanaImt, melyct a 12. sorban deklarltunk. A 9. sorban helyet ka-
pou a SetAge () . mely a megadon paramterrc belltja az itsAge rtkr.
A 11. sorban kezd6clik a Cat oszlly privt rsze, mcly csupn a 12. sorban
deklar lt itsAge tagvltozt tartalmazza. Az osztlydeklarcit zr kapcsos z:hjellel
s ponrosvessz6vel zrjuk le.
A 17. s a 20. sorok kztt definiljuk a GetAge () tagfggvnyt. A metc!us nem ren-
del kezik pammterrel s egsz rtket ad vissza. Ne feledjk: a metc!usok neve
szerepel az osztly neve s kl darab ken6spom. Ez jelzi a fordt szmm, hogy a Cat
oszlly fggvnyt definiljuk. A fejlc kivtelvel a Get Age () fggvny defini lsa
megegyezik a tbbi fggvnyveL
A GetAge () fggvny csupn egy sarbi ll, s az itsAge rtkt adja vissza. Ne fe-
k..uj k: a main{) fggvnyb61 nem rhetjk el a Cat osztly privt itsAge, vi-
139
140 III. rsz Osztlyok
szont elrhetjk a publikus GetAge () metdust. Mimhogy ct GetAge () a Cat osztly
tagfggvnye, gy elri az itsAge v1toz6L Ezzel mr a main () fggvny szmnl t-
adhat az i t sAge rtke.
A 25. sor tartalmazza ct Set Age (l defincijt. Egsz tpus paramtert Vf s ez alapjn
belltja az itsAge rtkr a 29. sorban. A SetAge () ct Ca t oszLly tagfggvnye, (gy
tdjes joggal kezelheti az itsAge tagvltoz6t.
A Meow () metdus implementcija a 36. sorban kezd6dik. Ebben az egysoros fgg-
'lnyben csupn kir.ujuk ct Meow szt egy soremelssel a kperny6re. (Emlksznk
ugye, hogy a \n j soremelst eredmnyez?)
A 44. sorban a mr jl ismert main () fggvny. Ennek nincs paramte-
re, s res (void) a viSSZatrsi rtke. A 45. sorban ltrel10zunk a Cat osztlybl egy pl-
dnyt Fr i s ky nven. A -i6. sorban bell tjuk a Set..Age () segtsgvel
az it sAge v1illozjt 5-re. Az elj{u"st a pldnyazonosltval, egy pontral s a metdus ne-
vvel hvjuk meg. Eh.hez hasonlan brmely ms met6clusl meghvhatunk az osztlyb61.
A sorban meghvjuk a Meow () tagf"ggvnyt, :l 48. s 49. sorokban kiolvassuk ki -
rat juk az i t sAge rtkt a GetAge () adattag-elrsi fggvny seglSgvel. Az 50. sor-
ban j ra meghvjuk a Meow () fggvnyl.
Konstruktorok s destruktorok, avagy az objektumok ltrehozsa s trlse
Ktflekppen definilhatunk egy egsllpUSLI v ltozt. Definilhatjuk elbb magt
a vlltozt gy, hogy rtket csak adunk neki:
int Weight ; II vltoz6 defini lsa
II programk6d
Weight = 7; II rtkads
Ugyanakkor defini ls utn akr azonnal is inicializlhat juk:
int Weight - 7, II definilunk s inici alizlunk egyszerre
Ez a m6dszer egyesti a defincit s a kezdeti rtkadsl. A v:!toz persze sza-
badon mdosthat, az inicializls azonba n garantlja, hogya vltoznk nem fog r-
telmetlen rtket tartalmazni.
Mi a helyzet egy osztlyadattagjaival? Az osztlyok pldnyost.sakor lefut egy speci-
lis a konstruktor. Ennek a feladata az osztly egy rvnyes pldnynak
ltrehozsa. A gyakorlatban ez azt jelenti, hogy az adattagokat indul rtkekkel l:'tja
el. A konstruktor eljrs neve megegyezik az oszrlyval , de nem rendelkezik visszat-
rsi rtkkel. pammtereket viszont kaphat, ahogyan brmely ms metdus is
az osztlyon bell.
7.6ra
Ha van konstnLktorunk, ajnlott cleslnlklort is deklarlni. Ahogy a konstruktor ltrehoz-
za s inicializlja a pldnyt, gy a destruktor az objeb. wm eltakaritja
az objektumot s az esetlegesen foglalt memrit felszabadtja. A destruktor neve
u&'Yanaz mim az osztly de - (tilde) karakterrel A destruktornak nincs be-
paramtere s visszmrsi rtke sem. A Cat osztlyhoz pldul gy kell
destnlktort rnunk:
-Cat cl ;
Alaprtelmezett konstruktorok
Ai': albbi sorral:
Cat Frisky(5);
rulajdonkppen a Cst osztly konslr1lktort hvjuk meg, amely jelen esetben egy para-
mtert kapott (S). r la paramter nlkl hvjuk meg, gy clhagyhat6 a zrjel pr s
az alaprtelmezett konstruktor fulle.
Cat Ft"i s ky;
Az alaprtelmezett ktmstruktor nem kap paramtereket.
A fordlt6 ltal biztositott konstruktor
Ha egyltaln nem deklarltunk egy osztlyhoz konstnLkton, gy a fordt autom:uiku-
s.1n ltre fog hozni egy alaprtel mezcner. (Ne feledjk, az alaprtelmezett konstnLktor
nem fogad paramtert.)
A fordt ltal knlt alap&rtelmezett konSlnlktor nem csi nl semmit. Mi is deklarlha-
nmk ilyent, hiszen nem kell mst tennnk m.im resen hagyni :I konstnLktor trzst.
Ehhez :lzonban [:utazik kt fontos megjegyzs:
1. Az alapnelmezeu konstnLktor nem kap paramtereket. Definilharjuk mi ma-
gunk is, vagy rbzhatjuk ennek ltrehozst a fordtra is.
2. Ha ltrehozunk sajl kOnstnlktort (paramterekkel vagy anlkl)
a fordt nem ad alaprtelmezett konstmktort. Ebben az esetben ezt is neknk
kell definilni.
A dCSTnlktor hinya esetn hasonlkppen jr el a fordt. Ha nem adunk meg
destruktort, akkor kapunk egy res amely nem csinl semmit.
Ha azonban deflniltunk brmilyen konslmktort, :Ikkor mindenkppen definiljunk
destrukton is, mg akkor is ha res s valjban nem csinl semmit. Noha az alaprtel-
mezen destruktor is tkletesen teszi a dolgt, a sajt destmklor tlthat6bb teszi
a k6dunkat, egy reset megrni pedig igazn nem nagy munka.
141
142 111, rsz' Osztlyok
A 7.2 listban a Cat oszlly kapou egy konstruklon, mely a Cat pldnyokat hivalaU
inicializlni gy, hogy belltja az ltalunk megadotl letkort. Destruktor nlkl nem
lenne teljes a program, gy bemutat juk azt is.
7,2 Lista - Ko .. truktorok destruktorok (_.Optl)
o: 1/ Bemutat juk konstruktor s destruktor
1 : / I deklarcijt il Cat osztlyban
2 : #inc!ude <iostream> II az std:, eout miatt
3 : using std: : cout; 1/ mindig az std: :cout-ot hasznljuk e forrsban
4 ,
5: class Cat
6 : {
7 ,
8 ,
9 ,
10 :
public:
Cat(int initialAge) ;
-Cat () ;
int GelAge () ;
void SetAge(int age) ;
void Meow ( ) ;
11 :
12 :
13 :
14 :
private:
H: ) :
16 :
int iteAge;
11: II a Cat konstruktora
18 : Cat : :Cat( i nt initialAge)
19, {
20 : itsAge initialAge ;
21 :
?2 :
II az osztlydeklarci6 kezdete
II publikus rsz
1/ konstruktor
II destruktor
1/ adattagelrsi fggvny
II adattagelrsi fggvny
1/ privt rsz
II tagvltoz6
23 : II destruktor , al1\ely nem csinl senunit
24 : Cat : : ~ C a t )
25 : {
26 :
27 :
28 :
29: II GetAge, publikus adattagelrsi tggvny
30 : II visszaadja az itsAgc tag rtk t
31 : int Cat : :GctAge()
32 :
33 : rturn ltsAge;
34 :
35 ,
36 : II a publikus SetAge definci6ja
37 : II adattagelrsi fggvny
38 : void Cat : : SetAgc {int age)
39 : {
40 : /I belltja az itsAge rtkt
41 : /I a paramterul kapott rtkre
42 : its1'lge = age;
43 :
44 :
45: II a Mcow met6dus definci 6ja
4 6 : II visszatrsi rtke : res (void)
7. ra
47 : II paramt erek : nincsenek
48 : II mit cs i nl: kiirja a kpel,"ny6re , hogy meow
49 : void Cat : :Mcow()
50 :
51 : cout 'Meow.\n';
52 :
53 :
5<1 : 1/ ltrehozzuk a macskt, bell!tjuk az letkort
55 : 1/ nyvog egyet, lekrdezzk a z let kort , majd i.!; mt nyvog
56 : int main()
57 :
58 : Cat Frisky(5);
59 : Frisky.Meow() ;
60 : cout 'Prisky is a cat who is ;
61 : cout Frisky . GetAge () years old. \n' ;
62 : Frisky . Mcow ( ) ;
6] : Frisky.SetAge(7) ;
64: cout 'Now Frisky i s ;
65 : cout f'ri sky . Go tAge (J yoars old . \n " ;
66 : return O;
67 :

](j
Meow,
Frisky is a cat who i s 5 yeal,"s old.
MCQw.
Now Frisky is 7 yenrs old.
A 7.2. List:1 hasonlt a 7.1-esre, kivve, hogya B-as sorban bvletrk egy konSlruk-
torml. mely egsz rtket vr, illetve a 9. sorban egy destruktorml, mcly ncm fogad pa-
mmterekeL A destruktorok sosem kapnak paramterekct, ill etve se a konstruktor, se
a destruktor nem ad vissza rtket, mg reset (void) sem.
A 18. s 21. sor kztt megfigyelheljk a konstruktor implementdjt, mely nagyon
hasonl a Set Age () adaltag-elrsi fggvnyhez.
A 24. s 27. sor k7.tl megfigyelhetjk a -Cat () destruktort. A fggvny nem csinl
semmit , de muszj megadni , amennyiben az osztlydeklarci6nl megadtuk.
Az 58. sorban pldnyost juk a Cat osztlyt Frisky nven. Frisky konstruktom 5-t
kap meg paramterknt. Nem kell meghvnunk a SetAge () fggvnyt, hiszen Frisky-
t lmf eleve gy pldnyosljuk, hogy az itsAge vl tozba 5 kerl, bizonytk erre
a 61. sor ki menete. A 63. sorban Frisky itsAge vl tozjt m6<.lostjuk, melyet a 65.
sorban krdeznk le jra.
143
144 , II. rsz OSZtlYaI<
Ausing kulcsszrl v e e n
Ebben a pldban tallkoztunk a us ing kulcsszval. Ez (namespace mdost
nlkl. amelyet az e l z rban mutattunk be) kzli a fordtval , hogya cout fgg-
vnyt mindig az std fggvnyknyvtrban keresse. Ha ms, szintn a szabvnyos
knyvtrbl szrmaz fggvnyeket is hasznlunk (ilyen pldul c in), akkor ezt
vagy mindentt std: : cin fonnban kell megadnunk. vagy hasonlkppen kell el-
jrnunk, mint a 3. sorban.
Krdsek s vlaszok
Krds: MilyeJ/ Hagy egy osztly pldny?
Vlt/sz: Egy osztly egy pklnynak helyfoglalsa mindig az adanagok helyfoglals-
nak az sszege. A t:lgfggvnyek nem az objektuman belil! foglal jk a memri[tt.
Nl!h:ny rordt 2 bjlos vltoz esetn 2 bjtnl valamivel tbbet foglal Je. Err61 tovb-
bi rszletekkel <IZ :1lt,dunk hasznlt fordtprogram lersa szolglhat, cle most mg fe-
lesleges ilyesmivel foglalkozni.
Krds: Mlc'!I1/1em szabad pub/ikllsnak definilni az adaffagokal?
Vlasz: Az adauagok privt elrse anlkl teszi lehet6vl: az osztly felhaszn l6ja sz-
mra !lZ adatok hasznlatt, hogy ismern az osztlyon belli ad:ntrols s adaeldol-
gozs mikntjt. Pldul ha a eat osztly rendelkezik egy GetAge () met6dussal, ak-
kor : I Z osztly kliensei lekrdczhetik az letkort anlkl, hogy nJdnk, mikpp trolja
:IZ az letkort, v:lgy hogyan szmolja ki azL A publikus adat ezzel szemben olyan, mint
:I globlis vltoz. Brmely parancs hozzfr, ha pedig megvltozik, akkor hossz s
kellemetlen hibakeress kvetkezik.
Gyakorlatok
Most, hogy mr lLldunk egyet-s-mst az objeklumokr61 s osztJyokr61, vlaszoljuk meg
a kvzkrcls:!ket a gyakorlatok segtsgve! pedig mlyL'ik cl a megszerzett tudst.
Kvfz
1. Mi a klnbsg az osztly s az objekmm kztt?
2. Mi a klnbsg a public s a private elemek kztt egy osztlyon bell?
3. Mit csinl egy konstruktor?
4. Mit csinl egy destruktor?
7. ra
Feladatok
l . Mdostsuk a simpleclass . cpp-t gy, hogy ltrehozunk egy msodik macskt
Spot nven. Nyvogsm tudjuk brni?
2. Mi trtnik a simpleclass . cpp-hen, ha megprbljuk megvltoztatni
az i t sAqe vltozt a main () fggvnybl? az itsAqe++ vagy
a Frisky. itsAge ++ kifejezs? Milyen kvetkeztetseket vonhatunk le
a publikus s privt elrsekkel kapcsolatban?
3. Mdostsuk II simpleclass . cpp-t gy, bogy az it!}lIqe publikus vltoz le-
gyen. Most hajtsuk vgre jr:. .. a 2. feladatot! Ezutn a main fiiggv(:nyb61 is 110z-
frnk Fri sky adataihoz, viszont gy sokkal nehezebb megmondani, hogy
hol rontottuk el (:s mirt kapta a vltoz ;IZ aktulis (;rtkt.
Vlaszok a kvfzkrdsekre
1. Az osztly egyfajta lers vagy definci, mely nem foglal memrit. Az objektum
ennek az osztlynak egy megvalstsa (pldnya).
2. A privt adatok s metdusok (fggvnyek) csupn az adott osztlybl rhet6ek
el. A publikus adatok s metdusok (fggvnyek) az oSltlyon kvlr61 is elr-
het6ck. Gyakorlatilag rdemes az osztlyadatokat privt clrslv, a metduso-
kat pedig publikllss{\ tenni.
3. A konstruktor ltrehozza az objektumot az osztlydefinki6 alapjn. Konstruktor
ltreho7ltst rbzhatjuk a fordt"l is, amennyiben nem bonyolult a progm-
munk, dc sszetett megrhatjuk mi is. A saj:t konstmktorok kszt-
svel nemsokrn rszletesen foglalkoZl.lnk.
4. A d/;!struktor vgzi :1 takartl'isl, ha egy objckl"umrn mr nincs
Konstruktor ltr/;!hozsc rbzhmjuk a fordtra is, amennyiben nem bonyolult
a programunk, de sszetett objektumnl megrhatjuk mi is. A sajt destnJkLorok
ksztsvel hamarosan rszletesen is foglalkozunk.
145
8. RA
Az osztlyokrl - mlyebben
Ebben az rban a lesz
Mik azok 3 konstans t.agfggvnyek
Hogyan klnL"k el az osztly keze16fellctt a megva16stst61
Hogyan kezeljk osztlyainkat, s hogyan vegyk r a fordt6programot, hogy
segtsen megtallni s elkerlni a progmmhibkal
Konstans tagfggvnyek
Ha egy osztly tagfggvnyL const -nak deklarljuk, ezzel meggrjk, hogya met-
dus nem fogja megvltozt:ttni semelyik osztly tag rtkt gy deklarlhatunk egy osz-
tlymetdust konstansknt, hogya const ku!csszt a zrjelek urn (a
el) rjuk. Pldaknt deklarljuk a SomeFunction () konstans tagfggvnyt gy, hogy
ne legyen egyetlen argumentuma sem, s csak az res tpust adja vissza. Ez a kvetke-
nz ki:
void SomeFunction() const ;
148 1 ll , rsz Osztlyok
A fggvnyeket ("gel accessor" vagy "geffe!" metdusokat) h'Yakmn konstans
fggvnyekknt deklar: lj k a const mdost segL'igvel. A Ca t o5zt.lynak kt hoz-
fggvnye van:
voi d SctAgc(int anAgel ;
int GetAge () ;
A SctAge () nem lehet konstans, mert megvltozt3tja az iLslI.ge tagvltozt.
A GetA.ge () viszont mr lehet konstans, s rdemes is annak vlasztani, mert nem vl-
(oztat a7. osztlyon; egyszen1cn csak visszaadja az ItsAge tagvltoz6 aktulis rtkl.
fgy ezen fggvnyek deklarcija az albbi mdon tnnhet:
void SctAgc(int anAge) ;
int GetAge () const;
!la cgy fggvnyt deklarlunk, majd a fggvny megval6stsba belekerl
valamely objektum (a;wz pkl[1U1 valamely mgvlloz6 rtknek) megvltoztatsa, akkor
ezt a fordt6prognull hibiin:lk knyveli el. Ha pldul gy rnnk meg a GetAge ( ) -et,
hogy tal1s.1 sZ:lmon, bogy il Cat hnyszor krdezte le a kort ("' get age), akkor ez ford-
t<'isi id6beli hibt gcner.i1na. Ez ugyanis vltoztaln:l a Co!It objektumon.
Ha csak lehet const
Erdem,,, konstanst hasznlni, amikor csak lehet. Deklarljuk konstansknt a tagfgg-
vnyeket, ha azok nem vltoztathatnak az objektumon. Ezltal a fordftprogram tbb
hibt szrhet ki, ami gyorsabb s olcsbb, mint ha a programoz foglalkozna ezzel.
J programo:dsi gY:lko rl:lt, ha a lehc16 1egLhh met6dust konst:lnsknr cl ekl:lrfLljuk. Va-
lahnyszor gy tesznk, felh:l!:l lm:l zzuk a fordt6progra mol, hogy tveszt(:seinkel
felfedezze; mg azok futs i progmmhibkk U: pnnek Ugyano lyan
okbl rdemes konstans fggvnyeket hasznlni, mint amil!rt konstans vltoz6k:lt.
Fellet s megval6sfts
Ahogy korbban tanultuk, az gyfelek a prognlm azon amik ltrehozzk s
hasznljk osztlyunk objektumait. gy is elkl!pzelhetjOk osztlyunk fellett - azaz
:lZ osztly-deklar:'idt - mint egy ezekkel az gyfelekkel. A felso-
rolj:l osztlyunk felhasznlhat adatait, meghatrm:za osztlyunk viselkedst.
A eat osztly uckl ar:k i6jban pldul ol yan rtunk, amely szerint minden
macska (Cat) tudhatja s kinyerheti sajt kort; valamint, hogy ltrehozskor iniciali-
zl hat ez a kor, s bellthat vab'Y s hogy minden macska tud
nyvogni: Meow () .
Ha a GetAge () -ct konstans fggvnyknt hozzuk ltre (ahob'Y azt rdemes), akkor
a arm vonatkozan is gretet tesz, hogya GetAge () nem fog vltoztatni
a macskn, ami meghvja
Tudta hogy ... ?
Mirt hasznljuk hibakeressre a fordtprogramo!?
A programozs vres valsga azt mutatja, hogy egyiknk sem r hibtlan kdot.
Nem az klnbzteti meg a profi programozt a hogy az nem vt hi-
bt; hanem, hogy mg megtallja azokat, tennkt vzre bocstja.
A fordts hibk - melyek a programfordts alatt deriilnek ki - sokkal jobbak
a futsi hibknl, melyek a program futsakor tkznek csak ki.
A fordtsi hibkat nem lehet nem megtallni. Viszont szmtalanszor le lehet
futtatni egy programot gy, hogy annak vezrlsi tja nem fedi le a teljes forrsk-
dot; gy a futsi hibk sokig rejtve maradhatnak. A fordtsi
hibk rgtn a fordtskor kiderlnek , gy azonostani s javtani
programozsnak pontosan az a clja, hogy ne maradhassanak futsi
hibk a kdban. Ennek kiprblt s jl bevlt mdszere a fordtprogram meg
kihasznlsa; segtsgvel a tvesztsek mg a fejleszts korai fzisaiban fel

Termszetesen hogy programunk hibamentes, csak pp nem azt teszi,
amit vrunk Ezrt szksgnk van csapatra is.
Hov tegyk az osztly-deklarcit s a metdus-definfcikat?
Oszt:1lyunk minden egyes deklarlt fggvnyhez meg kell rnunk a megfelel6 defin-
cit. Ezt ms nven a fggvny implementci6jnak, megvaI6sts.in:lk hvjuk. Mint
minden ms fggvnynek, az Osztlymet6dus definci6jnak is van fej rsze s trzse.
A dcfinci6n:lk olyan fjlhan kell lennie, melyet a fordtprogmffi megtall. A legtbh
C++ fordt6 azt vrja, hogy ennek a fj lnak. c vagy. cpp kiterjesztse legyen. Kny-
vlinkben a . cpp-t fogjuk hasznlni , de rdemes megnzni :I kedves olv:l." lL:!1 hasz-
nlt fordtprogmm elvrsait.
Aprop
A forrskd llomnyainak kiterjesztse
Sok fordtprogram azt ttelezi fel, hogya. c llomnyok C prog
ramot tartalmaznak, a . epp pedig C+ + Valjban hasznlha
t brmelyik, de cskkenti a ha . cppt hasznlunk C++ programjainkhoz.
. cpp llomnyokat fel kell venni a projektfjlba v:lgy a make file-ba. Ennek
konkrt mdja a hasznlt fordtprogramtl fgg. H:I integrlt krnyezetet hasz-
nl (TDE-, olyasfle menpontot rdemes keresni, hogy jjlok hozzadsa a projekt-
hez". A progr..lmhoz tartoz minden .cpp llomnyt hozz kell adni a projekthez,
azt szeretnnk, hogy bekeriiijn (fordts s linkels utn) a furrathat fjlba.
Br megvan a szabadsgunk arra, hogy a deklarcit a . cpp forrsfjlba illesszk, ez
nem tl j programozsbeli gyakorlat. A legtbb progmmoz ltal elfogadott kzmeg-
150 I II. rsz Osztlyok
egyezs szerint a deklarcikat fcjlc:llomnyokba rdemes tenni, melyek hasonl6 ne-
vet viselnek, ("sak a kiterj esztsk . h j . hp vagy. hpp. Knyvnkben. hpp-t fogunk er-
re a etIm hasznlni, de rdemes megnzni fordit6programunk belltsait.
A Cat osztly deklarcija pldul a cat . hpp ll omnyba kerlhet, mg az osztlyme-
tdusok deAnciit a cat. hpp llomnyba. gy junathatom a fejlcillomny tartaimt
a cat . cpp llomnyba, hogy ennek soraiba berom:
llinclude cat . hpp
Ez arra utastja a fordt6programot , hogy enn(;!k a sornak a hcly6re emelj e be
a cat . hpp llomnyt; mintha csak erre a helyre lenne berva annak tartalma. Na dc ak-
kor mirt is kell elklnteni ('iket, ha a vgn gyis ssze lesznek prostva? gyfl-
progntmjaink:it a legtbb cselben nem rdeklik az egyes fggvnyck konkrt megval6-
srs,nak apr rszletei. A fejlcll omnybl mindent megrudnak, amire szksgk
van; felesk:ges lt:nne a megvalstsi fjl okkal foglalkozniuk.
Aprop
Osztlyok deklarlsa
Egy osztly deklarcija mondja meg a fordtprogramnak, hogy mi is ez az osztly,
milyen adatai s tagfggvnyei vannak. Az. osztly-deklarcit ms nven az osz-
tly kezelfelletnek (interfsll is hIvjk, mivel ebbl derl ki a felhasznl szm-
ra, hogy mit tehet az adott osztllyal. Ezt ltalban egy . hpp fjlban, azaz fejlc l-
lomnyban troljuk.
Egy fggvny definci6ja Irja le tszletesen, hogy hogyan mukdik az adott fgg-
vny. Ezt ms nven az osztlymet6dus megvalstsnak hvjuk, s egy . cpp fjl-
ban troljuk. Az. osztly megvalstsnak rszletei csak az osztly megalkotjra
tartoznak. Az. osztly gyflprogramjainak - azaz a program azon rszeinek, ame
Iyek hasznljk az adott osztlyt - nem kell (s nem is rdemes) tudniuk, hogy ho-
gyan valsul meg egy-egy fggvny.
Ennek a megkzelltsnek az a hogy knnyen meg lehet osltani osztlyo-
kat; azaz msok pldnyosthat jk az ltalunk tervezett objektumokat, s mi is
hasznlhatunk msok (munkatrsaink vagy kereskedelmi eladk) llaliirehozott
osztlyokat.
Helyben kifejtett (inline) megval6sfts
Ahogy egy norml Fggvny esetben is utasthatjuk a fordt6progrnmor, ho1;,')' hel yben
kifejtett fi.\ ggvnyknt fordcsa Ic azt, ugyangy helyben kifejtett egy osztlyme-
tdus is. Ehhez a visszatrsi 6rtk el in inline kulcsszt haszn:'i lhatjuk.
A GetWeight () Fggvny helyben kifejtett megval6stsa pldul gy n(:z ki:
inlinc int Cat : : GetWcight ()
{
rcturn itsWeight; II Visszaadj a az adattag slyt (Wcight)
8. ra
gy is helyben kifejlell lehet6 egy fggvny, hob'Y az osztly-dekJarciba rjuk a dc-
fmcijt. Pldul:
class Cat
{
publ i c :
int Get Weight ( ) const { return i t sWeight ; ) II i nline
void SetWeight(inL aWeight) ;
Figydjk meg a GetWeight () dd'lncijnak szintaxis:t. A helyben kifejtett fggvny
lrLSe rgtn az osztlymctdus deklarci ja utn kezd6dik, a7..az nincs pontosvessz6
a zrjelek utn. Mint brmely ms fggvnynl, in is kapcsos zrojelek kztt szere-
pel a definci. Ahogy mr megszokhaltuk, a trkz karakl erek nem sz5mtanak, azaz
mindez gy is rhar6 :
class Cat
{
public :
int Getweight() const
{
return itsWeight ;
void Sctweight(int aWeight);
II inline
A 8.1 s 8.2 Li sta is ltrehozza a eat osztlyt; kln kerl a deklard (cat . hpp) s
:I fggvnyek megvalstsa (caL . cpp). A 8.1 Lisla II hozzfr6 fggvnyeket s ti ny-
vog (Meow ( fggvnyt is belyben kifejlett teszi.
8.1 Usta - A Ca. osztly daklarci;a a cat.hpp fjlban
o: tinclude <iostrearn>
"
2 , class Cat
3 ,
4 : public ,
5 : Cat (int initialAge) ;
6 : -Ca t () ;
7 ,
s ,
9 ,
i nt Ge tAge() ( retur n i t sAge ;)
void SetAge (int agc) { itsAge '=' age ; }
void Meow() { std :: cout "Meow. \n" ; }
10, private :
11 : int itsAge;
12 , };
8.2 usta - A Cat osztly megvalsitsa a cat.cpp f ~ b n
II inline !
II i nlinc !
II inBne !
o: /1 Helyben kifejtett (inIinc) faggvnyek bemutatsa
l : /I s a fejlcllomny(ok) beemelse
2 : hncl ude 'caL hpp ' II Ne feledj ak a fejlcllomny beemel st!
3 ,
152 111. rsz' Osztlyok
4: Cat : : Cat (int initialll.ge )
5 .
6 : itsAgc initialAge;
7 .
8 .
9 : Cal: : -Cal( )
10 : {
ll : }
12 :
13 : II Ltrehoz egy [J\(Icskt (cat) ; belltj a a kort ,
H : /I megnyvogtatja, lekrdczi a kort. majd j r a ny vogtatja .
15 : int main{)
16 :
17 : Cat Frisky(S) ;
18 : Frisky. Meow() ;
19 : std : : cout " Frisky egy ;
20 : std :: cout Frisky. Gct Age() ves macs ka . \ n ' ;
2l: Frisky . Meow();
22 : Frisky . sct Agn (7);
23 :
24 :
s t d : : OOIJl. ' Frisky most. mr'
std : , cout Frisky . GetAge()
25 : return O;
26 :
m
Mcow.
Frisky egy 5 ves mac9ka .
Mcow.
Frisky most mr 7 ves .
ves . \n ";
A GetAge () -el a R 1 Lisu 7. sorban dcklarljukj in nonna! gondoskodunk a helyben
kifejtett megvalsltsrl is. A 8. s 9. sorok tovbbi helyben kifejtett fggvnyeket ad-
nak meg; ezek megvalstsa ugyanaz marad, mint a korbbi .tvolabb kifejtett" meg-
valstsokban.
A 8.2 Lista 2. sorhan a #i nclude "cat . hpp beemeli a caL . hpp tartaImt (ami vi -
szont a cout szmra szksges iost r e am-et emelte be :lZ ;. sorban).
Osztlyok beillesztse ms osztlyadattagjaiknt
Nem ritka, hogy egy bonyolultabb osztlyt gy ptnk fel , hogy osztlyo-
kat hasznlunk fel h07.711; azaz deklarciikat beilleszrjk a bonyolultabb osztly dekla-
rcijba. Egy Aut osztly felplhet pldul Kerk, Motor , Sebessgvl t stb. osz-
tlyoklxll. Ezeknek a deklarciknak rsz jellegk van, azaz az aut rszei a kerekek,
a motor s a sehessgvlt.
8.
Vab'Y tekintsk a pldt: minden tglalap szakaszokb61 ll. A szakaszokat kt
\'gpontjval jellemezhetjk. A rOnloka! x s y koordintik halrozz.'ik meg. A 8.3 Lsta
a Rectanglc ( Tglalap) osztly teljes deklarki6jt mutatja ( rect . hpp). A tglalapot
a ngy cscst ngy szakasz jelenti meg; minden pont egy koordintaprml
van megadva, ezrt a Point ( Polll) oSltlyt kell megadnunk (mc1y :mnak x s y
koordintjl tartalmazza). A 8.4 Lista mindkt osztly deklarficijt bemutatja.
8.3 Ulta - A rect.hpp egy teljes osztly deklarcijt mutatja (fejlc).
o: II rect. hpp kezd6dik
1: lincludc <iostrcam>
,.
3: clss Point /1 Tartalmazza az x,y koordintkat
4: {
5 : II nincs konstruktorl az alaprtelmezs
6 : public :
7 : void Setx ( int x) ( itsx '" x ; )
8 : void SctY(int y) ( i t sY '" y ; )
9 : int GetX()const { return itsX; }
10: int GetY()const { return itsY;}
11: privllte:
12: int itsX;
13: int itsY;
14, I;
15,
16 :
II II Point osztly deklarci6jnak voc
17 : Rectangl e
18 : {
19 : oubl ic :
7.0 : Rectanglc (int top . int left, int hottom. int right) ;
21 : -Rectungle (l (l
22 :
23 : int GetTop() const { rcturn itsTop; l
24 , int GetLeft() const ( return itsLeft;
25: int GetBottom() const ( return itsBottom;
26: int GetRight() const { return itsRight; }
27 :
28 :
29 :
30 :
31:
32 ,
33 :
34 :
35:
36 :
37 :
Point
Point
Poi nt
Point
void
void
void
void
GetUpperLeft{) const ( return itsUppcrLcft ;
GetLowerLe[t() const ( rcturn itsLowerLeft ;
GetUpperRi.ght () const ( r eturn itsUpperRight ;
GetLowerRight () const { return itsLowcrRight;
SeLUpperLeft (Point Location) ;
SetLowerLeft(Point Location) ;
SetUpperRighL(Point Location) ;
SetLowerRight(Point Location) ;
38 : void SetTp{int top) ;
39 : void SetLeft (int left);
40 : void SetBot tom (int hottom) ;
41: void SetRi gh t (int right) ;
42 :
154 111. rsz OSlllyok
43 : int GetAn:!il () const;
44,
45 : private :
46: Point itsUpperLeft;
47: Point itsUpperRight;
48: Point itsLowerLeft;
49: Point itsLowerRight ;
50: int itsTop;
51 : int itsLeft ;
52 : int itsBottorn;
53 : int itsRight;
54 : J,
55: /I rect . hpp vge
8.4 Usta - A rect.epp egy bonyolultabb osztly megvalslUidt mutatja.
o: II rect . epp kczd6dik
1: #inc l udc Hrect .hpp
,.
3 : Rectangle : : Rec tanglc(int Lop, int left, int bottom, int.. right)
4 : (
5 : itsTop .. top;
6 : itsLeft - left ;
7 : itsBottom z bottom;
8 : itoRight '" right ;
,.
10: itsUpperLeft , SetX(lcft) ;
ll : itsUpperLeft . SetY(top);
12 :
13: itsUpperRight.SetX(right) ;
14: itsUpperRight.SetY(top) ;
15 :
16 : itsLowerLeft , SetX(left) ;
17 : itsLowcrLeft , SeLY(bottom) ;
18 :
19: itsLowerRight.SctX(right) ;
20 : itsLowerRlght . SetY(bottom) ;
21 :
22 :
23 : void Rectangle : : SctUpperLeft(Poi nt Location)
24. : (
25 : itsUpperLeft = Locdtion;
26 : jtsUpper Right . Se tY (Location .Ge t Y() ;
27 : i tsLowerLcft .SetX(Location GetX( ) ;
29 : itsTop = Location.GetY( ) ;
29 : itsLeft = Location.GetX();
30 :
31 :
32 : void Rectangle : : SetLowerLe ft (Point Location)
33 :
34 : itsLowerLeft =' Location ;
35 : itsLowerRight . SetY(Location. GetY());
36 : itsUpperLeft . SetX(Locati on . GetX()) ;
8. ra Az
37 : it.sBott.om = Location . GetY () ;
38 : itsLeft = Location . Gf'!t.X () ;
39 :
40 :
41 : void Rectangle : : SetLowerRi ght(Point Loca tion)
42 : {
43 : itsLowcrRight = Location;
44 :
45 : itsUpperRight.SelX{Locat ion . Get X( ;
46: itsBottom::. Location . Get Y() ;
47 : itsRight Location . GetX() ;
48 :
49 :
50: void Rectangle : : SctUppcrRight{Point Loca t lon)
51 : (
52 : itsUppecRight = Loca t. ion;
53 :
54 : i toLowe r Right . SctX(Location . GetX (;
55 : i tsTop '" LOCtlt.ton . GetY() ;
56 : itsRight _ Location.Cct X() ;
57 :
58 :
59 : void Rectnngle: : SetTop(int. LOp)
60: (
61 : itsTop top;
62: itsUppcrLeft.SetY{top);
63 : itsUpperRight.Set.Y(top) ;
64 :
65 :
66 : void Rectangle: : SetLeft(int 1eftl
67 : (
68 : itsLeft '"' left.;
69 : itsUpperLe[t.SetX(1eft);
70 : itsLowerLeft . SetX(left.) ;
71 :
12 :
7) : void Rectang1e :: Sct Bot tom (int bottom)
74 : (
75 : m bottom;
76 : itALowerl.eft . SetY(bottom) ;
77 : i tsLowcrRight . SetY(bot t om) ;
78 :
79 :
80 : void Rectny l e :: SetRi ght (int righ tl
81 :
82 : itsRight " right ;
83 : itsUppcrRight . SctX(right) ;
84 : itsLowerRlght.SetXCrlght) ;
85 :
86 :
87 : int Rectangle : : Get.Area () const
88 :
156111. rsz OSZ1lyok
89: int Width i tsRight - itsLeft;
90 : int Height '" itsTop - itsBottorn;
91 , return (Width Height);
92 :
93 :
94 : II kiszmitjuk a tglalap terulett a sarkok koordinti alapjn gy,
95 : II hogy meghatrozzuk a szlessgt, magassgt , s Osszeszorozzuk
96: int main()
97 : (
98 : / I A helyi Rectangle vltoz6 inicializlsa
99 : Rectangle MyRcctangle (100 , 20, 50, 80 ) ;
100 ,
101 : int Arca", MyRectangle.GetArea{);
102 :
103 : std :: cout "Terlet: Arca "\n\";
104: std: : cout "Bal fels6 pont x koordintja: ";
1 05 : std : : cout MyRectanglc.GetUppcrLeft() . GetX{);
106: return O;
107,
Tero.let: 3000
Bal fa!s6 pont x koordintja 20
A 8.3 Lista 3-14. sorban deklarlruk a Point osztlyt, amely egy sokszg valamely
pontjn:lk x s y koordintit hivatO!{ trolni. A programban nemigen kerl el6
a Point osztly, de a mjzol metdusok hasznlj k.
A Point osztly-deklarci612. s 13. sorban kl tagvltoz6t deklarlunk (itsx-et s
itsy-t). Ezek hordozzk a koordinta-informcikal. Az x koordinta nvekedsekor
jobbra ll10zdulunk a koordinlaskon, az y nvekedsekor pedig felfel. Ms brzol-
sok csetn ez msknt is lehet, pldul egyes ablakkeze\6 programok esetn az y nve-
lsvel lefel mozdulunk a
A Point osztly deklarci6jban (a 7-10 sorban) helyben kifejlett hozz,Mr6 fggvnyek-
kel el s llt juk be az x s y koordintkat. A Point-ok az alaprtelmezett konstruk-
tort s destmktort hasznljk, azaz knytelenek vagyunk belltani a koordintikat.
A 17. sorban kezd6dik a Rectangle osztly deklarcija. A tglalapol a ngy cscsa
(ngy pom) hatrozza meg.
A Rectangle konstruktora (20. sor) ngy egsz szmot vr, melyek a
top. left, bottorns right (azaz/ent, bal, lent s jobb). A konstruktornak tadott
ngy paramter ngy tagvltozba kerl, majd ltrejn a ngy Point.
A hozzCr6 fg&'\'nyeken kvl a Rectangle-nak van eb')' GetArea () fggv-
nye is, melyet a 43. sorban deklarlunk. A terlet vltozban val trolsa helyett
a GetArea () kiszmt ja a terletet a 8.4 Li sta 89-91. sorban. Ehhez a tglalap szless-
gt s magassgt szmolja ki , majd ezeket sszeszorozza
A tglalap bal pontja x koordintjnak kinyershez el kell rnnk az Upper -
Left pontot s ki kell nyernnk ennek x koordintjt. Mivel a GetUpperLeft ()
a Rectangle sajt metdusa, kzvetlen hozzfrse van annak s."l jt adataihoz, kztk
az itsUpperLeft-hez is. De mivel a itsUpperLeft egy Point , s a Point-ok itsX
rtke sajt (plivt) vltoz6, a GetUpperLeft () nem tudja ezt kzvetlenl elrni. Ehe-
lyett a nyilvnos GetX () hozzfer6 fggvnyt kell hasznlnia az adat kinyershez.
A 8.4 Lista 96. sorban :t tenyleges programtrzs. A 99. sorig nem foglalunk
le helyet a mem6riban, s voltakppen semJ11i nern trtnik. Pusztn aZI kzljk
a hogy hogyan kell ltrehozni Point-ot s Rectangle-t, ha valaha
szksg lesz r.
A 99. sorban viszont megadunk egy (vzszimes/fgg6Ieges oldahlkkal
Rectangle-t annak baloldali, als s jobboldali szlnek koordinta-rtkvel
(top, left, bottom s right).
A 101. sorban ltrehozunk egy Area ( /en"llel) new helyi egsz vltoz61. Ez t.1rolja
:IZ imnt ltrehozott Rectangle terletnek rtkt, mely a Rectangl e saj t
GetArea () fggvnyvel inicializi l6dik.
A Rectangle klie nsprogramja teht anlkO! t\Jd ltrehozni Rectangle objektumot (s
tudja lekrdezni a terlett), hogy brmit is tudna a GetArea () megval6stsr61.
Puszdn a fejldlllomnyt ltva (mely tartal mazza a Rectang1e osztly deklarci6jt)
a programoz tudja, hogy a GetArea () egy egsz szmot ad vissza. Hogy ez konkr-
tan milyen bO"vszmutatvnnyal trtnik, az nem a Rectang1e oszt:'i ly fel hasznljnak
a dolga. A Rectangle osztly progr-<lmozja anlkl is megvltozt.1thatja a GetArea ()
mkdst, hogy ez hacssallenne a Rectangle osztlyt hasznl6 programokra.
Krdsek s vlaszok
Krds: Ha a 1..'Ollslansfiiggvnyek osztiilymdosittisi ksrle/e hibajelzst adfordittisi
mirt 'Icm rdemes egysze1l7en elhagyni a const mdos;rszf a hiba jelzsek
elkell"ilsre?
Vlasz: Ha a szban forg tagfggv.nynek elvileg nem kell mdostania az osztlyt,
akkor a const kulcssz hasznlata j mdszer a buta hibk feldertsre a fordtprog-
158 111. rsz ' Osztlyok
mm rl!vn. A GetAge () -nek pldul semmi oka nincs arra, hogy vltoztasson a Cat
osztlyadatain, ha azonban a megvalsts programk6dja az al bbi sort tartalmazza:
if _ 100) std::cout "H! Mr 100 ves vagy?!\n";
akkor a konstansknt deklarlt GetAge () hibt dob a fordtskor. A prog .... moz6 felt-
telezhet6cn azt szerette volna hogy az itsAge egyen16-e szzzal, de ehe-
lyett vletlenl rtkl adta a szzat az itsAge-nek. Mivel ez az rtkads mdostani
szerelnI! az osztly adatait, hololt korbban azt grtk, hogy nincs ilyen szndkunk,
a fordt6progr-.tm hibt jelez.
Ezt a fajta hibt elg nehz pusztn vgignzssel megtaJlni - a szem gyakran azt lt-
ja, amit szeretne. A U:nycg: a program ltszlag normlisan fog futni , de az itsAge r-
tke egy hibs szfl mrtkrc lesz tlltva. Ez gondot fog okozni.
Krds: VCI II -C! l1C!l lIIc struct slmM/I. r/ hasz /llni C++ progl"alllban?
VlCIsz: Tbb C++ programoz csak olyan osztlyok esetben hasznlja a struct
kulcsszt, amelynek nincsenek fggvnyei. Ezzel a rgi C sLnlktrihoz nyl nak
vissza, amelyek nem tartalmnzhattak fggvnyeket. 6szint(:l' szlva czt nem tanom j
programozsi gyakorlatnak. Ami ma egy metdus nlkli struklI'".!, az a ig-
nyelhet metdusokat. Emiau L kell majd rni a struktrt osztlyl'".! , v!l.gy metdusokat
is tartalmaz struct struktlmlt hasznlva fel kelllgni a kveteU szablyt.
Gyakorlatok
Ebben 32 tovbbi ismereteket szereztnk az osztlyokr61. Tudsunk elmlyt-
$hez vlaszoljunk meg nhny krdst s vgezznk el nhny gyakorlatot!
Kviz
1. Mirt szoks az osztly-deklarci6kat kln fjlban elhel yezni?
2. Mi a szerepe a ca t . cpp-bcn konstruktornak?
3. Mi trtnne a rect . cpp-ban s a rect . hpp-ban, ha a Point osztlyt nem def!-
nHllnnk?
4. Honn:ln tudja a fordtprogram, hogy hol keresse a beemc!end6 llomnyokat?
FeladatoK
1. M6dostsuk gy a rect. hpp programot, hogya Point osztly deklarcija ke-
rljn t egy msik llomnyba, s ezt az j llom.1nyt emelje be a rect . hpp-be.
Vltozik az eredmny?
2. M6closcsuk gy a cat . hpp progmmol, hogy a GetAge () legyen konstans met-
dus. Kell mg valami mson is vltoztalni?
3. Mdosrsuk gy a cat. cpp progr<lmot, hogy jjjn ltre egy msik macska is,
(eat; pldul legyen a neve Szernl ....e). R tudja venni SzemI/MI, hogy legyen
s nyvogjon egyet?
Vlaszok a kvflk-rdsekre
1. Hogy knnyen megoszthatak legyenek msokkal (s mi is hasznlhassuk m-
sok objektumait).
2. Inicializlja az itsAge vltozt, arra az rtkre lltva be, amit az objektum pl-
dnyostsakor megadnak. Ez. ltal mcgsproljuk, hogy az objektum deklarlsa
utn mg kln meg kelljen hvni a SetAge () -el az letkor bclltsm.
3. Ha l Point oszt.lyt sehol mshol sem adjuk meg, akkor a fordtprogram hibt
jelez meghatrozatlan hivatkozs miatt. Ha valahol mshol kerlt deflni:lsrn,
akkor a fjlt be kell emelni (pl. poi nt . hpp-knt). Gyakori megolds,
hogy egy osztly egy mCtsikra t{11l1aszkodik, abbl ptkezik.
4. Ha llom{UlY neve (") kzt ll, akkor a fordtprogram
ugyanabban a knyvt:1rban (ogj;t keresni, mint ahol az aktulis forr.'sfjl is van.
Azt is kzlni lehet a fordtprogrd1llmal, ha ms knyvtrakban kell keresnie
az llomnyt: kzt megadva az elrsi utat, csak oU keresi a fjlt a for-
dtprogram. Ha azonban az llomny neve (o) kztt szerepel,
akkor a szabvnyos rendszer-fejlcknyvtrban tnnik a keress.
III. RSZ
Memriakezels
9. ra Mutatk
10. ra A mutatk kifinomult hasznlata
11 . ra Hivatkozsok
12. ra A hivatkozsokrl s mufatkrl - mlyebben
9. RA
Mutatk
sz6 ebben az 6rban:
Mik :'Izok a mutatk
Hogyan vezethetjk be s hogyan hasznlhat juk a mutatkat
Mi a dinamikus memria (heap), s hogyan kell vgezni ezen
a mem6riaterOlctcn
A mutatk s hasznlatuk megrtse
Egy C++ programoz szmm a ltez6 1eghatkonyabb eszkz a mutat, amdy a me-
mria kzvetlen clrsnek lehel6sgt biztostja. Ugyanakkor a mutat6kr6\ azt is
jk, hogy a programot leginkbb sszekusz16 elemek. pp ezrt mlgyon fontos, hogy
megrt,-;k. mik is valjban a mutatk.
Ebben :lZ rban a mutatk sz. m ne feledjk, hogy csak a knyv-
ben tovbbhaladva fogjuk teljesen megneni a mutatk szksgessgt.
A lilII/al egy olyan vltz, amely memriacmet tartalmaz.
164 1111. rsz Mem6riakezels
lljunk is meg, s olvassuk el jra. A mutat egy vltoz. Azt mr tudjuk, hogy mi
az a vlLoz: olyan nyelvi elem, amelyben rtkeket trolhatunk. Egy egsz vltoz
szmokat trol, egy karakter lpus vltoz em' tanalmazhat A mutat pedig
olyan vlloz, amely memriacmettrol.
Rendben, de mi is az a memriacm? Hogy eZl megrtsk, ismernnk kell valamennyi-
re a sz..mtgp mem6rijnak mkdst. Ne ijedjnk meg, annyira nem bonyolult.
A szmtgp mem6rija az a hely, ahol - tbbek kztl- a vltozk troldnak.
A mem6ria sorszmozott mem6riacellkra van bontva, a memriacmek pedig ezek
a bizonyos sorszmok.
Mindegyik vltoz, legyen az brmilyen tpus, egy egyedi cmen trol6dik a memri-
b<1!l . A 9.1. brn a theAge nevU nlkli hossz egsz vllOZ trolsnak mdja
lth<1! vzlat.os brzolsban.
Memria
A theAge vltoz
,
I 10110101
01110110
I I
I
11110110 11101110
I I I
100 101 102 103 104 105 106 107 108 109 110 111 112 113
Minden memriacella 1 bjt hossz
A theAge el6jel nlkli hossz egsz 4 bjt, azaz 32 bit hossz
A theAge vltoznv az els bjtra mutat.
A theAge memriaclme: 102
9.1. lb ..
" tf/eAge ultoz6 flbrt1zolt'i:;a /lz/a/osall
A"L egyes szmtgpek de ltalban elg sszetett smk S"Lcrint cmezik a me-
mrir. A programozknak ltalban nem kell ismernik a ponlos cmt minden egyes
vltozmik, mivel ezeket a rszleteket a fordtprogram kezeli. Ha szksgnk van er-
re az :.datra, :tkkor hasznlhat juk a cme (address of) opertorl (&), amelynek mkd-
sl a 9.1 Usta mul:ttja bc.
9.1 Usta - A vtlozk memriacimnek lekrdezse (addressdemo.cpp)
o: II A 9 . 1 . k6drszlet az address of (cim) opert orL
1 : II loklis vltozk esctbcn
2 : #i nc lude <iostre am>
3 ,
<I : int main()
5 : {
6,
7 ,
8,
9,
10 ,
unsigned short shortVar=5 ;
unsigncd long
long sVar = -65535;
std , : cout "shortVar : \t " shortVar ;
11 : &shortVac " \n" ; std: : cout "\tA shoctVar memriacime : \t"
12 : !;td: : c:out "longVar : \t" longVar ;
13 : &longVar '\n ' ; std , , cout "\tA longVar memriacme : \t'
1<1 : ctd: : c:out 'sVar : \t\t' sVar ;
15 : &sVar " \n "; sto : : cout ' \tA sVar mcmriacme : \ t "
16 :
17 : return O;
18 :
Aprop
Klnleges karakterek a C++ nyelvben
A \ t a 9.1. kdrszletben egy TAB karaktert illeszt a kimenetbe. Ily mdon egysze-
kszfthetnk oszlopokat (egyszeru ugyan, de messze nem tkletes).
A \n j sorra viszi a kurzort (ugvanazt eredmnyezi. mint az std : : endl fgg-
vny)
A \ \-t akkor hasznlhat juk, ha \ jelet szeretnnk kifrni (karaktersorozatokban)
A \ " karakterekkel [rhatunk ki (karaktersorozatokban)
A \ ' karakterekkel egyes frhatunk ki (karaktersorozatokban, vagy ka-
rakterknt)
A fenti sszefggsben hasznlva a \ (backslash) karaktert escape karaktemek ne-
vezzk, mivel megvltoztatja az t kvet karakter jelentst, s nem nyomtathat
karakterknt viselkedik (a \n j sort eredmnyez. s nem egy n
menet
short Var : 5
longVar : 65535
A shortVar memriacimc :
A longVar mcffirlacme :
12 45066
1245060
1245056 -65535 A sVar mem6riacme :
Sajt szmtgpnkn msknt nzhet ki a kimenet, lIlivel minden futs sorn ms c-
meken jnnek lt re a vltozk, au61 fgg6en, hogy mi egyb tallhat ppen a mem-
riban, s mennyi szabad hely ll rendelkezsre. A kimenet gy is kinzhet:
shortVar : 5
longVar: 65535
ll. shortVar mcmriacime : Ox8fc9 : fff4
A longVar mem6riacme : Ox8fc9 : ff:f2
sVar: -65535 A sVar memriacimc : Ox8fc9: ff 00
166 1111. rsz Memriakezels
Hrom vltozt vezettnk be, majd kezdrtket adtunk nekik. Egy short tpust a 6.
sorban, egy unsigned long tpust a 7.-ben, s egy long tpust a 8.-ban. Az rtkket
s a cmket a 10. l!s 15. sorok kztt raljuk ki, utbbit a cm ( &) operlor segtsgve!.
A shortVar vltoz rtke a vrtnak megfelel6en 5, mem6riacme 1245066 volt
az Intel x86 alap sz.-'intgpcmen futtatva , Borland fordtval ksztett binriS5."l!.
Ez a nem tl egyszeru cm szmtgpfgg6, s minden futs sorn vltozhat kicsit.
Ugyanakkor soha nem vllozi k az, hob'Y a kt vltoz cme kztti klnbsg
ngy bjt, amennyiben a szmtgp nh'Y bjt hossz cgszckct hasznl. A 9.2. bra
szemllteti, hogya fenti program vltOl:i hogyan troldnak il memriban. (Ne feled-
jk, hogy nhny szmtgpen mindkt vlloz kztt ngy bjt lesz a klnbsg, at-
l6l fgg6en, hogy il fordt6nkal hogyan MJtottuk be.)
Egyel6re a dolognak nem !'iok rtelme ltszik, elvgre minek neknk tudni egyes
vltozk memriacmnek aktulis rtkt. Ebben a pillanatban teht elg annyit meg-
jegyezni, hogy mindegyiknek van cme, s hogy mi ndegyikhez a mem6ria-
mennyisg van hozzrendelve.
T
".
I
00000"10'
0000 0000 "" '"' 'ooo 0000 "" 1111 0000 _ 1111 "11 _ 0000 "11 1111
9.2. bra
A Illfozk fro/snak lJcnluwfsC/
Honnan rudja a fordt, hogy mennyi memrit kell rendelni az egyes vlloz6khoz?
Nos, ezt mi magunk adjuk meg neki, amikor deklarljuk a tpusukal.
l Ia pldul unsigned long lpus vltoz6t vezetnk be, a fordt rudja, hogy ngy bjt
memrit kelllefoglalnia, mivel minden egyes unsigned long ngy bjton troldik.
A fordt dolga a megfelel 6 teliilet hozzrende1se.
9. 6ra Mutatk 167
Amikor egy mulat ltrejn, :l fordt a hardverfelptstl s opercis fg-
g6en annyi memrit rendel hOZ7.., hogy dfrjen benne egy vltoz mem6riacme. Egy
mutat mrete nem felttlenl akkora, mim egy egsz tipus vltoz. Semmikpp se
vonj unk le kvetkeztetseket a vltoztpus alapjn a muml6 mretre vonatkozan.
A memnacfm trolsa a mutatkban
Minden vltoznak van cme. s mg ha nem is ismerjk czl pontosan, akkor is el he-
lyezheljk egy mut:Cltban.
Vegynk pldul egy howOld nev egsz tpus vltoz6t. Ennek a cim(:t eltrolhatjuk
a pA'iJe nev mutatban, amit a deklarlhatunk
i nt *DAge = NULL
Ez egy pAge nva int tpustl vltoz6t cmz6 mutOlt61 vezet be, azaz a pAge meghatro-
zs.'l szerint egy int eimt fogja t.rolni.
Ne feledjk, hogya pAge ugyar'olyan v[lltoz6, mint a tbbi. Amikor bevezetnk egy
t::gsz (int tpus) v5Jtozt, akkor:lZ egy egsz rtk troJsiira lesz [elksztve. Ami-
kor egy, a pAge-hez hasonl mut;lIt ksztnk, az egy mem6riacm trolsra lesz fel-
ksztve. A mutat egy klnleges tpus vltoz, amely a memriban tal lhat ele-
mek cmnek trolsra alk<l lmas. Jelen esetben a pAge egy egC:sz tpus vltoz me-
mriacmt trolja.
Fontos, hogy lehct6sg szerint olyan tpus mutatt kell ltrehoznunk, <Imilyen
az a v ltoz, amelyet cmez. Ez hmrozza meg ugyanis a fordt szmra, hogy hogyan
kezdje azt memri:llerletcl, amire a mUlat murat. A mutat maga csak a mcmriac-
mer tartalmazz<I, semmi egyebet.
A fenti pldban a pAge vltoznak NULL kezd6rtkel admnk. A NULL rlC:kkel ren-
delkcz6 muutt 1I/lllmulalll(lk (null pointer) hvjuk. Minden mlltatnak, amit ltreho-
zunk, kezd6rtket kell adnunk. Ha nem nldjuk mit akarunk hozzrendel ni, akkor
NULL rtkel adjunk neki. A kezdrtkkel nem rendelkcz6 mutatkat szoklls {)C/d IIIU-
la/lmak (wild pointer) nevezni. Ezek igen veszlyes jszgok.
me II mulatk kezd6rtkkel egyOn trtn6 bevezetsnek egy msik mdja:
int pAge " O
Ennek eredmnye ugyanaz kelj legyen, mint ha NULL rckel adtunk volna neki, de
technikailag a O egy egsz tpus lland, a NULL pedig ennek az llandnak a mem-
riacml lartalmazz3.
168 1111. rsz Mem6riakezels
Aprop
Kezdrtket a mutatknak!
Programozzunk biztonsgosan, adjuk kezdrtket a mutatknak!
Ha a mutat6t O vagy NULL el, kln hozz,'! kell rendelni a howOld
eimt a pAge mutathoz. A plda ennek mikntjt mutatja.
int hoWOld = 50 ;
int .. pAge", O;
pAge ol &howOld;
II vltoz ltrehozsa
II mutat ltrehozsa
II a howOld cmnek h07.zrendelse a pAge-hez
Az els6 sor ltrehozza a howOld nevG vltoz6t, ::unelynek tpusa unsigned short int,
s az 50 kezd6rtkel rendeli hozz. A msodik SOr hozza ltre a pAge mUlatt,
;l!ncl y szintn unsigned short lnt tpus, (:s O kczd6rtkkel rendelkezik.
A pAge mutat voltt a v,lItoz6 tpusa s a vltoz neve kz irt k,lraktcr jelzi.
A harmadik s egyben utols6 sorban hozzrendeljk a howOld memriacmt a pAge
neVli rnut<1t hoz. A hozz rendelst az address of (&) opertor teszi
H<1 az address of kife!ejtennk, a howOld mcmriacmc helyctt annak rt-
kt rendelnnk hozz a nmtat6hoz. Ez az rtk vagy vals, vagy egy nem me-
m6riacm, de mg ha vals is, az teljesen a vletlen mGve, s biztos, hogy nem
az a hely, ahol b,1rmiflc szerelnnk vgezni azzal a mUl,Hval.
Aprop
Mutatk s nem mutatk
Nem mutat rtkt rendel ni egy mutathoz viszonylag gyakori hiba. Annyira az,
hogya fordtnak ezt elvileg jeleznie is kell fo rdts kzben.
A pAge vltoz6 rtke jelenleg a hoWOld vltoz memriadme, magnak howOld-nak
az rtke pedig 50. Ezt az ll apotot az albbi pr lpsben is megvalsthattuk volna:
unsigned short int howOld 50;
unsigned shor.t int pAge = &howOld ;
/1 vltoz kszitse
1/ a howOld ra irnyitott mutat
II bevezetse
A pAge teht egy olyan mutat, amely a hoWOld vltoz mcm6riacmt tartalmazza.
A pAge hasznbHval kiolvashatjuk a howOld rtkt:L, vagyis azt a bizonyos 50-ct.
A howOld vltoz6nak a pAge mutatn keresztltrtt:n elrt:s(!t k6ZveICII elrsnek
(i ndirection) nevezzk, mivel nem kzvetlenl (a nevn t) f(! rnk hozz a howOld-
hOL, hanem a pAge-en vagyis a memriacmn keresztl. de mg ebben a lec+
kben ltni fogjuk, hogyan alkalmazzuk a kzvetett elrst egy vltoz rtknek kiol-
vasshoz.
A kzvetett elrs azt jelenti, hogy a mutatban tallhat mem6riacmen rt-
ket olvassuk ki. A mutat teht rviden e.gy kzvetett mdsLert ad az ltala trolt ci-
men tallhat rtk megszer.lsre.
9. ra Mutatk 169
Mutatnevek
A mutatkkal kapcsolatban ugyanazok az elnevezsek rvnyesek, mint a vltozk
esetben. Knyvnk azl a konvendt kveti, hogy minden egyes mutat6t p octave!
kezdnk, mint pldul a pAge s a pNumher mulalkal tartalmaz pldkban.
A kzvetett elrs opertor, avagy mutatk kzvetett hasznlata
A kzvetett elrs open'iton ( *) msknt v;ssztlhiulItkozs(dereference) operlornak is
nevezzk. Amikor egy ffiutatval visszahivalkozunk, az ltala hiva tkozott rnern6rbd-
men tallhat nket olvassuk ki.
unsigned short int howOld '" 50 ;
unsigncd short int yourAge;
yourl\ge '" h(')wol d ;
A muta16 kzvetett dr(:st biztost aLOn v ltoz rt khez, arndynek mem6ri acimre
mut:lt. A hoWOld vltoz nl:knek {ttadsa a yourAge vltoznak a pAge mulat kz-
bei ktatsval pldul az albbi mdon tnnhet:
unsigned short int howOld
unsigned short int pAge K
unsigned short int yourAge;
yourA",e =
50; II howOld bevezetse
&howOld ; II a howOld-ra mutat pAge
I I bevezetse
II egy jabb vltoz bevezetse
II a pAge ltal mutatott rtk (50)
II hozzrendelse u yourAge v61tozhoz .
A kzvetett elrs oper.'itor (*) a pAge neV\l mUlat valami il yesmit jelem: .:I Z
ezen a cmen trolt A hozz.rcndcls teht a mondja: .VegYk
a pAge mutatban tallhat6 mem6riacmcn trolt rtket, s rendeljk hOZ2.1
:1 yourAge Egy mfLsik megkzeltsben a dolog a kvetkez6kpp
nz ki : foglalkozzunk a mutatval, foglalkozzunk a mUl at ltHl hiv:Hkozott cmen
lallhat
Aprop
Kzvetett elrssel kapcsolatos
A kzvetett elrs opertort (*) kt esetben hasznljuk: vltozk deklarlsnl s
hivatkozsnl. Amikor egy mutatt ksztnk, a csill ag jelzi, hogy ez egy mutat
lesz, s nem kznsges vltoz. Pldul:
unsigned short * pAge = NULL; II mutat6 unsigned short tpus
I I vltoz6hoz
Amikor a mutatn keresztl visszahivatkozunk, a kzvetett elrs opertora azt jelzi,
hogy a mutatban trolt memriacmen tallhat rtkhez szeretnnk hozzfrni, s
nem a memriacmhez maghoz.
pAge = 5; II az 5 rtk hozzrendelse a pAge
II memriaterlethez.
Ne feledjk tovbb, hogy ugyanezt a karaktert (*) hasmljuk a szorzshoz is. A for-
dt a kdkmyezetb61 llaptja meg, hogy ppen melyik felhasmlsi van sz.
170 1111. ISZ Memn.koz.ls
A kzvetett elrst a mindennapi letben is hasznljuk. l ia a helyi pizzrit hvjuk,
hogy vacsort rendeljnk, de nem tudjuk a telefonszmt, megnzzk a telefonknyv-
ben, vagy a wehen. Az informciforrs nem a pizzri fira magra vonatkozik, de tartal-
mazza 3IU1ak "eimt" elt:fonszmO. Amikor ezt tesszk, valjban kzvetett elrst
val6stunk meg,
Mutatk, cmek s vltozk
Nagyon fontos, hogy klnbsget tegynk a mUlat, s a mUlat ltal trolt mem6ria-
cm kztt. Ez a forrsa a legtbb sszcvisszasgnak a mutat6kkal kapcsolatban.
Nzzk a
int theVariable : 5;
int * pPointer = &theVariable
A theVariable vltOZI egsz tpusknl hatroztuk meg, s az 5 kezd6rtket
rendeltk hozz. A pPoinler-t egy egsz vMlozra mulat hivatkozsknt dekbrl-
tuk, kezdrtt:!kknt a thevariable vltoz Illernriadmt kapta. Teht a pPointer-
ben t rolt melllriadm megegyezik a theVariable vltoz cmvel. A pPointer ltal
hivatkozott Illelllriaclllt::n az 5 rtket troljuk. A 9.3. bra a theVariable s
a pPointer vltozkat szemllteti.
A.datok manipullsa a mutatk hasznlatval
Miutn a mulathoz hozzrendeltk egy vltoz mern6riadmr, a mutal6n keresztl
hozzfrhetnk a vltoz rtkhez. A 9.2. Lista bemutatja, hogyan rendelhet jk eh'Y
loklis vltoz eimt egy mUl3t6hoz, s hogyan vlloltathatjuk meg a vltoz rtkt
a mulatn keresztl.
IheVariable
Vltoz nv l
,
0000 0000
0000 0101
'------v----'
;
H"
'"
'02
Cmkioszts
9.3. bra
'Ol
A mell/ria l!z(atos hrzolsa
pPointer
j
, ,
0000 0000 0000 0110
0000 0000 0000 0101
'-----y-----'
I
104 105
".
'"
'08 '09
9. ra Mutatk 171
9,2 Um - Adatvltottatl mutat6k hasznlatval {pointeruse.cpp)
o: II 9 . 2 . Li s ta - Mutatk has znlata
1: linclude <lostream>
2 : using s t d: : cout ; /1 a z std: : cout knyvtr hasznlata
,.
4 : int main()
5 : (
6 : i nt myAge ;
7 : i nt" pAge .. NULL ;
,.
,.
10 :
11 :
12 :
1) :
myAge
pAge
cout
cout
5,
&myAge;
'myAge :




II egy v l toz
/ I egy mutat
/I a myAge cmnek
myAge ' \n " ;
"pAge ' \o\n" ;
14 : cout "'pi\(Je 7 \ 0" ;
hozz rendelse a pAge-hez
15 : "pAge = 7 ; II JI. 7 rt k h02z rcnde l se a myAge- hc z
16 : cout ''' pAge : "pAge " \n" ,
17 : cou t ' myAge : myAgC ' \n\n";
18 :
19 , cout 'myAge = 9\n ';
20 , myAge = 9 ;
21 :
22 :
23 :
cout 'myAge :
CDu t pAge :
24 : return O;
25 :
myAge : 5
" pAge : 5
pAge = 7
. pAge : 7
myAge : 7
myA<;le : 9
myAgc : 9
" pAge : 9
myAge " \n ';
" pAge ' \n ";
A fcnti program kt vllOZ6l vezet be: egy myAge nev egszet s egy pAge nev muta-
t6t, amely egy int tpus vltozra hivatkozhat, s amely a myAge cmt tartalmazza.
A myAge a 9. sorban az 5 rtket kapj a, ezt a ll. sorban kirat t\ssal.
A 10. sorban a pAge-hez rendeljk a myAge cmt. A 12. sorban visszahivutk07.unk
a pAge-re, s kiratjuk, bemutatva, hogy a cmn tallhat rtk val6lr.m 5, amelyet
'72 1111. rsz' Mtmriakezels
<l myAge vltozban trolunk. A 15. sorban il 7 rtket rendeljk a pAge memriacmn
tallhat memriaterlethez. Ez a myAge vltoz6 rtkr is 7-re vltoztatja, amelyet
a 16. s 17. sorban tallhat kir6 igazolunk.
A 20 sorban, a 9 rtket rendeljk a myAge vltoz6hoz. Ezt az nket aztn kiolvassuk
kzvetlenl a 21. sorl:Ydn, s kzverYc - visszahivatkozva a pAge mutat6ra - a 22. sorban.
A mutatkban trolt cfmek vizsglata
A mutatk teszik a mem6riacmekkel mlveleteket anlkl , hogy pon-
tosan mdnnk mi is van a mutatkban. Ha vgigolvasluk ezt a leckt, letk htralev6
rszben vakon bzhalunk abban, hogy amikor egy vltoz mem6riacmt hozzren-
deljk egy mut.1t6hoz, akkor a mutatban valban annak a vlt.oz6nak a cme szere-
pd. Egyszer az letben :Limnban bizonyosodjunk meg rla, hogy ez tnyleg gy van,
A 9.3 Lista ppen ebben segt neknk.
9.3 Lista - Mi il van egy 1IMIlIt6ban ... (pointemore.
o: / / 9.3 Lista: Mi ls van egy mutatban . .
1: ftinclude <iostream>
2 ,
3 : int main ()
4: {
5 ,
6,
7 .
unsigned short int myAgc : 5, yourAge
unsigned short int * pAge 'myAge;
8: std : : cout 'myAge : \t" myAge;
la;
/ / a mutat
9 : std:: cout '\t\tyourAge : \t' yourAge " \n";
10 : std : : cout '&myAge:\t ' &myAge ;
l l : std: : cout " \t&your Agc : \t' &yourAgc '\n',
12 ;
13 : std :; cout 'pAge:\t' pAge ' \n';
14: std:: cout '''pAge : \t" "pAge '\n\n',
15:
16: pAge = &yourAge;
17 :
std : : cout 'myAge : \ t ' myAge ;
std: : cout '\t\tyourAqe : \t ' yourAge "\n" ;
std: : cout 'cmyAge ; \t' &myAge ;
18 :
19 :
20 :
21:
22 :
std : : cout '\t&yourAge: \t' cyourAgc '\n';
23 : std:: cout 'pAge : \t' pAge '\n';
24 : std" cout ""pAge : \t " "pAge " \n\n';
25:
26 : std:: cout 'cpAgc : \t ' cpAge ' \n' ;
27: re t urn O;
28 :
9. 6,. Mutat6k 173
Kimenet
myAge: 5 yourAge : 10
&myAge : 1245066 &yourAge : 1245064
p Age : 12(\5066
*pAgc : 5
myAge: 5 yourAge : 10
&myAge : 1245066 &yourAgc : 1245064
pAge : 1245064
pAge: 10
&pAge : 1215060
Ne feledjk, hogy sajt rendo;zerkn 'L kimenet ismt eltf:rhet az itt lthat eredmny-
t61, mivel minden szmtgp kill!1bz6 cmeket trolja a klnbz6 vltozkat, attl
fgg6en, hogy mi van mg a memriban, s mennyi memria ll rendelkezsre. A ki-
menet a kvetkez6kppcn is kinzhet:
myAge :
&myAgc :
pAge :

myAgc :
&myAge :
pAge :
pAge :
&pAge :
5
Ox355C
Ox355C
5
5
Ox]S5C
Ox355E
10
Ox355A
you r Age : 10
&yourAge : OxJ55E
yourAge : 10
&yourAge : Ox355E
Az 5. sorban a myAge s yourAge vltozkat unsigned short egsz tpusknl vezel-
tk be. A 6. sorban 3. pAge mUlat6t egy unsigned short egsz tpus cm trolshoz
deklarlruk, s kezd6rtkknt a rnyAge vltoz cmt adtuk meg neki.
A 8.-11. sorokban a myAge s your Age vltozk rtkt s dmt lt.1ltuk ki. A 13. sor-
ban ratruk ki a pAge tart:l lmt, amely a myAge cme. A 14. sorban aztn a pAge-re tr-
vissza hivatkozs eredmnyt ki.i1dtk a kimenetre, amely a pAge cmn ral:'i1hat6
rtket, a myAge rtkt, azaz 5-t adott eredmnyl.
Ez a mutatk lnyege. A 13. sor mutatja, hogy a pAge a rnyAge vltoz cmt tartahnaz-
za, majd a 14. sor mutatja, hogy hogyan rhetjk el a myAge rtkr a pAge mut.116m
visszahivatkozssal. Fontos, hogy megnsk eZl, folYlalnnk.
Tanulmnyozzuk a kdot, s nzzk t jra a kimenetet.
174 1111. rsz Memriakemls
A 16. sorban a pAge-bez ezttal a yourAge vltoz cmt rendeltk, majd jra kiratnlk
az rtkeket s a cmeket. A kimenet azt mutatja, hogya pAge most a yaurAge vltoz
cmt tartalmazza, s a visszahivatkozs sorn a yourAge rtkt kaptuk.
A 26. sor a pAge sajt cmt rja ki. Mint az sszes tbbi vltoznak, ennek is van cme,
amely szintn e1t, ra lhat egy msik mutathan. (A mutat cmnek msik mutat6hoz
hozz rendelsre hama rosan rszletesen is kitrilnk.)
Hasznljuk a kzvetett elrs oper-
lort (*) a mutat6ban cmen trolt
6rtk elrshez.
Minden mutat6nak adjunk val6s kez-
drtkct, vagy null-t (O).
Ne feledjk II klnbsget a mutat-
ban cm, s :lZ azon a cmen l-
rtk kztt.
Mirt j mutatkat hasznlni?
Ne pr6blkozzunk memriadm tro-
lsval olyan vl tozkban, amelyek
nem lllutatk.
Most teht mr pontosan tudjuk, hogy hozh:Hunk ltre muta tt, s hogyan hel yezhet-
jk cl benne egy vltoz6 cmt. Most mr csak az H gond, hogy magunktl soha
jut.na esznkben il yesmit csinlni. Vgl is mi a csud5nak bajldjunk mUl alkkai , ami-
kor megvan a vltoznk, amelyen keresztl hozzfrhetnk a memriban troli rtk-
hez? Nos, az eddig bemutatott basznlau{nak egyetlen r-
telme tnyleg cS:l k a mutatk a bemumtsa.
llaneIllmOSl, hogy mr ismeros szmunkra a mutatk hasznlata, valami hasznosat is
kezdhetnk velk. A mutatkat le&!,'}'akr.lbban lZ albbi hrom feladatr" hasznljuk:
A dinamikus mem6ria (heap) kezelsre
Osztlypldnyokban Cobjektumokban) trolt v ltozk s c1rt!sre
V ltozk fggvnyeknek trtn6 refercnciaknti tadshoz
A fejezet rszben a dinamikus memriban ( heap) adatkezelst s
az oszt.lypldnyok adatainak s tagfggvnyeinek elrst mutatjuk be. A 11. fejezet-
ben foglalkozunk m:ljd a vltozk hivatkozssal tadsval.
9, ra Mutatk 175
A verem (stack) s a dinamikus memria (heap)
A programozk iLa[ban az albbi t mcm6riatcruleten vgeznek ml1veleteket:
Glob{ilLo; nvtr
A dimmikus memria (heap)
Regiszterek
Kdlr
A verem
A loklis vltozk l fggvnyparamterekkel egylt veremteriiklen vannak, A kd
mszetesen a k6dtrben tallhat, a glob,lis vltozk pedig n globlis nvtrben. A
gisztereket hasznljuk az olyan bels6 lbpotkczel funkcikhoz mint pldul a
kezels, de ill ta llhat pldul az ulas1.sszml:l6 is. Majdnem az sszes fen nmarad
memria a dinamikus:1n kezcIt mem6riaterlet (heap), amil nha egyswrcn .szabad
is hvunk.
A loklis vltozkkal az a problm,l, hogy nem maradandk. Atnikor a fggvny vissza-
tr, a loklis vltoz megsemmisl. A globlis vltoz6k megoldjk ezt a prob[mt, csak
pp a programbl brhonnan hozzfrhet6ck, amil:>61 aztn a Icgklnflbb probl-
mk eredhetnek. Az ilyen kdol llalban neMz megrteni s karbantartani. Az adatok-
nak a dinamikus memrib:m trtn6 elhelyezse mindkt nehzsgeI megoldja.
E[s kzelrtsben a dinamikus rnem6ria egy j6 migy memriatcn]lcl, ahol ezrvel sora-
kozmlk a sorszmOZOlt mem6riacellk, csak arm vrva, hogy adatokkal tltsk meg.
Azonban ezeket a cellkat nem cmkzhet jk fel egyszeruen vltoz6bcvezctssel, aho-
gyan a veremtefleten Itt krnnk kell egy mem6riadmct, amelyen le-
foglalhatunk egy terletet, aztn czt a dmet egy OlutatlYdn kell biztons.4gba helyeznnk.
Lssunk taln egy pldt, amin kereszrl jobban megrthetjk a dolgot. Egy bartunk
megadja neknk azt a 800-as tclefonszmot, amellyel a Mindentgyflrt Amerikai Vlla-
!attl (ACME) rendelhctnk poSlai utnvttcl. Miutn hazamegynk, felvesszk ezt
a szmot a telefonunkba, majd eldobjuk azt a darab paprt, amire a tclcfonszrnot
felrtuk, Atllikor trcszunk, a telefon kicsng valahol , s az ACME cso-
szolglat vlaszol a hvsra. Nem emlksznk mr a tclefonszmra, s azt
sem tudjuk, hogy a hvOll telefonkszlk hol van, de a gyorshv6 gomb seglsgvel
akfl rhnyszor jra elrhetjk az ACME csomagkld szolglatot. Az ACME csomagkl-
d kczdve olyan, mint egy adat a dinamikusan kezelt memriban (heap). Nem
rudjuk merre van, de azt igen, hogyan rhetjk el: a cmn keresztl , jelen esetben a a
telefonszm segtsgve!. Mg csak nem is kell ismernnk eZl a szmot, elg ha el-
tesszk egy muratba, eseTnkben egy gyorshv gombhoz trst juk A mutat hozzf-
rst biztost az adatainkhoz anlkl, hogy a rszletekkel kellene bajldnunk.
176 1111. rsz Mem6riakezels
A veremterlet automatikusan amikor a fggvny visszatr a hvhoz. Ezzel
az sszcs a fggvnyre nzve loklis vltoz ltkrn kivlrc kerl, s a ve-
1\ dinamikus memrit azonban nem takartja ilyen automatikusan a rendszer.
Az ott trolt dolgok megmamdnak, amig a progr.lmunk be nem fejezi a futst. Ez per-
sze egyben azt is jelenti, hogy ami hogy a hasznlat vt!geztt!vcl felsza-
badtsunk minden olyan memriaterletet, amclyet lefoglaltunk. I la ezt elfe-
lejtjk, s otthagyjuk magunk utn a mr nem hasznlt elemeket, akkor gynevezett
memriaszivrgs (leak) keletkezik. a tl!mr61 mg szt ejtnk ebhen
a leckben.
A dinamikus mernria legnagyobb hogy a lefoglalt tenHet egszen addig hoz-
mamd, amg clzottan fel nem szabadt juk. Ez az llus felttel nl:lkl igaz,
vagyis h" egy fogblunk le dinamikus memrit, az marad azu-
tn is, hogy II Cggvl:ny visszatrt a lvhoz.
A mem6ria ilyen mdon hasznlata azzal :IZ jrlf a globlis vlrozkhoz
kpest, hogy az adatokat csak :Izok a fggvnyek rik el, amelyek ismerik a hozzjuk
mutat6t.
Ez a mdszer teht egy szigoran ellen6rttl fdletet nyjt az adatok elrshez, s
megszntcti azt :l problm5t, hogy az egyik fggvny vmtlan el6re nem lthat6
mdon vltoztatja meg az adatainkat.
Ehhez azonoon musz .. 'ij mUL'Itkat ltrehoznunk s kezelnnk. A kvetkez6 rszben
megmUl:.lljuk, hogy:ln tehetjk ezt meg.
A new kulcssz hasznlata
A C++ programnyelvben a new kulcssz segtsgvel foglalhatunk dinamikusan mem-
rit. A new kul csszt annak a vltoznak/objektumnak a tpusa kveti, lItllcly szmra
a memri:Hefletellefoglalni szeretnnk. Ebb61 tudja a fordt6progflun, hogy mennyi
memri{1l kcll biztostani:l. A fentiek neimben a new unsigned short int deklarnci(
pldul kt bfijtot fogbl a dinamikus memri ban, mg II new long ngyct.
A new visszatrsi rtke egy memriacm, amelyet cgy mutat6hoz kell llozzrendeJ-
nnk. Egy unigned sort tpus dinamikusan kezelt vltoz6 ltrehozs:1 .1
kppen trtnik:
unsigned short int * pPointer;
pPointer new unsigned short int;
Termszctesen a mutatnak a bevezets sorn is adhatunk kezd6nkct:
unsigned short int * pPointer = new unsigned short int;
A mutat mindkt esetben a dinamikusan kezelt memriban tallhat unsigned
short int tpus adatra Illlltat , amelyhez a mulatn keresztl a ren-
delhetnk rtket:
*pPointer = 72;
Ez II jelenti : .. tedd a 72 rtket a mutat lt al cmzett teriiletre
H
, vagy
a 72 rtket a dinamikus memria azon pontjra, ahov a pPointer nmtat ".
Ha a new utasts nem tudj a lefoglalni a szksges memrit (a memria is
vges erfortis), akkor egy kivtelt dob.
Aprop
Kivtel generlsa
A kivtelek hibakezel objektumok, amelyekkel a 24. leckben foglalkozunk majd
bvebben.
Nlliiny rgebbi fordt ilyenkor nul lmut:ltval tr vissza. Ha ilyent 11asznlunk, fl -
ttlen hogy null-c a 1llutatnk rtke a new vgrehajtsa utn. Minden
jabb fordt esetben kiv(:tclck dob!lsra szmthatunk.
A delete kulcssz6 hasznlata
:\liutn vgeztnk a memriaterletnkn adatokkal, ki kell adnunk a delete
utastst a memriadmellartalmaz6 1l111latra. A delete . viss7.llcsatolja" a memrit
a szabad tetillethez. Ne feledjk, hogy maga a mutaL - ellenttben lIzL11 a mem6riate-
rleltel, ahov mutat - loklis vltoz6. Miutn a fggvny, amelyben bevczcunk,
ViSSl.:ltr a a mutat ltkrn kvlre kerl, s elveszik. A new kulcs-
szval lefoglalt memriareriller, nem szabadul fel automatikusan, te ht il yenkor az a LC-
rlet c1rhetetlenn vlik, ezt a helyzetet nevezzk memriClszivrgsnak (memory
leak). Azrt hvjk szivrgsnak, mivel a program futsnak vgig nem frhetnk hoz-
z, azaz mintha a szabad memria elszivrogna a szmtgpnkbl
Hogy visszaadjuk a memriatcriilctet a rendszernek, a delete utastst mindig ki kel t
adnunk. Nzznk cgy pldflt:
delete pPointer ;
Amikor trljk a mUlaL6t, valjban azt a memriatcriiletet szabadt juk fel, amelyre
a mutat hivatkozott, valami ilyesmit ktilnk: vissza a a szabad terlethez azt
a memriadarabkt , amire a mUlat hivatkozik." A mulat mg ezutn is mutat ma
rad, azaz szksg esetn jra mcmriadmet rendelhetnk hozz. A dinamikus lrban
mcmriafoglalsr.! a 9.4. LiSla mutat pldt. Lthatjuk a ltrejtt vltoz haszn-
latt, majd trlst is.
178 1111. rsz M.mriakezels
Figyeleml
Mutatk trlse
Amikor meghvjuk a delet e utastst egy mutatval, a hivatkozott terlet felsza-
badul. Ha jra trlni prbljuk ezt a mutatt, a programunk sszeomlik. Ennek ki-
vdsre ha trjnk egy mutatt, lltsuk az egyben null rtkre, a delete meg-
hvsa egy null mutat6ra ugyanis garantltan biztonsgos. lssunk egy pldt:
AnimaI *pDog .. new AnimaI ;
de l e t e pDog ; fels?abadits3
pDog '" O: IImutat6 null-ra lltsa
II . ..
delet e pDog; r/veszlytelen
Ne aggdjunk, ha a fenti kdot nem rtjk teljesen. Itz objektumok dinamikus keze-
lsrl szmra majd a leckben lesz sz. A mdszer termszetese
kdik az egyszeru adattpusokra, pldul az int-re is:
int *pNurnbcr = new int;
delet e pNumberl //mem6ria
pNumhcr = Ol //mutat6 null-ra llitsa
/ I . ..
deletc pNumberl /lvesz61ytelen
9.4 Us" - Mem6riafogl.ls60 mutat6k (poIntarhHp.Cpp)
O: II Lista:
1 : 1/ Mem6riafoglals s mutat6k t6rlse
2 : .include <iostreaffi>
3 .
4 : int main ()
5 : {
6 : int localV"riable :: 5;
7 : int * pLocal= &localVariable;
8 : int * pHeap = new int ;
9 : if (pHe,lp "".' NULL)
10 : {
11 : std:: cout "Error! No memory for pHcap!!";
12: return l;
13 :
14 : '*pHcap::: 7;
15 : std :: cout "localVariable: localVariable "\n";
16 : std :: cout pLoca l : " "pLocal "\n';
17 : std :: cout ' ''pHcap : " "pHaap ' \ n ";
18 : delet a pHeapl
19 : pHeap " new int ;
20 : if (pHeap == NULL)
21 : {
22 : std :: cout ' Error! No memory for pHeap!!" ;
23 : r eturn l :
24 :
25 : "pHeap = 9 ;
26 : std::cout ''' pHeap: ' *pHeap '\n' ;
27 : delet e pHeap;
28 : rcturn O:
29 :
localVariable: 5
*pLocal: 5
*pHeap: 7
*pHcap: 9
9. 6ra Mutat6k 179
A 6. sorban kezd6rtkkelltjuk el a bevezetett loklis v1tozl. A 7. sorban egy muta
tnak adjuk kezd6rtkkOl a loklis vlt oz cmt. A 8. sorban egy jabb mutall ve-
zelnk be, amel ynek nkl eh'Y new int utasts ViSS7..atrsi rtkt adjuk, amely di
foglal memrit egy int szmra. A 14. sorban a 7 rtket tesszk az jon-
nan foglalt mem6riatelleLre. A 15. sorban kii mtjuk a loklis vltoz rtkt, mlljd
a 16. sorban a pLocal {t ll::l ] hivatkozott rtkeL A vnnak megfelel6en a k l rt k
megegyezik. A 17. sorban a pHeap ltal hivatkozott rtket rat juk ki. A kimenet:lZ1
a tnyt igazolja, hogya 14. sorban radott rtk hozzfrhet6.
A 18. sorban a 8. sorban foglalt memrit felszaoodtjuk a delet e lltasts meghvfisfi-
val. Ennek hats.1ra a felszab:ldul memriaterlet cme is trl6dik a mutatbl.
A pHeap ennek kvetkeztben szabadon jra felh:'lsznlhat. A 19.-25. sorokban jr:.!
mem6riacmet rendelnk hozz, majd a 26. sorban kir:.lljuk az eredmnyl. A 27. sor-
ban jr-.t visszacsatoljuk a szab;ld terlethez a lefoglalt memrit.
Ugyan a 27. sor redundns (mivel a program vgn a lefoglalt memriaterlelek gyis
fe\.szabadulnak), mgis ajnlatos a memriateriiletet a progmmoz6nak felszabadtania.
Ha a program megvltozik, vagy hozznmk mg valamit, el6nys lehel, ha mr eI6z(5-
leg gondoskodtunk az ilyenkor szksgess v l lpsekr61.
A mem6riaszivrgs elkerlse
A msik gyakori oka a mem6riaszivrgs jelensgnek, ha m6g azcl6tt j cmet rende-
Ink a mutathoz, hogy felszabadtoltuk volna III ltala hivatkozott memriaterletel.
Nzzk a k6drszletet:
unsigncd uhort int * pPointer = new unsigncd short int;
*pPointer '" 72;
pPointer '" new unsigned short int ;
*pPointer '" 84;
A fenti kdrszlet cls6 sorban egy pPointer nev mulat6l hozunk ltre, majd hozz-
rendelnk egy a dinamikus memrihoz tartoz cmer. A msodik sorban erre a ter-
letre a 72 rtket helyezzk. Eddig a dolog rendben is volna. A 3. sorban azonban
ugyanehhez a mutal6hoz immr egy msi k dmet rendel nk, a 4. sorban pedig a &1 r-
tket helyezzk el ezen az j terleten. Az erede[ memriaterlet, ahov cl6z61eg a 72
180 Im. rsz
rtket rtuk, most mr nem mivel a mut:lt6t, amely az oda vezet6 utat
mutatta, fdlnuk. Mivel pedig nincs semmilyen md az eredeti terlel el-
rsre, felszabadlani sem mdjuk azt a progmm futsnak vge
A fenti kdrszl et teht helyesen a kvetkez6kppcn rest:
unsigned short i nt * pPoint er '" new unsigneo short int;
" pPoi n t er = 72 ;
delete pPointer :
pPointer '" new unslgned short i nt ;
*pPointcr - 84 ;
Az jabb k6drszletben .. zl a memriaterletet, amire a pPointer hivatkozik, immr
fels7Abadtjuk a 3. sorban, vagyis kikszbltk a fenl vzolt hibl.
Tudta hogy ... 1
Kvessk a mutatkat
Minden egyes alkalommal. amikor egy new utasftst kiadunk, ki kell adnunk hozz
egy delete utastst is. Fontos kvetnnk, hogy melyik mutat6hoz van
memriaterlet hozz rendelve, s mindig meg rla, hogy a lefoglalt me-
mriaterletet visszaadjuk a rendszemek, miutn mr nem hasznljuk.
A malloc s free
Bizonyra tallkoztunk mr rgebbi programokban malloc () s free () fggvny-
hivsokkal. Ezek a fggvnyek hossz ideje a C nyelv rszei, s ugyangy a dinami-
kus memriakezelsre szolglnak, mint a new s a delet e utastsok. A leglnye-
gesebb klnbsg a rgi C s az j C++ mdszer kztt az, hogyamal loe sz-
mra pontosan meg kell mondanunk, hogy mennyi memrit foglaljon. Nzzk meg
a fordt6programunk sgjt vagy kziknyvt, ha tbbet szeretnnk tudni rluk. Mi
termszetesen a C+ + nyelvi lehetsgeit fogjuk hasznlni a tovbbiakban is.
Krdsek s vlaszok
Krdes: Mil1 olyan jOllfosak a mulalb?
t'/asz: Amint ez ebb61 a leckb61 is kiderlt, a 1l11.1t:l!6k azrt olyan fOnlosak, mert
a segL<;gkkel a dinamikusan kezelt memriban is tudunk objektumokat elhelyezni,
illetve teszik a refercnciaknti paramtertad:.st is. Ezen kvl a 13. rban
majd ltni foguk, hogy hogyan hasznlhat juk a mul,Hkal a thb szerepkrben felhasz-
nlhat osztlyok esetben.
Krds: MiiJT1 J .'e/l egyltalll bajldllllllk a db/ali/ikm memliakeze/essel?
Vlasz: Egyrszt a dinamikusan kezelt memriban ltrehozoll objektumok azutn is
megmamdnak, hogyafggvnylink visszatrt a hvhoz. Ezen kvl az objektumok t-
rolsnak ez a mdja teszi, hogy dnLo;k el, mennyi objekrumra
lesz szksgnk, ahelyett, hogy lefoglalnnk valamennyinek a helyet. Ez utbbi
majd a 10. rban ismerhetjk meg mlyebben.
Gyakorlatok
Most, hogy megismerhettk a mutatk hasznlatt, vlas7.0ljunk nhny k6rd6src s
oldjunk mcg pM felad:not, hogy meger6sLSk eddig megszerzett ismereteinket.
Kvfz
']. Mi a klnbsg a O s NULL mulat kezcl6rtkek kztt?
2. Mennyi memrit foglal egy egszhez ltrehozott mutat? Mennyi memrit fog-
lal egy lebeg5pontos vltozl mulat?
3. Mi az. a mem6riaszivrgs?
4. Hogy:1Il tudjuk felszabadtani a new kulcsszval lefoglalt memrit?
Feladatok
l. MdostSlIk a pointeruse. cpp (9.2. Lista) programot gy, hogy a pAge mlltat6t
O kezd6rtkkel lssuk el NULL helyet!. Vltozott brmit is a futsi eredmny?
2. M6dostsuk a pointergtore. cpp (9.3. Lista) programot lll. albbiak szerinl:
szorozzuk ssze a yourAge s pAge vltozkat, majd troljuk ezt az rtkeket
egy j vlt07.ban. fmssuk ki az j vltoz rtkt. Gondolkodjunk el, vajon
honnan tudja a fordit, hogy II " karakter mikor jelent szorLst s mikor a pAge
mutatra hivatkozst.
3. Vgezznk jabb mdostst a pointerstore . cpp (9.3. Lista) progmtnon: old-
juk meg, hogya "pAge mutatt hasznlva mdosLSa a myAge vagy yourAge v;,\l-
tartaimt. Megvltozik ett61 a pAge-ben trolt mcm6riacrn?
182 1111. resz M,m6ri.k,zels
Vlaszok a kvzkrdsekre
l. a nulla cmel rendeli a l11utat6hoz. A NULL nyilvnvalan egy mulat,
mg a O inkbb gy nz ki , mint egy egsz, de a jelentsk vgeredmnyben
azonO$. KdolSt stlus kt!fdse, hogy ki m<::1yiket hasznlja.
2. A legtbb rendszeren a vlasz az, hogy ugyanakkork. Amgy viszont progr..!-
moz6knt egyltahin nincs szksgk erre az informcira. Elg annyit tudnunk,
hogya mutatk mrete biztosan ahhoz, hogy dfrjenek bennk a g-
pnkn hasznl atos memriacmek.
3. A mem6riaszivrgis akko r lp fel , amikor dinamikusan foglalunk Ic memrit,
de nem szabadt juk fel azt, antikor mr nem hasznlj uk. A program ilyenkor to-
vbb fogalja a memrit, gy egyre kevesebb szabad hellyel gazdlkodhat
4. Hasznljuk a delete kulcssz6l. A legjobb :lZ, ha azonnal trljk azt II mutal6t,
:lmely hal dmzett adatra mr nincs szksgnk.
10. RA
A mutatk kifinomult hasznlata
Ebben az rban a lesz sz:
Hogyan hozzunk ltre objektumokat a dinamikusan kezdt memriban
Hogyan haszn:'ilhatjuk igazn hatkonyan a mutatkat
Hogyan cl6zhctjk meg :il memriagondokat a mutatk hasznlata kzben
Objektumok ltrehozsa a memriban
A CH programoz egyik leghatkonyabb eszkze a mutatk hasznlata: segtsgkkel
kzvetlenl hozzf1'11Clv(: v{l]ik a szmtgp memrija.
Ahogy lt re lehet hozni egsz szflmra hivatkoz mutatt, ugyangy brmi lyen objek
[umra rmutathatunk Ha deklarl unk egy Cat tpus objektumot, akkor deklarlhat
erre az osztlyra hivatkoz mutat, s mris pldnyosthat egy Cat objektum a dna
mikusan kezelt me m6riban, mint ahogy az a veremben is A szintaxis meg-
egyezik az egszeknl hasznlnal:
Cat *pCat = new Cat ;
184 1111. rsz Memriak8lBls
Ez az alaprtelmezett konstruktort ruvia meg, amely nem kr paramtert. A dinamikus
memriban vagy a vereremben konstruktorrallehet objektumot ltrehozni.
Objektumok trlse
Ha egy mutatn keresztl trl nk (delete) egy objektumot a memribl, akkor
az objektum destruktora hvdik meg a memriaterlet felszabadtsa Ez
sget ad arra, hogy az osztlyunk utn kitakartsunk, hasonlan ahhoz, mint ahogy ez
a verem esetn is megtn6nik. A 10. 1 Lista bemutatja, hogyan hozhatk ltre s ho-
gyan trlhetk objeknllnok a mcmrib6l.
10.1 lma - ObioktumDk I_ozu 60 .... di .... lkuIa. kezolt mom6ri6llan
(h pcreate .... )
o: II 10 . 1 Lista
1 : II Objektumok ltrAhozsa a mem6rib;:ln
2 : #include <ios t rcam>
] ,
4 : class SimpleCat
5 : (
6 : public:
7 : SimpleCat() ;
8 : -SimpleCat() ;
9 : privata:
10: int itsAge;
11: };
12 :
13 : SimpleCat : : S ilnpleCat ()
14 : (
15: std: : cout ' Constructor called ." std : : endl ;
16 : itsl\ge ol 1;
17 :
18 :
19 : SimplozCi!lt: : -SimpleCat ()
20 : {
21 : std: : cout "Dcstructor called." std: : endI;
22 :
23 :
int
{
main ()
std: : COIJt ' SimpleCat Fr isky .
SimpleCat Frisky ;
std : : end.1 :
24 :
25 :
26 :
27 :
28 :
29 :
30 :
31 :
std: : cout "SimpleCat *pRi!lgs z new Simplecat ... " std : : endl;
SimpleCat * pRags ; new SimpleCat;
32 : std: : cout "delete pR3gS ... std:, endl ;
33 : delete pRags;
34 :
35 : std: : cout "Exiting, watch Frisky go .. . " std: :endl :
36 : return O;
37 :
Kimenet
SimpleCat Frisky . . .
Constructor called .
SimpleCat * pRags = new simpleCat ...
Constructor called.
de1ete pRags ...
Dcstructor ca1led.
Exiting, watch Fdl;ky go .
Destructor ca1led.
s
10. ra A mutatk kifinomult hasznlata 185
A 4-ll. sorban deklarljuk a lecsupasztott simpleCat osztlyt. A 27. sorban Frisky
ltrejn a vermen, melynek hatsra lefut a konstruktor. A 30. sorban pRags lllutatv;l l
ltrejn egy msik simpl eCat, de ez mr a dinamikus memriban (,I konstll.1ktor itt is
meghv6dik). A 33. sorban delet e-lel trljk a pRags mutat6t, ezzel a dcslruklorl is
meghvjuk. Amikor a f6program fggvnye vget r, Frisky a hatkrn kvl kerl ,
gy a destruktor munkba 16p.
Adattagok elrse mutatkon keresztl
A helyileg (veremben) 16trdlozott Cat objekl' umok esetn <IZ adauagokat s tagfggv-
nyekel a pont (.) opertorr:.11 rheuk eJ. A dinamikus mem6riban ltrehozott Cat ob-
jektumok elrshez fel kelloldanunk a mulatt , s a pont oper:.'lIort kell meghvnunk
a mutatott objekrumra. gy pldul a GetAge () tagfggvnyt gy rhetjk el:
(pRaQ's) .GetAgc () ;
A zrjel biztostja, hogy a pRags felold:'sa mg <1 GetAge () fggvny meghvsa
t.rtnjen.
Mivel ez igy elg knyelmetlen, a C++ nyelv rendelkezsre bocst egy rvidtett oper-
tort a kzveten eJreshez, a opecltort (->, kl6jel + jel). A C++ eZl
egyeden szimblumknt kezeli. A 10.2 Lista mutal egy pldt a memriban ltreho-
zott objektumok adattagjainak s lagfggvnyeinek
10.2 Lista - Dinamikusan ltrehozott obisktumok adanaaiainak az elrse
(heapaccess.cpp)
o: II 10.2 Lista
1: II Objektumtagok elrse a dinamikus memriban
2 : linclude <iostream>
3 : using std::endl;
4 : class Simp1cCat
S: (
6 : public :
7 : simp1ecat() {itsAge - 2; }
III. rsz MemriakeZ8ls
8 ,
9 ,
10 :
-Simp1eCat{l II
int GetAge(l const
void SetAge{int age l
ll : privatc :
12 : int itsAge :
13 : };
14 :
15 : int main(J
16 :
return itsAge ; }
{ itsAge = age ; }
17 : SimpleCat Frisky : new SimpleCat :
18 : std: : cout "Frisky Frisky->GetAge(l
19 :
20 :
ves' endl;
21 : Frisky->SetAge{5l :
22 : std: : cout 'Frisky Frisky >GetAge()
23 : ves ' endl :
24 :
25 : dc1cte Fr i s ky;
26 : return O;
27 :
Kimenet
Frisky 2 ves
Frisky 5 ves
A 17. sorban egy SimpleCat objektumpld{my jn ltre a memriban, melynek let-
konn az alapnelmezett ko nstrukt or 2-re lltja be. A lR. sorban a GetAge () tagfgg-
vnyt hvjuk meg. Ez most egy mutat; ilyenkor a lilii/af opertorral tudjuk elrni
:1 hivatkozon tagfggvC: nyt. A 21. sorban a SetAge () metdus, a 22. sorban pedig jra
a GetAge (l hvdik meg.
Adattagok a dinamikus memriban
Az osztlyok egy vagy tbb adatlagja rmutathat a mcm6ria egy-egy objekllllnra .
A szksges memriaterlet lefoglalsa tnnhct az osztly konstruktorban vagy vala-
mely metdusban, a felszabadtsa pedig a dcstruktorban, ahogy az a 10.3 Listban
is lthat.
10.3 Lista - Adattal sl8r.pt jtsz mutatk (datamember.cppl
o: /I 10.3 Lista
1 : II Adattag-mutat6k
2 : iinclude <iostrcam>
3 ,
4: class SimpleCat
5 ,
public :
Si mp leCat ( ) ;
-SimpleCat{ }:
10. ra A mutatk kifinomult hasznlata 187
6 ,
7 ,
8 ,
9 ,
10 :
int cons t
vo i d SetAge(int a ge )
return l
( *itsAge " a ge ; )
11 :
12: int Get Wci9ht() con st { return *it sWcight ;
13 : void setWeight ( i nt weight) ( *i t sWeight = weight ;
14 :
15 : privat e :
16 : int itsAge ;
17 : int * itswci9ht ;
18 : ) ;
19 :
20: SimpleCat : : Simp1cCat (J
21 : (
22 : i t sAge = new 1nt(2) ;
23 : i t s Weight new i nt ( 5) ;
24 :
25 :
26: SimpleCat , : -SimpleCat ()
27 , (
28, delete itsAge :
29: delete itsWeight;
30 :
31 :
32 : int main()
33 : (
34 : SimpleCat *Frisky = new SimpleCat ;
35: std: : cout "Frisky " Frisky->GetAge()
36 : ves\n' ;
37 :
3B : Frisky->SotAge(S) ;
39 : std : : cout "Fr i s ky , Frisky->GetAge ( )
40 : ves\ n';
41:
42: delete Frisky ;
43 : return O;
44 :
Frisky 2 ves
Frisky 5 ves
A Simp1eCat osztlynak kt tagvltoz6ja van, egszeket cmez. A konstruk-
tor (a 20-24. sorban) inicializlja ezeket a mutat6kat gy, hogy a dinamikus mem6riate-
rletre mutassanak, s a vltoz6khoz hozz rendeli a megadou kezd6rrkekcl.
188 1111. rsz Mem6riakezels
A destnIktor (a 26-30. sorban) felszabadtja a lefoglalt memriaterOletekcl. Minthogy ez
a destruktor, nincs rtelme nullzni a mutatkat, hiszen ezek a mr nem
lesznek Ez egy bizlonsgosan vllalhat kivtel azon szably all, hogy
a trlt mutatkhoz rdemes null rtket rendelni ; persze nem okoz gondor a szably
kvetse sem.
A hv fggvny - jelen esetben a main () - mit sem rud arrl , hogy az itsll.ge s
az itsWeight a dinamikus memrira irnyul mutatk. Egyszenlen meghvja
a GetAge () s a Get WeighL () fggvnyeket, mint eddig is; a mem6riakezels rszle-
t.ei el vannak rejtve az osztly megvalstsban - ahogy annak lennie kell .
Amikor F'risky a 42. sorban, meghv6dik a destruktOJ:l. A deSlmklor
minden adattag-mutatt trl. Ha ezek kimutatnak egyb objektumokra is, melyek a fel-
Il:lszn{116 {tltal definilt oszt51yok pldnyai, akkor azok destruklorai is meghfv6dnak.
Ezen a p6kl{tn jllthat6, hogy mirt rdemes sajt destruktort rni (a fordt6progr.:tn1
llal fclaj{tnlotl alaprtelmezs helyett). Alaprtelmezetten a 28. s 29. sorban lthat6
trl(:sek trt(: nnnek meg; a programozmik kell ezeket ll1<:!grnia. Ezek hjll
a 42. sor trl(:se csak magm a F'ris ky objektumm vonatkozna (s a hozztartoz mu-
tatk .... .,i), de a dinamikus memriban ltrehozott bejegyzsekre nem. A destHlktor nl-
kl memriaelszivrg:'isunk lenne.
A this mutat6
Az osztlyok minden tagfuggvnye tartalmaz egy rejtett paJ:lmtert: a this ( ez) muta-
tt. Ez muta! magra az objektumpldnyra. gy minden GelAge (J vagy Set.i\ge () hl-
vsnl az objektum this mutatja rejtett paramterknt jelen van.
A Lh is mutat feladata rmutatni arra az objektumm, melynek metdust meghvtuk.
ltalban nem hasznljuk; egyszeruen meghvjuk a tagfggvl! nyckel l!s bel1tglltjuk
a tagvlLOZkal. Alkalmanknt azonban szksgnk leheL arm, hogy magt az objektu-
mot is elrjk (pldul a r hivatkoz mutat vissza3dsa miau). Ezen a ponton vlik
igaz5n hasznoss II this mutat.
ltalftban nem kell a this mutatt haszn lni ahhoz, hogy egy objektum tagvltozit el-
rjk ugyHnazon objektum tagfggvnyein bell. Azonban meghvhat kifejezenen
a t hi s mutat is, hH a programoznak gy tartja kedve. A ] OA Lista bemutatja, hogy
ez miknt hasznlhat.
10.4 Usta - A this mutat hasznlata lusingthis.cpp)
o: II 10 . 4 Lista
l : II .i\ thi s mut at6 hasznlata
2 : .include <iostream>
3 : using namespace std;
4 : class Rectangle
5 : {
6 : public ,
7 : Rec t angle () ;
8 : -Rectangle() ;
10.6ra A mutatk kifinomult
9 : void SetLength(int length) ( this- >itsLcngth = length;
10 : int GetLength() const ( return this->itsLength;
ll : void SetWidth(int width) ( itsWidth = widt h ; )
12 : int GetWidth() const { return itswi dth ; }
13 :
14: private:
15 : int itsLength;
16 : int itsWidth ;
17 : ) ;
18 :
19: Rectang1e : : Rectang1e ()
20 : (
21 : i t s Width = 5 ;
22 : itsLength;; 10 ;
23 :
24:
25: Rectangle : : -Rectang1e()
26 : ( )
27 :
28: int main()
29: (
30: Ractangle t haRect ;
31 : cout "Tgla1apom " theRect . GetLength()
32: lb hossz ." end1;
33: cout "Tglalapom theRect . GetWidth()
34: " lb szles . " endl;
35 :
36 : theRect . $et Length(20) ;
37 : theRect . SctWidth(lO);
38: cout "Tgla!apom thcRect . GetLcngth(l
39 : " lb hossz . " endl ;
40 : cout "Tglal apom " t hcRect . GetWidth()
41 : lb szles . " endl ;
42 :
43: return O,
44 :
Tglalapom 10 lb hossz .
Tgl alapom 5 lb szles .
Tglalapom 20 lb hossz .
Tgl alapom 10 lb szles .
190 III. rsz Mem6riakezels
-
A SetLength () s GetLength() hozzfr6 f&!,,,,nyek kifejezetten a this mutatt
hasznljk a Rectangle objektum tagvltozinak elrsre, ellenttben a SetWidth (J
s GetWidth () hozzfr6 fggvnyekkel , melyek msknt dolgoznak. Nincs klnbsg
a viselkedskben, csak abban, hogy a this nlkli metdus kdja taln olvasl1at6bb.
Tudta hogy ... ?
Mire is val6 teht ez a this mUlat6?
Ha csak ennyi rtelme lenne a this hasznlatnak, nem lett volna rdemes meg-
emlfteni. A this mutat hordozza az adott obj ektum memriacfmt - ez igen hat-
kony eszkz lehet!
A knyv egy (14.) fejezetben lthatjuk majd ennek a gyakorl ati felhaszn-
lst az opertorok tlterhelsnl. elg annyi is, ha tudunk a this muta-
t s arrl. hogy magra a szban forg objektumra mutat.
Semmi dolgunk vele, nem kell ltrehoznunk vagy trlnnk - ezt el vgzi helyettnk
a fordtprogram.
Gazdtlan vagy "lg" mutatk
A programhibk egyik forrsa a gazdtlan mutatkb61 ered, melyeket nehz s kellemet-
len felkutami. Gazdtlan mutat akkor keletkezik, amikor trjnk egy mutat6t (delete-
leO - ily m6clon felszabadt juk a hivatkozott memriaterillelet - s ks6bb anlkl kis-
rcljk meg jra hasznlni ezt a muratt, hogy brmit is hozL1rendeltnk volna.
Olyan ez, mintha egy cg elkltzne telephelyr61, s egy gyfelk a rgi sti'imon pr-
blna telefonlni nekik. Lehet, hogy semmi klns nem trtnik - csng egy telefon
egy elhagyott irodahzban. De az is lehet, hogy ezt a szmot mr valaki ms hasznlja,
aki esetleg az jszakt, s ez a telefoncsrgs breszti legszebb lmbl.
Rviden: ne hasznljunk olyan mutatkat, melyeket e16z6leg trltOnk. A mulat to-
vbbra is a mem6ria egy bizonyos terletre mutat, de ;1 fordtprogramnak joga van
oda ms adatokat tenni, gy ennek a mtJtatnak a hasznlata II progl"J.m sszeomJs-
hoz vezethet. Ennl is rosszabb, ha a program vgan fut tovbb, s a hiba csak nhny
perccel ks6bb kvetkezik be. Ezt bombnak hvjk, s nem tl vicces. A biz-
lonslig kedvlt rdemes NULL-ra lltani (s ezzel lefegyverezni) a hasznlaton kvl
helyezett mutat6kat.
Aprop
K6bor mutat6k
Az. gazdtlan mutatkat kbor vagy lg mutatknak is hvjk.
10. ra A mutatk kifinomult hasznlata 191
Konstans mutatk
Mutatk esetben a const kulcssz61 ti tpus utn, vagy mindkt helyen
hat juk. Az albbi deklarcik mind helyesek:
const int pOne ;
int cons t pTwo ;
c onst int const pThree ;
Ezek klnooz6 mutatkat eredmnyeznek. pOne ch'Y konstans egszre mutat. A hivat-
kozou rtket nem lehet megvltoztarni a mutatn keresztl, azaz nem
az albbi sor:
' pOnc = 5
Ha eZI ks6reljk meg, hibt ad a forJt6progmm. pTwO konstans mutat egy egszre.
A hivatkoZQII szm rtke megvltoztathal6, de a p'I'wo nem mutathat sehov mshov.
KonsWns mutat6hoz nem lehet ms vl tozt rendelni. Azaz nem a kvetkez{}:
.. &x
pThree konstans mutat egy konstans egszre. A hivatkozott szm rtke sem vlloz-
tathat mcg, s a pThree sem mutat hat semmi msra.
Hzzunk egy kpzeletbeli fgg61eges vonalat :l csill ag jobboldal n. Ha a cons t sz
a vomtlt61 balra esik, akkor az objektum konstans, s ha jobbr-.l , akkor pedig a maga
mutat vltoztathatatlan
const int pl ; II A hi vatko.,;ott eg!lz konstans
i nt const p2; I I p2 konsta ns , nem mutathat semmi msra .
Konstans mutatk s konstans tagfggvnv.k
A 7. 6rn tanultunk az osztlyok alapjair61. Oli volt sz arrol, hogya const kulcsszt
lehet tagfggvnyekre is vonalkOZL1. tni. l ia egy fggvnyt konstansknt dekladlunk,
a fordl6progr-.un hibajelzsselm3st viSsza minden ksrl etet, amellyel az adon fgg-
vny vltoztatni akama az objekrumon.
Ha konstans objcklumra hivatkoz6an deklar l unk egy mutatl, akkor ezt csakis kons-
tam; mctdusokkallehet hasznlni. A 10.5 Li sta ezt illusztrlja.
10.5 Usta - const objektumot cimz6 mutat hasznlata (constptr.cpp)
o : !! 10 . 5 Lis ta
l : I I kons tans objektumot c i mzo mu tat6 ha s.,;n l ata
2 : 'incl ude <iostream>
3 ,
4 , class Rect angle
5 : {
6 : public ,
192 1111. rsz
7 : Rectangle() ;
8 : -Rectangle() ;
9 : void SetLength( int l e ngt h) ( itsLength = leng t h ;
10 : int GetLength() const { ret urn itsLength; }
l l :
12: vo id SetWi d th{int wi dt h) l itsWid th - wi dth;
13 : i nt Get Wi dt h() c on s t { retur n i t s Width ; )
14 :
15 : private :
16 : int itsLength;
17 : int itsWidth ;
18 : } ;
19 :
20 : Rectangle: : Rectangle () :
21 : itsWidth(S) ,
22 : itsLength (10)
23 : (l
24 :
25 : Rcc t angle : : _Rectnngl e ()
26 : {}
27 :
2B : int main()
29 :
30 : Rectang!a* pRect = new Rectanglc;
31 : const Rectangle * pConstRect new Rectangle ;
32 : Rectangle const pConstPtr = new Rectangle ;
33 :
34 : std: : cout 'pRect szlessge : "
35 : pRect ->GetWidth() lb" std: : endl ;
36 : std : : cout "pCons t Rect szlessge :
37 : pConstRect->Cctwidth() ' lb' std, , endl;
38 : st: , cout ' pConstPt r szl essge ,
39 : pConstPtr->CetWi dth () ' lb' std:: endl ;
40 :
41 : pRect->setWidth(10) :
42 , II pConstRect->SetWidth(lO) ;
43 : pConstPtr->SetWidth(lO) ;
44 ,
45 : std: : cout 'pRect szlessge:
46 : pRcct->GetWidth() lb' std: : endl ;
47 : std , , cout 'pConstRcct szlessge :
48 : pCons t Rect->Get Width() l b " std:: cndl ,
49 : s td : : cout 'pCons tPt r szlessge :
50 , pConstPt r - >GeLWidth() lb' s td : : endl ;
51: return O;
52 :
pRect szlessge : 5 lb
pConstRec t szlessge : 5 l b
pConstPtr szlessge : 5 l b
pRect szlessge : 10 lb
pConstRcct szlessge , 5 lb
pCons t Pt r s z l essge : 1 0 l b
10, ra A mutatk
A 4- 18. sorokban deklarlunk egy tglabpot. A 13. sorban a GetWidth () tagfggvnyt
konstansknt deklarljuk A 30. sorban cgy mutatva! hozzuk IIre a pRect tglalapot.
A 31. sorban deklarlt pConstRect egy konstans tglalapra hiv:ltkoz mulat. A 32.
sorban ltrehozott pConstPtr pedig egy tglalapra hivatkoz konstans mulat.
11.34-39. sorok kirjk a hrom szlessg-rtket.
A 41. sorban a pRect segtsgvcl lllitjuk az els6 tglalap szlessgt 10-fe. A 42. sor-
ban a pConstRect hasznlatval tennnk de ez II mUlat egy konstansknt fel-
veti tglalapra hivatkozik, melynek rtke nem vltoztathat, s nem hvhat meg r
nemkonstans L:tgfggvny. Ez a sor tch:1t megje,gyzss van alakitv:-I, A 32. sorban
3 pConntPtr konstans mutatknt lett llfehozv<l, va,gyis senuni msra netTI tud mr mu-
tatni, csak az eredetileg kiszemelt tgla lapr.lj ez llzonban nem konstans, gy vltoztathat.
Konstans this mutat6k
Amikor konstansknt deklarlunk egy objektumot, ezzel a hozz tartoz this mutatl
is konslanSr:l hivatkozknt hal:1rozzuk meg. A konstans this mutat viszont csak
konstans tagfggvnyekkel hasznlhat6.
A kom:t:lOs objC;!klumok s konstans mulatk II rn j!"'..! el6kerlnek, ami-
kor a konstans objektumokra vonatkoz hivatkozsokat trgyaljuk
Krdsek s vlaszok
Krds: Mi11 rdemes konsUII/ske1lf dek/arlllom egy objektumot, ha ezzel korllozom
a jelhasz1llltalsgl?
V/asz: Progmmozknt az az egyik clunk, hogy magval a forditprog!"'dmmal minl
tbb hibtlelepleztessnk. Egy nehezen fe!derithet6 komoly hib<l lehel az, ha egy
fggvny olyan mdon vlloztat meg egy objektumot, ahogy azt nem vrnnk t6le.
A lehetCi legtbb objeknun konstansknt val deklarlsa megel6zheti ::IZ ilyen hibkat.
Krds: Mi 11elme azza! baj/dllom, hogy brmit is a dillamikllst/ll kezelt memri-
ban dek/arljak?
Vlasz: A memriban deklarlt objektumok megmaradnak a fggvnyek visszatrse
utn is. Ezek radsul dinamikusak iSi vagyis annyit lehet ltrehozni, amennyi-
re csak szksge van egy adott alkalmazsnak vab')' egy adath<llmaznak. Ezen
tl a dinamikusan kezelt objektumokat sszetett adatszerkezetekhez is fel lehet hasz-
nlni, ahogy arr61 a lncolt listknl is sz lesz a 19. rban.
194 ( 111. rsz Mem6riakezels
Gyakorlatok
Az elmlt rn a mutatk hasznlatinak sokfle trult fl az olvas eln; nl-
dsnak elmlytshez vlaszoljon meg most nhny krdst s vgezzen el nhny
gyakorlatot!
Kvfz
1. Milyen C++ kulcsszavakkal tudunk dinamikusan mem6riatelletet foglalni s fel-
szabadtani?
2. trlni egy objektumOl (azaz meghvni a destruktort) anlkl,
hogy nem hasznljuk a trlsi (delete) p:mmcsot?
3. Melyik <l kt t.1nult mdszer az adattagok mutat6val trtn6 elrshez? Melyik
a jobb?
4. Mi az a gazdtlan mUlat?
Feladatok
L Vegye ki a megjegyzsb61 <I constptr . hpp program 42. somt 00.5 Lista). Mi
trtnik? Mi a fordtprogram zenete?
2. 13iwnyra szrevette, hogy r16hny programkd \n-et hasznl, ms helyeken
std : : endl nJnik fel. Helyenknt std: :cout s std : : endl szerepel, msuLt pe-
dig a using utastssal egyn hasznlt cout s endl. Prblja meg ezeket cse-
rlgetni a fejezet programjaiban. Melyiket jobb hasznlni, a \n-et vagy az end1-
et? Melyik az egyszenlbb, a std : : elCtag vagy a using utasts?
3. ki a " mulaf' opertort a heapaccess . cpp programban (10.2 Lista)!
Melyiket knnyebb olvasni, az eredeti vagy a mdostolI vl tozatot?
Vlaszok a kvfzkrdsekre
1. A new utastssal lehet memriaterilletet lefoglalni a dinamikusan kezelt terle-
len; a de1ete utastssal lehet ugyanezt felszabadtani.
2. Amikor a vezrls kilp egy objektum hatkrbl, az objeknllll automatikusan
trl6dik. Ha egy objektumot ltrehozunk, de nem trJnk a main () fggvny-
ben, akkor a main val kilpskor hvdik meg a destmkror, ahogy eZL
a 10.1 Lista kimenetnek utols sora is mutatja.
3. Az egyik a (pRags) . GetAge (), a msik a pRags- >GetAge ().
A ( - opertor jobb, mivel rnzsre is nyilvnvalan mutatja a progra-
moz szndkt.
4. Gazdtlan mutatrl akkor beszlnk, ha azutn ksreljk meg amemria
hasznlatt egy mutat rvn, miutn mr azt a mulatt trltk. Ilyenkor nem
tudhat juk, hogy az adott memriaterlet milyen szerepben ll!
11. RA
Hivatkozsok
Ebben az rban a sz:
Mik azok a hivatkozsok
Miben klnbznek a hivatkozsok a mutatktl
Hogyan lehet hivatkoz.'isokat ltrehozni s hasznlni
Mi lyen korltai vannak a bivalkozsoknak
Hogyan lehet a fggvnyeknek rtkeket s objeknllnokal tadni s t510k tven-
ni hivatkozsok segtsgvel
Mi az a hivatkozs (referencia)?
Az elmlt kt rn ttekintettk a mutatk hasznlatr; hogy segtsgkkel miknt le-
hel a dinamikus memriban objektumok kal bnni, s hogy hogyan lclu;!( ezekre
az objektumokra kzvetett mdon rmutatni. A hivatkozsok, ezen az rn sz6
lesz, a rnutatkhoz hasonlan hatkony eszkZT adnak a keznkbe, csak jval egysze-
nbb szintaxissal.
196 1111. rsz Memriakezels
A hivatkozs egy alternatv nv ( alias). A hivatkozst egy msik objektum, a clobjek-
tum nevvel lehet inicializlni. a pillanattl kezdve a hivatkozs b.'Y viselkedik,
mintha maga a clobjekt um lenne; brmi , amit a hivatkozssal tesznk, megtrtnik
a clobjektummal is.
Ennyi az egsz. Nhol gy emlegeti a hivatkozsokat, mintha azok mutatk le nn-
nek, de ez nem pomos. Br gyakran tnyleg mutatknt valstjk meg 6kel, ez csak
a fordtprogmmok gyrtira tartozik. I' rogmmozknt el kell mdni klnteni a kt
fogalmat.
A mUlatk olyan vltozk, melyek egy msik objekmm memriacmt troljk. A hivat-
kozsok ezzel szemben egy msik objektum nvvltozatai.
Hivatkozsok ltrehozsa
Hivatkozst gy hozh:nunk ltre, hogy megadjuk a <:lobjcklum tpust, majd a
koz t:," opertort (&), vgl :1 hi vatkozs nevt. Ez utbbi brmi lehet, de knyvnkben
kis r-rel fogjuk kezdeni a hivatkozsok neveit. II .. pldul van egy somelnl. ncvlT
egsz vltoznk, akkor az .. Ibbi mdon hozhatunk ltre egy hivatkozst r:
int &rSomeRef someInt:
Ezt (Jgy olvassuk, hogy hivatkozs egy egszre, melyet a someInt-re hivat-
kozva A '11 .1 Li sta mutatja be a hivatkozsok ltrehoz .. 'lst s haszn:latt.
Aprop
A hivatkozs opertora
A "hivatkozs opertor" !&) megegyezik a "elme" opertorral. Pldnkban a dekla-
rciban fordul el.
Emlkezznk vissza, hogyamutatknl is hasonl volt a helyzet ha a deklarci-
ban szerepelt a csillag (,,) jel, az azt jelentette, hogya szban forg vl toz egy
mutat. Ha utasftsban szerepelt, akkor a .kzvetett' opertor! jelentette
(amennyiben mutatval egytt jelent meg), vagy matematikai kifejezsben
a HSlOrzs" opertOr!.
11.1 Lista - Hivatkozsok ltrehozsa s hasznlata (cre8tereference.cpp)
0 , II 11 . 1 Lista
1 : II Hivatkozsok (referencik) ltrehozsa, hasznlata
2 : Jlinclude <iostream>
3 ,
4 : int main ()
5 ,
6 ,
7 ,
B,
int intOne;
int &rSomeRef
9 : intOne '" 5 ;
intOne ;
11. ra Hivatkoz,ok 1197
10 , std: :cout 'intOne : intOne std: : endl;
ll : std: : cout 'rSameRef : rSorneRef std: : endl ;
12 :
13 : rSomeRef = 7;
14 : std: : cout 'intOne: intDne std: :cndl;
15 : std: :cout 'rSomcRcf : rSomeRef std : :endl;
16 : return O;
17 :
intOne: 5
rSomeRef : 5
intOne: 7
rSomeRef : 7
A 6. sorban tleklm'lunk egy egsz vl tozI (intOne). A 7. sorb:m hivatkozst (rSomeRef)
deklarnlunk eb'Y egszre, melyet al intOne-r::t hivatkozva iniciali7 ... 'lunk. Ha initiali:r.ls
nlkl akarunk deklarlni egy hiv;Ltkozsl, akkor rordtsi id6ben hibt kapunk. A hival-
kozsok:lt inidalizlni kell .
A 9. sorb:m a7. intOne-nak rtk] adjuk az 5-l. A 10. s ll. sorb:1O kir::tljuk
az intOne s az rSomeRef rtkeit, melyek termszetesen megegyeznek, hiszen
az rSomeRef egy egyszeru hivatkozs az intOne-rd.
A 11. sorban az rSomeRef-nek rtkl adjuk a 7-el. Minthogy ez egy hiv:ltkoz..s, az
intOne alternatv neve, a 7 tulajdonkppen az intOne vltozlxI kerul , ami a A 14. s
15. sorban ki is derl a kimtskor.
A .eime opertor alkalmazsa hivatkozsokra
[la hivatkozs emre krdeznk r, akkor a e!objeklum cmt kapjuk vissza. Ilyen
a hivatkozsok Lennszele - pusztn egyallernatv nvknt viselkednek. A 11.2 Lista
ezt mutatja be.
ll.2Usta - A hlvatkoz'lOk cfm6nak meghaUtrozsa {addressreference.cpp)
o: II 11.2 Lista
1 : II A hivatkozsok s az "&" hasznlata
2: jinclude <iostream>
3 ,
4 : int main!)
5 ,
6 : int intOne;
7: int &rSomeRef = intOne ;
g ,
9: intOne "" S;
198 1111. rsz Mem6riakezels
10 :
ll :
12 :
13 :
14 :
15 :
std: : cout
std : : cout
std : : couL
std: : cout
16 : ret urn O,
17 :
JGmenet
intOne : 5
rSomeRef : S
&intOne : 1245064
&rSomeRef : 1245064




'intOne :
.

'rSomeRef :
' &intOne :
.
&rSomc.Re ( :
.
intOne std: : endl;
rSomeRef std : : endl;
&intOne std: : end1 ;
&rSomeRef std: : e nd l ;
A kapott kimenet terlll(:szelesen nem fog ezzel megegyezni, hiszen minden szmt
gp ms-ms cmen t{lfolja a vltozkat, aItl fgg6en, hogy mg Iru minden van a me-
mrihan s hogy mekkora az drhel6 memria mennyisge. Ha nem Borland fordt !
hasznlunk, akkor gy is festhet a luls eredmnye:
intOne : 5
rSomeRcf : 5
&intOne: Ox0012FF7C
&rSomeRef : Ox0012FF7C
s.
III is n intOne-ra hivaLkozvH inicializljuk az rSomcRef -et. Ez alkalommal a vltozk
mem riadmt is kir.l tjuk, ami szintn megegyezik. A C++ nem ad lehet6s6gcl arra,
hogya hivatkozsok tnyleges memriadmt lekrdezzk, hiszen annak nincs rtel-
me, szemben a mutat6kkal vagy egyb vltozkkal. A hivatkozsok ltrejllkt61 fogva
a clohjeklUm szinonimiknt visclkednek, mg a ~ c m d opertor alkalmazsakor is,
Nzznk egy msi k pldt. Legyen egy President osztlyunk, melyet az albbi m-
don pldnyostsunk :
Llrehozhatunk s inidaliz:i lhatunk egy hivatkozst a President-re:
Csak egyetlen President van; mindkt nv ugyanazon osztly egyazon objektumra
utal. Brmi, amit Dubya-n elkvetnk, George_W_Bush-on is vgrehajtdik.
Gondosan klnbztessk meg a 11.2 Lista 7. sorban tallhat & jelet a 13-14. sorban
tallhat6akt61. Az el6bbi egy egszre utal hivatkozst deklarl rSomeRef nven, mg
az utbbiak lekrdezik egy egsz szmnak (s a r vonatkoz hivatkozsnak) a me-
m6riacmt .
~ b a n nem szoks hivatkozsok mcmriacmvel dolgozni, hanem egyszeruen
... -1objektum helyett hasznljuk a hivatkozst, ,thogy ez a 11. sorban is ll'izik.
T .. pasztalt CH progmmozk is zavarba jnnek, ha szba kerl, hogy mi trtnik ak-
.. _ ha egy bivatkozshoz megprblunk valami ms vltoz6t hozz rendelni. Azt tud-
~ _ hogy a hivalkozsokat nem lehet jminicializlni, s hogy mindig is az eredelileg ki-
SZt.'TTlelt clobjeklum szinonimi lesznek. A 11.3 Lista futsnak tans.'1ga szerim az j-
r.ahozzrendelst (Igy tekinthetjk, mim rtkadst a clobjektum szmra.
11. 3 Lista - Hivatkozs sz6mra trtn6 rtkadl (assignrefareace.cpp)
II l l. 3 Lista
II Hivatkozs jrainicial izlsi kisrlet e
, : l inc lude <iostream>
using name space std: II hsznljunk most std :: obj ektumokat
4 :
5 : int main()
7 : int intOm! :
~ int &rSomeRef i ntOne :
9,
.. C: intOne 5 :
: 1 :
l2 :
... 3 :
l4 :
: 5 :
cout
cout
cout
cout
"
"


' intOne : \t '
"
' rSomeRef :\t"
"&intOne , \t"
'&rSomcRef , \t'
i nt One
"
end1 ;
"
rSomeRef endl :
&int One andI ;
&rSomcRef cndI ;
16 : i nt intTwo '" 8 ;
17 : rSomeRef = intTwo : /I nem az lesz , mint amit vr hat nnk
18 : " \ nintOne , \t ' intOne endl : cout
19 :
20 :
21 :
22 :
23 :
cout
cout
cout
cout
aout





' intTwo : \t' intTwo endl ;
' r SoIll eRcf ,\t ' rSomeRcf endl :
' &intOne : \t" &int One endl :
' &intTwo : \t" &intTwo endl ;
' &r SomeRef : \t' &rSomeRef endl :
24 : return O;
25 :
i ntOne : 5
rSomeRef : 5
&i nt One : 12450 64
&rSomeRef : 1245064
intOne , 8
intTwo : 8
rSomeRef: 8
&intOne : 1245064
&intTwo , 1245056
&rSomeRef , 1245064
200 1111. rsz ' Memri.kezel,
A kapon kimenet nem ugyangy fog kinzni, hiszen minden szmtgp ms-ms c-
men trolja a vltm:6kat, ;Illl fgg6en, hogy mi van a memriban s hogy mennyi
az memria. Ha ms fordtt hasznlunk, akkor ehhez hasonlt is kaphatunk:
intOnc: 5
rSorneRe f: 5
&int One : Ox0012FF7C
&rSomeRef: Ox0012FF7C
intOne: 8
intTwo: 8
rSomeRef : 8
&intOne: Ox0012FF7C
&intTwo: Ox0012FF74
&r.-SomeRef : Ox0012FF7C
ltt is cgy egsz S:dlrnOl s egy r utal hivatkozst inicializlunk a 7-8. sorban, majd
az egsz sz.mnak adjuk az S-t CI 10. sorb'Ln. A vltozk rtkeit s cmeit CI 11-
14. sorban ralj uk ki.
A 16. sorban egy (lj vltoz, az intTwo jn ltre s B-as kezd6rtkkel inidaliz./j I6dik.
A 17. sorban a programoz (lj hozz rendelst ksrel meg az rsomeRef-hez; legyen 6
ezentl az intTwo hivatkozsa. m nem ez trtnik. Az rSomeRef tovbbra is
az intOne szinonimja mar:ld, gy az ominzus az albbival egyennkll:
intOne = intTwo ;
Erre elg bizonysg az rSomeRef s az intOne rtknek kiratsa (18-20. sor) - ezek
az intTwo rtkvel egyeznek meg. Az is ltszik, hogy az rSomeRef elme tovbbra is
az intOne elmvel egyezik meg, nem pedig az intTwo-val.
HoIyeo
Objektumok szinollimjaknt hasz-
n{lljuk a hivatkozsoka!.
Jnicializljuk a hivaLkozsokm.
Mire lehet hivatkozni?
Ne rendeljnk j objekmlllol egy,
mr hivatkozshoz.
Ne tvesszk a "cmr!' oper-
tort a "hivatkozS' opertorral.
Minden objekmmhoz rendelhet6 hivatkozs, belertVe a relhasznl ltal ltrehozott
objeknunokat is. rclemes tudatositani, hogy objektumm lehet hivatkozst ltrehozni,
nem pedig osztlyrd vagy adattpusra, mint amilyen pldul az egsz. Nem ml1kdik
teht az albbi sor:
i nt & r lntHef " i nt ; II rossz
Csak egy bizonyos egsz vltoznak az lneve lehet a hivatkozs;
int howBig = 200;
int & rIntRef = howBig ;
Ugyarugy lehetetlen a eat osztlyf'd hivatkozst lltani:
CAT & rCatRef - CAT; II rossz
11. 6ra Hivatkozsok I z01
Az rCatRef-et csak egy bizonyos eat objektummal inicializ.'lhatjuk:
CAT frisky ;
CAT & rCatRef = frisky;
Az objektulllokm mulat hivatkozsok ugyangy hasznlh:lt6ak, mint maguk az objek-
tumok. Az adallagok v,Lgy mel6dusok a megszokolt osztlytag-kivlaszt6 opertorral
(. ) rhet{5ek el. A be6ptell tpusokhoz hasonlan az objektumoknak is szinonimkal
reremLt!llck a hivatkozsok
Null mutatk s null hivatkozsok
Ha egy mutat6t trloc:k vagy nem inializlnak, a null rtket kell t:utalm3znia. A hi -
vatkozsokkal nem gy ll a helyzet. Hivatk07 .. -; nem lehel null Az :l progra m,
amelyik null hivatkozsl tartalrnaz, JVnytelennek tekinthct6, ekkor pedig
akrmire kpes. Futhat norm lisan, v:lgy ppen trlheti az sszes llomnyt merevle
lVnylc1en progl"'J.mtl minden kitelik.
A legtbb fordt6progr::lrn nem panaszkodik sokat, ha null hivatkozst lall, s
csak akkor omlik ssze, ha megprbljuk valamikpp hasznlni ezt :1 hiv:ukozst. Nem
rdemes azo nban ilyesmit haszn.lni, mert ha msi k szmtgpre vagy msik fordt{r
progmmnak pr6bljuk tadni a progl"'dmunkal, titokzatos hibk jelenhelnek meg null
bivatkozsai nkbl ered6en.
Cm szerinti paramtertads
Az 5. rnn a fggvnyeknl tanultuk, hogy van kt korlt juk: a paramtereknek csak
az rtkt veszi 51 a fggvny, a ret urn utastssal pedig csak egyetlen rtket lehel
visszaadni.
A dm szerimi pa,.!mLcrtadssal mindkt korltozson fell lehet emelkedni. C++ban
kle mdon lehel eZl megvalstani: mulatval vagy hivatkozssal. A szintaxis
de a hats ugyanaz: a fggvny hat6krben JVnyes msolat helyett maga az eredeti
objekmm keni! tadsra. Ezzel lehet6v v lik, hogya fggvny mcgvltoztassa a hivat
kozott objektumot.
eZl megvi7_sglnnk, tanulmnyozzuk a 11.4 Listt, melynek swap () fggvnye
rtk szerint kapja meg pa'dmlereil.
202 1111. rsz' M.m6riakezels
11.4 lista ~ __ 6boMods
l
o: /1 11.4 Lista /1 trtk szerinti paramtertads
1 : Unclude <iostream>
2,
3: void 5wap(int x, int Y)i
4 ,
5: int main ()
6: (
7: int x = 5. Y '" 10;
8,
9 , std: : cout "Mai n . 8efore swap, x: x
10 : y : y "\n";
11 : swap(x,y) ;
12 : s t d : : cout "Ma i n . After swap, x: ' x
13 : y : ' y '\n";
14 : roturn O;
15 :
16 ,
17 :
18 ,
19 :
20 :
21 :
22 :
23 :
24 :
25 :
26,
27 :
28 :
29 :
30 :
31 :
Main.
Swap .
void swap ( int
(
int tomp;
std : : cout
temp
.
" x

y,
y
.
temp;
std : : cout
Before swap .
Before swap .
x. int y)
Swap.
Swap.
"
5
y ,
10
"
5
y ,
10
Swap . Af ter swap .
"
10
y ,
5
Main. After swap .
"
5
y,
10
Before swap,
"
.
x

.
y ,
.
y \n" ;
After swap,
"
.
x

.
y ,
.
y \n";
A program kt vltozt inicializl a main ( ) -ben, amelyeket tad a swap () fggvny-
nek. Ez arm lenne hivatott, hogy a kt paramter rtkl felcserlje. Azonban
a main () -beli ismtelt kiratsbl az derul ki, hogya vltoz6k rtkei vltozatlanok!
11 .!a"
A problma abbl ered, hogy csak rtk szeri nt kapta meg a swap () fggvny 3Z x s
y paramtereket; azaz csak helyi msolatok kszltek a fggvny szmra a vltoz6k-
r61, 1\ megoldst a dm szerinti paramtertads jelenti.
C++-ban kt t knlkozik a problma megoldsra. A swap () -nek tadhatunk (az ere-
deti vltozkra utal ) mUlat pa,dmlereket, vagy ugyanezekre l vltoz6kra val hivat-
kozsokat.
A swapO javltsa mutatk segitsgvel
Amikor tadunk egy mutatt, akkor az objektum tnyleges cmlludatjuk a fi.igg-
vnnyel, ami ezek utn rud v ltozUllni az adott mem6riacmen leviS rtken. Hogy
a megjavtolt swap() tnylegesen tudjon cserlni, hasznljunk kt egb;z mUlatt para-
mterknt. Ezen mutatk feloldsa ul:n mr tnylegesen x Y, amim azt
a 11.5 Lista is szemlltt:li.
11.5 UI1II- CIm szerinti paramtertad mU1lt6kkallpanllyplJ. pI
o: /1 11.5 - Cim szerinti paramtertads
1 : 'include <iostream>
2,
3 : void swap(int "x, int *y);
4: II the "*" saya that the function expects pointers
5 : int main()
,.
int x 5, Y = 10; 7 ,
8,
9 ,
10 ;
std:; cout "Main . Bcfore 9wap , x: " x

Y '
y "\n" ;
11 , s wap (&x . &:y) ;
12 : s td: : cout "Main. After s wap , x: x
13 : " y , " y " \ n " ;
14 : return O:
15 :
16 :
17 : void swap (int *px, int *py)
18 :
19 : int temp;
20 :
21 : s td : : cout Swap. Bcfore s wap , "px: " *px
22 : " *py : " .py \n' ;
23 :
24 , t e mp = *px;
25 : px *py :
26 : .py = temp ;
27 :
28 : std: , cout "Swap. After s wap, " px: " *px
29: *py: "py "\ n " ;
30 :
203
204 1111. rsz Memri8kezels
lIImenet
Main. Before swap . x: 5 y : 10
Swap. Before swap. px : 5 *py : 10
Swap . After swap . *px : 10 *py: 5
Main. After swap . x : 10 y : 5
Sikerlt! 1\ 3. sorban a swap () deklarcijt gy alakitouuk, hogy kl egsz szm he-
lyett kf:l egszre mutat par.lmten vrjon. A swap () fggvny hvsakor (a 11. sor-
ban) az x s y vltoz6k cmeit adjuk t paramterknt.
fl 19. sorban egy helyi vltozt deklarlunk a swap ( ) -en bell (temp) . Ennek nem kell
mutat6nak lennie, hiszen csak a *px rtkt fogja hordozni a hv6 fggvnybeli
x a fggvny lettartam,l sorn. A fggvny visszatrse utn mr nem lesz
szksgnk a tempore.
A 24. sorban a temp-hez hozzrendeljk a px cmen t:.tllh,lt6 rtket. A 25. sorban
a px cmen ll 6 rtket fellrjuk a py cmen wllhat rtkkel. A 26. sorban a temp-
ben ideiglenesen trolt rtket (azaz a korbbi px rtkt) berjuk a py mem6riacmre.
Mindezek eredmnyeknt a hv fggvny kl vltoz6jmtk rtke, melyekkel meghv-
ta a swap () fggvnyt, tnylegesen fe1cserl6dik.
A swap() jabb megvalstsa hivatkozsokkal
Az cl6z6 program mG'kdik, de a swap () szintaxisa kt okbl is nygvenyel6s. Egy-
rszt a swap () meghvsa kor ktszer is ismtelt cmfelolds hibalehet6sgekel hordoz,
s nehz is olvasni. Msrszt az a knyszer, hogya szban forg6 vltoz6k cmeit kell
megadni a hv6 fOggvnyben, felfedi a swap () megva!6stsnak technikai rszleteit
a fel hasznlk szmra.
A C++ egyik clja, hogy a fggvnyek hasznl6it megkmlj e a konkrt mGkds meg-
fradsgtl. Mutatk tadsnak a megkvctdsc a hv fggvny fel -
hasznl6jl1l tesz tbblet terhet, amit pedig nem az 6 dolga viselni; gy a hv flnek
kell fejben tartania, hogy a swap () szmra a felcserlend6 vltozk cmeit kell tadni.
A cmzs-szemantika megrtsnek terht a swap () megalkot6jnak kell hordoznia.
Ezt hivatkozsok hasznlatvallehet megoldani. A 11.6 sta ennek megfelel6en fogal-
mazza t a swap () fggvnyt. A hv fl most csak az objektumokat adja l, de - minl-
hogy az elvrt paramterek hivatkozsknt vannak deklarlva - ezek hivatkozsknt
rtelmez6dnck. A hv fggvnynek semmi klnsel nem kell tennie.
11.6", Hivatkozsok 1205
11.6 Lista - Az jra/rt sw,pO imm, hivadc02sokkal (passbyraf.cpp)
o: /1 11.6 Lis ta
1: / / eim szer.i.nti szp paramtertads - hivatkozsokkal l
2 : *include ciost ream>
3 .
4 : void s wup (i nt &x, int &y);
5 : /1 az ' &' jel mutatja, hogy a fggvny hivatkozsokat vr
6 : int main ()
7 : (
8: int x =5,y=10;
, ,
10: std: : cout 'Main. Before swap, x: <c x
11: C< " y : y '\n';
12 , 6wl.lp{X , y) ;
13 : std : : cout 'Main. After swap , x: c< x
14 :
15 :
16 :
17 :
return O;
18 , void swap (int &rx, int "ry)
19 : (
20 : int temp;
21 :
y : y "\n';
22 : std : :cout Swap. Before swap, rx : rx
23: ry : ry '\n' ;
24 :
25 : tcmp " rx ;
26: rx ry ;
27 : ry = temp ;
28 :
29: std : : cout Swap . After swap, rx : rx
30 : ry : ey '\n';
31:
Main . Before swap , x: 5 y : 10
swap . Betore swap, rx : 5 ry : 10
Swap . After swap, r x : 10 ry: 5
Main . After swap , x : 10 y : 5
Ahogya mutatkkal megval6ston pldban, in is deklarlunk kt vltoz6t a 8. sorban,
melyeket ki is rarunk a 10-11. sorban. A 12. sorban hvjuk meg a swap () fggvnyt,
melyben maga az x s y kerl tadsF.l, nem a cmeil .... A hv fl egyszeruen magukat
a vlLOzkat adja t.
206 1111. rsz Memriakezels
Amikor a swap () meghvdik, a vezrls a 18. sorra kerl, ahol a vltozk hivatkozs-
knt rtelmez6dnek. Kezdeti rtkket kirjuk a 22-23. sorban. Fontos, hogy semmi-
lyen opertort nem hasznlunk az elrskhz, hbzen ezek az eredeti vltozk
nimi, gy nmll gllkban is hasznlhatak.
A 25-27. sorblln fclcscrl6dnek az rtkek, melyeket a 29-30. sorban ki is nyomtatunk.
A. vezrl s visszakerl a f6programba, s a 13-14. sorban a main () is kirja :l vltozk
nkeit. A swap () pammterei hivatko7..skntlettek deklarlva, gy a main () -heli r-
tkt:!k tadSa is gy trtnt; emilltl rtkvltozsuk a main () -ben is megm;wddt.
A. hiv:ltkozsok knyelmet s hasznlhatsgol klcsnznek a norml vlto-
z6knak, II mutatk cm szerinti paramtertadsi kpessgnek lehet6sgvel s erej-
vel felvrtezve.
A fggvnyek fejlcei s prototfpusai
Hivatkozsokat is elfogad fggvnyekkel knnyebb az let, s a kd is olvashatbb,
de honnan tudja a fggvny meghvja, hogy rtk szerinti vagy cm szerint i param-
tertads trtnik? A swap () -et hasznl programoznak tudnia kell , hogy ez a fgg-
vny tnylegesen hozz fog-e nylni a p;munterekhez.
Ez a fggvny deklarcijbl (prototpusbl) derl ki , amely tbbnyire a fejlcllo-
mnyban tallhat a tbbi deklarcival egyOtt. Az ou paramtereket megte-
kintve egyb61 ltszik, hogy az adott fggvny cm szeri nti par.Jmtertadssal dolgozik;
gy meggy6z6dhel arrl a programoz, hogy tnyleges csert vrhat II swap ( ) -t61.
Ha a swap () egy osztly tagfggvnye [enne, akkor az osztly-deklarcibl (amel y
szil1tn a fejl cllomnyban tallhat) lenne ez az informci.
C++-ban az osztlyok gyfelei (azaz valamely ms oszt::i ly tagfggvnyei, melyek
az adott osztlyt hasznlni szeretnk) bzhatnak abban, hogy a fejlcl1omnyokban
mindent megtal l nak, amire szksgk van. Ez jelenti az osztly vagy a fggvny keze-
16fellet1. A tnyl eges megva lsts el van rejtve az gyflprogramok Ez segti
a programozt abban, hogya lnyegre koncentrlhasson, s anlkl haszn lhassa
az adott osztlyt vagy fggvnyt, hogy ismern II pontos megvalstst.
Tbb rtk visszaadsa
Ahogy korbban emIteuk, a fggvnyek csak egyetl en visszatrsi rtkkel rendel-
kezhetnek. Mit tehetnk akkor, ha kt rtket szeretnnk visszakapni egy fggvnyt61?
A problma gy orvosolhat, hogy kt paramtert adunk t neki cm szerint. Ezeket
a fggvny [eltltheti a rtkekkel. A cm szerllt paramtertads felruhzza
11. 6ra HivatXozs<>k I W7
a fggvnyt azzal a kpess6ggel, hogy tnylegesen tbb rtket adjon vissza. Ebben
a megkzeltsben a fggvny eredeti vissz,n6r6si rtke ms szerepbe kerl; hasznl-
hat pt:!ldul hibajelzs kldsre.
A dm szerinti paramtertads teht mUlat vagy hivatkozs segtsgvel trtnhet.
A 11.7 Lista eb')' olyan fggvnyt mutat be, amelynek hrom visszatrsi rtke van; kt
mlLral6 paramter plusz II Chibajelzsre hasznlt) klasszikus visszatrsi rtk.
11.7 Usta - VisszatrNi rtkek tbbsz6r6zltse mutatkkal (returnwithptr.cpp)
0, 1111.7 Lista
1: II FOggvnyek tObbszrs visszatrsi rtke mutatkkal
2: linclude <iostream>
3 ,
4,
5 ,
6,
7 ,
8 ,
9 ,
10:
ll:
12 :
13 :
short Factor (int, int",
int main!)
int number, squared,
short error;
std: : cout 'Enter
std : : cin number;
i nt*) ;
cubed;
a numbar (o - 20) :
. ,
14 : error = F'actor(number, &squered . &cubcd);
15 :
if (!errorl
{
16 :
17 :
18:
19:
'"O :
21:
std: : cout "number:
.
number \n" ;
std: : cout "square:
.
squared
std: : cout ' cubcd :
.
cubed
22 : e l se
'-3 , std::cout "Error encountered!! \n";
24: return O;
7.5 :
26 :
27 : short Factor(int n, int *pSquared, int *pCubed)
2S :
29: short Value = O;
30 : if (n > 20)
31: value = 1 ;
32: else
33 :
34 :
35 :
pSquarcd = n*n:
*pCubed n*n*n:
36: Valuc '" O;
37 :
38 : ret urn Value;
39 :
"\n' ;
\0' ;
20e 1 III. rsz Mem6riakezels
Enter a number (O-20) : 3
number: 3
square : 9
cubed: 27
A 8. sorban llrehozzuk a number, squared s a cubed (szm, ngyzete, k6be) egsz
vltozkat. A number--nek a felhasznl adata ad rtket. Ezt a szmot, vala-
mint a squared s a cubed cmt tadjuk a Factor () fggvnynek.
A Factor () megvizsglja az rtk szerint ladolt els6 p;munterl. Ha ez nagyobb
hsznl (v:lgyis a maximumnl, amit ez a fggvny mg kezelni akkor II vissza-
trsi v ltoz6t (va.lue) egy hibajelz6 rtkre lltja. ri gycljk meg, hogy
a Factor () visszatrsi rtke vagy ez a hibajelz6 rtk, vagy nulla (ami azt jelzi, hogy
minden rt..:ndben zajlott). A 38. sorban kerill visszakoldsre a Value rt6kc.
A kt tnylegesen vrt a szm ngyzete s kbe nem a return r-
vn jut vissza a fl5programba, hanem a fuggvnynek tadott mut..tk rvn lehet6v
vlt kzvetlen C:n6kvltoztatssal.
A 34. s 35. sorban bekerlnek a kiszmtott rtkek a mutatk lUl! hivatkozott mcm6-
riacmekre. A 36. sorban a visszatrsi nket (value) sikeres ll apotra llljuk, s a 38.
sorban vissz..kldjk.
A progmmot tovbbfejleszlhetjOk azzal, hogy felvesszk az al bbi deklar.'lci6t:
enum ERROR-VALUE ( SUCCESS, FAILURE):
Ezek utn mr nem O vagy l rtket kellene visszaadnia a t"ggvnynek, hanem
SUCCESS-t (sike,t) vagy FAILURE-t (hbtit). Ahogy korbban lthattuk, II fcl sorolsos t-
pus eleme (SUCCESS) O, msodik eleme (FAILURE) l rtket vesz fl.
Tbb visszatrsi rtk hasznlata hivatkozsokkal
Br a 11 .7 Lista programja knnyebb olvasni s karbantartani, ha mutatk
helyett hivatkozsokkal dolgozunk. A 11.8 Lista mutatja az tn programot, amely mr
hivatkozsokat hasznl, valamint szebb hibakezelst valSt meg az ERR-CODE rvn.
". .. Hivatkozsok 1209
11.81.is1a - A 11.71.is1a lnlra: __ ""'"'" _ ... hit_al
(-..withnof.cppl
o : /I 11. 8 Lista
l ; 1/ FOggvnyek felruhlosa
2 : II tObbszOrs visszatrsi rtkkel hivatkozsok rvn
3: tincludc <iostream>

5 : enum ERR-CODE ( SUCCESS, ERROR ) 1
6 .
7: ERR-CODE Factor(int , int&, int&) ;
,.
9 : int m",in()
10 : {
ll : int number , squared , cubed:
12 : ERR-COOE result :
13 ;
14 : std: : cout "Enter a number (O - 20) :
15 : std: : cin number ;
16 :
17 : re!lult Factor(number , squared , cubed) ;
18 ,
19 :
20 :
21 :
22 :
23 :
24 :
if (reGult ..
,
std: : cout
std: : cout
Btd : : cout
25 : else
SUCCE$S)
"number : number
square : squared
cubed:
.
cubed
26 : std:: cout "Error encountered!!\n" ;
27 : return O,
28 :
29 :
\n ";
\n" ;
\n';
30 :
3L
32 :
33 :
34 :
35 :
36 :
37 :
38 :
39 :
ERR.....CODE Factor (int n, int &rSquared, int &rCubed)
,
40 :
if (n > 20)
ret urn ERROR;
else
,
r Squared :: n *n ;
r Cubed '" n"n*n ;
return SUCCESS ;
Enter a number (O-20) : ]
nwnbe r : ]
square : 9
cubed : 21
II simple error code
210 1111. rsz
A 11.8 sta megegyezik a 11.7 Listval , kl kivtelle1. Az ERR-CODE felsorolsos tpus
tllhat6bb teszi a hiba jelentseket (33. s 38. sor) , valamint a 19. sor hibakezelsl.
A v lt ozs azonban abban ll , hogya Factor () fggvnyt most gy dek-
larltuk, hogy mutatk helyett hivatkozsokal vr a squared s a cubed helyre. A pa-
mmterek kezelse h'Y sokkal s
Krdsek s vlaszok
Krds: Mirt IJtlsznljl/llk hivatkozsoka" Ita cl mutat6k mindarnl kpesek, amire
CI hfvatl.lozsok?
Vlasz: A hivatkozsokat knnyebb hasznlni s megrteni. A cmfelolds rejtenen tr-
tnik, nincs szksg ismtelt cmfelold opertorokra.
Krds: An,., hasz/llj/.mk akkor /IIuUll kat, ha egyszerl1bbek CI lIiv(l lkoz!ok?
Vlasz: A hivatkoz{!sokat nem lehet null zni, sem pedig jra felhasznlni. A mutatk
rugalmasabbak, de valamivel nehezebb a hasznlatuk.
Gyakorlatok
Most, hogy megismerkedfnk a hivatkozsok hasznlatval , vlaszoljunk meg nhny
krdst s vgezznk el nhny feladatO[ Uldsunk
Kvfz
1. Mi az a hivatkozs?
2. Milyen opertorral hozunk ltre egy hivatkozst?
3. Mi egy hiv"koz's mem6"ocime'
4. Mi a fggvnyek al aprtelmezett paramtertadsi mdszere a C++-ban? Milyen
mdon lehet ennek korl tait tlpni?
Feladatok
1. Egyestse a passbyptr. cpp s a passbyref. cpp (11.5 s 11 .6 Lista) programja-
iban hasznl t mdszereket gy, hogy az egyik rtkel mutat, a msikat hi vat-
kozs segtsgvel adja t a swap () fggvnynek! Ez jl mutatja, hogy e kl
mdszer teljesen tj rhat.
l1.6ra HivatkOLls.kl 211
2. Mdosrsa gy a returnwithptr. cpp programot (11.7 Li sta), hogy mutatk he-
lyeu hivatkozsokat hasznljon!
3. Bontsa hrom rszre a returnwithptr. cpp programot Cl 1.7 Lista) oly mdon,
hogy HZ eredeti nven maradjo n meg a (returnwithptr . cpp),
a Factor () fggvny megv.d6stsa kerljn t egy kln fjlba (factor. cpp),
s legyen egy fejlcllomny is a Factor {} fggvny proTolpusval
(fa ctor . hpp). Vegye fel a factor. cpp-t a projektllomnyok kz, (:$ fordtsa
le a progmmot! Ez azt szemllt eti, hogy hogyan lehet megosztani a fggvny- s
osztlyknyvtrakat. A fggvny lefordthat s a gpi nyelv{[ progmmkd a fej-
lcll omnnyal (bclUle a ruggvnyprototpussaD egytt kzzlehe16 a termel-
kenysg javtsra.
Vlaszok a kvfzkrdsekre
1. A hivatkozs valamely vltOl6 vagy objektum szinonimja, nvvltolat.1,
2. Al jel (&) hasznlatvallehec hivatkozst deklarlni. A hiv:ltkozsokat inida-
lizlni kell a deklarlskor. Nem lehet null hi vatkozsul,k, csak lenulIzott mu-
tat6nk.
3. A hivatkozs cme annak a vltoznak vagy objektumnak a cme, amelyre utal.
Ha :1 . cm(/' opertorl alkalmazzuk egy hivatkozsra, akkor (a mutat6kkal ellen-
ttben) gy hogy semmi helyet sem foglal el a memriban.
4, Az rtk szerinti pammter:'uads. Il yenkor az tadott vllOZ msolatval dolgo-
zik a fggvny, gy nem lehet fellrni az tadott vltoz61. Ezen ktfle m6don
lehet fellemelkedni: egyrszt a mutatk hasznlatval, ugyanis ilyenkor az ob-
jektum cme kerl tadsra. Msrszt hivatkozsok tadsval, hi szen ezzel
az eredeti vltoz nvvllozatl kapja meg a filggvl1y.
12. RA
A hivatkozsokrl s mutatkrl
- mlyebben
Ebben az 6rban a sz6:
llogyan tehetjk hatkonyabb programjainkat cm szerinti paramtecitadssal
Mikor rdemes hivatkozsokat hasznlni, s mikor mutatkat
Hogyan Icgyilnk rr a mcmriagondokon a mutatk kzben
Hogyan kerljk el a hivatkozsokkal kapcsolatos csapdkat
Hatkonyabb a cfm szerinti paramtertads
Az rtk szerinti paramtcrt:tdskor msolat kszl az objeklumr61. Ha a fggvny
visszatrsi rtke egy objekt um, akkor megint egy jabb msolat keletkezik.
Nagyobb mrcr, felhasznl ltalltrehozou objekrumok esetn ezeknek a msolsok
a szITtsignyc mr igen is lehel. A szksgesnl tbb memrit hasznl
a program, s vgs6 soron sokkal !assabban fut.
214 1111. rsz Memriak.,.l.
Egy, a felhasznl ltal definilt objektum mrete a veremben az egyes tagvltozk
mretnek sszege. Ezen tagvllozk akr nagy objektumok is lehetnek. Egy effle gi-
gantikus struktra tadsa (azaz a verembe msolsa) igen sokba kerlhet memria s
futsi vonatkozsban.
Msfle kltsgek is fellpnek ilyenkor. Az oszt{llyok plclnyostsakor kszl rluk
t'b'Y ideiglenes msolat; ilyenkor a fordt6progmm meghv egy specilis konSlnlktOI1:
a msol konstruktort. A 13. rn, a Ixmyolulwbb fggvnyeknl megtanul juk, hogy
hO!''Yan ezek a msol konstnlktorok, s hogy hogyan kszthetnk ma-
gunknak ilyeneket; most azonban elg annyit tudnunk, hogy egy objektum ideiglenes
msolatnak a verembe msolsakor meghv6<.lik a msol konstruktor. Amikor :1 fgg-
vny kilpsekor vget r ennek az ideiglenes msolatnak az leuartama, az objektum
destll.lktora hvdik meg. Ha egy objektumot szerint adunk vissza, akkor ennek
az objektumnak II m{lsobtt ltre is keH hozni, majd trlni is kell.
A konstruktorok s dCSlruktorok meghvsa nagy objektull1okkal kltsges lehet a se-
bessg s a memriah<lsznlallcrn. Ennek illusztrlsra a 12.1 Listban ltrehozunk
egy lecsupasztott, felhasznl ltal definilt objektumot, a SimpleCat-et. Egy igazi ob-
jekulm sokkal nagyobb s mg klL'igesebb lenne, de annak szemlltetsre az is elg
lesz, hogy milyen gyakl"'dn hvdik meg a msol konstl1Jktor s a deslruktor.
A 12.1 Lista f6programja IIrehozza tehl a Simpl eCat objektumot, majd meghv kl
fggvnyt. Az els6nck rtk szerint adja t a Cat -et, s J1k szerinti kapja is viss:tll CZl.
A msodiknak cm szerint adhatja l paramtert, azaz a f'ggvny az objektum mutat-
jt veszi ,It az objektum helyett, s ugyanezt kapja is vissza. A cm szerinli par::unter5t-
adssal kikszblhet a msolat ltrehozsa s a msol konstruktor meghvsa, s
gy ltalban sokkal hatkonyabb a progl"'dnl. Msrszt ezzel valban magt az eredeti
objektumot kapja meg a hvott fggvny, s gy lehet6sge van vltoztatni is rajla.
o: II 12 .1 Lista
l: 1/ Obj ektum mutat6j na k az tadsa
2 , winclude <i ost rcam>
3,
4, class sjmpl eCat
5: {
6 : public :
7 : SimpleCat () ; II constructor
8 : SimplcCat (Simp lCat&) ; II msol 6 konstrukt or
9 : -Simpl eCat() ; II destruktor
10 : J ;
ll :
12: SimpleCat : : SimpleCat ()
13 : {
14 : std:: cout "Si mpl e Cat Constructor .. . \n";
15 :
16 :
12. 6ra A hivatk.omsokfl s mutat6kr61-
17 , SimpleCat , , SimpleCat(Simp1eCat &)
18 , (
19 : std, , cout "Simple Cat Copy Constructor ... \n";
20 ,
21 ,
22 , SimpleCat , , -Simplecat ()
23 , {
24, std, , cout "Simple Cat Destructor. .. \n" ;
25 ,
26,
27 : Simp!eCat Punctionane (SimpleCat theCat) ;
28 , FunctionTwo (SimpleCat *theCat) ;
29 :
30, int main()
31 ,
32 : std , : couL "Making a cat. .. \n" ;
33 : SimpleCut Frisky;
34: atd : : cout "Calling FunctionOne ... \n ";
35 , FunctionOnc(frisky);
36 : std , : couL "Calling Function'l'wo ... \n" ;
37 : FunctionTwo(&Frisky);
38 : return O;
39 :
40,
41 : II FunctionOne. rtk szerinti paramtertadssal
42 : SimpleCat theCat)
4] : (
44 : std: : couL 'Function One. Returning ... \n";
45: return theCat;
46:
47 :
48 : II functionTwo, passes by re ference
49: Simplecat* FunctionTwo (Simp1cCat theCat)
50 : {
51 : std :: cout 'Punction '!'wo . Returning ... \n" ;
52 : return thcCat ;
53 :
1 : Making a cat ...
2 : Simple Cat Constructor .
3: Cal l ing FunctionOne ...
4: Simple Cat Copy Cons t ructor .
5 : Function One . Returni ng ...
6 : Simple Cat Copy Constructor .
7: Simple Cat Destructor . .
8 : Simple Cat Destructor .. .
9 : Call ing PunctionTwo .. .
10 : Function '!'wo. Rcturning . .
ll : simple Cat Destructor ...
216 1111. rsz Memriakezels
Aprop
Sorszmok akimenetben
Az itt lthat sorszmok nem jelennek meg a csak az elemzs meg-
knnytse vgett tntetjk fel
Egy tdjesen lecsupasztott SimpleCat osztlyt deklarlunk a 4-10. sorban.
A konstruktor, a msol konstmktor s a destruktor mindssze egy-egy tmr zenet-
leJ jelzi a meghvst.
A 32. sorban a main () rtest a macska ltrehoz..'isrl , melyel a kimenet 1. sorban lt-
haTtlnk. A 33. sorban val6ban ltrejn egy simpleCat pld{IllY, mgpedig
a konstmktor rvn, melynek zenete a kimenet 2. sorban olvashat6.
A .,4. sorban a main () jelzi, hogy kthizl a FunctionOne () meghvsIra (ez a kimenet
3. sora). Mivel itt rtk szerinti pammtertads rrtnik, a simpleCat mlsolatt keH
ltrehoznia a programnak a veremben, hogy legyen a fi.lggvt!l1ynek egy sajt, helyi ob-
jektmna. Emiatt ismt meg1Lvdik a msol konstruktor (ez a kimenet 4. sor:a).
A vezrls a 44. sorra keri.il, :1 hvott fggvny tnsbe, ahol egy nyomjelz6 zenet r
dik ki (a kimenet 5. sorban). A fggvny kilp, s rtk szerint ad vissza egy Simple-
Cat objektumot. Emi:llt ismt meghv6dik a msol konst ruktor (:1 kimenet 6. sorban).
A FunctionOne () visszatrsi rtke nem rendel6dik hozz semmilyen vltozhoz,
gy a (vissz.1trsi rtkknt) ideiglenesen ltrejn objekrumot el kell dobnunk, :unit
a destmktor vgez el (ez a kimenet 7. sora). Ekkor a Funct ionOne () egyttal ki is lp,
gy a szmro. kszlt helyi objektummsolat rvnyt veszti, s ismt munkba lp
a destruktor (a mit a kimenet 8. sara mutat).
A vezrls visszakerl a fprogmmba, s (a kimenet 9. sora szerint) meghv6dik
a FunctlonTlo.>o (), melynek paramtere mr cm szerint addik t. Nem kszl mso-
lat, gy nincs is err6l zenet a kimenetben. A FunctionTlo.>o{ ) hrt aci sajt rutsr61
a kimenet 10. sorban, majd visszaad egy SimpleCat objektumot cm szerint (gy most
sincs nyoma konstnlktof vab'Y destruktor hvsnak).
Vgl II program kilp, Frisky rvnyt veszti s meghvja a sorst
destmktort, amit a kimenet utols sora nyugtz.
sszessgben elmondhat, hogy a FunctionOne () hvsa az rtk szerinti param-
tertads s visszaads miatt kt konstruktor- s kt destruktorhvst ignyelt, ezzel
szemben a FunctionTwo () hvsa egyet sem.
12. 6ra A hivatkozsokr61 s mutat6kr61- mlyebben 1217
Mutassunk konstansra
Br ktsgkvl hatkonyabb dolog mutal6t tadni FunctionTwo () *nak, ez nem teljc*
st:n veszlytelen. a fggvnyt61 ugyanis nem vrjuk az tac10tt SimpleCat () ob*
jektum megv{lltoztatst, mgis t.adjuk neki a dmt. Ez tesz akr tiltott v[*
toztats! is, s meghistja az rtk szerinti knlta vdelmet.
Az rtk szerinti pammtertads hasonlt ahhoz, mint amikor valaki rltve m-
kincse helyett annak fnykpt adja a mzeumnak. I-Ia a vandlok meg is rongljk,
az eredetit semmi krosods nem ri. A dm szerinti paramtertads ezzel szemben
olyan, minth:1 :1 l:lkcimnket kldennk el a mlzeumnak azza l a biztatssal, hOb'Y ir-
nytsk csak hozznk nyugodtan a ltogatkat, hogy mcgnzhessk az eredeti kincset.
J-Ja egyszerre szeretnnk lvezni az rtk szerinti paramtertads biztonsgt s a cm
szerint.i paramtertads hatkonysgt, konstans mutat6val kelJ tadnunk a Sil1\ple
Cat objektumot. Ez meggtol nlinden nemkonstans metdushvsI, gy ke1!6 vdelem-
ben rszesl SimpleCat objekrunmnk. A 12.2 Lista ezt mutatja be.
o: II 12 . 2 Lista
l : II Objektum konstans mutAtjnak az tadsa
2: .include <iostream>
3 ,
4: class Simpl eCat
5 : (
6: public :
7: SimpleCat () ;
8: simpleCat(SimpleCat&) ;
9 : -SimpleCat();
10 :
ll :
12 ,
13 :
int GetAge () const
void SetAge(!nt Age)
14 : private :
15 , int itsAge;
16: } ;
17 :
18 : SimpleCat: : SimpleCat ()
t9 : {
return itsAge ; }
( itsAge = age; )
20 : std: :cout Simple Cat Constructor ... \n" ;
21 : itsAge = l;
22 :
23 :
24: SimpleCat : : SimpleCat(Simplecat&)
25 : {
26 : std : :cout "Simple Cst Copy Cons tructor ... \n ";
27 :
28 :
218 1111. rSZ M,m6ri.k",ls
29 : SimplcCat : : -Simpl eCat ()
30 : (
31 : std:: cout 'Simple Cat Destcuctor ... \n' l
32 :
33 :
34 : const Simplecat * const
35: F'unctionTwo (cons t SirnpleCa t * const theCat);
36:
37 : int main()
38 :
39 , std : : cout 'Making a cat .. . \n" I
40 : Sirnpl eCat Fr isky l
41 : std: : cout 'Frisky is "I
42 : std :: cout Frisky . GetAge() "ycars old\ n"1
43 : int age" 5 ;
d4 : rcisky . SatAge(age) ;
45 : std,: cout 'Frisky i s 'I
46 : !:Itd :: cout Fri s ky . GetAgc( ) ycar s o l d\ n"1
47 : otd : : cout "Call i ng Functlon'T'wo ... \n " ;
48 : FunctlonTwo(&Frisky) ;
49 : std:: cout "Frisky is ";
50 : std : :cout Frisky . GetAge() ' years old\n" ;
51 : return O I
52 :
53 :
54 : II functionTwo, konstans mutatt kap s ad vissza
55 : const SimpleCat .. const
56 : FunctionTwo (const Simplecat * const theCat)
57 : {
58 : std: :cout "Functlon Two . Returning ... \n" ;
59: std: : cout "Frisky is now " theCat->GetAge()I
60: std : :cout ' years old \n' ;
61: II theCat->SetAge(8); const!
62: return thecat;
63:
Making a cat ...
Simple Cat Constructor ...
Frisky i s 1 years o l d
Frisky i s 5 years o l d
Calling Funct i onTwo ...
Function Two . Returni ng .
Frisky i s now 5 years old
Frisky is 5 years old
Simple Cat Destructor . .
12. 6ra' A hivatkozsokr61 s mutatkr61 - mly.bb.n 1219
A SirnpleCat szmra kt hozzfr6 fggvnyt deklarltunk: a GetAge () -el a 11. sor-
ban, amely konstans fggvny, s a SetAge () -et a 12. sorban, amely nem az. Van egy
sajt tagvltozja is, a 15. sorban deklarlt egsz itsAge.
A konstruktor, a msol konstn Jktor s a destrukwf gy lett megrva, hogy kirja a sajt
nyomje\z6 zenetl. A msol konstruktor azonban sohasem kerl meghvsn:I; prog-
ramunkban ugyanis csak dm szerinti paramtertads tnlmik, s ehhez nincs szksg
msolat ksztsre. A 4Q. sorban ltrejn egy macska; az alaprtelmezeu letkort ki is
nyomtat ja a 41-42. sor.
A 44. sorban a SetAge () segtsgvel t!1ljuk a kort 5-re, s az en..>(lmf:nyt
megjelentjk a 45-46. sorban. A FunctionOne ( ) -l nem haszn:ljuk ebben a program-
ban, csak a FunctionTwo () -t, amelyet egy kicsit trtunkj a 34. s 35. sorban lthatjuk
visszatrsi rtkt s tadand6 paramter6t: mindkett6 egy konstans objektumra utal6
konstans mutat.
Minthogy az tadand pammter s a visszatrsi rtk is cm szerint kerUl ,tad:'isl"""d ,
nem kszlnek m:'isolatok, s nem hv6tlik meg a msol konstmktor. A Function-
TwO () -beli mutat azonban konstans, gy nC:!m lehet bel6le meghvni a nemkonsta ns
SetAge () -et. Ha az ezt megksrl6 61. sort kivesszk a megjegyzsb61, nem fordul Ic
a program.
rdemes megIIgyeini, hogy a main () f6programban ltrehozott Frisky objektum nem
konst:ms, gy pldul tJlthat a kora, meghvhat6 r a Setll.ge () . Ennek
a nemkonstans Frisky objektumnak a eimt kapja meg a FunctionTwo (), s mivel ez
gy lett dC:!klarlva, hogy konstansra hivatkoz ll1utat6ra szmt, az objektumot kons-
tansknt fogja kezelni!
Hivatkozsok, mint a mutatk knyelmes altematfvi
A 12.2 Lista megoldja a felesleges msols (s ezzel a msol konstmktor s destruktor
indokolatlan meghvsnak) problmjt. Konstans objektumra mutat konstans muta-
t6t hasznl, gy nem kell tartanunk att61, hogya fggvny jogosulatlanul megvlloztatja
a paramterknt tadott objektumo{ka)t. A mdszer azonban mg mindig nem tl ele-
g ns, mivel mgiscsak mutatkat kell tadnunk a fggvnynek.
Mivel azt is tudjuk, hogy az tadand paramterek nem lesznek null
knnyebb lenne az let, ha mutatk helyett hivatkozsoka t adhatnnk t. A 12.3 Lista
ennek szellemben korriglja a 12.2 Listt.
220 1111. rsz Mem6riakezels
o: II 12.3 Lista
1: II Objektum hivat ko zsnak az tadsa
2 : ftinclude <lostream>
3 ,
4: class SimpleCat
5 : {
6 : public :
7 : SjmpleCat() ;
8 : Simp leCa t (SimpleCat&) ;
9 : -simp1eCat() ;
10 :
ll:
12 :
13 :
int GetAge () const
void SetAgc( int age)
14 : private :
15 : int itsAge:
16 : ) ;
17 :
18 : simpleCat : :Simp1eCat()
19 : (
return itsAge : }
{ i tsAge age; )
7.0 : std: : cout 'Simple Cat Constructor ... \1'1 ';
21 : itsAge = 1 ;
22:
23:
24 : SimpleCat: :Simplecat(Simp1eCat&)
25 : (
26 : std: : cout "Simple Cat Copy Constructor ... \n";
27 :
28 :
29 : Simp1eCat : : -Simplecat ()
30 : {
31 : std : : cout 'Simple Cat Destructoc .. . \n' ;
32 :
33 :
34 : const SimpleCat & Func tion'l'wo (const SimpleCat & theCat) ;
35 :
36 : int main()
37 : (
38 : std :: cout 'Making a cat ... \ n ';
39 : Simpl eCat Fr i s ky;
40: std : : cout "Frisky is ' Frisky . CetAge()
41 : ' years 01d\n' ;
42 :
43 : int age", 5;
44: Frjsky.SetAgc{age) ;
45: std: : cout 'Frisky is ' Fri sky . GetAge()
46 : ' years 01d\n' ;
4 7 :
48: std : : cout 'Ca11ing FunctionTwo ... \n" ;
49 : FunctionTwo(Frisky) ;
50 : std: : cout "Frisky is " Frisky.Geti\ge()
12. 6ra A hi_omokrl s mutat6krl- 1221
51: years old\n" ;
52 : return O;
53 :
54 :
55 : 1/ functionTwo. konstansra utal6 hivatkozst kap s ad vissza
56 : const SimpleCilt & FunctionTwo (const SimpleCat (. theCat l
57 : (
5B : std :: cout ' Punction Two. Returning ... \n' ;
59 : std: : cout 'Frisky is now ' theCa t . GetAgc()
60 : years old \n";
61 : /1 thecat . SetAge(B); const!
62 : return theCat;
63 :
Making l cat . ..
Simple eat constructor ...
Frisky lS 1 yoars old
Frisky is 5 years old
Calling FunctionTwo
FunctionTwo . Returning ...
Frisk.y is now 5 years old
frisky is years old
simpl e eat Destructor ...
A kimenet megegyezik a 12.2 Listval. Az egyetlen emJlt!sre mlt6 klnbsg az,
hogy most a FunctionTwo () fggvny konstans objektumra utal hiv,ltkoz{lsl vr s
ad vissza. Ezen II pldn is lthatj\lk, hogy hi vlltkoz.'isokkal knnyebb dolgozni, mint
mutat6kkal ; a konstansok ltal elrhct6 nyeresg, hatkonysg s hizlonsg azonban
itt is megval6su1.
Mikor hasznljunk hivatkozsokat,
s mikor mutatkat?
A C++ programozk ltalban sokkal szvesebben hasznlnak hivatkozsokat, mint
mutat6kat, mivel ezek tlthat6bbak s hasznJhat6bbak. A hivatkozsokhoz azonban
nem lehet j objektumot hozzrcndeJni. Ha a program futsa kzben vltoztatni kell
II clobjektumon, knytelenek vagyunk mutatt hasznlni. A hivatkozs nem lehet
null gy, ha van esly arra, hogy aclobjektum nul1z6dik, akkor sem tudunk
hivatkozst hasznlni, csak mutatt. Ha a dinamikus memribl szeretnnk terletet
foglalni, akkor is mUlatkra van szksg, ahogy arrl az rkon mr sz volt.
222 1111. rsz' Memriekezels
Ne adjunk vissza objektumra mutat
hivatkozst!
Ahogya C++ programozk megtanuljk a eim szerimi par.lmtertadsl, vrszemet
kapnak, s id6nknt hajlamosak tlkompenzlni ifjkori lvedseikel. Ne lvesszk
szem eid!, hogya hivatkozs csupn egy nvvllOZ<l l. amely egy msik objeklumra
utaL I la egy hivatkozst adunk vagy vesznk t egy fggvnyt6J, mi ndig krdezzk
meg nmagunkat: . Mil yen objektumot lczok is most? U:tezik az mg
A 12.4 Lista rmutat, mi lyen veszlyes is lehet egy mr nem objektum hivatkoz-
snak II visszaadsa.
12.4 Lista - Nemltezli objektum hivatkozinak vi81zaads. (returnref.cpp)
0, II 12. 4 Lista
l : II Mr nem ltezo objekLwnra mutat6
2: 1/ hivatkozs visszaadsa
3: 'include <iostream>
, ,
5: class SimpleCat
6: {
7, public:
8: SirrrpleCat (int age, int weight);
9 : -SimpleCat () (l
10: int GetAqe() ( return itsAge; )
ll: int GetWeight() ( return itsWci9ht;
12 : private :
13 : int itsi\ge ;
14 : int itsWeight ;
15: ):
16 :
17: SimpleCat :: SimpleCat(int age, int weight) :
18 : itsMe (age), itsWeight (weightl {)
19:
20 : SimpleCat &TheFunct ion() ;
21 :
22: int main()
23 :
24: SimpleCat &rCat = TheFunction() ;
25 : int age = rCat . GetAge() ;
26 : std :: cout "rCat is age years old!\n" ;
27 : rcturn O;
28 :
29 :
30 : SimpleCat &ThcFunction ()
31 : (
32 : SimpleCat Pr isky (5 ,9 ) ;
33 : rcturn Frisky;
34 :
I s mutatkrl
A 12A Lista rordtsakor az albbi hibazenenel szembeslnk
"returnref.cpp , E2363 Attempting to return a reference to local variable
'Frisky' in function TheFunction() at line 3]
(Azaz; E2363 A 'Frisky' helyi vltozra utal hivatkozs visszaadsi k-
srlete a 111cFunctionO fru,'v6nybcn, a :$3. sorban)
Figyelem!
Intelligens fordft6programok
Vannak intelligens fordft6programok, melyek szreveszik a (null ) objek-
tumra utal hivatkozst, s hibt jeleznek, mint ahogy ez itt is ltszik. Ms fordt6k
azonban ilyenkor is lefordftjk a programot, s ellltjk a futtathat kdot. Fontos
tisztzni, hogy itt az alkalmazott programozsi gyakorlat a rossz, vagyis nem rde-
mes olyan fordtt keresni, amelyikkellefordul az ilyen program. A Borland s
a g+ + pldul okos fordft6programok. Hibt jeleznek, ahogy az fent is ltszik.
Az 5-IS. sorban deklarljuk a SimpleCat osztlyt. A 24. sorm.k az lenne a feh.data,
hogy ltrehozzon egy olyan hi vatkoz;'ist, amel yet a TheFunction () visszatrsi rtk:-
"el inici<lliz.1 Iunk. Ezt a 20. sorban gy dcklar-Jltuk, hogy egy SimpleCat hivatkozst
adjon vissza.
A TheFunction () tm;e ltrehozza a SimpleCat egy helyi pldnyt, s iniciali zlja
anml k kort s slyl. Ez a helyi objektum lenne a cm szerinri vissz:nrsi rt k.
A jobb fordt6progrmnok elcs pik ezt a ksrletet s nem hoznak ltre futtat hat prog-
ramot, mg Illsok lefordt jk, pedig megjsolhatatlan a futs kimenetele. Amikor
a TheFunction () kilp, Frisky (bizton llthatom, fjdalommemesen) l-
tezni. A fggvny lt al visszaadott hivatkozs nemJtez6 objeklurnra utal, ami rossz.
A dinamikus memriaterleten ltrehozott
objektumra mutat hivatkozs visszaadsa
Szeretnnk kijavtani a returnref . epp programunkat (12.4 LiSL1).
Csbt6 lehetsg, hogya TheFunction () segL'igvel a dinamikus mem6riaterleten
hozzuk ltre F'risky mllcskt, hiszen ily mdon letben marad a fggvnybl val6
visszatrs utn is.
Ezzel a megkzeltssel lve azonban felmerl a krds, vajon ki gondoskodik majd
224 1111. rsz
a Frisky ltal lefoglalt mem6riaterletrl, ha mr nincs r szksg. Ezt pldzza a 12.5
Lista.
O, I I 12. 5 Li s t a
1 : II A mem6riaelszivrgs jav tsa
2 : II includc <iostream>
3 .
4 : class SimpleCat
5 : {
6 : public :
7 : SimpleCat (int age, int weight) ;
8 , -SimplcCat () ()
9 : int GetAge() { rcturn itsAge ; }
10 : i n t GetWeight() ( return itsWeight;
11 :
12 : pr i vate :
13 : i nt itsAge ;
14 : int itsweight ;
15 : ) ;
16 :
17 , SimpleCat : , SimpleCat(int age, int weight) :
18 : itsAge(age) , itsweight(welght) fl
19 :
20 : SimpleCat" TheFunction() ;
21 :
22 : i nt main ()
23 : (
24 : Simp lcCa t &. r eat = TheFunction ();
25 : i nt age = rCat . Get Age( );
26 : std: : cout "reat i s age years old! \n";
27 , std: : cout ''-rCat : &reat std: : endl ;
28 : I I How do you get dd of that memory?
29 : SimpleCat pCat = &rCat ;
30 : delete pCat ;
31 : II Huha , ezek utn mire utal az rCat??
32 : ret urn O;
33 :
34 :
35 : SimplcCat &TheFunc ti on ()
36 : {
37: SimpleCat * p Frisky " ne w SimpleCat (5 , 9) ;
38 : std : : cout "pFrisky: p Frisky s td: : end !;
39 : return *pFrisky ;
40 :
pFrisky: 8861880
Az rCat 5 ve!; !
&rCat : 886 1880
12. ra A hivatkozsokfl s
Az olvas ltal kapott kimenet msknt fog kinzni, hiszen minden szmtgp
cmen trol ja a vl tozkat, attl fgg6en, hogy mi van a memriban s hogy mennyi
az szabad hely. Ehhez hasonl t is kaphatunk teht:
pFrisky : Ox00431CAO
Az rCat 5 ves!
&rCat: Ox00431CAO
Figyeleml
Gondoljuk t, mit trlnk!
A fenti program szpen lefordul s ltszlag jl Csak ppen egy idztett
bomba ketyeg benne ...
A TheFunct ion () rm.:gvllOZI:ltluk; immr nem egy helyileg ltrehoi'.oLt ob-
jektum hivatkozst adja vissz<I. A 37. sorban egy mutat6val dinamikus memriaLerletet
roglalunk le. Az ll:lla r'yilvnl:lrtoll memriacmet kinyomtatjuk, majd a mulat felold-
sa utn visszatrsi rtkl adjuk SimpleCat objektumunkat, mghozz cm szerint.
A 24. sorban :l TheFunction () visszatrsi nkvel inicializ:'ilunk egy frissen dekl a-
rlt hi vatkozst rClIt nven. Ennek a macsknak az letkort adjuk t egy egsz vlto-
znak a 25. sorban, amelyet ki is nyomtalunk a 26. sorban.
Annak igazol:'is.r3, hogya f6progmmban deklarlt rCat hi vatkoz.s ugyanarr3 az ob-
jektumm mulat, mint amit a TheFunction () ltrehozott a dinamikus memriban,
a .cme!' operntoTl alkalmazzuk az rCat -re. Minden ktsget kizran megegyezik
a kt kinyomtmotl mem6riacm, vagyis az rCat hivatko7..sa s a di na mikus mem6riate-
rleten korbb'Ln lt rehozott macska azonos.
Eddig rendben vagyunk. De hogyan szabaditjuk fel vgl a macska Jtal lefoglalt me-
m6ri:Herletet? Hi vatkoztlsra nem lehet trlst (delete) alkalmazni. Egy agyafrt meg-
olds: hozzunk ltre egy msik mutatt, inicializljuk az rCat-t6J kapott memriadm-
re, majd trljk. Ez relsi'.abadtja a lefoglalt memrit s megsznteli a mem6riaelszi-
vrgst. Van azonb,Ln mg egy kis problma: mire utal az rCat a 31. sor mn? Kor"b-
ban gy fogalmaztunk, hogya hivatkozsoknak objekrumra kell utalnia.
Ha (null) objektumra utal egy hivatkozs, lrunt most, akkor a program r-
vnytelen.
Figyelami
objektumok
Nem lehet elgg hangslyozni, hogy a objektumra hivatkoz program
rvnytelen, s futsnak kimenetele megjsolhatatlan.
226 1111. rsz Mem6riakezels
Valjban kl megoldsa is van a problmnak. Az egyik az, hogy a fggvnyt61 magt
a mem6riacmre utal, 37. sorban ltrehozott) mutat6t krjk el vissz.mrsi
nkknt. Ezutn a hv program trlheti a mutatt, ha nincs r tbb szksge. En-
nek vghezvitelhez vltoztassuk meg a TheFunc t ion () fggvny visszatrsi nkt
(hivatkozs helyett) mut;ltra, s a feloldott mut:l t helyett adjuk vissza magt a rnuta16t:
Simpl eCat TheFunction()
(
Simp!eCat pFrisky = new SimpleCat(S, 9) ;
std: : cout 'pFrisky : pFrisky std: : e nd !;
ret urn pFrisky ; 1/ Magt a mutat6t adjuk vissza
A msik (elegnsabb) megolds: a macska objektumot mg a hv fggvnyben hoz-
zuk ltre, s cm szerint adjuk l a TheFunction () -nak. E megolds szpsge, hogy
a hv fggvny foglalja le a szksges memri aterOletet, az mar-J.d
nek felszabadtsa is. A sorokb61 kiderl, mirt kvnatos ez gy.
Mutat, mutat, k.i a mutat?
Amikor progr-dmunk lefoglal egy szeletet a dinamikus memribl , visszakapunk egy
erre hivatkoz mutatt. Musz:'tj megtartanunk ezt a mutat!, mert ha elvsz, a
szelel tbb nem szabadthat fl; mem6riaelszivrgs keletkezik.
Amikor a fggvnyek egymsnak adogatnak egy memriaszeletet, valamelyik
vny a mUlat lulajdonos;'\nak tudhatja magl. ltalb:m cm szerint keri.11 tadsm
a memria tartalma, l!s annak a fggvnynek a dolga lesz felszabadt:lni a mem6rb sze-
letet, amelyik lefoglalta. Ez azonban csak egy javasolt sZ:lb;'\ly, nem brmi {lTon ktele-

Meglehetsen veszf:lyes valamely fggvny ltal lefoglalt memriatetiilet
st egy msik fggvnyre bzni. Ha nem hogy melyik a mutat,
ez kt csapdt is rejthet: elfelejtjk trlni vagy tbbszr is trljk. komoly
gondokat okozhat a programban. Biztosabb gy megrni a fggvnyeinket, hogy :lme-
Iyik lefoglalja a memriaeimct, az legyen a felszabadlja is.
Ha olyan fggvnyt r az olvas, amelyben ltre kell hozni valamit a dinamikus mC1l16-
riaterOleten, majd ennek eimt vissza kell kldenie a hv fggvnynek, fontolja meg
a kezelfellet megvltoztatst. Legyen a hv fl feladata amemria lefoglalsa - ez
adja t a eimpar.lmlert fggvnynknek. Ezzel a memriakczcls
ge a hvon fggvnye n kfvlre kerOl; ahhoz a fggvnyhez, melynek egybkt!nl is ne-
mes feladata a felszabadts megszervezse.
12. 6ra A hivatXozsokrl s mutat6kr61- mlyebben 1227
Helyes
Akkor hasznljunk rtk szerinti pa-
ramtertadst, ha musz.1j.
Akkor adjunk viSS7.a rtket egy fgg-
vnyMI, ha muszj.
Krdsek s vlaszok
HelyteIon
Ne hasznljunk cm szerinti tadst,
ha nem nyilvnval6, hogy ltezik
a hivatkozou objektum.
Ne hasznljunk objekmm-
ra utal hivatkozst.
Krds: /vfit!r' hasznlj/mk lIIutatkat, ha egyszen7bbek CI hiva/kozsok?
Vlasz: A hivmkozsok nem utalhatnak objektumra, s nem lehet6kr.:t jF.!
felhaszn::j lni. A mutatk n.lg:llm:LS;Lbbak, dc valamivel nehezebb a hasznbtuk.
Krds: Mil1 adju nk ,lissza b/'ll/iI ls nk szedI/! egy faggvll)'oo/?
Vlasz: Ha helyi objektumot kell visszaadnunk, akkor knytelenek va
gyunk az rtkt visszaadni, mert egybknt objekrumra utal6 hivatk07.st
adnnk vissza.
KrdC"S: lia ilycn veszlyt"S a Ililxlfkozs visszaadsa, min nem hasznlj/lk mindig
az l1k szerimi visszaadsI?
Vlasz: Sokkal hatkonyabb programokat lehet rni hivatkozs visszal.ldsval. Keve-
sebb mem6ria kelt hOZ7., s gyorsabban fut a program.
Gyakorlatok
Most, hogy mlyebben megismerheLtk a mutatk s hivatkozsok hasznlatftl, vla
szol junk nhny knlsre s oldjunk meg nhny feladatot ludsunk mcgszitrdts:l
vgeU!
Kvz
1. Mirt jobb a cm szerinti paramtertads na!,'Y adalmennyisg esetn?
2. Mirt lehet rdemes const mutatt hasznlni a cm szerinti paramtertadskor?
3. Mirt lehet j hivalkozs helyett mutatt hasznlni a dm szerinti paramtert-
adskor?
4. Lehet-e hivatkozst kszteni eb'Y mutat tpus vltoz6ra?
228 1111. rsz Mem6nakezels
Feladatok
1. Bontsuk hrom rs7:re :l passobjectsbyref. cpp progmmot 02. 1 Lista) gy,
hogy maradjon meg eredeti nven a s a flli,'Vnyek megval6stsa
(Passobj ectsbyref. cpp), az osztlymet6dusok kerljenek t egy kln fjiba
(SimpleCat. cpp), s legyen egy fejlcllomny is az oSltly-deklarcikbl
(SimpleCat. hpp). Vegyk fel a SimpleCat. cpp-l a projektllomnyok kz, s
fordtsuk le a programot! Ez azt szemllteti, hogy hogyan lehet megosztani
az osztlyknyvUrakat. A tagfgf,rvnyek leFordthat6k s a gpi nyelv(!' prog-
ramk6d a rcjldllomnnyal (benne a fggvnyprolotpussal) egyiin
a termelkenysg javL'isra.
2. Mdostsuk Clgy ,t lcaky. cpp progmmOl 02.5 Lista), hOh')' az mutatkat hasz-
nljon a TheFunction () hvsakor, majd trlje a mUI,Hkal a memriaelsvr-
gs kivdse rdck6ben!
3. MdosLo;uk gy a pUI:lDobjectsbyref . cpp s a passre[toobj. cpp (12.1 s
12.3 Lista) programokat gy, hogy azok nyorntassak ki a vltozk memriaci-
meit a fggvnyhvsok el6tt s utn! Ezzel betekintst nyerhetnk a Iamlit md-
szerekbe.
Vlaszok a kvfzkrdsekre
L Az alaprtelmezett al. rtk szerint par.lrnter.'itads. Ekkor m{tso!atot kell ksz-
tt::ni al. tadand objcktumokr61. Nagy objektl.lmoknl ez szmottev6 idet s me-
mrit ignydllcl.
2. A const kulcssz alTa utastja a fordt6programot, hogy tiltsa meg a bVOIl fgg-
vnynek a mulat ltal hivatkozott rtk megvltozt3tst. gy a msols klts-
gei nlkl is rvnyesl az rtk szerinti paramtertads biztonsga.
3. Ha a hvott fggvny dinamikus memrit foglal le, ennek cime viss7.akldhet6
a hv flnek egy mulat segtsgvel. Nem szabad azonban elfelejteni
a lefoglalt memria fc1sl.abadtst, hogy kikszbljk a memriaelszivrgst.
4. Mirt is ne lehetne? Azonban rdemes megfontoltnak lenni e tren, mert egy
ilyen hivatkozs sok zavart okozhat, Gondoljl.lnk ugyanis bele, hogy mr magl.lk
a mutatk is elg fejtrst okozhatnak.
IV. RSZ
Halad eszkzk
13. ra A fggvnyek ki fi nomultabb hasznlata
14. ra Opertorok tlterhelse
15. ra Tmbk
13. RA
A fggvnyek kifinomultabb
hasznlata
Ebben az rban a sz:
Hogyan k:hCl II tagfggvnyeket llterhelni
Hogyan rjunk olyan fggvnyeket, amelyek dinarnikusan kezelt vltoz6kkal
osztlyokat is tmogatnak
Hogyan ini cializljunk klnrle objektumokat
Hogyan lehet msol konstruktorokat rni
Tlterhelt tagfggvnyek
Az S. rban lthattuk, miknt lehet megval6stani a fggvnyek lbbalaks<gt (azaz
a fggvnytlterhelst) az.1hal, hogy tbb fgb'Vnyt hozunk ltre azonos nven, k-
pammtcrekkcl. Az osztlyok tagfgf,,,,nyeil is hasonlkpp lehet tlterhelni.
232 1 IV. rsz Halad eszkzk
A 13.1 Listban szerepl6 Rectangle osztlynak kt DrawShape () fggvnye is van.
Az egyi k nem kr paramtert; ez az osztly pillanatnyi adatainak megfelel6en rajzol
egy tglalapoc. A msik kt paramtert kr: a szlessget s a hosszsgot, s - elte-
kintve az osztly akmlis adataitl- ezek alapjn rajzolja meg a tglalapol.
13.1 Usta - Tagfggvnvak tharhelse (overloadfunctions.cpp)
o: II 13.1 Lista II Egy osztly tagfOggvnyeinck tlterhelse
1 : tinclude <iostream>
2 ,
3 : II Rectan9lc osztly-deklarci
4 : class Rectangle
5 : (
6 : public :
7 : II KonsLruktor
8 : Rectangle(int width. int height);
9 : -Rcctangl e () ( J
tO :
11 : II Tlterhelt tag fggvnyOnk : a DrawShape
12 : void OrawShapc() c o n ~ t
13 : voId OrawShape(int aWidth , int aHeight) const ;
14 :
IS : priV/lltl".! :
16 : int itsWidth;
17 : int itsHeight ;
18: };
19 :
20 : 1/ A konstruktor mcgva16sitsa
21 : Rectangle: : Rectangle(int width, int heightl
22 : (
23 : itsWidth : width;
24 : itslleight - height;
25 : J
26 :
27 :
28 : II Az egyik tlterhelt DrawShape nem kr enni
'-9 : II Az osztly pillanatnyi rtkei szerint rajzol t glalapot
30 : void Rectangle: : DrawShape() const
31 : (
32 : OrawShapc( itswidth. itsHcightl ;
33 : )
34 :
35 :
36: 1/ A msik tlterhelt DrawShape kt paramtert kr
37 : II A kt adaL alapjn rajzolj a a Lgldiapol
38 : void Rectangle: : DrawShape (int width, int heightl const
39 :
40: for (int i '" O; i<height; i H)
41: {
42 :
43 :
44 :
for (int j '" O; j< width; j++l
{
std: : cout ".';
45 :
46 :
47 :
48 :
49 :
std : :cout "\n" ;
13. ... A kifinomultabb hasznlata
50 : 1/ A tlterhelt fggvnyek bemutatsa a foprOgramban
51 : int
52 : (
53 : /1 30 ; 5 - re inicializljuk az egyik tglalapot
54 : thcRcct(30,5);
55 : std : : cout "DrawShape() : \n ";
56 : theRect . DrawShape () :
57 : std:: cout "'nDrawShapc{40,2): \n" ;
58 : LheRecL.DrawShape( 40,2) ;
59 : reCurn O;
60 :
KImenet
DrawShape ( ) :
*
...............................
DrawShapc(4.0, 2) :
A fenl lista lt!gfonlosabb k6drszlele a sorban tallhat6, ahol a DrawShape ()
fggvnyt llwrhdtnck deklarljuk. Tlterhelt osztlyfggvnyeinket a 28-48. sorban
valstjuk meg. Figyeljk meg, hogya paramter nlkli vltozat cgyszenen meghvja
a ktparamteres vltoZ:ltOL a7. aktulis tagvltoz-rtkeivcl. rdemes kem-
nyen taltani magunkat ahhoz, hogya kt fggvnyben ne ismtclji.\nk k6drszJetet,
mert gy igen nehz a vltm:LaLliokal Slizehangolni, s ez szmtalan hiba le-
hct6sget tartogrtl.
Az 50-GO. sorban lthat ltrehoz egy Rectangle tgla lapot, majd meghvja
a DrawShape () fggvnyt, paramter nlkl, majd kt egsz szmmal.
A fordtprogram dnti ej a paramterek szma s tpusa alapjn, hogy melyik met6-
dust hvja meg. Icnnc ch')' olyan DrawShape () fggvny is, amely szintn
kt paramter krne: egy hosszsg s egy felsorolsos tipust, amely rt fel-
hasznl kvnsgnak lehetne szlessg vagy hosszsg.
234 l iV. rsz Halad asz!<zk
Alaprtelmezett rtkek hasznlata
Ahogyanannl fggvnyeknek is lehet alaprtelmezett paramterilk, ugyanez a hely-
zet tagfggvnyekkel is. Megadhatunk alaprtelmezett rtkeket a dcklarci6kor, amint
azt a 13.2 Lista bemutatja.
13.2 UsI. - Alap6rtalmazett rtkek megadsa (usingdefautts.cpp)
o: / I 13 . 2 Lista / I Alaprtelmezett rtkek a tagfQ'l1Vnyekbcn
l : #include <iostream>
2 .
): II Rectangle osztly-deklarci6
4 : class Rect.angle
5 : (
6 : public :
7 : II Konstruktor
8 : Hectanglc(int width, int height) ;
9 : -Rec t angle () (}
10: void DrawShape(int aWidth, int aHeight .
ll : bool UscCurrentVals = false} const ;
12: pdvale :
l) ,
14:
15 : J ;
16:
int itsWidth ;
int itsHeight ;
11: II A konstruktor megva16sitsa
18 : Rectangle : : Rect.anglc(int width, int heightl :
19 : itsWidth(widthl , II inicializls
20 : itsHeight(height)
21 : (j 110res fUggvnytOrzs
22 :
23 : II A 3 . paramter helyn ll rtk 6rtc1mezse
24 : void Rectangle : : DrawShape{
25 : int width,
26 : int height ,
27 : bool UscCurrentValue
28 : ) const
29 :
30 : int printWi dth ;
31 : int printHeight ;
32 :
33 : iC (UseCurrentValue "':o true)
34: (
35 : printWidth", i t sWidth; II Hasznlja az osztly pillanatnyi rtkeit
36 : printHeight :o itsHeight;
37 : )
38 : else
39 :
40 : printWidth", width; II Hasznlja a megadott paramtereket
41: printHeight = height ;
42: j
43:
13. 6ra
44 : for (int i = O; i<printHeight; i H )
45 :
46:
47 :
48 :
49 :
50 :
51 :
52 :
53 :
for ( int j = O: j< printWidth: jH)
t
s td: : cout ~ ;
std: , eout "\ n';
54 : II A tlterhelt fUggvnyek bemutatsa a foprogramban
55 : int main()
5 6 : {
57 : II 30;5 - re inicializljuk a z egyik tgla1apot
58: Rectangle theRect(30,5);
59 :
60 :
6l :
62 :
63 :
64 :
menet
std :: cout 'OrawShape(O,O,truQ) .. . \n" ;
theRect . OrawShape(O , O. truQ) ;
!:ltd : : cout "Or-awShape(40 , 2 ) ... \n";
theHect. DrawShape (40,2) ;
return O;
OrawShape(O,O , true) ...
~ * ** ***
_ *

DrawShape(40, 2) ...
~ * *.* ** * o *. 0 *
A 13.2 lista a DrawShape () fggvny tlterhelse helyen <llaprtelmezeu rtkekkel
felruhzott egyetlen fggvnnyel dolgozik. A fggvny deklarcija a 10-11. sorban
van, mely szerint hrom pammterr vr. Az ds6 keu6 (a szlessg s hosszsg) egsz
sz. .. 'im, a harmadik (amely arm uwl, hogy hasznljunk-e alaprtelmezett rtkeket) logi-
kai tpus (igaz vagy hamis), mely alaprtclmezsknt hamism van lltva.
A fggvny megval6stsa a 29. sorban kezd6dik. Ha a harmadik (useCurrentValue)
paramter iga:.:, akkor az itswidth s itsHeight tagvltoz6kal adjuk rtkl a helyi
printWidth, ill etve printHeight vltoz6knak.
236 I IV. rsz Halad eszkzk
Ha ellenben a UseCurrentValue hamis - akr azrt, mert nincs is Cs hamis az alapr-
telmezs), akr azrt, mert a felhasznl azt adta meg - akkor a kl paramter
al apj n llt juk be a printWidth s a printHeight rtkt.
Fi gyeljk meg, hOb'Y ha a UseCurrentValue rtke igaz, akkor senkit nem rdekel
a msik kt paramter rtke.
Hogyan vlasszunk a tlterhels
s az alaprtelmezett rtkek hasznlata kztt?
A 13.1 s a 13.2 Lista ugyanazt a feladatot oldja meg, de az hasznlt tlterhelt
fggvnyeket egyszenbb megrteni s hasznlni. Ha esetleg egy har-
m:ldik fggvnyvllozal ignye is felmerl (pldul a felhllszn16 szeretne egy olyat is,
mclybcn csak a szlessget vagy csak a hosszsgot adjuk meg, de nem mindkeu6t),
:Ikkor is knnyebb ki terj eszteni a tilerhelt fggvnyeket. Az alaphtdmezett t'! rtkek
hasznlata hamar elbonyol6dhat az utlagos hozztold(lsokkal,
Hogy,ln lehet eldnteni, hogy tLllterhelt vagy
rdemescbb-c hasznlni? Ime egy gyors irnymutats:
Hasznljunk fggvl: nytlterhelst, ha
Ni ncs {:sszer al:l pl1elmezeu rtk.
Klnbz<l eljrsokra van szksg az egyes VltOZ<1tOknl.
paramterlistkat szeretnnk tmogatni.
Konstruktorok tlterhelse
A konstruktorok, mint minden ms tagfggvny, tlterhelhet5ek. Ez nagy hats s ru-
galmas eszkzt ad keznkbe.
I [a pld{IU[ ktfle tglalapkszt6 konstruktorunk vanj az egyiknek l lehet adni para-
mterl a adatprt, :I msiknak viszont nincs szksge r, akkor
a fordtprogram "szerint hoz ltre ilyen v:lgy oly:ln tglalapot, ahogy II megadott para-
mterek szma s tpus diktlja (mint brmely ms tlterhelt fggvny esetben).
A konstruktorokkal ellenttben a destnlktorokat nem lehet tlterhelni. A destruktorok
paramter-szignatrja (deklarcija) mindig ub'}' an3Z: az osztly neve, el6tte egy
hullm(-) jellel, s nem adhat meg pammter.
13,6ra
hasznlata 237
Objektumok inicializlsa
Mostanig az objekrumok tagvltozit a konstruktor trzsben inicializltuk. A konstruk-
toroknak azonban kl rsze van: a kezcl6rtklista s a konstruktor tr.lSe.
A legtbb vltoz brmelyik rszben inicializlhat, azonban vilgosabb s gyakmn
hatkonyabb is a kezd6rtklistban inicializini a tagvltozkat. Az albbi plda eZl
mutatja be:
CAT() , II a konstruktor neve s a paramtGrek
itsAge(S) , II kezdortklista
i t sWeight(8)
( l II a konstruktor trzse
A konstnlktor par:amterlistj{mak zrjele utn egy kett6spont ez utn kvetkezhet
a tagv ltoz6 neve s egy zlirjelpr. [bbe frand az a kifejezs, amelyet kezd6rtkOl
szeretnnk adni a tagvltoz6nak. Ha tbb tagvltoz6t is inicializlunk, vessz6vel kell
6kt!t.
Figyeleml
A konstansok nem vkoznakl
Ne felejtsk el, hogya hivatKozsokat s a konstansokat inicializl ni kell, s utna
mr nem lehet ket megvlloztal ni . Ha adat1ag hivatkozsaink vagy konstansaink
vannak, ezeket a lenti m6don, a kezdrtkJistban kell iniciaHzlni.
- s azt kell mondjam, hogy hatkonyabb - a tagvltoz6kat a kezcl6rtk-
listban inicializl ni, mintsem ks6Db rtket rendelni hozzjuk. Ennek megrtshez
el6szr meg kell ismerkednnk a msol konstruktofdl
A msol konstruktor
Az alaprtelmezett konstruktoron s destmktoron kvl a fordtprogram mg egy
alaprtelmezett m:sol konstruktort is rendelkezsnkre bocsr. A msol konstnlktor
mindannyiszor meghvdik, ahnyszor csak msolat kszl az objektumrl.
Ha rtk szerint adunk vagy kapunk objektumot egy fggvnyt61, ideiglenes msolat
kszl r6la. Ha egy felhasznl ltal defmilt objekrumrl van sz, akkor az oszt{llyhoz
tartoz msol konstruktor hvdik meg.
Minden msol konstruktornak egyetlen pammtere van: a sz6ban forg osztly egy
pldnym utal hivatkozs. Ezt nyugodtan rhat juk konstans hivatkozsknt, hiszen
a msol6 konstruktornak nem kell vltoztatnia al tadon objekrumon. Pldul:
ClIT(const CAT & thecat) ;
IV. rsz Halad eszkzk
ln a CAT konstruktor egy (mr l t z theCat) macskm utal konslans hivatkozst
vesz L A msol konstruktor clja msolatot kszteni a theCat objektumr61.
Az alaprtelmezett msol konstnlktor egyszen.1en lemsolja a paramterknt kapoll
objektum nunden tagvltoz6jt, s gy hozza ltre az j objektum tagvltoz6it. ELL fel-
szni (vagy tagonkntO msolsnak Cshallow copy) hvjk, mivel jl mt1kdik a legtbb
tagvltozra, de nem kezeli jl a dinamikus memriatcrletre utal mutatkat.
A felszni vagy tagonknti msols tehl az objekrum tagvltoz6inak pontos m(lsolatt
viszi t egy msik objekrumba. Ez aZl is jelenti, hogya mutatk ugyanarra a mcm6ria-
cmre fognak mutatni mindkt objektum esetben. A mlysgi msols (deep copy) ez-
zel szemben kpes arra. hogy a dinamikus mem6riateJilleten lev6 rtkeket is meg-
duplzza.
lIa a CAT osztlynak van egy itsAge tagv:ltoz6ja, ;1rnely egy a dinamikus mem6riban
lev6 egsz sz:mrJ mulat, akkor az alaprtelmezett m{lwl6 konstruktor a paramterknt
kapott CAT objektum it sAge tagvltoz6jt, mintmulat6t msolja l az (Lj CAT objektum
itsAge n v l:!8vlloz6jba. A kl vltoz6;1 mem6ri:l egyazon terletre mutat, :!hogy
azt a 13.1 bm is mutatja.
Free Slore
old CAT New CAT
,---""' ::: A, ,,,,-...Jf-'
I\sAge
13.1 bra
Az a/t/{Jrtc/mczell m{/so/ kol/slmklol" hasz1llara
Ez kataSZlrnfhoz vezet, ha brmelyik macska megsznik ltezni. Ekkor ugyanis meg
hvdik a destruktor, amely meg fogja ksrelni a lefoglalt memria felszabadtst.
Esetnkben, ha pldul az eredeti macska hallozik el, akkor :!nnak destruktora felsza-
badtja a dinamikusan lefoglalt memrit. A msolatbeli i tsAge ugyanakkor mg min
dig ugyanoda fog mut:!tni, gy, ha a program megpr6blja hasznlni ezt a mutat6!,
sszeomlik. A 13.2 bm illusztrlja a katasztrft.
13. ra A fggvny.k ki1inomultabb h,sznl.ta I 239
Fr86 Store
NewCAT
.'
13.2 bra
Gazdl/llll IIIIIUII IlrcllozslI
gy oldhat juk meg ezt a felszni msolsbl fakad problmt, hogy megrjuk gljt
msol konslruklorunk:n, s lefoglalunk a msolat szmra egy j mem6ri acmcl.
A mly msobt kszt(:sc lehet5v teszi, hogy a mr ltez6 rtkeket is tmsoljuk
:IZ j memrialerletrc. EZL mutatja be:\ 13 .. ' Lista.
13.3 Lista -A __ ktur oHIk6d6Ie I __ .epp)
o: /1 13.3 Lista
l : /1 maol konstruktorok
2 : linclude <iostrcam>
3,
4: class eliT
S : (
6 , public :
7 : CAT(); 1/ alaprtelmezett konstruktor
a: eAT (const eliT 'l; 1/ msol konstruktor
9 : _CAT(); 1/ destruktor
10 : int GetAge() const ( rcturn *itsAge ;
ll : int GctWeight() const ( return *itsWeight ;
12 : void SetAge(int age) { *i tsAge = age; }
13 :
14 : private :
15 : int *itsAge;
16 : int *it sWeight ;
17 : } ;
18 :
19 : CAT: : CAT()
20 : {
21: itsAge = new int;
22 : itsWe ight = new int;
23 : *i tsAge = 5 ;
24 : *i tsWei ght = 9;
25 :
26 :
140 I IV. r" Halad aszkzk
27: CAT , : CAT(const CAT & rhs l
28 : (
29 , itsAge '" new int;
30 : itsWeight '" new int;
31 : *itsAge '" rhs , GetAge () ;
32 : " itsWeight "- rhs .GetWeight() ;
33 :
]4 :
35 : CAT ,: -CAT()
36 : {
37 : delete itsAge ;
38 : itsAge '" O;
39 : delete itsWeight ;
40 : itsweight O;
41 :
42 :
43 : int mai n (}
44 :
45 : CAT frLs ky;
i1 6 : std:: cout "frisky ' s age : frisky.GctAge() '\n' ;
47: std :: cout 'Setting frisky to 6 ... \n';
48 : frisky . SetAge(6) ;
d9 , std :: cout ' Creating boots from frisky\n';
50 : CAT boots(frisky) ;
51 : std :: cout "frisky's age : frisky . GetAge{) "\n' ;
52 : std :: cout "boota' age: boots.GetAge() "\n";
53: std : : cout 'setting frisky to 7 ... \0";
54: frisky.SetAge(7) ;
55: std :, oout "frisky's age , " frisky.GetAge() "\n" ;
56 , std: :cout 'boot ' s age : boots.GetAgc() "\n";
57 : return O;
58 ,
friaky' a age , 5
Setting frisky to 6 ...
Creat ing boots from frisky
frisky ' s age : 6
boota ' age , 6
sp. t ti ng frisky t o 7 ...
fri sky ' s age : 7
boota ' age , 6
A 4-17. sorban deklarljuk a CAT osztlyt. Figyeljk meg a 7. sorban az alapnelmezett
konstruktor, a 8. sorban a msol konstruktor deklarcijt. A lS. s 16. sorban kt tag-
vltozt deklarlunk, m i n k e t t egsz szmra mutat. ltalban nem hasznlunk egsz
mutatkat egy Q'jztly ta&",ltoziknt, de gy lehet a legegyszerbben illusztrlni a di-
namikus memrialerleten definilt tagvltozk kezelst.
Az alaprtelmezen konstruktor a 19-25. sorban helyet kszit a dinamikus memriban
ki!t egsz szmnak, majd az rtkadst is elvgzi.
A msol konstruktor a 27. sorban kezd6dik. Figyeljk meg az rhs n v pammtert.
Gyakran nevezzk gy a msol konstruktornak tadott paramtert, amely a rig!Jf-
1/CI lld-side(jobboldalt) rvidtse. Ha vetnk egy pill antst a 31. s 32. sorban tallhat
rtkadsokra, megf1gyelhetjk, hogy :LZ tadott paramter ll az egyenl6sgje1 jobb ol-
daln. Vizsgljuk ezt meg rszletesebben:
A 29. s 30. sorban lefoglalunk egy-cb 'Y egsz szmnyi helyet a dinamikus me-
mriban, melyeket a mr ltez6 CAT objektum megfelel6 rtkei alapjn tl-
tnk fel a 31. s 32. sorban.
Az rhs eb'Y macska (CAT), melyet konstans hivatkozsknr adunk t a msol
konstruktornak. Az rhs . GetAge () tagfggv&ny azt az rtket adja vissza, mely-
re az rhs sajit itsAge tagvltoz6ja mutat. Mint igazi CA'! objektumnak, rhs-nek
megvan minden szksl!ges tagvltoz6ja.
Amikor a msol konstruktor mcghv6dik egy ct j macska ltrehozsra, kapnia
kell egy (mr ltez6) macskt par.!mterknt.
A 13.3 bra felvzolja, mi trtnik itt. A mr ltez6 macsk .. vltoz6i ltal mutatott rtc:!-
kek tmsolMnak az j macska szmr.! lefoglalt memriaterlctckrc.
Free Store
r-
5
5
1-
oIdCAT NewCAT
ItsAge
I--'
itsAge
13.3 bra
A mly mdsols bemutatsa
A 45. sorban ltrejn egy frisky n v m,lCska (CAT), majd kir6clik az letkora, melyet
a 48. sorban gyorsan t is llrunk 6-m (termszetesen ezt is dokumentljuk). Az 50.
sorb-.lO kl6nozunk egy j macskt (boots nven) egy msol konstruktorral, melynek
frisky-t adjuk t pammterknt. Ha brmil yen ms fggvnynek adnnk t rtk sze-
rint frisky-t pardmterknt, akkor is ugyanezt a msol konstruktort hvn meg a for-
dtprogmm.
242 1 IV. rsz Halad as2l<zk
Az 51. s 52. sorban mindkt macska letkort kiratjuk Elg ltszik,
hogy hoots letkora nem az alapnelmezen 5, hanem a frisky-161 megrklt 6.
Az 54. sorban frisky letkort 7-re llt juk, s ezt rgtn ulna ki is rat juk. Ekkor
frisky letkora mr 7, boots azonban megmaradt fiatal 6 vesnek, jl nlUtatva, hogy
kora klnll memriatcrlctcn lroldik.
Amikor macskink kiml nak, destruktoraik automatikusan meghv6dnak. A CAT dest-
ruktor mcgval6stsa a 35-41. sorban lthat. Mindkt mutat6t (it s Age s itsweight)
trljk egy-cgy delet e paranccsal, felszabadtva ezzel az ltaluk lefoglalt dinamikus
memrit, s a biztonsg kedvrt le is nullzzuk a mutatkat.
Krdsek s vlaszok
Krds: Mil1 haSZ/llnnk afaprtelmczcu /1kekkel dolgoz jggvnyeket, Ita lellet
jllggvnytlterhelst is alkalmazul?
Vlasz; EgyszenThb egy fggvnyt karbantanani, mint kettt, s sokszor knnyebb
megrteni egy alapnelmezett nkekkel defi nilt fggvnyt, mi nt kt fggvny trzst
vgignzni. Szintn fontos szempont, hogya tapasztalatok szeri nt gyakori hiba, hogy
az egyik fOggvny kijavtsa utn elfelejtkeznk a msikr61.
Krds; Ha ilyen problematikus afi."lggvllyek fl lterltalse, mirlllem hasznlulIk he-
Iyetfl"/k mindig alapl1elmezett rlkeket?
Vla..tt: A rggvnytlterhels olyan is szolgl, amelyek nem llnak ren-
delkezsnkre az alaprtelmezett rtkekkel dolgo7..6 fggvnycknl:1. A paramterek
szmn tl ezek tpusval is befolysolhat6 ugy.mis a tlterhelt fggvnyck
Krds: Egy osztly komtrllktoriinak megrsakor mi alapjll dntllet el, mit rdemes
az kezdoo'1klisttibcIII e/vegez/l i, s mit ajiiggvnyt6rzsbell ?
Vlasz: Egy egyszenl alapszably az, hogy amil csak lehet, intzznk el a kezd6rtk-
li stban; azaz minden tagvltoz6t iniciali zjjunk ill. Az egyb dolgok, mint a szmt-
sok vagy kirsok a konstruktor trzsbe valak.
Krds: Lelle/-e Illlerhell fggvllynek alaprlelmezelf paramtere?
Vlasz: Termszetesen. Semmi sem liltja, hogy ezeket a hathats eszkzket egyszerre
hasznljuk. A tlterhelt fggvnyek kzl egy vagy tbb tartalmazhat sajt alaprtelme-
zett nkeket a szoksos szablyok szerim, mint ahogy ez gy van brmely ms fgg-
vnnyel is.
13. 6ra A fggvnyek kifinomultabb hasznlata 1243
Gyakorlatok
Ebben az rblln a fg&yvnyek kifinomultabb hasznlatval ismerkedtnk meg. Vla-
szoljunk nhny krdsre s vgezznk el nhny feladatolludsuok l l n r z s s
megsziJrdt;sa vgett!
Kvfz
1. Honnan tudj:l a fordit6progmm, hogy a tlterhelt fggvnyvlto7..alOk kzl me-
lyiket kell meghvnia?
2. Lehet-e ala pnelmezelt paramterekkel elltni tllltcrhelt fggvnyvltoz31okat?
3. Mirt rdemes tlterhelni egy konstruktort?
4. Mit csinl a msol6 konstruktor?
Feladatok
1. Mdostsa gy az over l oadfunctions . cpp programot 03. 1 Lista), hogy legyen
egy olyan vltozata is a DrawShape () fggvnynek, amelynek kt alaprtelme-
zett egsz paramtere van. SikeriI llefordtani s futtatni? Milyen kvetkeztetst
tud levonni ez alapjn a tlterhelt fggvnyek s az alaprtelmezett paramter-
listk sszekapcsolst illet6en?
2. Mdostsa gy a copycons truc t ors . cpp programot (13.3 Lista), hogy azutn
m6dostsa boot s korth, milltfin f risky letkora mr megvltozott! I [alssa! van-
e bOOLS letkora f dsky-rc? Azt mr lttuk, hogy f risky letkornak vltoWI-
tsa nem befolysolja boots-l.
3. Goodo!kodjon el a copyconstruct ors . cpp program 03.3 Lista) alapjn azon,
hogy mi trtnne akkor, ba az itt lthat6 destruktor helyen az alaprtelmezettct
hasznlnnk? Mi (vagy pontosabban mi nem) trtnne?
Vlaszok a kvfzkrdsekre
1. A megadott paramterek szmbl s tpusbl.
2. Igen, mindaddig, amg a kl nbz6 fggvnyvltozalok paramterlisti egyedi-
ek maradnak, hiszen csak ebb61 tudhatja a fordt6progmm, hogy mikor melyiket
kell hvnia.
3. A konstruktorok t'lterhelhet6sge rugal mass teszi az objektumok ltrehozst.
Ltre lehet hozni paramterek nlkl is egy objektumot (pldul egy alaprtel-
mezeIlet vagy reset), s egy msik konstruktor segtsgve! egy olyat is, amely-
nek kezd6 paramtereit megadhatjuk; vagy akr lehet tbb konstruktor is tbb-
fle paramterlistval.
244 1 W, rsz ' Halad aszkzk
4. A msol konstruktor akkor Ivdik meg, amikor msolat kszl egy objektum-
r61; pldul amikor egy objektumot kifejezetten le szeretnnk msolni, v3b'Y
amikor egy fggvny szmm rtk szerinti pammterMads trtnik. A fordt-
program rendelkezsnkre bocst egy alaprtelmezett msol konstruktort, de
a bonyolultabb objektumok esetn ez nem biztos, hogy ignyeinknek megfele-
l6cn m k d i k
14. RA
Opertorok tlterhelse
Ebben az 6rban a kvetkez6kr61lesz sz6:
Hogyan terhelhetOnk tl tagruggvnyekel
Hogyan terhelhet jk tl a hozzrendelsi opertort mem6riakezels cljb61
Hogyan rhatunk olyan fggvnyeket, melyek tmogatjk a dimtmikus v1Loz-
kal hlsznl6 osztlyokat
Hogyan terhelhetnk tlopertorokat
A C++ s:dunos beptett tpussal rendelkezik. Ilyen pldul az i nt, real, char, stb,
Mindegyik tpushoz tartozik szmos beptett opertor is, mint pldul az sszeads
Ct) s a szorzs (*). A C++ lehet6v teszi, hogy ilyen oper..torokat sajt osztlyainkkal
kapcsolatban is fel hasznl junk.
Az opertor tlterhels bemutatshoz a 14.1-e5 listban ltrehozunk egy Counter osz-
tlyt. A Counter osztlyt szmllsra fogjuk fel hasznlni - meglepets - pldul
ciklusokban s olyan helyeken, ahol egy szmO[ nvelnk, vagy brmi
egyb mdon vllozlaljuk az rtkt
2461 W. rsz Halad eszkzk
0 , II 1 4. 1 Lista
1 : / 1 Counter os ztl y
2 : tlinclude <iost r eam>
3 .
4: c lass Countcr
5 ,
6 : public :
7 : Countcr() ;
8 : -Counter(){}
9 : int GetItsVal()const { return itsVel ;
10 : void SctItllVal (int xl {itsVal x : }
11 :
12 : private :
13 : int i tsVal ;
14 : } ;
15 :
16 : Count er: : Counter{) :
17 : itsVal(Q)
18 : fl
19 :
20 : int main{)
21 :
22 : Counter l i
23 : std : : cout "The value of i is i . GetItsVal()
24 : std : : cndl :
25 : ret ur n O;
26 :
The value of i is Q.
Ebben a formban nem sok haszna van ennek az osztlynak. A defincijt a 4- 14 so-
rokban lthatjuk. Egyedli tagv ltolja egy egsz tpus vltoz. Az alaprtelmezett
konstruktor - amelyet a 7. sorban deklarltuk s a 18, sorbnn implementltunk - bcil-
ltja az i tsVal rtk! Q-ra.
A valdi, beptett, mondhami vrbeli int tpus vltoz6val szemben a counter tpu-
s objektumunkat se nvelni, se cskkenteni nem tudjuk Nem tudunk se hozzadni,
se elvenni bel61e, nem tudjuk mshoz hozzrendelni , OOt semmilyen egyb mdon
sem tudjuk manipullni. Cserbe mg az rtkt is problmsabb kiratni.
14. 6ra
meg az inkrementl fggvnyt
Az opertor tlLcrhels rvn nylik osztlyainkat (pldul a fenli
Counter l is) szmos olyan hasznos kpessggel amelyekkel amgy nem ren-
delkezik. Opertor tlterhe1srl beszlnk, lm ch'Y opertorr egy osztlyban implemen-
tlunk. A 14.2 Listban lthatjuk, hogyan terhelhet jk tl az inkrcmentls opertort.
14.2 Lista - Az inkremantl6 oper., therhel6sa (overloadincrementcppl
0, /I 14.2 Lista
l: /1 Az inkrement16 opertor tlterhelse
2 : hnclude <iostream>
3 .
4 : class Counter
5 .
6 : publ i c :
7 : Counter() :
8 : -Counter(){}
9 : int GetltsVal () const { return i tsVal;
10, void SetItsVal(int xl (itsVal = Xi )
11: void Incremcnt() { ++itsVal; l
12, const Counter& operator++ (l;
13:
14 : privatc :
15 : int sVal ;
16 : ) :
17 :
18 : Counter : : Counter() :
19 : itsVa1(0)
20 : ()
21:
22: const Counter& Countcr : : operator++ ()
23:
24 : ++itsVal ;
25 : return - this :
26 :
27 :
28 : int main(}
29 : {
30 : Counter i;
31 : std : : cout 'The value of i is ' i. GctltsVal(}
32 : std :: endl ;
33 : i .lncrement() ;
34 : std: : cout 'The value of i is ' i .GetltsVal ()
35 : std : : endl;
36 : ++i;
37 : std : : cout 'The value of i is ' i.GetltsVa1()
38 : s t d : : end!;
39 : Counter a = -+ -+i;
40 : std: : cout ' The value of a : ' a . Getl tsVa1 () :
24l1 1IV. rsz Halad aszkzk
41: std :: cout and i : . l.GetltsVal() std:: endl ;
42: rcturn O;
43:
The value of i
"
O
The value of i
"
1
The value of i
"
2
The value of
"'
3 and i : 3
A 36. sorban meghvtuk az inkrcment!6 opcrtor1:
++1 ;
A fordt ekkor valjban a 22-26 sorokban megva16stoTt operator++ fggvnyt hvja
meg, mely nveli az itsValue tagvltoz6 rtkt majd visszatrsi rtkknt az aktu-
lis objckuHllot cmz6 (l his) mutat6n keresztl mag{ll az objektmnot adja vissza.
Ez egyben lehet6v teszi azt is, hogy a Counter objekwmot hozzrendelhessk a-hoz.
l ia a Counter tpus objektumok dinamikusan is roglalnnak memrit , akkor ktele-
z6en fell kellenI.! br{llnunk a konstruktort is. Jden esetben azonban az :l laprtelme-
zelt msol konstruktor is megleszi,
Figyeljk meg, hogya pldban hivatkozsknt adjuk vissza a Counter objektumot
<I hvnak, gy nem kellllrehoznunk felesleges ideiglenes objektumot. A const: kulcs-
szra azrt V:1ll szksg, men a Counter objektummal dolgoz fggvny nem mdo-
sthatja az rtk!.
A postfix (uttag) inkrementl opertor tlterhelse
Mi a helyzet abban az esetben, ha a postfIx inkremcntl opertOlt szeretnnk tlter-
helni? Ez problms krds a fordt nzve, hiszen nem vilgos,
hogyan tehetnk klnbsget preftx s postfLx opertorok kztt? Megegyezs s;.;erint
czt egy egsz tpus vltoz segtsgvel jelezzk az opertor dekJard6jban , A paOJ.-
mtcr rtke lnyegtelen, csupn jelzs rtkkel br: kzli a fordt6programma l hogy
postlIx opertorr61 van sz.
A prefix s a postfix kztti klnbsg
megrhatnnk S<"ljt POStfIX opertorunkat. meg kell rtennk, miben klnb-
zik a prefix vltozatrl. a prefIX opertor inkrementl. majd kiol-
vas, a postfix pedig el6bb kiolvas, csak aztn inkrementl.
tltemelse
Amg prefIX opertor esetn egyszeruen csak nveljk az rtket s visszaadjuk magt
az objektumot, addig postfIX esetn el6szr kell rtkel visszaadnunk s csak utna
nvelhet jk meg. Ehhez felttlenl ltre kell hoznunk egy ideiglenes objektumot.
Ez az ideiglenes objektum fogja trolni az eredeti nket, mikzben az eredeti objektu-
mot megnveljk. Ezt az ideiglenes objektumot fogjuk aztn vis.<;7..aadni, hiszen
a postflX opertomi az eredeti rtket vrjuk s nem a mr inkrementltat.
Aprop
Nzzk t mg egyszer
Tegyk fel, hogy a programunkban szerepel a v t k z sor:
(l = X++1
Ha x rtke 5, akkor az utasrts vgrehajtsa utn a rtke 5 lesz, de x rtke mr
6. Az x rtkt kiolvassuk s hozzrendeljk a-hoz, csak aztn nveljk meg.
Amennyiben x egy felhasznl6i objektum, gy postfix nvels esetn el kell trol -
nunk az eredeti rtket (5) egy ideiglenes objektumban, aztn megnvelhetjk x r-
tkt 6-ra, vgl pedig visszaadjuk az ideiglenes objektumot, amelyet azutn hozz-
rendelhetnk a-hoz.
Figyelembe vve, hogy ideiglenes objektum tartalmazza a visszatrsi rtket, ncm
hasznl1mtunk hivatkozssal trtn6 tadst, hiszen amint lefut 3 fggv6ny, 34 ideigle-
nes objektumot nt:m tudjuk tbb elrni. ppen ezrt rtk szeri nti atadst kell hasz-
nlnunk.
A 14.3. Lista bemutatja, miknt hasznljuk a preflX s a postfIx opertoroka!.
14.3 Ulla - Prefix s po.lfix opo,6torok hosznllla (pr ... dposlfix.cppl
o: II 14.3 Lista
1 : II A this pointer 6rt6knek visszaadst mutatjuk be
2 : jinc1ude <iostream>
3 ,
4: class Counter
5 : (
6 : public:
7: Counter():
8: -Counter{) ()
9: int GetltsV",l(lconst { return itsVal;
10 : void SetltsVal(int xl {itaVal x;}
ll : const Countcr& operat:or++ (l; II prefix
12 : const Counter operator++ (int) ; /1 postfix
13 :
14 : private:
15: int itsVa1;
16: ) ;
17 :
18: Counter : : Counter{) :
19: itsVal (O)
20 : fl
21 :
250 I IV. rsz Halad eszkzk
22: const Counter& Counter : :operator++ () /1 prefix
23 , (
24 : ++itsVal:
25 : return *this;
26 :
27 :
28 : const Counter Counter : : operator++ (int) II post fix
29:
30 : Counter temp(*this);
31 : ++itsVal;
32 : return temp;
33 :
34 :
35 : int main()
36 :
37 : Counter i-
38 : std:: cout 'The value of i i s i.GetltsVa1! )
39 : std::end l;
40 : i + + ;
41: std : : cout 'Thc valuc of i is LGctltsValO
42: std : : endl ;
43 : +Ii ;
44 : std :: cout "The value of i is i.GetItsVal()
45 : std: : endI ;
46 : Counter a
++i;
47: I:Itd :: cout "The value of
"'
.
a . GetItsVa,l();
48: std : : cout
.
and i:
.
i .GetItsVal () std: : endl;
49 : II .. i.+;
50 : std : : cout 'The value of
.,
.
a . GetltsVal();
51: std :: cout
.
and i :
.
i .GetltsVal () std: :cndl;
52: return O;
53 :
The vllIue of i
"
O
The vaIue of i i. l
The vllIue of i i. 2
The vaIue of
"'
3 and i: 3
The vaIue of
a ,
3 and i: 4
A 12. sorban deklarlt postfIx operton a a 33-ig sorig ccrjcd6en implementlmk.
szrevchetjOk, hogy a 43. sorban prefix operlornl nem hasznltuk az egsz
lpus jelz6l (x).Postfix opertor esetn viszont gy jelezzk, hogy poscfixr61 s nem
prefixr61 van sz. Termszelesen az x nkt nem hasznljuk semmire.
14.6ra
tltemelse 251
operator+
Az inkrementl6 opertor egyopemndus (unary), teht csupn egy operandusr vr 16-
Jnk. Ezzel s7.emben az sszeads opertora (+) ktoperandus (binary), kt operan-
dust kell neki megadnunk (pldul a + b). Magtl addik a krds: hogyan terhelhet-
jk f] a -+- opertort a Counter osztlyunk esetben?
A clunk teht az, hogy kl Counter tpus vltozt ssze tudjunk adni az albbi
mdon:
Counter varOne, varTwo, varThree ;
varThree = varOne -+- vurTwo l
Ismtlem: nyugodtan rhat nnk mondjuk egy Add () nevC fggvnyt, amely kl
Count er tpUSlI paramtert vr s egy Counter tpust ad vissza eredmnyknt. EZl
:1 megkzeltst mutatja be a l4A-es li sta.
14.4 Ulla - Az Add(l fggv6n, laddlunction.eppl
o: /I 14 .4 Lista
1 : II Add fOogvny
2 : linclude <iostream>
3 ,
4: class Counter
5 : (
6: public :
7 : Counter{);
8: Counter{int initialValue) ;
9 : -Counter(){}
10 : int GetltsVal()const ( return itsVal;
11 : void SetItsVal(int x) {itaVal " x; }
12: Counter Add(const Countcr &);
13 :
14 : private:
15 : int itsVa1 ;
16 :
17 : } ;
18 :
19 : Counter: : Counter (int initia1Val ue) :
20 : HsVal (initia1Va1ua)
21 : ()
22 :
23 : Counter: : Counter() :
24 : itsVa1(O)
25: {}
26:
27 : Counter Counter : : Add(const Counter l< rhs )
28 :
29 : return rhs.GetItsVal(;
30 :
252 1 IV. rsz Halad ,s2i<zk
31 :
32 : int main ()
33 :
34: Countcr varOne(2) , varTwo(4) , varThree;
35 : vdrThree = varOnc .Add (varTwo) :
36 : std::cout ' varOne : varOne.GetltsVal() std: : endli
37 : std: : cout 'var'l'wo : varTwo.GetltsVal() std : : cndl ;
38 : std: ,cout ' varThree : varThree.GctltsVal()
39 : std:: endl ;
40 : return O:
41:
va rOne : 2
varTwo : 4
varThree : 6
AZ Add () filggvllyt a 12. sorban deklarljuk. Cm szerint tadjunk egy Councer tpus
konstan!;t, mcly aZl a l:rtkct tartalmazza, melyet hozz szeretnnk adni az aktu:'ilis ob-
jekrumhoz. Counter tpus objektumot ad vissza, melyet a 35. sorban hozzrcndclnk
a bal oldalhoz. sszefoglalva: varOne az objektum, varTwo az Add ( ) -nak para-
mter, varThree-be pedig elhelyezzk a vgeredmnyl.
Ahhoz, hogya varThree-t l6trehozhassuk inicializ:ils nlkl , alaprtelmezett
konstmktort kell rnunk hozz. Az alaprtelmezett konst!l,lktor inicializlja az itsVal
rtkl O-ra, ahogy azt a 23-25 sorok kztt is megfigyelhctjk. Nem nulla rtkkel ini-
ciali zljuk varOne s v.!IorTwo objektumokat, ezrt hozzjuk msik konstruktorra van
szksg, melyet a 19-21 sorokban tallunk. Msik leheL'>ges megoklsa ennek a prob-
lmnak, ha alaprtelmezsknt o-ra 11tjuk a konstruktorban (8. sor) az rtket.
Az operator+ tltemelse
A 14.4-es lislban az Add () fggvnyt a 27-30 sorokban val6slottuk meg. Noha a meg-
olds elgg hasznlat kzben. Az operator+
tlterhelsvel sokkal termszetesebb a Counter osztly hasznlata. Ezt a 14.5-
s listban mutatjuk be.
0 , 1114 . 5 Lista
1 , lj Az sszeads opertor (+) tlterhelse
2 , lIinclude <iostrearn>
3 ,
4 , class Counter
5 ,
6 : public:
7 : Counter () ;
8 , Counter(int initialValue) ;
9 : _Counter() {J
10 : i nt Ge tltsVal()const { ret urn i tnVal ;
11 : void Set ItsVal(int xl (itsVal '" x ; )
12 : Counter operator+ (const. Counter &);
13 : pdvate :
14 : int itsVal ;
15 : ) ;
16 :
17 : Counter : : Counter(int initialvalue) :
18 : itsVal{initialValuel
19 : ()
20 :
21 : Countcr : : Count er() :
22 : itaVal ( O)
23 : ()
24 :
14.6 ... Oportorok tttemels. 1253
25 : Counter Counter : : operat.or-+ (const Counter " rhs)
26: (
27 : return Counter(itsVal + rhs.GetltsVal() ;
28 :
29 :
30 : int main()
31: (
]2 : Countcr varOne(2) , varTwo(4) , varThrec;
3] : varThree = varOne + varTwo ;
34 : s td: : cout 'varOne : varOne . Getl t s val( ) s td: : cndl ;
35 : std : : cout ' varTwo : varTwo.GetltsVa!() std: : e ndl;
36 : std: : cout 'varThrec: ' varThree.GetltsV51()
37 : std : : endl ;
36 : return O;
39 :
v5rOnc : 2
varTwo : 4
varThree : 6
Ezek utn meghvhatjuk az sszeads opertorl gy, ahogy azt a 33. sorban is [esszk:
varThree : varOne + varTWO;
A fordt6 ilyenkor gy rtelmezi, mintha CZl rtuk volna:
varThree = varone ,operator+(varTwo) ;
.r
. .,
254 1 W. rsz Halad ,,",zk
Ennek meghvja a 12. sorlY,m deklarlt s 25-28 sarokb,1n megval6ston
metdusL sszevetve a korbbi Add { ) fggvny deklarcijval s defincijval szin-
te nincs is klnbsg. Ami al alkalmazst illeti, ott viszont szembetl 6 az eltrs. Men
hiszen mennyivel tennszetesebb a
varThree varOne + varTwo;
mint a
varThree = varOne.Add{varTwo) ;
Nem nagy vltozt.ats, de ahhoz pp elg, hogy knnyebben tlthat s hasznlhat
programot kapjunk. Lthat teht, hogy opertorok t(JlterheJsveltulajdonkppen
expli cit fggvnyhvsokat helyeuesthetnk.
Az opertortlterhels korltai
/I. bepLCU tpusok opcrlomil (ilyen pldul <LZ int) nem terhelhcljk tl. A prece-
dencia nem vltoztathat meg, mint ahogy az opertor operandusain:lk SZlma (:t dly)
sem. j operlorokat sem hozhatunk ltre, teht nem dekbrlhaljuk mondjuk a *"'-ot
a hatvnyozs o pertoraknl.
Mit tlterhelni?
Az opertortlterhels lehet6sge a c++ egyik olyan terillete, melyet programo-
zk gyakra n feleslegesen hasznl nak s6t visszalnek a lehct6sl!ggel. Csbt lehet6sg
ugyanis jszen1 s rdekes mdon felhasznlni a legzavarosabb opertorok31, azonban
ez lt alban zagyva s nehezen rtelmezhet6 kdot eredml!nyez.
Egy ideig persze vicces lehet a + opertorral kivonst, a ., opertorral meg sszeadst
vgeztetni, dc profi programozk soha nem tesznek ilyel. Veszlyforrs az is, ha valaki
j de egyni logik:lval hasznlja az operlorokat - pldul + operi'tlo rL
hasznl betk sszefzsre, vagy j - t karakterlncok relbontslra. Fel lehet persze so-
rakoztatn! az cff6le megoldsok mellett s:.:6l6 rveket is, dc minden eselben krlLe-
kint6en kell eljrnunk. Ne feledjk: az opertoltlterhel s clja a progl<ununk stabilit-
snak nvelse s forri'tskd rthetsgnek javtsa.
operator=
Ugye emlksznk, hogy a fordt6 biztost alaprtelmezeu konstruktort, destruktort s m-
sol6 konstruktort. A negyedik s egyben utols fggvny, melyet a fordt biztost-
amennyiben nem adunk meg sapt vlt07..atol- a hozzrendelsi opertor (operator= (l).
14. 6ra ttterhelse
Ezt az opertol1 hvjuk meg, valahnyszor rtket adunk egy objektumnak Pldul:
CAT catOne (S , 7);
CAT catTwo(3,4) ;
II .. 0 a program tbbi rsze
catTwo '" catOne;
Pldnkban ltrehoztuk a catOne-t s a megadott pammterekkel (5,7) inidalizltuk
az itsAge s az itsweight tagvltoz6kat. Ezutn ltrehOlllIk a catTwo-t, amit ismt
a megadott paramterekkel (3,4) inidalizltunk. Az utols sorban azt{m sznre lp
az alaprtelmezett hozzrendelsi opertor (operator=):
catTwo '" catOne;
A hozzrendels eredmnyekppen a catTwo objektum itsA<;I'e s itsWeight vltozi
felveszik a catOne megfelel6 rtkeit. Az utasts lefurtatsll utn a catTwo o itsAge r-
tke teht 5 lesz, a catTwo. i t sWeight rtke pedig 7.
Figyeljk meg, hogy pldnkban nem hvnlk meg a msol konstruktort. A catTwo
ugyHois mr ltezett, nem kellett azt ltrehozni, !,'Y a fordt intelligens mdon a hoz-
zrendelsi opertort hvta meg.
A 13. rban megtrgyaltuk 3 felszni Clagonknti) s a mly (kzvellen) msols kZli
klnbsget. A felszni msols csak a tagokat msolja s dinamikusan kezelt tagokn{d
mindkt objektum ugyanarl"..t a cmre mutal. A mly msols ezzel szemben lefog;lalja
a szksges memriaterletel. Az alaprtelmezett msol konstruktor
mr lthaUunk korbban egy brt 03.1. bra), lapozzunk vissza, ha szksgesnek
rezzk.
A hozz rendelsi opecltornl meglehet6sen hasonl6 a helyzeT, mint a m{\soI6 kons!
ntktoml. Persze itt van egy kis csavar a dologban: a cat'J'wo objektum mr ltezett, te
ht tartozott hozz<1. lefoglalt trterlet. Hogy elkeri.iljk a memriaszivrgst, trlnnk
kell ezt a terletet. A hozzrendelsi opertor implementls.1 sorn teht dolgunk
a mutathoz tartoz memriaterlet [rlse, kitakartsa.
De mi is trtnik, ha a catTw"o-L nmaghoz rendeljk, va lahogy gy:
cat TWo = catTWo ;
Persze senki nem csinl ilyesmit szndkosan, de a programnak akkor is le kell mdnia
kezelni. Van valami, ami viszont mg ennl is fontosabb: az effle rtelmetlenek tnd
hozzrendelsek vletlenl, rejten mdon is bekerlhetnek a kdba, pldul gy, hogy
a hozzrende1st mutatkon keresztl vgezzk, amelyek elfedik 3 httrben
esemnyeket.
25S I IV. rsz' Halad eszkzk
Ha ezt a problmt nem kezeltk krltekinten, a catTwo trl heti sajt memriafog-
lalst Aztn amikor a hozzrendelsi opertor oda rkezik, hogy tnylegesen rnsoln
a mem6ria tartalmt, akkor szembesl csak a nagy problmval: nincs is mit msolni.
Ezt ell en6riznnk kell, hogy a hozz rendelsi opertor jobb oldaln sze-
objekcum nem ugyanaz-e? Ezt a this mUlat vizsglatval teheljk meg. A 14.6
Li stban egy osztlyt mutarunk be, amely rendelkezik hozzrendelsi operdlorral.
14.6 Uata - Hourandelsi opertor (assignoperator.cppl
o: /I 14.6 Lista
1 : II Msol konstruktorok
2 : #include <iostream>
3 ,
4 : c lass CAT
5 : {
6 : public :
7: II alaprtelmezett konstruktor
a : II cl mnsol konstruktort s destruktort kihal]Ytuk
9 : int Gethge() const { return *i tshge; }
10 : int GetWaight {) const { return *itsWeight;
ll: void SetAge(int age) ( ' itsAge = age ; )
12 : CM' operator:c(const CAT &) ;
13 :
14 : private :
15 : int *itsAge;
16 : int "itsWeight;
17 : );
18 :
19: CA'!' : : CAT()
20 : (
21 : itsAge = new int ;
22: itaWeight = new int ;
23 : *itsAge 5;
24 : *itsWeight = 9 ,
25 :
26 :
27 :
28 : CAT CAT: : oper ator=(const CAT & rhs)
29 : (
30 : if IthiEl == &rhs)
31 : return " thi s ;
32 : delete itsAge;
33 : delete itsWeight;
34: itshge = new int;
35 : itsWcight = new int;
36 : *itsAge = rhs . GetAge{);
37 : " itsWeight = rhs . GetWeight () ;
38 : return *this ;
39 :
40 :
41 :
42: int rnain()
43 :
44: CAT frislcy:
14.6ra
45 : std: :cout "frislcy's age: frisky.GetAge()
46: std: : end1 ;
47: std:: cout 'Setting frislcy to 6 .. . \n' ;
48 : frisky . SetAge(6) :
49: CAT whiskers:
50 : std: : cout "whiskers' age: whiskers.GetAge()
51: std: : cnd1 ;
52 : std : : cout 'copy ing frisky to whiskers ... \n' :
53 : whiskers frisky :
54 : std: :cout 'whiskers' age : whiskcrs.GetAge()
55 : std : : end,l;
56 : reLurn O;
57 :
frisky' s age: 5
Sctting fri!;ky to 6 ...
whiskcrs' age: 5
copying frisky to whiskera ..
whiskcrs' age : 6
A 14.6 Listban ismt viszomlthatjuk a mr jl ismert CAT osztlyt, (gy mern helytaka.
rkoss.1gbl kihagynJk a msol6 konstruktort s destruktor!. A 12. sorblln dekbrltuk
a hozz rendelsi opcrtort, melyet ks6bb a 2s..39 sorokban definiltunk.
A 30. sorban n aktulis objektumot, amelyhez hozzrendelnk, megvizsgljuk, hogy
nem egyezik-c azzal, amelyet hozz szeretnnk rendelni. Az az rhs mem6
riacmnek a this memriacmnek sszehasonltsval vgezzk el.
Termszetesen az opertort (,,"') is tlterhelhetjk, ennek sa
jt kritriumok alapj{tn dnthet jk el, mikor kt objekntmunk.
Aprop
Kezdjnk tiszta lappal
A 32tI35ig sorokban trljk, majd jra ltrehozzuk a tagvltoz6kat
a memriban. Noha ez nem j s korrekt programozi szoks, mert meg-
kfml a mem6riaszivrgs okozta problmktl, amikor olyan vltoz hosszsg
objektumokkal dolgozunk, melyek nem rendelkeznek sajt hozzrendelsi opertor
ral.
25S I IV. rsz Halad ,szI<zk
Konverzi6s opertorok
Mi trtnik ha egy beptett tpust - legyen az egsz vagy el6jel nlkli rvid egsz -
kvnunk egy felhasznli osztly pldnyhoz rendelni? A 14.7-es listban a Counter
tpus objekru mhoz ksrelnk meg int tipus vltoZI hozzrendelni.
FIgyelem!
Ne lep6djnk meg
A 14.7. Lista kdjt nem lehet lefordtani . A hibazenetet az elemzs elolvassa
utn fogjuk csak megrteni.
o: /I 14 . 7 Li!;ta
1 : II Ez a plda nem fog leforduln! !
2 : j include <iostream>
,.
4: class Counter
5 : (
6 : public :
7 : Counter{) ;
8 :
9: int GetltsVal{)const { return itsVal ;
10 : void SetItsVal(int x l litsVal = x : }
ll : private:
12 : int itsVal;
13 : l;
14 :
15 : Counter : : Counter() :
16: itsVI!Il(O)
17 : ()
18 :
19 : int /'IIlIIin()
20 : (
21 : int theShort = 5;
22 : Counter theCt r = the Short ;
23 : s td : : cout "theCtr : theCtr.GetItsVal()
24 : std: : e ndl ;
25 : r eturn O;
26 :
"counterconvert.cpp" : E2034 Cannot convert 'int' to 'Counter' in
... function main() at line 22
14. ra t.emelse 259
A sarok kztt deklarlt Count er osztly csupn alapertelmezctl konstruktorral
rendelkezik. Nem rendelkezik eb'Yooi metdllssal arra vonatkozlag, hogyan alakthat
t int tpus rtket Counter tpus objektumm, gy fordtsi hibt kapunk a 22. sor-
ban. A fordt nem mdja kitallni - hacsak nem kzljk vele - hogyan kell hozzrcn-
delnie egy i nt tpusO v!toz6t az itsval-hoz, mely az osztly tagvltozja.
A 14.8. Listban konverzi6s opertor ltrehozsval javtjuk a hibt:
a konstruktor al. int tpusO vltoz alapjn ltreholza egy Counter objektumot
14.' Lista - int talakItsa Counter..,
o: II 14. 8 Li sta
l : II Konstrukt or , mint konvcr%i 6s opertor
2 : #include <iostream>
3 .
4 : class Counter
5 : (
6 : public :
7 : Countcr() ;
8 : Counter ( l.nt val) ;
9 : -Counter() {l
10 , int Gc t ltsVal()conSL { rnturn itsVal ;
ll : void SetItsVal(int xl (itsVal = X; l
12 : private :
13 : int itsVal :
14 : l;
15 :
16 : Counter : : Count er( ) :
17 : itsVal {Ol
18 : ()
19 :
20 : II Konstruktor tlterhels
21 : itsVal (val)
22 : (J
23 :
24 : int main()
25 : (
26 : int theShort " 5 :
27 : Counter thcCtr = t heShort ;
28 : std: : cout "thcCtr , thectr.GetltsVal() std : : end1 ;
29, retur n O,
30 :
thectr : 5
260 I W. rsz Halad eszl(zk
A lnyeges vltozs a 8. sorban llhat, ahol is il konslruktolt terhe1tk tl gy, hogy
j nt tpust fogadjon. A mcgv'116sls a 20-22 sorokban ](llkHfJ, A mdostsok eredm-
nyekpp ez a konstruktor az int tpusbl Counter lpust hoz ltre.
Ezutn a fordt mr meg tudja hvni a konstruktort, amely int tpust vr argumentum-
knt. De mi trtnik, ha pldul megfordt juk a hozzrendelst az albbi mdon?
1 : Coun t.er thcCt.r(5) ;
2 : int theShort theCtr ;
3 : cout "theShort : theShort endl ;
Ez ismt fordtsi hibt fog eredmnyezni. Noha a fordt m{l r tudja, hogyan hozzon
ltre Count er lpus vltoz! i nt tpusb61, nem tudja megfordtani a hm:zrendelst.
Az intO opertor
I logy megoldjuk a femi problm{u - vagyis hogy miknt csinl lhatunk Counter tpus-
bl int tpust - s az ehhez hasonlkat, hasznljuk a C++ konverzis o pertornil. Ezck
a konverzis opertorok kpess tcszik osztlyunkat arrd, hogy implicit mdo n kon-
vcrt ljunk objektumokat a beptett tpusokra. A 14.9. Listban mutatjuk be ezl. Egy
megjegyzs cSllpfln: a konverzi6s opertoroknlil nincs megadva visszatrsi tpus an-
nak e ll enre, hogy az talaktott rtket visszakapjuk.
14.9 Ulta - Countar tfpust intO tpust alakftjuk Icounterconvamntcpp)
o: II 14. 9 Lisla
1 : II konverzi6s opertor
2 : linclude <iostream>
] ,
4: class Countar
5 ,
6 : public :
7: Count ar(j ;
S : Counter ( i nt va l j ;
9 : _Count ar(j { j
10 , int GetItsVal()con st { return itsVa 1 ;
11 : vo i d SetItsVa1(int xl ( itsVal =: x ; )
12 , operator unsigned short C) ;
13 : private:
14 : int itsVal ;
15 : ) ;
16 :
17 : Counter : : Counter() :
lS , itsVa!(O)
19 : ( )
20 :
21 : Counter : :Counter(int vall ;
22 ; itsVal (val)
23 ; {}
24 ;
25 : Counter : : operato r uns i gned short ()
26 ; {
27 : return ( int (itsVal) ) ;
28 :
29 :
30 : int main()
31 ;
32 : Counter e t r(5) ;
33 : int theShort etr ;
34 : std : : eout "theShort : " theShort std : : endl;
35 , return O;
36 :
theShort : 5
A konver.d6s opeT"tort a 12. sorban deklarlilmk. Figyeljk meg, hogy nincs visszatrsi
rtke. A fggvny implementki6jt a 25-28 sorokban t;:tlljllk. A 27. sor adja vissza
az i tsVal rtkt i nt tpusra alakitva.
A fordt6 most mr tudja, hogyan kell egsz (int) s Counter tpus objektumokat
egymsba talaktani oda-vissza, vagyis a hozzrendelsekkel kapcsolatban teljes
a szabadsg.
Krdsek s vlaszok
Krds: !H/l1 definilunkfe/l egy opertol1, hll tagmeldllsl is lelrehozhall/./Ik?
Vlasz; Tlterhelt operlitorokkal knnyebb dolgozni, feltve persze, hogy j61 ismerjk
a viselkedsket. teszik osztlyaink szmra, hogy a beptett tpusokhoz ha-
sonl an viselkedjenek.
Krds; Mi ti klnbsg II msol konstluktor s a hozz/"CI"Ide/si opertor i...'ztt?
Vlasz: A msol konstruktor j objektumot hoz ltre, amelynek rtkei megegyeznek
a objekcumival. A hozzrendelsi opertor ezzel szemben egy mr meglv6
objektumot mdosl, mely felveszi egy msik objektum rtkeit.
262 1 IV. rsz Halad 8S2I<Zk
Krds: Mi frllllk azzal az int tpus pammlerrel, amit cl post fix opertorok llter-
lIc1slll haszlIftmkl
\I/asz: Semmi. Az az int csupn annak jellsre hasznljuk, hogy postfix opedtort
kvnunk tlterhelni.
Gyakorlatok
Most, hogy mr ismerjk az opertorok tltcrhelsvel kapcsolatos mdszereket, vla-
szoljuk mcg a kvzkrdseket s ;1 gyakorlatok segtsgve! mlytsk el a 1l1egszerzelL
tudst.
Kvfz
1. Mitt nem hozhatunk ltre j opertorokm, mim pldul a **-ol hatvnym.shoz?
2. Mirt nem definilhat juk fell a mr meglv6" opertOrl gy, hogy hatvnY0-
zsknt viselkedjen?
3. Mirt klnbzik a szintaxis prefIX s postfi x inkrcmcntls/dekremcntls esetn?
4. Mil csinlnak a konverzi6s opertorok?
Feladatok
l. A 14.6-05 Jistt (assignoperator . cpp) rjuk t gy, hogy az c&'YenI6sg oper-
tort (==) terheljk tl. Hasznljuk az opertol1 frisky s whisker letkornak
SSzchasonltsra.
2. Irjuk t a 14.3-as pldt (Preandpost fix. cpp) gy, hogy al inkrernentl6 ope-
rtor hatsra cskkenjen az itsVal rtkc. Ha megcsinfiltuk s Iln1kc\ik, te-
gyk flre egy kis (egy rm vagy akr egy napr::l). Aztn nzzk meg jra
a programot. Mg mindig egyrtelmnek hogy hogyan viselkednek
az opertorok? E.'ielleg nmi zavart rznk, mikor a progmlllot futt at juk? Ebbl
taln kiderlt, mirt nem szabad a therhelstleljesen j funkcik kialaktsra
hasznlni.
3. Mdostsuk a 14.5. Listban bemutatott kdot (pl usoperator . cpp) &'Y, hogy
amnusz opertort is therhcljk. gy rjuk meg a kdOL, hogy az csupn egy
egyszeru kivonst hajtson vgre, majd futtassuk tc nhny klnbz6 bemenel-
tel. Szmt az objekrumok sorrendje az utastsokban?
14. 6ra Opertorok Memelse 1263
Vlaszok a kvzkrdsekre
1. A ** nem rsze a C++-nak, gy magt a fordtprogramol kellene trni, hiszen
nem tudja, hogyan kell azt kezelnie.
2. Megtehetnnk s taln lenne is rtelme. Azonban ms programozk 7A v;lrnak
ta llnk - 561 akr akr mi magunk is nhny v mlva, A nyelvben semmi sem
akadlyoz meg abb:m, hogy ezt megtegyk, mindazonltal ha egy m6d van r,
(,lin ne nehctsnk meg a sajlll1unknkat.
3. A kt opertor viselkedse teljesen klnbzik Prefix jells esetn vg-
rehajtjuk a s csak azutn OIV:lssuk ki az rtket. Postfix hasznlat
esetn ezzel szemben kiolvassuk az rtket, csak aztn hajtjuk vgre
a A tlterhelst hasznl programnak utnoznia kell eZl a viselkedst.
Pontosabban nem kell, de ha nt:.:m szeretnnk magunkat megutltatni a kollg-
inkk:tl, akkor kvessk ezt a szokst!
4. A konvertl segtsgvel objektumot alakthatunk beptett tpuss.
Ebben az rba!' a counter objektumot tanulmnyozluk s a vgeredmnyt
egyszenl egszkm kvntuk megkapni. A cl elrshez II konverzis operlo-
rokat hasznltuk.
15. RA
Tmbk
Mir611esz sz ebben az rban:
Mik <I tmbk s hogyan deklarljuk .
Mik a karakterlincok s hogyan hm;znlhal6k karaktertmbk karaktcrHinckl: nt
A tmbk s mutllt6k kzlti sszefggsek
Hogyan hasznlhal'Unk
Mi az a tmb?
A tmh a7.onos tpus objektumok sszessge. A tmbt ennek mcgre1e16en akr lIdat-
trolsra szolgl rekeszek sorozataknt is elkpzelhetjk. Minden egyes rekesz
a tmb egy-egy elemnek felel meg.
Tmbt gy deklarlhatunk, hogy megadjuk a benne trolt adatok tpust, lerjuk
a tmb nevt, majd kzvetlenl ez utn szgletes zrjelek kztt megadjuk a fl.ltin-
dexnek Csubscrip hatrt Ez utbbi rulajdonkppen nem ms, mint a tmbben
trolhat elemek szma szgletes zrjelek kz rva. lssunk. C&'Y pl!ldt:
long LongArray [25] ;
266 I IV. rsz Halad ,S2!<zk
E deklarci szerint a LongArray tmb 25 hossz egsz (long) tpus elemet k-
pes trolni. Amikor a fordtprogram ehhez a sorhoz r, lefoglal annyi memrit,
amelyben az adat elfr. Mivel esetnkben egy long tpus 4 bjtot
foglal, a fordt egy 100 bjtnyi mem6riateruletet fog lefoglalni. Ez lthat
a 15. L brn.

100 bytes
15.1. bra
l;gy 16mb deJdarl$a s tm/lak lia/sa
A tmbk elemei
Ha hozz akarunk frni a tmb egyelemhez, csupn meg kell adnunk a neve
utn annak indext, mgpedig ugyangy szgletes zrjelek kz ztva, mint a dekJa-
rciban. gyeljnk r, hogyatmbeleme nulltl szmoz6dnak, vagyis az els6 elem-
re a tOmbNeve[OJ formban hivatkozhatunk. E16z6 p ldnknl maradva teh:t
longArray [O I jelenti az imnt ltrehozott 2S tmbnk elemt,
longArray [ll a msooik:u s gy tovbb.
A swmozsnak ez a mdja els6re sokak si'..mra zavar. A SomeArray (31 dekla rci
azt jelenti, hogya someArray tmbnek 3 eleme van: SomeArra [O l ,
SomeArray [ll s SomeArray [2 ] . ltalnossgban teht a SomeArray [n] deklarci
mindig egy n tmbt mkar, amelynek awnban az eleme Somell.rray [O 1,
az utols eleme pedig SomeArray [n- l l. Megint visszatrve sajt pldnkhoz a 2S ele-
longArray tmb elemei loangArray [O) -tllongArray [24 J-ig szmoz6dnak.
A lS.l. lista egy olyan kdot mutat, amelyben lrrehozunk egy 5 egsz rtkMI ll
tmbt, s egyenknt feltlt jk az elemeit.
15.1. S .. - Eg6szekb6I AI16 tmb ltni_II s blllZlllata limnay. pl
o: 1115.1. Lista - Tmbk
1 : *i nclude <iostrearn>
2 ,
3: int main ()
4 ,
5: int myArray[51:
6: for (int i=O ; i<5; iH) II O- 4
7 : (
8: std : :cout Valuc for myArray [" i J : ";
9: std: :cin myArray[il ;
10 : )
ll : for (int i = O; i<5 ; i++)
12 : std : : cout i ": " myArray[i] "\ n";
13 : return O:
14 :
ValuE:l [oc myArray [Oj : 3
Va l ue fo c myArray [l J : 6
Valuc foc myArrny[2 1' 9
value for myArraytJ j: 12
Va lue foc InyArray [ 4] :
15
0 , 3
"
6
2 , 9
3 , 12
4 , 15
-
Az ;. sorban ttrehozunk egy myArray nevtl tmbt, amely t eb'Yszeres pont ossg
egsz rtket kpes trolni. A 6. sorban egy ciklus, amelybe n a ciklusvlloz6
o-t61 4-ig megy, vagyis ppe n megfelel egy 5 tmb indexei nek. A felhasznl6t61
minden egyes elemnek bekrilnk egy rtket majd berjuk az a tm belem be.
A tmbk szmozsnak teht az bekrt rtk myArray r OJ -ba fog
kerlni, a msodik myArray [lJ -be s gy lovbb. " msodik ciklus kirja II bekrt rt-
keket a kperny6re.
Aprop
A C++-ban a tmk indexelse nullval
A tmbk szmozsa nullval s nem eggyel Ez sokak szmra
elg furcsa, Igy a ltal elkvetett programozsi hibk igen hnyada
ennek a "nyelvi rdekessgnek" Ne felejtsk teht el, hogy ha van egy
10 ll tmbnk, akkor arra csak TmbNeve [Oj -tl TOmbNeve [91 -ig hi-
vatkozhatunk. TOmbNeve (10 J elem egyszeruen nem ltezik. Ha teht a fenti pl-
daprogramunk 6. s 11. sorban megengedtk volna az is a ciklusfeJ-
ttelben =5), akkor tlszaladtunk volna a tmb vgn.
26S I IV. r" Halad eszkzk
Tmbk tlrsa
Amikor fell akarunk rni egy tmbe!emet, a fordtprogram a trolt adatok mrete s
a tmbindex alapjn szmtja ki a eltolsi rtket. Ha pldul a LongArray [5]
elemel akarjuk mdostani programunk valamely pontjn, akkor a fordtprogram veszi
a long tpus hossz{n (vagyis 4 bjto, megszorozza azt az index nkvel (az eredmny
20), majd a tmb elejt61 ennyi bjt tvolsgra a megadott rtket.
Mrmost ha azt krjk l fordl6progmffitl, hogy rja fell a LongArray [50 l elemet,
az akkor is pontosan ugyanezt fogja csinlni, fgget lenl 31tl, hogya kf:rdses tmb-
nek nincs is ilyen sorszm eleme. Kisdimtj a, mi lyen messzire van a hivatkozou elem
a tmb - esetnkben 200 bjtnyira - azt n berja oda a megadott rtket. Csak-
hogy azon a mem6r3!.erleten gyakorlatilag brmi lehetett, "mit felOllrva <'lZ eredmny
egyszeruen megj6solh:llatlan. Ha szerencsnk v,ln, a progL'"munk azonnal lell valami-
lyen misztikus hibval. Ha viszont nincs, akkor a program tovbb fut, kiszmol min-
denfle eredmnyeket, mi pedig hosszan trhetjk :l fejnket, hogy hol is lehet
a problm:L
A tmbk kezelsvel kapcsolatban teht a fordtprogram gy viselkedik, mint a vak
ember, aki elindult hazulrl egyet stlni. elmegy az hzig, vagyis
a F6Utca (O] elemig. Eddig a dolog rendben is volna. Ha most ilt azt mondjuk neki,
hogy menjen el :1 FG utca hatodik hzhoz, "kkor azt mondja magban: most <'lZ els6
hznl llok, teht mennek kell mg t Mznyit. Minden hz ngy lps hosszsg, tc-
ht mennem kell sszesen mg hsz lpst. Ez egszen addig rendben is va n gy, amg
van a utcnak olyan hza, amire hivatkoztunk. Ha viszont azt mondjuk a vak em-
bernek, hogy menjen el II FC; utca 1OO-ba, de a F6 utc:{lban sszesen csak 25 hz van,
akko r is menni fog 400 lpst, men 6 ezt nem tudja. Po ntosabban csak akarna menni
400 lpst, mert szinte biztos, hogy mg odllrne, beleesik valami gdrbe,
vagy elti egy busz. Szval ha egy md van r, lcgynk vatOSlIk, hogy hova kldjk
a szerencstlent.
Kerftsoszlop hibk
Az egyik leggyakoribb programozsi hiba az, amikor pontosan egy elemmel nLnk tl
egy tmbt. Ami azt illeti , annyira gyakori, hogy kln neve is van: ezt nevezzk ker-
tsoszlop hibnak. A nv egy az emberi gondolkodsmd nucsasgt kihaszn l tal-
165 krdsbl ered. Ha megkrdeznk embereket, hny kertsoszlop kell egy tz m-
ter hossz kertshez, ha mterenknt egy oszlopot akarunk lesni, akkor a legtbben
azt fogjk vlaszolni hogy tz. Pedig valjban tizenegy, hiszen a vgre is kell egy z-
r6 (lsd a 1;.2. brt).
15. ra 269
15.2. bra
Hny osz/op I..'CII egy tz mter lIosszr kerllshez? ..
Ez az eggyel val tlszaladsos problma rengeteg programoz lett keserti meg. Id5-
vel aztn megszokja az ember, hogya 25 tmb utols eleme a huszonnegyedik,
men a szmozs nullt6l indul, de addig elkveti nhnyszor II kertsoszlopos butas-
got. CA C++ programoz6k egybknt gyakran nem rtik, mirt nincs az plctekbel1
nulladik szint. Olyannyira nem, hogy egyesek tnyleg a ngyes gombot nyomjk mcg
a liftben, ha az tdikre akarnak menni. Ezen aztn a tbbiek jl szoktak sz6mkozni.)
Tmbk
Ha egy tmb elemei egyszeru beptett tpusok (pldul egszek vagy kaT"J.kterek), :ik-
kor a deklarfi ci6val egy inidaliz..i lhatjuk is. Ehhez nem kell egyebet tenni, mint
a neve utn egy egyenl6sgjelet rni, majd kapcsos zrjelek kztt felsorolni az ele-
mek nkt. L-',ssunk egy pldt:
int IntegerArrey[51 = ( 10, 20 , 30. 40 , 50 J ;
Esetnkben az IntegerArray t egsz szmot tanalmaz. Az I ntegerArray [O J elem-
be 10 kerl, az IntegerArray [1) -be 20, s gy tovbb.
Ha a deklar:'id6ban nem adjuk meg a tmb mrett, akkor II fordtprogram akkora
helyet foglal le neki, amennyiben az inidalizcis rtkek elfrnek. Ha teht azt
hogy
i nt Integerl\ rray l ] = ( 10, 20, 30, 40 , 50 );
az eredmny pontosan ugyanaz lesz, mim az imnt, amikor explici t mdon megadtuk,
hogy t elemb61 lljon a tmb.
Ha kvncsiak vagyunk egy tmb mretre, meghatrozhatjuk azt a mr ismert
sizeof () fggvny segtsgvcl a kvetkez6 mdon:
cons t int Integerl\ rrayLengt h
sizeofClntege rAr rayl Isizeof ClntegerArray[O} l ;
Pldnkba az I nt egerArrayLengt h vltoz rtke a tmb hossznak, s az els6 elem
hossznak hnyadosa lesz, ami nem ms, mim a tm elemszma.
170 I IV. rsz' Halad aszkzk
Ha a deklaruciban megadjuk a mrett, akkor az inicializci sorn nem
tunk meg ennl tbb elemet. gy pldul a deklarci6m fordti hibt fo-
gunk kapni, hiszen hat elemet prblunk elhelyezni egy t ll tmbben:
int IntcgcrArray[S] '" { 10, 20, 30, 40, 50, 60};
Ugyamikkor kevesebb elemel adhatunk meg az inicializciban, vagyis a
forma helyes:
int IntegerArray[Sl = ( 10, 20);
Objektumtmbk
B:'lrmely objektumot - legyen az bc{:ptetllpus vagy a felh:lsznl6 ltal definilt - t-
rolhan,mk tmbben. Amikor tmbt deklarlunk, tulajdonkppen csak kt informcit
adunk meg a fordt6progf<lIUoflk: a trolni kvnt objektumok tpust s azok szmt
A fordt ez abpjn mr elrudja dnteni, hogy mekkO' d mem6rialerl etet kell lefogla l-
nia s ez neki elg is. Hogy egy adott objektumtpus trols hoz mennyi memria
szksges, azt a fordtprogram a osztly deklarcija abpj{\o dnti el. En-
nek az osztlynak mellesleg kell legyen egy olyan ,\Iaprtelmel.ett is, ami
arglllnentumok meg:lds:l nlkl kpes alaphe1yzetbe lltani az objektumokat, hiszen
ezen kereszrill hozz., lC:tre II fordtprogram a tmbben trolt valamennyi objektumot.
Aprop
Az alaprtelezett konstruktor
Itt szeretnnk emlkeztetni arra, hogy az alaprtelmezett konstruktort nem flttlen
a fordftprogram hOlla ltre automatikusan. ltrejhet [gy is, de megfrhatja maga
a is. A lnyege mindssze annyi, hogy nem lehetnek paramterei.
Egy tmbben trolt objektum valamely adanagjhoz val 6 bozz(l':rl':s mindenkppen
ktlpsl foglal magban. is meg kell adunk a r l opertorml, hogy az objek-
tl.lmtmb h:'inyadik van sz, ntn pedig a tagopertor (.) seglsgvel hozz{\-
frhetnk a krdses adattaghoz. A 15.2. Listban beml.ltatjuk, hogyan hozhatunk ltre
egy t CAT objektumbl ll tmbt.
15.2. Lista - Objektumtmb ltrehozsa (objarray.cpp)
o: II 15 .2 . Lista - Objektumok tmbje
1: #include <iostream>
, ,
3: class CAT
, ,
5: public :
6: CAT() ( itsAge = l; itsWeight =5; ) II Az alaprtelmezett konstruktor
1: {} II A destruktor
8 : int GetAge{) const I ret urn itsAge; }
9 : int GetWeight() const { return itsWeight;
10 , void SctAgc{int agc) { it s Age = age; }
ll :
12 : private:
13 , i nt i tsAge;
14: int itsWcight ;
15 : } ;
16 :
17 : int mainO
18 ,
15. 6ra Tmbk 1271
19 : CAT Littcr[5] ; II Ltrehozunk egy 5 obj ektwnbl .1116 tmbt
20 : int l ;
" 1: f or (i :: O; i < 5 ; i ++)
22 : +1) ;
23 :
24 : f or (i:: O; i < 5 ; i ++ )
25 : s td:: C':Qut eat i +1 . :
26 : Li t t er r i ) . GetAge () st d ,; e ndl ;
27 : r e turn O;
28 :
oat U : l
cot
'2 :
3
cat
'3 :
5
cat H : 7
cat
'5 :
9
A CAT osztly deklarcija a 3 15. sorokban lthat. Ahhoz, hogy CAT lpuSlI o bjektu-
mokat tmbben lehessen trolni a CAT osztlynak mindenkppen rendelkeznie kell
alaprteJezelt konslruklorl".ll. Ennek a dekl arcija lthat a 6. sorba n. Ne fclcj ls.ik cl ,
hogy ha hozunk ltre brmilyen ms konstruktort, akkor a fordt6progr::un llal biztos-
toct alaprtelmezett konstruktor nem jn ltre, vagyis azt is neknk kell megrnunk.
A 19. sorban lefoglaljuk a nagysg mem6rt egy olyan tmbnek, amely 5
CAT tpus objektum trolsra kpes. Ennek a tmbnek Litter lesz a neve.
Az fo r ci klus (21. s 22. sorok) belltja az t CAT objektum kort. /\ msodik cik-
lus (24-26. sarok) jra egyenknt vgigmegy a tmbdemeken, s valamennyinek meg-
hvja a GetAge ( ) metdust
Llhat, hogy ez ut6bbi esetben mindig elbb a Litter [ il konstrukcit haszn ljuk,
amivel kikeressk a sorszm tmbelemet, majd ezt kveti a pont (.) oper-
tor, amivel a lagfggvnyhez fr nk hozz.
272 I IV. rsz Halad6 eszkzk
Tbbdimenzis tmbk
Egy tmb tulajdonkppen nem egyb, mint adatsor. Adatokat azonban nem C!iak sorba
lehel rakni. Elkpzel hetjk pldul rcsba szervezve, ahol vannak soruk s oszlo-
pok is. Ezt a felptmnyt nevezzk ktdimenzis tmbnek. Az els6 dimenzi felel
meg a soroknak, a msodik az oszlopoknak. Innen persze mr csak egy lps a hrom
dimenzi, vagyis a kocka. Itt a kiterjedsek a szles.sgnek, magassgnak s a hossz-
sgmIk felelnek meg. Mi tbb, akr hromnl tbb dimenzis tmbkkcl is dolgozha-
tunk, ha ppen erre van szksg. Ezeket persze mr sokkal nehezebb elkpzelni, vagy
vals, trbeli objektumokkal kapcsolatba hozni, de nha tnyleg hasznosak.
Amikor deklarlunk egy tmbt, minden megadott index egy-egy tmbdimcnzi6nak
fclcl mcg. A ktdimenzis tmbknek teht kt fut indexe van, a h{lromdimcmd6sok-
nak hrom s gy tovibb. A C++-ban egy tmbnek gyakorlatilag lctszO"legcsen sok di-
menzij" Jehel, de l megoldand fejadatok lermszetb61 addan a legtbbszr egy-
vagy ktdimenzis tmbket hasznlunk.
A ktdimenzi6s tmb hasznlltra kivl pld,l a sakktbl:!. A tmb egyik kiterjedse
a nyolc sornak, a msik a nyolc oszlopnak felel meg (lsd a 15.3. brt).
."
15.3 bra
A sakkIbia s a kIClimellzis 16mb megfeleltetese
Tegyk fel, hogy van egy SQUARE osztlyunk. A sakktblnak
tmb deklarcija ezzel a nzhet ki:
SQUARE Board [8) [8) ;
l5.ra-
Ugyanezt az adatmenyisget termszetesen trolhatnnk cm' 64 ll 6 egydi-
menzis lmhben is a
SQUARE Board[64l
Ugyanakkor ez a megolds nem ll szerkezetileg olyan kzel a vals, lerni kvnt ob-
jekturnhoz, mint az A jtk kezdetn a kirly az sor negyedik ll.
Figyelembe vve, hogy a sz. lllozs most is nulltl indul, ez a pozci a
kppen rhat le:
Board{O] [3) ;
A fenti kd persze tartalmaz mg egy felttelezst is, nevezetesen hogya sorokat az els6
index reprezentlja. A helyes indexelst s a helyzett szemllteti a 15.3. bra.
Figyeleml
A tmbk helyfoglalsr61...
A tbbdimenzis tmbk flelmetes gyorsasggal kpesek elfoglalni a teljes me-
mrit. Ne felejtsk el, hogy a szksges trhely szmtsnl az indexrtkek itt
szorzdnakl
Tbbdimenzis tmbk inicializlsa
Az egydimenzis tmbk hz hasonlan termszetesen a tbbdimenzis tmbk dek-
larcijban is megadhatunk kezdrtkeket. Il yenkor az elemeket gy kell felsorol ni,
hogya tmb utols indexe vltoz.zon a leggyorsabban, vagyis mikzben az utols n-
vekszik, addig !lZ sszes tbbi legyen ll and. Nzznk egy pldt! Legyen egy tm-
bnk, melynek deklarcija a
int theArray[Sll31
Ha ebben a dckl:irci6ban kezd6rtkckct adunk meg, akkor az hrom a the-
Array [O) indexl sorba keru I, a msodik hrom a theArray [1) sorba s gy tovbb.
Nzzk pldul a deklarcit:
int theArray[5l[3 ] = { 1, 2 , 3 , 4, 5 , 6 , 7 , 8 , 9 ,1 0 ,11,12,13 , 14 , 15
Ha uthat6bban szeretnnk lerni az inicializcis rszt, akr azt is megtehetjk, hogy
kapcsos zr6jelekkel csoportostjuk a felsorols elemeir valahogy gy:
int thcArray[5] [3] .. ( {1,2 , 3} ,
{4,5 , 6},
{7 , a , 9},
{lO,11.12},
{13,14 , 15} );
274 I IV. rsz Halad 'szKzk
A fordtprogram automatikusan figyelmen kvl fogja hagyni II bels6 kapcsos zrjele-
ket, vagyis ezek csupn a programoz szmra teszik olvashatbb a kdot, hiszen vi-
lgosabb teszik, hogy melyik rtk melyik tmbelembe kerl.
Az inicializl rtkek felsorolsban minden egyes szmOl vessz6vel kell elvlasztani
a szomszdaitl, mgpedig fggetlenl att61, hogy alkalmaztunk-e bels6 7.1ir6jelezst.
Ezen kvl II teljes inicializcis szakaszt kapcsos zrjelek kz kell zrni , a deklarci-
l pedig szoks szerint pontosvessz6 zrja. A 15.3. listban egy ktdimenzis tmbt
hozunk lt re . Ennek az els6 dimenzija II O-4 indexeket, mg II msodik II 0-1 rtkeket
veheti fel. Az alaprtkeit gy llt juk be, hDb'Y minden l -es elem a O-s indexi
ktszerese legyen.
o: /I l.lstl ng 15.3 - Creati ng A Mul t idime ns i ona1 Ar ray
1 : *incl ude <i ost r e am>
, ,
3 : int
4: (
mai n ! )
5 ,
6 ,
int
for
SomcArray [5 1 [21 .,. ( (O, O), {t , 21, (2 ,4 ), (J , 6), {4, 8}} ;
(int l = O; 1<5 ; i++)
7 : for
8 , (
(int jeD; j<2 ; j ++)
9 ,
std : , eout
10 :
11 , J
"SomeArray[" i l ( 0
SomcArray[il [jl std : : end1 ;
12 : return O;
13 :
SomeArray[OI [Oj :
SomeArray[O) [l) ,
Somehrray [ ll [Ol :
SomeArray [ ll [ll '
SomeArray [2) {O l :
Some Array[ 21 (l ):
SomeArray (3 1 [0 1 ,
SomeArray {3 ] [l ]:
SomcAr ray [ 4] [O ],
SomeArray[ 4] [l ]:
O
O
1
,
2
4
3
6
4
8
j o ) ,o;
Az 5. sorban deklarci szerinl SomeAr r a y egy ktdimenzis tmb. Az
kiterjedse t , a msodik kl elem hosszsg. Ezr reht egy 5x2-es rcsnak
adalSzerkezel (lsd a 15.4. brt).
15. 6ra Tmbk 275
, ,
3 3
2 2
o o
some Array [5[ [2[
15.4. bra
L;iV' 6tszr J..'Clles rcs megfelelje a mell/rilxIII
A tmb elemeit pronkt:nt inicializ;ljLlk, br ami azt illeti , akr ki is szmUlatnnk
egy k6drszlettel. A 6. s 7. sorban kt egymsba :'igy:l zott ciklLlS kezd6clik.
A ciklus az mg :1 bels6 a msodik tmbindexen halad vgig, ,1111int az :1 ki
rsbl is llhat, hiszen SomeArray [ Ol [Ol-t SomeArray [O J [l J kveti. Az
tmbindex aktulis rtkr termszetesen csak akkor inkrementlja a progrdm, amikor
a msodik leheL<kges rtkein vgigrt a bels6 ciklus. Aztn (jjra kezd6dik ell r61
a ciklus.
Nhny sz a memriahasznlatrl
Amikor deklarlunk egy tmbt, pontOsan megmondjLlk a fordtnak, hogy hny cIc
met szcretnnk benne trolni. A fordtprogram ennek htttls{]ra lefoglalja a szksges
memri atenlletet, amiL akkor is lefogla lva tan, ha a tmb egyes rszeir soha nem is
hasznljuk. Ez a stratgia nem jelent klnsebb problmI abba n az esetben, ha
meg lehet mondani, hogy a tmbnek legfeljebb hny eleme kell legyen. Egy sakktbla
pldul mindig pontosan 64 ll , dc az is hogy egy macsknak (CAT
objektum) eb'Yszerre krlbell 1-10 klyke lehet. Vannak ugyanakkor esctek, amikor
fogalmunk si ncs, hogya program futsa sor{m hny adon tpus elemre lesz majd
szksgnk. Il yenkor kifinomultabb adaLo;Zt;'rkezctckct kell haszn:\ lnunk. Ebben
a knyvben ppen ezrt sz esik mg a a dinamiklIs memriban
lefoglalt terl etek tmbkm val hasznlatrl, illetve nhny egyb adatt rolsi szer-
kezctr61 is. A 19. rban pldul az gynevezett lncolt listkrllesz majd sz. Ugyan-
akkor a mg ennl is kifinomultabb adaLo;zerkezctck, amelyek kifejezetlen nagy
mennyisgIl adat hatkony trolsra hasznlllatk mr tlmutatnak e knyv keretein.
Errol a tmrl szlnak azok a bizonyos ,.Algoritmusok s adatszerkezetek" cm tan-
knyvek, amelyekb61 szmos programoz tanul a klnbz6 cgyelcmi s
kurzusokon. A programm..sban amgy az a szp, hogy soha nem lehet a vgre rni.
Mindig van mg mil tanulni , b'Y mindig van mg msik knyv is, amil el kellene olvas-
ni. Az t vgtelen.
27S I IV. resz eszkzk
Mutattmbk
Az eddig trgyalt tmbk kzs vonsa, hogy valamennyien a vermen (stack) kapnak
helyet. Mivel azonban a veremteriilet a rendszerek tbbsgnl meglehetsen korltos,
a nagyobb tmbket a dinamikus memriban ltrehozni . van
pldul arra, hogy a tmbbe szervezett objektumokat tnylegesen :t dinamikus mem-
riban hozzuk ltre, magban a tmbben pedig csak egy-egy dr11i:6 mutat6t t:rol-
junk. Ez OL mdszer nmag{tlxl ll drasztikusan cskkenti l trult adatmennyis-
geL A 15.4. Listban trrl.lk a 15.2. Listba n bemutatott kdot llgy, hogy ell a kombi-
nlt mdszert hasznlja. Mivel gy sokkal kevsb kell aggdunk altl , hogy elfogy
a rendelkezsre ll mem6ri a, a tmb mrett S-r61 500-ra emeltk s lneveztnk
Litterr61 Familyre.
15,4. Lista - Tmbelemek trolsa a dinamikus memriban (arravonheap.cpp)
0, /I 15.4 . Lista Objektumok eimt trol tmb
l: .include <iostream>
2 ,
3 , class CAT
4: (
S: public :
6 : CAT() ( itsl'lge '" l: i tsWeight =5 : ) II alaprtelmezett konstruktor
7 : {} II dest.ruktor
8 , int GctAge{) const ( rcturn itshge: )
9 : int GetWeight{) const ( return itsWeight;
10 , void SetAgc(int age) ( itsAge = <.Ige; )
ll :
12 , privata :
13 : int itsl'lge ;
14 : int itsWeight;
15 , );
16:
17 : int main()
18 :
19: CAT Family[500);
20 , int 1;
21 : CAT !;leat ;
22 : for (i ." O; i < 500; i H)
23 : (
24 : pCat = new CAT;
25 : pCat->SetAge (2 *i +1) ;
26: Family[i) = pCat ;
27 : )
28 :
29 : for (1 = O; i < 500; i++ )
30 : std: : cout "Cat ff' i +l " :
31 , Family[ i]->cctAge() s td, : end l ;
32 :
33 : for (i = O; i < 500 ; i ++ )
34 : {
15. 6ra Tmbk
35 : delet e Family [i l ;
36 : Family[i ] NULL ;
37 : )
]8 :
39 , return 0 ,
40,
menet
Cat
fl,
l
Cat
'2 :
3
c.t
'3 :
5
Cat M499 : 997
Cat : 999
A CAT osztlyt a 3-15. sorokban deklarljuk. Ez a form .. amClgy mindenben megegyezik
a 15.3. Li stban bemutatott:!!. Ugyanakkor ez alkalommal a 19. sorban tal lhat tmb
neve m!lf Family, s a dekl:lrcija szeri nt 500 darab CAT tplJS objektumot dmz6
mulat! kpes trolni.
A nyit ciklusban C22-27. sarok) 500 j CAT objektumot hozunk ltre, amelyek a dina-
mikus memriban kapnak helyet. Valamennyi j ohjektumban bellrjuk az letkort is,
mgpedig a sorszm ktszeresl:nl eggyel nagyobb rtkre. Az els6 CAT objektumnl
teht az rtk 1 lesz (a sorszm nulla!), a msodikn13, a harmadi knl 5 s gy tovbb.
A dklusmag Ulols6 az objektumot mulatt el helyezzk a
tmbt:lemben.
Figyeljk meg teht, hogy ebben az esetben nem maga az objeknnn (eAT) kerl bele
a tmbbe, hanem csa k egy azt mutat6, ami a tmb deklarcija alapjn pcrsze
nem is lehet msknt. A msodik ciklus (2931. sorok) kirja az egyes eltroh nkeker.
Ehhez ebben az esetben ktlpsrc van szksg. kivesszk a objek-
tum dmt a tmbbl (Family lil), majd ezen kereszCi.iJ meghvjuk a Ge tAge () tag-
fggvnyt, ami visszaadja a kvnt rtket.
Pldnkb-.1O a Family tmb s n abban trolt valamennyi mutat6 a vermen kap he-
Iyel. Ugyanakkor az 500 darab CAT objektum a dinamikus memriban van. Ennek
a mdszernek verem tehermentestsn fl megvan az az is, hogy
progmmszervezssel csak annyi memrit kclllefoglalnunk a CAT objekollnok szm-
rn, nmennyit tnylegesen hasznlunk is. Igaz ugyan, hogya fenti k6dban nem ez trt-
nik, hanem egyszeruen egy dklussalltrehozunk 500 ilyen objektumot, de a dklusvl-
toz hatrt akr a felhasznltl is bekrhellk volna. Bizonyos esetekben cz
nyilvn sokkal gazdasgosabb mdszer, mint eleve ltrehozni adott szm objektumot.
278 1 IV. rsz Halad eszkzk
Vgezetl egy harmadik ciklusban trljk a memribl mind az 500 CAT objektu-
mot, a Family tmb elemeit pedig null rtkre 5l1ljuk
Dinamikus memriban trolt tmbk deklarlsa
Arra is van, hogy a teljes tmbt a dinamikus memriban [roljuk, ne
csak a bCl1ne elhelyezett objektumokat. Ehhez a new opertorL kell hasznlnunk de
gy, hogy aZI kombinMjuk a tmbindex megadsval. Ennek a az eredm-
nye egy mulat lesz, amely :17.1 l memriateriilelet cmzi, ahova ti kerlt. Lssunk
egy pldt:
CAT *Family = new CAT15001;
Ez a deklarci azt mondja, hogy Family egy muLat, amely egy 500 darab Cl\T tpus
objektumot t'iro16 tmbt dmez. Msknt fogalmazva Family nem egyb, mint
a Family[OJ elem dmI:!.
Ennek ,I megoldsnak az egyik nagy az, hogy kezdve Inumtaritmetikt is
hasznlhatunk a tmbelemek dmzsre. Lssunk erre is egy pldt:
C1\T "Family = new ClIT(5001 ;
CAT *pCaL = Family; II pCat a Family[OI e l emre mutat
pCat->Setllge(lO); II Fmily[O] rLkt lD-re llit juk
pCat++; II advance to Family [l ]
pCat->SetAge(20); /I Pamily(ll rtkp.t 20-ra llit juk
A femi els6 ltrehoz egy 500 CAT tpus demet trol tmbt a dinamikus me-
mrib:m s egy mutatl, amely ennek a tmnek az cls6 elemt cmzi. A harmadik sor-
ban ezen a mut:1tn (pontosabba n a msolatn) keresztl hvjuk meg az ilyen CA'l'
objektum SetAge () tagfggvnyt, s helltjuk vele a 1 Q-es rtket. A mlllall ez-
utn inkrementljuk, melynek hal.s{ira immr a CAT objektumot cmzi. EZl is-
mt a mr ltott mdon hasznljuk, vagyis megint meghvjuk az aktulisan cmzett ob-
jektum Set1\ge () de immr a 20 rtket adjuk neki bemenelknl.
Tmb mutatja s mutatk tmbje
Vi:t.Sgflljuk meg a kvetkez6 hrom deklarcit:
1: Cat FamilyOne[500l
2: CAT FamilyTwo[SOO];
3: CIIT Family'l'hree = new CAT[500] ;
FarnilyOne egy 500 CAT objektumot trol tmb. FamilyTwo 500 olyan mutatt lrol,
amelyek CA'r tpus objt!ktumokat cmeznek. FamilyThree maga egyetlen mulat egy
olyan tmbre, amely 500 CAT objektumol trol.
15.6ra Tmbk 1279
A hrom deklarci kzti eltrsek drmaian befolysoljk a hrom dolog mkdst.
Ami taln mg ennl is az az, hogy flg FamilyThree rulajdonkppen
FamilyOne valamifle vari nsnak is felfoghat, addig FamilyTwotl gykeresen k-
lnbzik.
Mindezzel el is jutottunk ahhoz a krdshez, hogy miben is egyezik illetve tr cl egy-
mstl egy tmb s egy mutat. FamilyThree egy mutat, amel y egy tmbt cmez,
vagyis tanalma nem ms, mint e tmb elemnek a cme. A FamilyOne esetben
sz szerint ugyanez a helyzet, vagyis maga a tmbnv nem c!''Yb, mint a tmbt cm-
z6 mutat.
Mutatk s tmbnevek
C++-ban a tmb neve ncm egyb, mint egy konstans mutat, amely,) tmb els6 ele-
mt d mz!. N(:zzk a kvetkez6 deklnrcil:
CA'r Family l S0 1;
lu Family ncm egyb, mim egy mmal, mgpedig egy olyan mm:H, amelynek t:utal-
maz az a cm, amit a &Family 101 mllvelettel is megkaphatn5nk. Kicsit egyszenlbben:
a tmb nevt lerva a tmb c1s6 elemnek cmt.
A C++-b:m teljesen elfogadott, ha egy tmbnevet lland nllltatknr hasznlunk, vagy
pp fordtv:l. A Family + 4 forma teht ebben a nyelvben ugyanazt jelent i, mi nt
a Family r 41, ugyangy hi vatkozhatunk vele brhol a tmb tdik demre.
Ha egy mulal rtkhez hozz:'iadunk egy szmoL, inkrememljuk, v:tgy dekremen-
tljuk aZl, az ehhez szksges Imlvelete a fordt6program vgzi el. EZl azrt fontos
hangslyozni, mert a Family + 4 forma termszetesen nem egy olyan dmet jelent,
ami 4 bjtnyira van a Family tmb e1ejt61. Ha pldul minden, a tmbben trolL ob-
jekmm 4 bjt hosszlIsg, akkor a Family + 4 cm 16 bjtnyirn lesz a tmb kezdet-
t61. Ha vi szont a Family tmb CAT tpus elemeket trol, s minden CA'!' 20 bjtnyi tr-
helyet ignyel, :lkkor Family 4 jelentse egy a tmb elejt6180 bjt tvolsgra nm-
tae Cm lesz.
A 1 S.5. Li sta olY'1n k6clor mutat be, amelyben a dinamikus memriban hozunk
llre egy tmbt.
15.5. Lista - Tmb ltrehozsa 8 new opertorral (oewarrav.cpp)
o: II 15.5 Lista - TOmb a dinamikus memriban
1 : Hinclude <iostream>
2 ,
3 : cla.ss CAT
4 : {
5: public :
280 l iV. rsz Halad6 eszkzk
6: CA'!'() { itsAge = 1; itsWeight=5; } 1/ alaprtelmezett konstruktor
7: ~ C A T ) ; /1 destruktor
S : int GetAge() const ( retllrn itsAge ; )
9 : int GetWeight() const { return itsWeight;
10 : void SetAge(int age) { itsAge '" age ; }
11 :
12 : private :
13 : int itsAg-e :
14 : int itsWeight ;
15 : J ;
16 :
17 : CAT : : ~ C A T )
18 : (
19 : /1 std " eout "Destructor called!\n' ;
20 : )
21:
22 : int main()
23 :
24 : Cl\T * Fl.lmily .. new CAT [ 500j ;
25 : int i;
26 : CAT pCat ;
27 : for (i '" O; i < 500 ; iH)
28 : {
29 : pCat = new CAT;
30 : pCat->SatAqe(2 * ] +1};
31 : Fumily[ll ,. ' pCat ;
32 : delete pCat;
33 : l
34 :
35 : for (i .. O; i < 500; iH)
36 : std :: cout 'Cat ." 1+1 ':
37 : Family[ij.GetAge() std:: endl ;
38 :
39 : deletc [I Family;
40 :
41: return O;
42 :
Kimenet
Cat U: 1
Cot 1/2 : 3
Cot B: 5
Cat "499 : 997
COL 8500: 999
A 24. sorban deklarljuk a F'amily tmbt, amely 500 CAT tpus objektumot kpes t-
rolni. A new CAT[SOOI utasts hatsra ebben az esetben az egsz tmb a dinamikus
memriba kerl.
Aprop
Egy mGszaki rszle!...
Technikai rtelemben a 24. sorban tulajdonkppen egy a dinamikus memriban le
nvtelen tmbt deklarlunk. A Family mufafba csupn a tmb elem
nek dme Ennek ellenre ltaliIban azonosnak ezt a mutatt magval
a tmbbel, ami azrt nem helytelen, mert maga a C++ fordt is gondolko-
dik". Amikor ltrehozunk egy tmbt -legyen az akr a vermen, akr a di namikus
memriban - annak a neve tulajdonkppen nem ms, mint egy mutat, amely
az els elemt clmzi.
A tmbbe kerl6 CAT objektumokat szintn a dinamikus memriban hozzuk ltre (29.
sor). Figyel jk meg ugy,makkor, hogy I:!bbl:!n az I:!setben nem az j objektumok mUlat6i
kerlnek a tmbbe, hanem m:Lguk az objl:!ktumok. Ez a tmb teht nem mUlaltmb,
amelynek ekmci Cl\T tpus objektumokat cmeznek, hanem CA'I' objektumok tmbje.
ltah'iban a [ l opertor( helyeltesthetjk a * opertorral Gndirekd) is. A Family [3 J
teht cbben a helyzeten ugyanazt jelenti, mint a * (Family + 3) forma.
Dinamikus memriban ltrehozott tmbk trlse
A Family nv teht nem egyb, mit egy mutat, amely egy a dinamikus memri!ib:u,
tall hat, CAT objektumokat tartalmaz tmb els6 elemt cmzi. Amikor a 15.5. Lista
31. sorban hasznljuk a pCat mlllatt, akkor az garantltan egy I I dinamikus memri-
ban ltrehozou CAT objektl.lmra mOIat, ami most bekerl a tmbelembe.
( Eddig ugye semmi meglep nincs 3 dologban, elvgre pont arrl van sz, hogyan kell
a dinamikus memrifib:m objektumtmbket kezelni .) Csakhogy a pCat mutatt ti cik-
lus kvetkez6 itercijban is feihasznljlIk. Nem jr ez azzal a veszllyel hogy az el6-
z CIIT objeknllnra mr nem mutat semmi, s soha tbb nem fildjuk felszabadtani
az {t1t:da lefoglalt memrit?
Ez valban nagy gond lehetne, de valjban nem kell t61e tartanunk. A fordtprogram
elg okos ahhoz, hogyemlkezzen az ssze dinamikusan kezelt objektumra, gy bizto-
sak lehetnk benne, hogy az objektumtmb valamennyi eleme s progra-
munk vissL1kapja az ltaluk lefoglalt memrit.
Hogy megbizonyosoclhasSlmk err61, mdostsuk egy kicsit a 155. Listban bemutatott
kdot. is vltoztassuk meg a tmb mrett 500-r61 IQ-rc a 24., 27. s 35. sorok-
ban. Aztn vegyk ki a megjegyzsjelct a 19. sorban lthat6 cout utasts Amikor
a program futsa a 39. sorhoz rkezik, a tmb mr nem ltezik, a rendszer meghvta
az abban trolt valamennyi CAT ohjektum deslruktorl.
Amikor a dinamikus memriban ltrehozunk. egy objektumot a new opertorral, azt
a delet e utastssal lehet onnan trlni, amit az elem neve kvet. Ehhez teljesen ha-
282 l iV. rsz Halad6 eszkzk
son!an ha a new <osztly> [l utastssal hozunk ltre egy objekmmtmbt, akkor
azt a delete [J <osztly> utastssal lehet trlni. Az res :z.'lr6jelpr jelzi a fordt-
nak aZl, hogy in egy egsz tmb van sz.
Ha vletlenl kifdejtjk a zrjeleket, akkor a mcrvelet csak az objektumtmb ele-
mt fogja trlni. EZl szintn belthatjuk is, ha a 15.5. Lista 39. sorb] el-
tvoltjuk a Ha ezzel prhuzamosan tszerkesztjk a 21. sort is gy,
hogya destruktor a jelezze, ha lefut, akkor lthat6, hogy csak egy ilyen jel-
zs jelenik meg, vagyis csak cb'Y CAT objektum trl6dtt. Sz6val gr..ltullunk! pp most
sikerltl trchozni cgy mcmr;akczclsi hibt (memory leak).
Helyes
Ne felejtsk el, hogy egy n
tmb elemei O-ll n-J-ig sz5moz6d-
nak.
Tmbk indexelst csa k olyan mu-
tatkon keresztl vgezzk, amelyek
valban az adott tpus tmbre Ilm-
tatnak.
Karaktertmbk
Helytelen
Ne prbljunk egy tmb vge utn r-
ni, vagy onnan olvasni.
Ne keverjk ssze a tmbt
muta tt a mlllat6tmbbe l.
A kar.lktcrl:'inc nem egyb, mint karakterek sorozata. Eddig C.'i upn nvvcl nem rcndel-
karakterlncokkll ltallkoztunk, ltalban a eout utastssal kapc.'>Ohnhan. me
egy plda erre:
cout "hel lo world. \n";
C++-ban a kal"oIkterlnc tulajdonkppen egy karaktert mb, amelynek vgt egy null
karakter jelzi. (A null karakter jellsre - megklnbztetend6 a NULL rtkU mutat-
tl- a '\0' hasznl:1tos.) Ennek megfelel6en egy kal"oIktcrlncot deklar.'ilhatunk s ini
daliz lhntunk is ugyangy, mint egy tmbt. Helyes teht a kvctez6 forma:
char Grccting [l .. { ' H', ' e ', 'l' , ' l ' , ' o ' , '
' W' , ' o ', ' r' ,' l ' , ' d ', ' \0 ' };
A sort zr i \0 ' karakter az a bizonyos null kllrakter, ami alapjn a C++ fggvnyei
meg tudjk mo ndnni, hogy hol van a karakterlnc vge. Br a fenti mdszer
kpes, sem knyelmesnek, sem biztonsgosnak nem nevezhet6. Sz{unos helyen el le
het gpelni, arTI nem is beszlve, hogy egy szveget betfinknt, elvlaszt
va begpelni inkbb gpr6i bravr, mint rtelmes mcgolds. ppen ezrt a C++ bizto-
st egy sokkal a karakterl ncok megads."ira:
char Greeting[) " "Hello World" ;
15, 6ra Tmbk 1283
Ezzel a szintaxissal kapcsolatban kt dologra szeretnnk flhvni a figyelmet:
Az itt nem egyszeres, hanem kell
hasznlni, a vessz6k s a kapcsos zr6jelek pedig nem kellenek.
Nem kell kln kirnunk a zr null karaktert, az II fordtprogram automatiku-
san beilleszti a karakterlnc vgre.
A "Hello World
n
karaktednc 11 ll , teht 12 bjt hosszsg. A Hello 5 b{ljtot
tesz ki, II sz6kz egyet, a World jabb ll, a zr null kardkter pedig egy bjlOS.
Deklarlhatunk inicia1i7..ci6 nlkl is kar:.lktertmbket. Ezeket szoks puffereknek is
nevezni. Mini ffiindtm lmbnl, termszetesen ill is gyelnnk kell arra, hogy nem
akarjuk tbb karaktert elhelyezni egy ilyen lrban, mint amekkora a mrete.
Az inici:llizci nlk! dck!arlL karaktertmbk hasznlatra mUlat pldt a 15.6. Lista.
15.6, Usta - Egy karaktertmb feltltse (arrayfilled.cpp)
O; /1 15 . 6 . Lista KaraktertOmbOk pufferknt val hasznlata
l ; linclude <iostream>
"
3 ; i nt main ()
4 , {
5 ; char buffer[801 ;
6 : std: : cout "Enter the string ; ' :
7 : std : : cin buffer:
8 : std: : cout "Here ' s the buffer , buffer std : : endl;
9 : return O;
10 : }
Kimenet
Enter the string : Hello Wor l d
Here ' s t he buffer : Hello
Az S. sorban ltrehozunk egy puffert, amely 80 karAktert kpes trolni . Ez azt jelenti,
hogy ebben a tmbben egy legfeljebb 79 bettls szvegel helyezhetnk el, hiszen kell
egy bjt a lezr6 null karaktcrnek is.
A 6. sorban bekrunk a felhasznl6tl cgy szvegel, amit a 7. sorban el is helyeznk
37.. imnt kialaktott pufferben. A cin automatikusan elhelyezi a karakterlnc vgt jel-
z6 null karakter, ezzel teht nem kell tr6dnOnk.
A 15.6. Listban bemutatott kddal kt problma is van. El6szr is nem tudjuk, hogy
mit fog gpelni a felhasznl. Ha 79 karakternl tbbet ad meg, akkor a puffer tlcsor-
284 1 IV. rsz' Halad aszkzk
dul, hiszen a c in nem rzkeli a vgl. A msik problma, hogy ha a felhasznl sz-
kzt is gpel, akkor a cin azt fogja a bemenet vgnek tekinteni , s a maradkot be
sem rja a pufferbe.
Ezeknek a problmknak a megoldsra kicsit t kell alaktanunk a programot: a cin
egy specilis metdust, a get () -et kell hasznlnunk. A c i n . get () hrom paramtcn
vr bemt!nelk nl:
A kitltcnd6 puffer nevt
A beolvasni kvnt karakterek legnagyobb szmt
Azt a jck:t, amit a bemenet vgnek kell tekinteni
Az alaprtelmezett "bemenet vge jel az jsor. A mdostott kd a 15.7. Listban lthat.
15.1. Lista - Karaktertmb feltltse (msodik vltozat) larrayfilled2.cpp)
o : 1115 .7. L i!l t l A ci n . get (} met6dus ha sznlltv.
l : #i nc l udc <io9t r cam>
2 .
3 : int ma in()
4: I
5 : char buffer[80] :
6 : std : : cout "Enter the st r ing : ";
7 : std :: cin . get!buffer, 79) : II get up to 79 or newlin
8 : /ltd : : cout "Here ' s the buffer : buffer std : : endl ;
9 : return O;
10 :
menet
Enter the sLri ng : Hello World
Here ' s the buffer : Hello Wor l d
A ci n osztly get () rnetdust a 7. sorban hvjuk meg. Ennek az argurnenmma
az a puffer, amit az 5. sorban deklarlrnnk. A msodik paramter a bekrhet6
karakterek maximlis szma. Esetnkben ez 79, mivel a pufferben gy mg ppen elfr
a zr null karakter is. A bemenet vgt karakter megadsra itt most nincs szk-
sgnk, mivel az alaprtelmezett jsor erre a clra ppen megfelel. A s annak
mindenfle klnlegessgr61 majd a 21. rban sz6l unk rszletesebben.
Az strcpyO s az stmcpyO fggvnyek
A C++ rklte a C a karakterlncok kezelsre szolgl fggvnyeket. A sz-
mos lehetsges mO"velet kzl iti csak szeretnnk kiemelni, amelyek karakterln-
lS.6ra-
cok msolsra szolglnak. Az c&'Yik az strcp () fijg&'Vny, a msik az s t rncpy ( ) .
Az strcpy () viszonylag egyszenT: veszi a megadott kamkLerlncot, s a tel-
jes tartaImt tmsolja a szintn megadott pufferbe. Hasznlatt a 15.8. Lsta szemllteti.
15.8. Lista - Az strcpyll fggvny hasznl ... ( .. ingstrepy.epp)
o: 1/ 15 . 8 . Lista - Az s trcpy() fo.ggvny hasznlata
l : #include <iostream>
2: #incl ude <string h>
) .
4: int main ()
5: {
6. chnr
7: char
,.
Stringll] = "No man is an island";
String2lBOJ ;
9 . strcpy (String2 , Stri ngl) ;
10:
ll : s td : :cout string1 :
12: std : : cout "String2 :
l): return O;
14:
JGmanot
Stringl : No man iy an island
String2 : No man is an island
Stringl std :: endl ;
Stri.ng2 std: : endl ;
A 2. sorban beemeljOk a STRING . H fejlcllomnyt, amely tartalmazza az strcpy ()
fggvny prototpust. Az strcpy () bemenetknt kt karakt ertmbt vr, melyek k-
zl az il msols c;(:lj a, s a msodik a forrlIs. gyeljnk amI is, hogy ha a forrns
tbb adatot tartalmaz, mint nmennyi a clpufferben elfr, akkor az strcpy ()
en tlrja azt.
Ennek a lchel,>ges hibnak a kikszblsre a szabvnyos knyvtr tartalmaz egy
strncpy () vltozatot is, amelynek a msolni kvnt kamkterck maximlis szmlIt
is mcg lehet adni. A fggvny az null karakterig msol, vagy nmg el nem ri ezt
az rgzLeu szmot. Az strncpy () fggvny hasznla tM szemllteti a 15.9. Li sta.
15.9. Lista - Az strncpyO fggvny ha""lata (usingstrncpy.epp)
o: II 15 . 9 . Lista Az strncpy() fo.ggvny hasznlata
1: inc1ude <iostream>
2: *lnclude <stri ng.h>
) .
4: int main()
5 : {
6: const int MaxLength : 80;
7: char Stringl [] : "No man is an island";
286 I IV. rsz eszk2k
8 , char String2[MaxLength+l1;
9 .
10 : strncpy(String2,Stringl,MaxLength);
ll: String2[strlen(Stringll] ' \0'; II add a null to the end
12 : std : : cout 'Stringl : <<: String! std: :endl;
13 : s t d :: cout 'String2 : String2 std: : endl;
14 : return O;
15 :
Stringl : No IMn is an island
String2 : No man is an island
A 10. sorban az strcpy () -l lecserltlik egy s t rncpy () -rc, amelynek ezrt t!gy h,moa-
dik parnmtelt is meg kelJ adnunk: a msolni kvnt karakterek maximlis szmt.
A String2 nevt1 puffert MaxLength .. ! hosszsg(mak dekl:trlruk. Az a bizonyos
plusz egy hely lermszelest!n megint a zr null karaklemck kell.
Karakterlnc-osztlyok
Az ANSI/ISO szabvnynak 1ll<:!gfelcl6 C++ fordt6programokhoz minden esetben tarlO-
zik egy szabvnyos knyvt5r, amely rengeteg adatkezels! s adattrolsi osztlyt tar-
talmaz. Ennek ktelez6 eleme egy String osztly is, amely nevnek megfelel6en
a karakter!ncok kezc::lsrc szolgl.
A C++ ugyan rklte a C nyelvt61 a null karakterrel 7Jirt karakterlncokat, illerve azo-
kat a knyvtri fggvnyeket , amelyek ezek kezelsre szolglnak, m al. objektum-
orientlt keretrendszerbe ezeket nem emelte t. Ehelyeu a String osztly az, amely
az objektumkzpont szemlletnek elrejti magukat a trolt adatokm a fel-
hasznl e161, s csak a met6dusokon keresztl engedi kezelni azokat.
Ha az olvas nem azt a fordtprogramot hasznlja, amit ehhez a knyvhz mell ke\-
tek, akkor megeshet, hogy az ltala hasznlt rendszer nem tartalmazza a String osz-
tlyt. Mi tbb az is megeshet, hogy megtallja ugyan, de az nem a szabvnyoknak
gy knytelen jm megrni.
Affle szolgltatsi minimumkm a String osztlynak kpesnek kell lennie thidaini
a karakterlncok tmb add problmkat. Ilyen problma pldul hogy
a karakterlncok, mint minden tmb statikusak: meg kell mondanunk a mretkel. Az-
tn ha megmondruk, akkor azt a helyet mindenkppen lefoglaljk a memriban, akkor
is, ha nem Ls hasznljuk. Ha pedig tlrunk egy tmb vgn, az eredmny kamsztr6fa.
15. ra Tmbk 287
Nos, ezek azok a dolgok, amiket egy jl megrt. String osztly biztosan kikszbl:
csak a tnylegesen szksges trhelyet fogalja le, azt viszont mindig, akrmekkora ka-
rakterlncot akarunk is ltrehozni. Ha pedig egyszeruen nem lehet lefoglalni a szks-
ges memrit, az osztly jelzi ezl a felhaszmil6nak.
Krdsek s vlaszok
Krds: Mi trten/k, Ita be/cirok egy 25. elemel egy amIigy 24 elemi_I tmbbel
Vlasz: Igazbl nem lehet megmondani. Annyi biztos, hogy olyan mem6riatcriiletre
runk, ami nem a tmbhz tartozik, az eredm(:ny pedig katasztrfa is lehet.
Krds: Mil nevezl1k il/icializlat/al1 1/llbe/emnek?
Vlasz: Ez egy tmbnek egy olyan eleme, amely mg soha nem kapmt rtkel. ilyen-
kor is van benne persze vallmi , de azt nem lehet megmondani, hogy mi. Ami ppen
aZon a mem6riateri.iJeten VOll, amelyen a tmb helyet kapott, az lesz az inicializls
d6u az elemekben. Ha teht kezdeti rtk megadsa nlkl kezdnk hasznlni egy
tmbclemet, annak belthatatlan kvetkezmnyei lehelnek.
Krds: wllet tmhket kombillllli, vagyis egymsba gyaz/li ket?
l 'lasz: Igen. A kznsges tmbket az 6ket mutatk segtsgvellehel ssze-
egy j, nagyobb tmbb. Kardkterlncok esetben az akr knyvliri
fggvnyeket is hasznlhatunk. Ilyen pldul az strcat ().
Gyakorlatok
Eltltttnk teht egy teljes rt azzal, hogya tmbk kel ismerkedjnk. ItI aZ ideje,
hOb'Y tudsunk ellen6rzse s gyakorlatba val temelse vgett megvlaszoljunk n-
h ny krdst s megoldju nk nhny feladatot.
Kvfz
1. Mekkora a legkisebb s legnagyobb hasznlhat tmbindex egy adott tmbnl?
2. Mi trtnik, ha egy tmbben tbb ad,ttot prblunk elhelyezni, mint amennyi
a deklarcija szerint elfr benne, vagyis a maximlisnl nagyobb indexet hasz-
nlunk?
3. Milyen jr a tmbk hasznlata?
4. Honnan szerezhetnk tbb informcit a C++ String osztlyval kapcsolatban?
288 [V, rsz Halad eszkzk
Feladatok
1. Mdostsuk gy a 15.4. Listban bemutatott kdot (arrayonheap ,cpp), hogy
nem kelljen benne hasznlnunk a pCat muuut.
2. Mdostsuk gy a 15.4. Listban bemutatott kdot (arrayonheap . cpp), hogy
minden olyan helyen, ahol flbukkan benne az 500 mint konstans, on hasznl-
juk az ugyanerre az rtkre belltott MAXSIZE llandt. Prbljuk gy is lefunal-
ni a programot, hogy cskkenljk ezt a szmot. Mi trtnik, ha eltvoltjuk
a const ku1cssz6t? A C++-han a tmbk lefoglalsa nem dinamilmsan trtnik!
3. Mi trtnne, ha a 2. gyakorlatban MAXSIZE rtkeknt 200-at adnnk meg, de
nem rnnk t 3i'. 500-as rtk minden egyes eloforcl ulst MAXSIZE:-ra?
-1 . Mdoslsuk a 15.9. Listban bemutatott kdot (usi ngstrncpy . cpp) gy, hog)'
a 10. sorban a MaxLength rtke 5 legyen. rordtsuk Je s futtassuk a progra-
mol, majd hasonltsuk ssze a kimenett az eredelivel. Ez a vltoztats kivlan
mutatja az strncpy () fggvny igazi kpes ti telj es kamkterl ncnl
kevesebbet is msolni.
Vlaszok a kvzkrdsekre
1. Vtl llmenny; tmb indexelS(! nullval kezd5clik. Az utols elem (v:lgyis az utol-
s hasznlhat index) rt ke mindig eggyel ki sebb, mint a tmb elemszma.
Ha teht egy tmb dekhlrcijban az [50J szerepel, akkor az utols hasznlha-
t index a 49.
2. Nehz megmondani. Ha szerencsnk van, akkor pont egy olya ll memriaterlet-
re fogunk rszaladni, amit az opercis rendszer gy azonn:ll valami-
lyen hib:llizenetet k:lpunk. Ha nem, akkor megvlrozhat pldul egy msik vl-
toz rtke, ami rendszcrinr nehezen felderthet6 hibhoz vezet. n egyszer egy
teljes szombmomat eltltttem azzal, hogy egy il yen hibt keresgltem, s mg
csak nem is a sajt k6dom volt..
3. A tmbk hasznlatnak legfobb c10nye az, hogy ltaluk egyetlen nven keresz-
tl rhetjk el logikailag sszetartoz adatok cgy egsz h:ll mazt.
4. Az hely, amit rdemes megnzni tlZ ltalunk fordtprogram sg-
ja. Ha a knyvhz mellkelt Borland fordt6l hasznljuk, kattintsunk a Help me-
npontra, majd vlasszuk onnan a Help Torks pontot. Krmintsunk a Reference
opci6ra, majd keressk ki a <string> pontot. (gyeljnk r5, hogy ez ut6bbi
nem azonos a <string . h> ponttal, am; a C szabvnyos knyvtrban tallhat,
:l k:lrakterlncokkal kapcsolatos dolgokat rja le.).
v. RSZ
..
s tbbalaksg
16. ra Az rklds
17. ra A tbbalaksg s a szrmaztatott osztlyok
18. ra A tbbalaksg kifinomult hasznlata
19. ra lncolt listk
16. RA
Az
Ebben az rban a kvetkez6kr611esz sz:
Mi az az rkl6ds
Hogyan szrmazIassunk egy osztlyt egy msikbl
Hogyan lehet elrni az alapmetdusokat a szrmaztatott osztlyokbl
Hogyan !ehet felOlrni az alapmct6dusokat
Mi az a vdett elrs, s hogyan lehet hasznlni
Mi az az
Az emberi rtelem :dapvcl6 ignye, hogy a fogalmak kzt kapcsolatokat ke-
ressen, felismerjen s ltrehozzon, hierarchikus, tblzatos, hM6zatszcn1
egyb intellektulis mcx.lcllckct ptnk fel, hOh'Y megrtsk, hogyan egylt
a dolgok. A C++ nyelv az rkl6dsi hierarchiban prblja mindezt lTlegr::tgadni.
Mi az a kutya? Amikor kedvenc hzillatunkra nznk, mi jut esznkbe? Az llalolVos
klnfle szervek sszehangolt h16zatlltja, a fizikus atomok s kl
csnhats.1r<l gondol, a biolgus a canine domeslicl/s egy szp pldnyt veszi szre,
de'ianym pedig kutyasz6rt s nylat emleget.
292 V. rsz rkl6ds s tbbalaksg
Bennnket most a biolgus rdekel; az szempontjbl egy kutyaflvel
van dolgunk, tgabb nelemben egyemlssel, ami e.gy llat. A biolgus felosztja
az s a maga szempontjai szerint minden besorol az orszg, [r7$,
osztly, rend, nemzeL<;g, nem, faj s alfaj valamelyikbe.
A biolgus ltal fellltoLL hierarchinak minden kapcsolata jeJlega, A kutya em-
Ltjuk a httrben a rsze relcit: A Toyota az egyfajta gpkocsi, amely egy
jnn. A Tibi csoki egyfajta dessg, amely lelmiszer.
Mit is rtnk az alatt, hogy "valami egyfajta msvalami? Azt, hogy annak a msvalarni-
m:k a specilis esete. Azaz a gpkocsi a egy sped{ili.<; esete. A gpkocsik is,
az autbuszok is j: rmvek. Van valami specialitsuk, amely gpkocsiv vagy aut-
bussz teszi de mindkt tpust egyformn megilleti a besorols. Osztoz-
nak ebben a
s szrmaztats
A imtya rkli (azaz automatikusan megkapja) az eml6sll at ok valam<:!nnyi nllajdons-
gt. VOIt.,1 [ll fogva kpes a hclyvltoztat mozg{lsra s a belJegzs-
re - minthogy minden e m16slbt definci szerint kpes ezekre. A kutya speeialitsa
mtg HZ ugats, farokcsvls stb., gyhogy ezek II tulajdonsgok mg hozz:'ijnnek
az ddlnci6hoz. A nkutyas.1g speciali zlt jellemz5, mg az nem16ssg" ltal:mos,ln
igaz minden eml6sllatra.
A kuty{lkat ki sebb esoporlokra is feJoszth:lljuk, pldul vaclszkulykra s terri e rekre
stb.; a terriereket is csoponostl1atjuk: vannak Yorkshire Terrierek, Dandie Dinmont
T<:!rnerek stb. A Yorkshire Terri<:!r egyfajta terrier, gy egyfajta klllya is, emiatt
is, azaz llal, s ily m6don A hierarchit a 16. 1 bra mutatja.
16.1 bra
Az lla/ok hir:m,., hija
16. ra Az
A CH gy pr6bl meg effle hierarchikat lekpezni , hogy az egyik osztlyt a
bl szrmaztatja. A szrmaztats j61 kifejezi a relci6t. Az emlos osztlybl s7.r-
mazhat az j kutya osztly. Ekkor mr nem kell kifejezetlen megmondani , hogy a
tyk tudnak mozogni, hiszen ezt a tulajdons{lgukat mr az rklik Mivel
a kutya-t az eml os-b61 szrmaztattuk, automatikusan kpes a mozgsra.
Azt mondj uk, hogy ha egy oszt'ii.ly j ad egy msik osztly tulajdonsgai-
hoz, akkor azt cbb6l szrmazt:lttuk. Az eredeti osztlyt hvjuk az j osztly bzisoszt-
lynak, vagyalaposztlynak.
Ha a kutya osztly az szrmazik, akkor az emlos a kutya osztly bzisosz-
tlya. A szrmaztatott osztlyok az eredeti b:.::isosztlynl g:lzdagabb struktrt alkor-
nak Ahogy a kutya fogalma is gazdagabb az eml6sllatnl, gy a kutya Q.'iztly is
g'l:.::dagabb nhny mel6dussal vagy adauagga! az emlos osztlynl.
A bzisoszt:.lyoknak lralb:m van nhny szrmaztatott os:.::t:'i lyuk. Ahogya kutyk,
macskk s lovak klnbz6 fajtll a nekik mcgfclcltetell osztly szrmaz-
hat az emlos osztlybL
,
Modellezzk az az Allatok Orszgval
Ebben a rszben klnmle llatosztlyokat kpzelnk el a7. rkl6ds s :L szrmazta-
ts trgyals.1hoz. Kpzeljk el, hogy egy jtk teTVezse a feladatunk - llatfannOl
szeretnnk szimull ni gycrmekek szmm.
EI6szr mindenfC:le llatot kpzelnk el, lovlIkal, teheneket, kutyl, macskM. birkl stb.
Klnbz6 met6dusokat is terveznk a sz.1mukr-.l, hogy gy ahogy
ilZ a gyerekek kp7.dctben l, de ill most csak egy kirsr.:t csupaszlSllk le ezek L'll1almt.
Egy fggvny lecsllpaszt sa vagyelnagyolsa (sLllbbing) azt jelenti, hogy csak annyit
runk meg be161e, hogy Jtsszon, hogy meg lett hvva - a r{!szletek megrst pedig k-
hagyjuk. vekig gyrtonam JecsupllsztQ[[ fggvnyt!ket, vrva a
napra, amikor tbb lesz rjuk. me az egyik el6nye II val tervezsnek-
a munka a szinten s fokozatosan egyre mlyebbre ha1:Ldva folytat-
hat. Munka kzben nem kell kidolgozni a problm:l minden rszl<:! ttj a "cson-
kok" j trkitlt6knt Ez egyben azt is jelenti, hogy akr msok is befoltoz-
hatjk a lyukakat, kidoJgozhaljk a rszletekct, amg az progmmoz mr ms r-
szekkel foglalkozik.
Ha valakinek tbb ideje van, nyugodtan ennek a fejezetnek minimlis kcl-
rszleteit, hogy mg visel kedjenek legyenek az llatok.
293
294 . rsz rkl6ds
A szrmaztats szintaxisa
Egy osztly deklacicijakor megadhat. hogy melyik msik osztlybl szrmazzon.
Az osztly sajt nevt kvct() utn kvetkezik a szrmaztats Lpusa (pldul
public) s a bzisosztly neve. csak a public (nyilv nos) trust fogjuk hasz-
nlni. me egy pld,,:
CldSS Dog : public Mammal
A szrmaztats tipU5.'r3 mg visszatrnk ebben a fejezetben. A bzisosztlynak mr
deklarlva kell lennie, klnben fordtsi hibt kapunk. A 16.1 Lista bemutatja, hogy
hogyan lehel a Dog (lmlya) osztlyt a Mammal osztlybl szrma;;:talni.
16.1 Usta - Az agyszer (simpleinherit.cpp)
0 , 1/16.1 Lista II OrOkl6ds
1, #include <iostrcam>
2 ,
3 , enum BREEO { YORKIE, CAIRN, DANDIE, SHETLAND, DOBERMAN, LAS J;
.... II Fajt6k
4,
S: class Mammal
6, (
7: public:
8 : II Konstruktorok
9 : Mammal();
10: -Mammal() ;
ll:
12 : II Hozzfr6 rOggvnyek
13 : int Geti\ge () const;
14: void SetAge(inl);
15: int G'!tWeight() const;
16: void SetWeight();
17:
18: II Ms tagfo.ggvnyek
19: void Spe",k{);
20 : void Sleep{);
21 :
22 :
23: protected :
24 : int itsAgc;
25 : int itsweight;
26 , };
27 :
28 : class Dog public Hammal
29 :
30 , public :
31 : /1 Konstruktorok
32 , Dog() ;
33 : -Dog();
34 :
35 : II Hozzfr6 fggvnyek; breed=fajta
36 , BREED GetBreed() const ;
37 : void SetBreed(BREED) ;
38,
39, II Ms tagfggvnyek
40, /1 WagTail(); /I Parokcsv.1s
41 , /1 BegPorPood(); II KajrtKuncsorgs
42 :
43 : protceted,
44 : BREED itsBreed;
45 : );
46 : int main()
47: (
48: return O:
49:
16. ra Az rkl6ds 295
A programnak nincs kimencIc, mert itt csak az osztlyok deklarncii lthatk a mcgva
16sl:is nlkl. Ennek ell enre van mil n:mi raj ta, st mg le is fordu l.
AZ 5-26. osztlyb:Ln dt!khuflljuk a Hamma1 osztlyt. Figyeljk meg, hogy a Mammal osz-
t lynak nincs b:zisosztlya, nem szrmilztattllk A val6 vilgban ez r1cm gy
van, :IZ emI6sk" az "ll atok" egy fa jtja. C++ programjainkban az eredeti gondolat
krnek csak elvonalkoztatst kpezzk le. A v ls,g tlsgosan rszletgazdag ah
hoz, hogy egy progr.r.m mi ndent megval6stson. A C++ programokban brzolt hierar
ehia a meglv6 adatoknak csak egy haszn.Hja. A j tClVczs ismlVc, hogy oly m6don
kpezi le krdses terleteket, hogy ,IZ hitelesen megfeleltethct6 a val6sg
adott szeletnck
A hierarchinak valahol el keH kezd6clnicj ebben a progt:lmban ez ti Mamma1 oszt{i[y.
E dntts miatt lehetsges, hogy lesznek olYlm tagvltozk, melyeket egy magasabb
szintG osztlyban kellene deklarlni, mi mgis ilt tesszk meg. Pl!ldul bizonyra min
den llat nak van kom s slya; gy, ha az AnimaI (llat) osztlybl szrmaZOlI II Hammal
osztly, akkor sl."imthalnnk arra, hogy ezek a tulajdonsgok onnan fognak rkl6dni.
Jelen esetben azonban ezek a csak a Mamma1 osztlyban jelennek meg.
A program keretek kzn tartsa rdekben csak hal metdus kelll a Mamrnal
osztlyba - ngy hozzfr6 fggvny, valamint a Speak () (beszlj) s a Sleep ()
(al/telj).
A Dog osztlya Manuna1bl sznnazik, ahogy azt a 28. sor mutatja. Minden Dog objek-
nLmnak h,rom tagvltozja lesz, i tsAge, itsWeight s itsBreed (/...'Ora, s{).'a,fajl-
ja). Figyeljk meg, hogy a Dog osztly-deklarciban nem szerepel az i t sAge s
az itsWeight, mert ezeket a Marnmal osztlybl rkli az sszes tbbi metdussal
egytt, kivve a konstruktort, a msol konstruktort s a destruktort.
296 1 V. rsz s tbbalaksg
Privt vagy vdett?
Taln felfigyelt r az olvas, hogya 16. 1 Lista 23. s 43. sorban egy j kulcssz kerlt
e16, a protected. Korbban az osztly sajt tagvltoz6il a private, azaz privt kulcs-
szval adtuk meg. Az ilyen adanagok azonban nem a szrmaztatott oszt
4
Jyokban. Nyilvnoss (public) leheme lenni a szbges adaltagokat (it sAge s
itsWeight), de igazbl nem ez a clunk; nem szeretnnk, ha ms osztlyokbl eze-
ket kzvel1enl ellehctne rni.
Mi cgy olyan megjellsre vgyunk, amely arra utal, hogy ezen osztly tagok legyenek
ebben az osztlyban s ennek szrmaztatott osztlyaiban. Erre szolgl
a protected (v{'(lefl). A vdett adattagok s fggvnyek Caz aclott osztlyon kvl)
csak a szrmn.talott osztlyokbar, ltszanak, a tbbiek s:.:::m:r:l lthatatlanok, mim
a privt vltoz6k.
1\ vdett vhoz6k elrhet6sgc teht valahogy flton van a privt s a nyilvnos k-
zu. Kevsb szigor a vdelme, mint a privfit, de azrt nem annyira laza, mim
a r'yilvnos.
Ezzel megismenk mindhrom ltez6 hozzMrs-szablyoz mdost6sz6t: nyilvnos,
vdett s privt. I-la egy fggvnyhen pldnyostunk egy osztlyt, akkor a fggvny
ennek az osztlynak csak a nyilvnos t.1gvllozit s tagfOggvnyeit mdja elrni. Egy
oszuly sajt tagrggvnyei azonhan ezeken kvl a privt tagvlloz6knt s tagfggv-
nyeket is Mtjk.
igy :1 Dog: : WagTail () fggvny elri az itsBreed privt adatait, valamint a Hammal
osztly vdett adatait is.
J la netn ms osztlyokat is dekl,u lnnk a Hanunal s a Dog kz (pldul olyat, hogy
DomesticAnimal, luzilll/t), akkor is elrn a Dog osztlya Hammal vdett adatait, fel-
tve, hogy ezen kztes osztlyok is mind nyilv{mos rkl6dst h:lsznlnak (mim a Dog).
1\ 16.2 List.1 szemllti:!Li, hogy hogyan lehet Dog tpus objektumokalltrehozni, s
a hozz tartoz adatokat s fggvnyeket hasznlni.
16.2 lista - Egy szrmaztatott osztly Iderivedobjectcpp)
o: /1 16.2 Lista /1 ogy szrmaztatott oszt3ly hasznlata
1: *include <iostream>
,.
3 : enum BREED { YORKIE, CAIRN, DANDIE. SHETLAND, DOBERMAN, } ;
4.
5 : class Mammal
,.
7 : public :
B: II Konstruktorok
9 : Mammalj) : itsAge(2), ilsWeight(51 {}
10 : -Manunal()(}
11 :
12 : II Hozzfr6 fggvnyek
13 : int GetAge()const { return itsAgc ; }
14 : void SetAge(int age) { itsAge = age:
15 : int GetWeight{) const { return itsWcight:
16 : void SetWcight(int weight) { i t sWeight = weight:
17 :
lB : II Ms tagfggvnyek
19 : void Speak{)const ( std : : cout "Manunal sound ! \n" ; )
... II Em16s11athang
20 : void Slccp() conGt
21:
22 :
23 : pr otected:
24 : Lnt itsAgc ;
25 : i nt itsWeight ;
26 : } ;
27 :
ot d : : cout "shhh . I ' m sleeping . \n " ;
.... II Alszom
28 : class Oog : public Hammal
29 : (
30 : public :
31 : II Konstruktorok
32 : [log j) : itsBreed(YORKIE) {}
33 : -Dog () ()
34 :
35, II Hozzfr6 fggvnyek
36 : BREED GetBreed() const { retllrn itsBreed: }
37 : void SetBrccd(BREED breed) ( itsBreed = breed;
3B ,
39 : II Ms tagfggvnyek
40 : void WagTail() ( std:: cout 'Tai! waggi ng ... \n': )
.... II Farokcs6vls
41 : void BegForFood() ( std :: cout "Segging for f ood . .. \n' ;
.... II Kajr t Kuncsorgs
42 :
43 : privatc :
44 , BREED itsBreeo ;
45 : l ;
46 :
47 : i m. main {)
48 :
49 , DOg fido ;
50 : fioo . Speak() :
51 : fi do . WagTail () :
52 : std : : cout 'Fido is " fido . Get Age {) " yea rs old\n";
53 : return O:
54 :
296 1 V. rsz s tbbalaksg
menet
Mammal sound!
TaU wagging ..
Fido is 2 years old
Az S-26. sorlxm deklarljuk a Hamma! osztlyt (:1 helytakarkossg kedvrt minclen
fggvny he lyben kifejtett). A 28-45. sorban deklarljuk a Dog osztlyt, mint a Manunal
osztly lcszrmazottjt. Il y mdon nlinden kutynak (Dog) van kora, slya s faj tja.
A 49. sorban ltrejn Fido kutya. Minden kutya- (s gy ltllajdonsggal rendel-
kezik Azaz tud plcl :hil farkat csvlni, .beszlni" s aludni (WagTail, Speak, Sleep).
Konstruktorok s destruktorok
A kutyk em16sk. Ez a lnyege a ,rszd' relci6nak. Amikor Fido ltrejn,
ti bzisosztly konstruktora hvdik meg (az em16sk), majd a kurya oszl: ly
konstruktora fejezi be a kutya ltrehozst. Mivel nem adtunk Fido-nak semmi lyen pa-
ramtert, mindkt esetben az alaprtel mezen konst ruktor hv6doll meg. Fido addig
a pillanatig nem ltezik, amg teljesen meg nem "konstru16dik
n
, azaz az eml6s rsze
s a kutya rsze is el nem kf:szl. Mindkt konstruktornak le kell teht futnia.
Amikor Fido befejezi I:: lcLply{lj{ll, el6szr a kutyk a esLruktora hvdik meg, s csa k
ezut:n az em[6sllatok deslrlJktora. Minden desLruktornak megvan a lehet6sge, hogy
takartson maga utn a memriban. Mi se fe[edkezzllk el teht takartani kuty{lOk
utn! A 16.3 Li sta ezt mutatja be.
16.3 Usta - A konstruktorok s destruktorok hivsa (conanddest.cpp)
o: II 16.3 II KonstruktoroK s destruktorok hvsa
1: <iostream>
2 .
3 : enum BREED { YORKIE , CArIDl, DANDIE, SHETLAND, OOBERMAN, LAS l ;
4 .
5 : class MallUnal
6 .
7 : public :
B: II KonstruktoroK
9 , Marrunal () ;
10 , -Hamma l (l;
ll ,
12 , II Hozzfr6 fOggvnyek
13 , int GetAge() const { return itsAge; }
14 , void SetAge{int age) ( i tsAge = age; l
15 : int GetWeight() const { r eturn itsWeight ;
16, 6ra Az rkl6ds
16: void SetWeight(int weightl { itsWeight weight; }
17 :
18 : II Ms tagfggvnyek
19 : void Speak() const { std::cout 'Manunal sound!\n' ; }
20 : void Sleep() const { std: :cout 'shhh. I'm sleeping . \n';
21 :
22: protected:
23 : int itsAgc;
24 : int itsWeight;
25 : l;
26 :
27 : class Oog : public Manunal
28 : (
29 : public :
30 : II Konstruktorok
31 : Dog() ;
32 : -Dog() ;
33 :
34 : II fOggvnyek
35 : BREED Ge tBreed() const ( return itsBreed; )
36 : void SetBrcod{BREED brood) ( itsBreed = breed;
37 :
38 : II Ms tagfggvnyek
39 : void WagTail() (std::cout 'TaH wagging ... \n" ; )
40: void BcgForFood(} { atd:: cout 'Begging for food .. . \n' ; }
41:
42 : private:
43: BREED itsSreed;
44 : } ;
45:
46 : HaIl\JTlllI: :HaTMUll() ,
47, itsAge(l),
48 : itsWeight(5}
49, (
50 : std, , cout "Mammal constructor ... \n';
51 : )
52 :
53 : Hammal :: ()
54 : (
55 : std:: cout "Hammal dcstructor ... \n';
56 :
57 :
58 : Dog: : Dog() :
59 : itsBreed(YORKIE)
60 : {
61 : std:: cout 'Oog conSLructor . .. \n" ;
62 : }
63 :
64 :
65 : {
66 : std:: cout 'Oog destructor . .. \n';
67 : }
68 :
300 I V. rsz s tbbalaksg
69: int main()
70 : {
71: Dog fido; /1 a Kutya szletse
72 : fido. Speak () ;
73: fldo.WagTail();
74 : std :: cout "Fido is fido. GetAge() ycars old\n" ;
75: return O,
76 :
Maromal constructor ...
Dog constructor ...
Mummul sound !
Tail wagging ...
Fido is 1 ycars old
Dog destructor ...
Mununul destructor ...
A program szinte megegyezik lIZ elzvel, azzal a klnbsggel, hogy most
il konstrukrorok s destn.lktorok kirnak egy nyomjelz6 (I zenetet. Amikor Fido ltre-
jn, e16szr 3z eml6sk konslrukloid hvdik meg, majd ezek ut1i.n a kutyk/!. Innent61
kezdve mr teljes mrtkben ltezik a kUlya, s tagfggvnyei meghvhat6ak. Amikor
Fido hatkrn kvlre a kutyk deslruktora ki nyomj elz6 Ozenelt,
majd az eml6sk destruktom,
Paramterek tadsa a bziskonstruktornak
Megv:m arra is a hogy a konstnlktorokat tlterhcljk; az cml6sllatnak pl-
dul meg szeretnnk hatrozni az indul kor.it vah'Y a kutya fajtjt. Hogyan lehet meg-
oldani, hogy ti kor sly kezdrtkek a megfelel6 konslruktormlk ad6cljanak t? Mi
...
ftdttlenl?
Egy b:lisosztly inicial izcija gy is trtnhet, hogy megadtu" .a
I'fm)a. zt\r:I:\ol:n ',fL. a'\;<I.'" "V7l.ft p .. t .. anOS'j >e'L a .' __
. ..-.-
o: II 16 ,4 /1 Konstruktorok tlterhelse a
1 : 'include <ios tream>
2 ,
7 , public :
8 : /1 Konstruktorok
9: Hamma l () ;
10 : Marnmul(int age);
ll , -Mammal();
12 :
13: 1/ Hozzfr6 fuggvnyek
14 : int GetAgc{) const { ret.urn itsAge; }
15 : void Setllge(int age) { itsAge '" age ; }
16 : int GctWeight() const ( ret.urn itsWeight. ;
17 : void Setwelght(lnt wcight) ( itsWcight = weight;
18 :
19 : II Ms
16. 6ra Az rij6ds 301
20 : void Speak!) const ( std :: cout "Hammal sound ! \n"; )
21 : voi d Sleep () const. ( std :: cout shhh. I ' ro sleeping . \n ;
22 :
23 : protected :
24 : i n t i esAga ;
25 : int itnWeight;
26 : );
27 :
28 : class OOg
29 :
30 : public :
public Hammal
31 : II Konstruktorok
32: Dog();
33: Dog(int age);
34 : Dog(Jnt age, int wcight.);
35: Dog{int age, BREEO breed);
36 : Dog(int 4gC, int wcight, BREEO brccd);
37 : -Dog();
]8 :
39 : /1 Hozzfr6 fggvnyek
40: BREED GetBrced{) const ( rcturn itsBreed; )
41 : void SetBreed(I3RRF.O breed) { itsI3reed = breed;
42 :
43 : II Ms tagfOggvnyck
44 : void WagTail {} ( .!ltd :: cout "Tail wagging ... \n" ; )
45 : void BegForFood{) { std :: cout "Begging for food ... \n" ;
46 :
47 : private :
48: BRF:RD i taBrm'ld ;
49 : };
50 :
51 : Hammal: : Marnmal () :
52 : itsA.gc{11,
53 : itsWeight(5)
54 : {
55 , std : : cout "Hammal constructor ... \n" ;
56 :
57 ,
58 : Hammal::Mammal(int age} :
59 , itsllge(age) ,
60 : itswcight (5)
30z 1 V. ,sz s tbbalaksg
61 : {
62 : std :: cout "Mammal{intl constructor .. . \n" ;
63 :
64 :
65 : Mammal : : -Mammal ()
66 : (
67 : std : : cout "Mammal destructor ... \n' ;
68 :
69 :
70 : Dog : : Dog () :
71 : Mamma l () ,
72 : itsBreed(YORKIEI
73 : {
14 : std : :cout "Dog constructor ... \n";
15 :
16 :
11 : Dog :: Dog(int age) :
78 : Mammal (age),
79 : itsBreed (YORKIE)
80 : {
81 : std : : cout "OOg (int) constructor .. . \n' ;
82 :
8] :
84, Dog : :Dog(int age, int weightl :
85: Mammal(age),
86, itsBreed(YORKIE)
87, {
88 : itsWeight :: weight;
89 : std : : cout "Oog (int, int) cons t ructor ... \n' ;
90 :
91 :
92 : Oog : : oog(int age, int weight, i3REED breed) :
93 : Mamma1 (age) ,
94 : itsBrccd (breed)
95 , (
96 : itsWeight weight;
97: std::cout "Oog(int, int, BREED) constructor ... \n";
98 :
99 :
100 , Dog : , Dog(int age, BREED breed) :
101 , Mammal (age) ,
102 : itsBreed(breed)
103 : {
104 : std: , cout "Dog (int, BREED) constructor . . . \n" ;
105 :
106 :
107 , Dog , , -Dog()
108 : (
109: std:: cout "Oog destructor ... \n";
110 :
III ,
112 : int main ()
113 ,
114 : Dog fido ;
16. ra f>J. r ~ d s 303
115 : Dogrover (5) ;
116 : Dog bustcr{6 , 8) ;
117 : Dog yorkie (3,YORKIE);
118 : Dog dobbie (4 ,20, OOBERMAN) :
119 : fido.Speak();
120 : rover .WagTail () ;
121 : std : : cout 'Yorkie is
122 : yorkie . GetAge () years old\ n':
123 : s td: : CQut "Dobbic wcighs
124 : dobbi e. GetWeight() pounds \n';
125 : return o:
126 :
Aprop
Sormmok akimenetben
Az. elemzs utalsainak megknnyrtshez sorszmokkallttuk el a kimenetet. Fu-
ts kzben ezek nem jelennek meg a kpernvn.
1 : Mammal constructor ...
:2: Dog constructor ...
3 : Mammal (int) constructor ...
4: Dog (int ) constructor ...
5 : Mammal(int) cons t ruc t or .. .
6: Dog (int , i nt ) constructor .. .
7 : Marruna l (int) constructor .
8: Dog (int, BREED) constructor ....
9: Mammal(int) constructor ...
10: Dog(int, int, BREED) constructor. ..
ll : Hammal sound !
1," : Tail wagging ...
13 : Yorkie is 3 ycars old
14 : Dobbic wc i ghs 20 Dounds
15 : Dog destructor . . .
16 : Hamma! destructor . ..
17 : Dog destructor ...
18 : Hammal destructor ...
19 : Dog destructor . ..
20 : Mammal d estructor. ..
21 : Dog destruct or ..
22 : Hammal destructor ...
23 : Dog destructor ...
24 : Hammal dcstructor . ..
-
A 16.4 Lista 10. sorban megjelenik egy tlterhelt konstruktor: a Mammal elfogadja para-
mterknl az em16s kort. Az 58-63. sorban tallhal megval6sts az itsAge tagv!cQ-
z6t a konstruktornak tadott rtk alapjn inicializlja, a paramterrel nem jellemzett
itsWeight nkt pedig 5-re lltja.
304 1 V. rsz s tbbalaksg
A Dog szmra t tlterhelt konstnlktor ll rendelkezsre (32-36. sor). Az az a lap-
nelmezelt vltozat, a msodi knak az llat kort adhat juk meg (csak gy, mint
a Mammal esetben). A harmadik konstruktor a kort s a slyt kri, a negyedig a kon
s a fajtt, az tdik pedig a kort, a slyt s a fajtt.
Fi gyeljk meg a 71. son , ahol a kutyk alaprtelmezett konslruklOr.l az alap-
rtelmezett konstruktort hvja meg. Br ez nem lenne ktelez6, ez egyben azt is doku-
memlja, bogy szndkosan a paramter nlkli alaprtelmezett bziskonstmktort hv-
juk meg. A bzisko nstmktor meghvsa egybknt is megtrtnne, dc gy mg nyilvn-
valbban ltszik erre vonatkoz szndkunk.
A 77-82. sorban van az a kutyakonstruktor, amely egy paramtert vr, spedig az let-
kon. A (78-79. sor) a Dog iniciaJizlja sajt bzisosztlyt, ii tadva
neki a kor par.'lmlelt, majd a fa jta inicializlsa kvetkezik.
A 84-90. sorban tal lunk egy jabb kutyakonstnlktort, amely kt paramtelt vr. Megint
csak a sajt bzisosztly inicializci6j:lval az rtkad61ista (a megfelele>
konstmktor meghvsva!), de ezttal a fajt<! be{dltsa ut:n a bzisosztlyb61 SZ{t.r maz
itsWeight (stly) tagv llozt is inici ali zljuk a weight paramter rvn. rdekes,
hogyabzisosztly tagvllozjt nem lehet az rtkad1istlxm inicializlni. Vagyis
nem rhat juk ezt,
Dog: :Dog(int age, int waight) :
MarrulIal (age) ,
itsBreed{YORKIE),
itsWeight(weight) II hibs!
(
std:: cout 'Dog{int, int) constructor ... \n";
)
mivel :l bzisoszlfi ly sajt vltozjt tilos in inicia1i;cilni. Hasonlkppen ezt sem rhat-
juk le:
Dog : : Dog(inL age , int weightl :
Mammal(age, weight), II hibs !
i t sBreed(YORKIE)
(
s t d :: cout "Dog( i nt . i nt ) con6tructor . . . \n":
mivel a ManunalOSztlynak nincs slyparamlert elfogad konstruktora. Ezt az rtk-
adst a Dog konstmktomnak trzsben lehet csak megtenni.
Dog : : Dog{int age, int weight) :
Hrurunal(age) , II bziskonstruktor
itsBreed{YORKIE) II inicializci
(
itsWeight = weight : II rtkads
std:: cout "Dog{int, int) constructoz:: ... \n" :
)
16. 6ra Az 305
Nzzk vgig a tovbbi konstruktorokat, s meg arrl, hogy rtjk a mll-
kdsket. Figyeljk meg, mi az, amit inicializlhatunk a s mit va-
gyunk knytelenek a konstruktor tr/..sben megoldani.
A kimenet szmozsa megknnyti az elemzst Az kt sorban az alaprtelmezeu
konstruktor ad hrt magrl: Fido ltrehozsrl tanskodik.
A kimenet 3. s 4. surd Rover ltrejttt mutatja; az S-6. sorban Buster szlelik meg,
mgpedig az egypar.unleres Marnmal s a ktparamtercs Dog konslruktor j6voltbl.
Miutn minden llat eI6(tllt, befejezse utn kvl kerlnek.
Ahogy sorban mcg llezni, minden kutyra a kutyadestruktor hvdik
meg, m;Jjd ezutn az mindez sszesen tszr 05-24. sor).
Remek pldt lttlmk a sznuaztatott osztlyok alnpmetdusainak tlterhd6s6rc.
Fggvnyek fellbfrlata
A kutya objektumok elrik a Hammal bzisoszlly tagfggvnyeit s persze a sajt Dog
tagfggvnyeiket is, amilyen pldul a WagTail () (faro!..'CSvls). Ez utbbiak akr
fell is rhatjk a bzisoSZlly fggvnyeil, ami azt jelenti, hogya s7.rmaztatOll osztly
j megval6stst rhat II bzisosztly val:lmely fggvnyre. A szrmaztatott osztlyba
tartoz objektum ilyenkor a szmnl rt fggvnyt fogja hasznlni.
Pontos,lbban megfogalmazva: fellrsnak vagy fellbr-.latnak nevezzk azt, amikor
egy szrmntatotl osztly olyan fggvnyt valst meg, melynek mind a neve, mind
a paramter-szignatrja, mind a visszatrsi rtke megegyezik egy bzisosztlybeli
13gfggvnyveJ.
A paramter-szignatra, azaz a fggvny prolotpusa tbbet tartalmaz, mint egy vissza-
trsi rtk, mert (a paramtereken kvl) lthat6 a fggvny neve s al. esetle-
gesen hasznlt const kulcssz is.
A paramter.szignatra teht a fggvny neve, paramterei (s azok tpusai), esetleg
a c:onst kulcssz, de nem bele a fggvny visszatrsi rtke.
A 16.5 Lista bemutatja, hogyan lehet a kutyk szmra fellrni az ernl6sknl ltalban
hasznlt beszdet (Speak). az osztly-dekladcikbl helytakarkossgb61 ki-
maradtak a hozzfr6 fggvnyek.
306 V. rsz rld6ds s
1&.5Ii1ta- A-.-, ............. ot
~
o: /1 16 . 5 1/ Bzi sosztl y tagfuggvnyne k fe l ul rsa
1 : #include <los t ream>
2 ,
.. egy szrmaztatott os ztlyban
] : enum BREED ( YQRKIE, CAIRN, DANDIE, SHETLAND, OOBERMAN, LAS) ;
4 .
5 , class M.limnal
6: (
7 , public :
8, II Konstruktorok
9 : Hammal () { std:: cout 'Marrunal constructor ... \0' ; }
10 : -Hamma l () { !:ltd :: cout "Hamma l destructor ... \n' : }
11 ,
12 : II Ms tagtggvnyek
13 : void Speak()const { std :: cout 'Ma mma l sQund l \n' ; }
14 : void Sleep()conat ( std :: cout "shhh . I 'm s!eeping . \n";
15 :
16 : protected :
17 : int itsAge ;
IB : int itsWeight;
19 : l ;
20 :
21 : class Dog
22 :
23 : public :
public Mammal
24 : II Kons t ruktorok
25 : Dog()! std :: cout 'Oog cons t ructor ... \n';
26 : ~ D o g ) { std:: cout 'Oog des t ructor ... \n' ;
27 :
28 : II Ms tagfggvnyek
29 : void WagTail() ( std: : cout "Tail wagging .. . \n" ; )
30 : void BegForFood() ( std:: cout "Begging (or food . .. \n" ; )
31 : void Speak()const ( std :: cout "Woof!\o" ; )
32 :
33 : pr ivate :
34 : BREED itsBreed;
35 : };
36 :
37 : int main()
38 :
39 : Mammal bigAnirnal ;
40 : Dog fido;
41 : bigAnirnal.Speak.();
42 : fido. Speak () ;
43 : return O;
44 :
Mammal const ructor ..
Mamrna l construct or .. .
Dog const ruc t or ...
Mamma l sound!
Woof !
Dog desLructor . .
Mam.mal des true tor .
Mnmmal dcstructor ...
16. ra Az 307
A 31. sorban a Dog osztlyban fellirjuk a Speak () met6dust, aminek a hatsr.!. a ku-
tyk azt fogjk mondani, hogy" IVOOp'. A 39. sorban egy bigl'l.nlma l (nagytfla/)
eml6s{J ll alot hozunk ltre; kOllstruktorinak ksznhet6 a kimenet els6 sora. A 40. sor-
ban jn ltre fi do kUlya, emiatt kapjuk a kimenet kvetkez6 kt sort, az eml6s-
s a kutyakonsu1Jklor ad hrt magrl.
A 41. sorban megszlal a biglulimal, majd a 42. sorban fido kutya is. A kimcnetb61
ltszik, hogy mindkt llat a sajt Speak () met6dust hvta meg. Vgl :1 kt:t objektum
hatkrn kvl kerl, s meghvdnak a destnIktorok.
Tlterhels vagy fellfrs?
E kl fogalom nem ll messze egymstl, azonba n alapvet6en n tartalmuk. Ami-
kor tlterhelnk egy fggvnyt, akkor ann:tk tbb viltozatl ksztjk el (tlgyanabban
az osztlyban) azonos nven, de ms-ms paramter-szignatrftva1. Amikor viszont fe-
llnlnk egy fggvnyt , akkor a szrmaZL.1ton oszllyban ugyanolyan ncvC s 118)'al1-
ol)'a/I paramter-szignatrj fggvnyt deklarlunk, mint mni a bsosztlyban is
megvan.
A bzisosztly met6dusainak elfedse
AZ progmmban a Dog osztly Speak () mel6dusa elfedte a b!izisosztly azonos
Jllctdust. Ez volt a slndkunk, azonban vratlan mellkhatSOli is lehetnek e
Ha az van egy mozgst kifejez6 tlter11elt metdusa, s
a kutyk szmra ezt fellrjuk, akkor ezzel az sszes ilyen nev(i metdusvltozatot fe-
llnuk.
Ha a Mammal tlterheli a Move () fggvnyt, s hrom vltozatot valst meg (az
egyik paramter nlkli , a msik egy egsz paramtert, a harmadik egy egsz s egy
irny jcllegC paramtert vr), s a Dog ezek kzl csak a paramter nlkli vltozatot
rja fell, akkor nem lesz egyszeru a Dog objekrumok szmra a msik kt Move ( ) -
vltozat elrse. Ezt a 16.6 Listban lilhatjuk.
30a l V. rsz s tbbalaksg
16.6 lista - Metdusok eHedse (hidingbase.cpp)
o: 1/ 16 . 6 II Metdusok el fedse
1 .
2 : #i nclude <l ost r cam>
3 .
4: c l ass Hammal
5 : (
G: public :
'I : void Hove!) const ( std: : cout 'Hammal move one step\n' ;
8 : voi d Move{int distance) const
9 : { std :: cout 'Marnmal move distancc stcps . \n '; }
10 : protected:
11 : int i tsAgc;
12 : int itsWeight;
13 : };
1 4:
15 : c l ass Dog public Mammal
16 :
17 : public :
18 : void Move() const { std:: cout 'Oog move 5 stcps . \n' ; }
19 : l ; II A jobb forditprogramok figyelmeztp.tnok , hogy el fogunk fedni
.. egy fOggvnyt !
20 :
21 : int main()
22 : (
23 : Hammal blgAnimal ;
24 : Dog fido ;
25 : bigAni mal ,Movfl ( ) ;
26 : bigAni ma l.Move (2) ;
27 : fido . Move() ;
28 , II fido . Move(lO) ;
29 : return O;
30 :
Kimenet
Mammal move one stcp
MaJnlUal move 2 Gt ops .
Dog move 5 s l epl:l .
Be s
Minden flsleges adatoL s fggvnyr cltnlettnk az oszttyokbl. A 7. s 8. sorban
deklarljuk a Mammal osztly therhelt Move () fggvnyeit. A 18. sorban a Dog feWlrja
a Move () fggvny paramter nlkli vltozatt. A 25-27. sorban hvjuk meg e fggv-
nyeket, melyek vgrehajtst a kimenet mutatja. A 28. sor azonban megjegyzsbe van
tve, mert fordtsi hib{1l okozna. Ha nem trtnt volna fellrs, akkor a Dog pJd,lny
meghvhatn a Move ( egsz) szignatrj vltozatot, de mivel fellrtl.lk az eredeti
fggvnyvltozatok egyikt, gy valamennyi vltozatot jra kell fogalmazni, ha hasznl-
ni akarjuk Ez emlkeztet arra a s7,ab{t1yra, hogy ha megadunk sajt konstruktort,
akkor a fordtprognlm mr nem t,mogalja az al aprtelmezett konstruktor hvst.
Gyakori hib-d., hogy fggvnyek fellrsakor elfelejtjk a const kulcssZl, amely pedig
a paramter-szignatrn rsze. Igy a paramter-szignatra megvltoztatsval cs.lk elfed-
jk a bzisosztly eredeti fggvnyt, nem pedig fellrjuk
Egyes fordt6programok figyelmeztetnek az elfedsre valahol ;1 15-19. sor krnykn.
A Borland fordt nem teszi ezt. Ms fordtprogrdmok gy tlik meg, hogy - br van
a metdusok elfedsre - cz gyakran tvedsb61 bkad, gy inkhh kldenek
egy figyelmeztetst, ha ilyent szlelnek.
A bzismetdus meghfvsa
lia fell is rtunk egy bizismetdust, megvan r a hogy azt hvjuk
meg, csak meg kell adni a teljes nevl. Ez a bzisoszt,'ily nevb6I, kl kett6spontb61,
vgl a fggvny nevl>61 ll, pldul:
Mnmmal: :Move()
A 28. sort ennek megfelel6en tlehetlle fogalmazni, hogy lcforduljon a 16.6 Li sta:
28 : fido.Mammal::Move(10);
Ez kifejezeuen a Mammal sajt metdus:' t hvja mcg. A 16.7 Li sta ezt a lehct6sget nlU-
taLja.
, 6. 7 Usta - A bzismetdu5 meghvsa egy fellirt meldusbl (callingbase.cpp)
o: II 16 . 7 II 11 bzismet6dus meghvsa a felal!rL met6duGb l
1 : j include <iostrcam>
2 :
] : cl ass Marranal
4, (
5 : public :
6: void Move () cons t ( std: : cout 'Marrunal move one step\n"; )
7: void Move(int distance) const
8: ( std: : cout "Hammal move
9 : d istance ' steps . \n"; )
10: protected:
11 : int i tsAge;
12 , int itsWeight ;
13 : l ;
14:
15: class Dog public Mamma l
16 :
17 : public !
18: void Move ()const ;
19 : };
310 I V. rsz rkl6ds s 1bbalaks!g
20 ,
21: void Dog : : Move() const
22: (
23 : std: : cout 'In dog move . .. \n' ;
24 : Hammal :: Move (3) ;
25 : }
26 :
27 : int main()
28 :
29 : Manunll l b igAnimai ;
30 : Dog (ido ;
31 : bighnimal . Move{2) ;
32 : fido . Mammal :: Move{6);
33 : return O;
34 :
menet
Mammal move 2
Mammal move 6 stcps .
Bamzs
A 29. sOl'ban ltrejn egy bigAnimai (nagyl/ lIat) cml6s{l llal, majd a 30. sorb:11l
fido, a kutya. A 31. sorban [[Ilhat metd ushvs n eml6sk Move () fggvnyt hvja
mcg, amely egy egsz szm pardmtert vr.
A programoz a kutya szmra is il yen egyparamleres Move () fggvnyt szeretne
meghvni, dc ez akadlyba tkzik. A Dog osztly fellrta az eredeli Move () fgg-
vnyt, de nem vette a fradsgot II llterhelsrc, s nem fogalmazta meg az egypara-
mteres vflltozatot. Ezen gy segthetnk, hogy kifejezetten a bzisoSZlly Move ()
fggvnyt nevezzk meg a 32. sorban.
H81y81
rdemes kiLerjeszteni a bevMt oszt-
lyok fl.lnkcionalitst a szrmntalott
osztlyokban.
A bzisoszll y metclusain:lk fellr-
sval rdemes bizonyos s7..l nnazta-
totl fiiggvnyek mkdst megvl-
taztatni.
H8lytelen
Ne essnk abba a hibba, hogy a pa-
ramter-szignatra megvlt oztatsval
vletl enl elfeclnk egy bzisfgg-
vnyt.
Krdsek s vlaszok
Krds: Ork/6dncl.!-e tbb genercin t a szrmaz/atoll osztlyok adaltagjai 6fgg-
t-tllyei? ifa a Mulya egy s elZ egy l/al, akkor rkli-e II kut)'a az llatok-
ra ada/okai s jiiggvnyeket?
Vlasz: Igen. Az folyamatban a szrmazlatott osztlyok min-
den adatt s fggvnyl megkapjk.
Krds: lalakfhal-e etv' szrmaztatott osztly egy nyi/vllos (p/lblic) bzisJliggvnyl
priu' ra?
F/asz: Igen, de ebben az esetben ez nem fog ltszani il tovbbi szrmaztatott oszt-
lyokbnJl.
Gyakorlatok
Az el mlt 6dban ;iZ rkl6dssel. Most vlaszoljunk meg nhny
krdst s v{:gczznk cl nhny feladatot tudsunk ellen6rzse s megerostse vgett!
Kvfz
l. Mi a lecsupaszts clja?
2. Mirt rdemes egy osztCtlyl sznnaztatva
3. A fejezel programjaiban (16. 1-16.5) lallkozhatott az enum ut:lsitssa1. Ez mit csi-
nl?
4. Mirt lehet rdemes elrejteni egy bzisfggvnyt a szrmaztatott osztly
(mint ahogy az a 16.6 listban is trtnt)?
Feladatok
l. A hidingbase.cpp programban 06.6 Li sta) vegye ki a a 28.
SOlt. Mi tl1nik? Hogyan lehet mgis tenni a programot?
2. Mdostsa gy a derivedobject. cpp programot 06.2 Li sta), hogy a fajta
(breed) nyilvntartsm a felsorolsos vltoz helyett szveges vltozt hasz-
m ljon.
3. A baseoverride . cpp programban (16.5 Li sta) csak az sz.3.mra ll ren-
delkezsre a Sleep () fggvny. Mdostsa gy a programot, hogy bigAnimal
s f ido is hvja meg ezt a mel6dust.
312 1 V. rsz s tbbalaksg
Vlaszok a kvfzkrdsekre
1. A lecsupaszts rvn pillanatok alalt futtathat6v egy fggvny. Nem kell
a feladat megvalstsnak apr rszletei re koncentrlni; egy ks6bbi
ban is be lehet fejezni a vzlatosan elk!szlt fggvnyt.
2. Egy osztly szrmaztatsa gyakran sokkal egyszenThb, mint a megrni.
Ha mr nhny vonatkOzsban jl mil1 kezdennk
3. Az enum lehet6v teszi (a mesterklt s nehezen lthel6 szmk6dok helyett)
a beszdes szimb61umnevek hasznlat.l, lrunt pl dul a YORKIE.
4. A osztly viselkedse eltr a bzisosZtlyt61, oly-
annyira, hogy nhny bzisf'ggvny mr hasznlhatatlan. Mivel nem mindig
van arra hogya bzisoszrlyhoz hozznyljunk (pld:lul mert nincs is
meg a forrsa), ezt a megoldsT rdemes haszn{llnL
17. RA
A tbbalaksg s a szrmaztatott
osztlyok
Ebben az rban a sz:
Mik azok a viltu:'lis fggvnyek
Hogyan hasznljuk a virtu:'lis dcslruktorokat s msol konstmktorokat
Miknt teszik leher6v a virtulis fggvnyek a bzisosztlyok tbbalaksng:'t
Milyen kltsgei s veszlyei vannak a virtulis fggvnyeknek
A virtulis fggvnye kkel megvalstott tbbalaksg
Az fejezet azt hangslyozta, hogya kutya tpus objekrum egyben lpus
objektum is. El eddig cz pusztn .lZl jelentene, hogy a kmya objektum rklt minden
Tulajdonsgot (adatot) s kpessget (fOggvnyr) a bzisosztlyt61. A C++-ban azon-
ban a "rszt!' relci ennl mJyebb sszefggst takar.
314 rsz
A tbbalaksg teszi, hogy gy bnjunk egy szrmaztatott osztllyal, mintha
az a bzisosztly objektuma lenne. Tegyiik fel pldul , hogy lt rehozunk nhny spe-
cializlt eml6st j kutyt, macskt, lovat stb. Mindezek az osZtlybl szrmaznak,
gy az is a smukra. Az egyik ilyen lehet a Speak () .
Minden ad ki valamilyen hangol.
Meg szeretnnk tantani minden szrmaztatott llatfajt a specializlt hangadsra. A ku-
tya ugasson, a macska nyvogjon stb. Minden osztl yban fell kell rnunk a Speak ()
met6dust.
Ugyanakkor, ha mr van egy sereg llatunk (pldul egy farmnyi kutya, macska, l s tc-
hn objektum), akkor szeretnnk farm jtt:kunkban tudatni ezekkel az ll atokka l, hogy
j vol na, ha beszlnnek (SfX 'ak), de azzal nem kvnunk foglalkozni, hogy miknt is va-
16stj:k meg eZl a kpessgket a sajt Speak () metdusukkaL Amikor ezeket az llato--
kat cgysz(,;!r(,;!!1 <:: 1l116sknek (Mammal) tekintj k, s meghvjuk r!ljuk ,I Marranal. Speak ()
metdl.ls[, ,Ikkor ezzel a lbbBIBksgot valstjuk meg. Angolul ez a "polymorph" tulaj-
dons.'g; a sz elemzsve\ is a fogalmlloz jutunk. VaI6b,lll , ,IZ
kel foglalkozunk, annak tbbtele megjelensi formjban.
Lehet pldul egy eml6s objektl.lmra vonatkoz mutatt deklarlni, majd rtkl adni
neki egy kutya objektum cmt a dinamikus memriban. Mivel a kutya az em-
halmazfinak, ez teljesen sL1blyos:
Mammal* pMammal = new Dog:
Ezzel a mutat6val aztn az eml 6sk tctsz61cges lagfggvnye meghvhat. Igazbl azt
szeretnnk, hogy ha egy fggvnyt fellrtunk a kutya osztlyban, akkor az hv6djon
meg alka lmas pillanatban. A virtulis fggvnyek ezt teszik Ha tbb:!laknak
teki ntjk ezeket az objektumokal, akkor meghvni az eml 6s mutatm vonat-
koz tagfggvnyt, s nem kell a konkrt szrmaztatott objektum mibenl tre koncent-
cllni (hogy ez mOSt pp egy kutya), vagy hogy miknt is van megval6stva a ha.szn: -
land fggvny.
A 17."1 Li sta II vimllis fggvnyck ltal megval6sthat tbbalaksgot.
17.1 U ... - Virtu6lil flIggrinyek hasznlata (virtmeltlod.cpp,
o: 1117 . 1 Lista - Virtulis fggvnyek hasznlata
l: 8include <iostream>
2 ,
3: class Mammal
, ,
S: public:
6: Mallll\al() : itsAge(l) { std" cout 'Ma!ll1\ll;l constructor ... \n ;
7 : -Marnmal{) { std:,cout "Marnmal destructor ... \n'; }
8: void Hove() const ( std: : cout "Mammal move one step\n" ;
9, virtual void Speak { ) const { std: :cout "Harnmal speak! \n":
10 :
11: Dcotected:
12 : int itsAge;
13: };
14 :
15 : class Dog : public Mamma1
1 6 : (
17 , public :
.6ra
18: Dog{) ( std:: cout "Dog constructor ... \n"; )
19 : -Dog() { std " cout "Dog destructor ... \n" ; )
20 : void WagTail() {std:: cout "Wagging Tail ... \n" ;
21 , void Speak{)const I std :: cout "Woof!\n"; }
22 : void Move()const { std:: cout "Dog moves 5 steps ... \n" ;
23: } ;
24 :
25 , int main(}
26 :
27 , Mamrna l *pDog .. new Dog ;
28 , pDog->Move();
29 : pDog->Speak{) ;
30 : return O;
31 :
Hammal constructor ...
Dog Constructor ...
Mammal move one step
woof!
A 9. sorban az eml6s oszt.ly biztosit egy Speak () vinulis fggvnyt. Az oszt.ly
ezzcl kifejezi azt a sz.'indkt, hogy cz az osztly ms osztlyok bzisosz-
llya legyen. A szrmazulloll osztlyokban fell fogjk irni ezt a fggvnyt.
A 27. sorbHn ltrejn egy eml6sre ulal mUlll1, a pDog; ehhez egy j kutya objekmm
cmt rendeljk hozz. Mivel a kutya eml6s, ez a hozzrendels helyes. Ezzel a mutal-
val hvjuk meg azutn a Move () fggvnyt. A fordtprogram gy tudja, hogya pDog
egy mutatja, gy az em16sknl ke resi a Move () metdust.
A 29. sorban a mutat6val a Speak () fggvnyre hivatkozunk. Mivel a Speak () vimI-
lis fggvny, a kurya osztlya ltal fellrt Speak () metdus hvdik meg.
Ez mr-mr legalbbis abban a vonatkozsban, hogya hv fgg-
vnynek csak egy mutat6ja van, m ill mgis egy kmya met6dusllud meghvni.
Ha egy egsz lmbnyi mutatnk lenne, s mindegyik valamilyen
315
316
mazOllrd hivatkozna, akkor is mind-mind sorban a neki sznt fggvnyt hvn meg.
A 17. 2 Li sta ezt mUlalja be.
0 , II 17 . 2 Lista - TObb virtulis fggvny egyms utni meghvsa
1: 'include <iostream>
2,
]: class Mamma!
4,
5 : public :
6 : Mammal() : itsAge(l)
7 ; -Mammal( ) { )
8 : virtual void Speak() cons t ( sta : : cout "Mammal speak!\n";
9 : protected :
10 : int itsAge;
ll : ) ;
12 :
l] : c l ass Dog publ ic Mammal
14 :
15: public:
16: void Speak () const ( std :: cout "Woof! \n " ; )
17: );
18:
19 :
20: class Cat public Hammal
21: {
22: public:
2]: void Speak()const { std::cout "Meow!\n"; }
24 : );
25 :
26 :
27: class Horse
28: (
29: public:
public Hammal
30: void Speak () const ( std :: cout 'winnie! \n" ; )
31: J;
32 :
]] : class Pig public Hamma l
34 :
35 : public :
36 : void SpeakO c onst ( f;td :: cout 'Oink l \n' ; )
37 : ) ;
38 :
39 : int main()
40 :
41 : Mammal * theArray(5J ;
42 : Mammal* pt r;
43: int choice, i ;
44 : for ( i " O; i <5; i H )
45 : {
46 : std: : cout '(l)dog (2)cat (3)horse (4)pig : ' .
47 : std: : cin choice ;
48 ,
49 :
50 ,
51 :
52 ,
53 ,
54 :
55 ,
56 :
57 :
58 ,
59 :
60 :
61 ,
62 :
63 ,
64 :
65 :
66 :
67 ,
switch (choice)
{
case 1 ,
ptr '" new Dog :
break :
case 2 ,
ptr ,... new eat ;
break ;
case 3 :
ptr = new Horse;
break :
case <1 :
ptr :: new Pig :
br eak :
default :
pLr = new MalTunal :
bre ak:
theArray [ i] '" p tr :
68 : tor (i-0 ; i<5 ; i .... )
69 : theAr ray f 1 J ->Speak () ;
70 , return O:
71 :
Kimenet
(1 )dog (2)cat (31 horse (4)pig : l
(l) dog (2)cat (3)horse (4)plg : 2
{1 ) dog (2)cat (3)horse (4)pig : 3
(l)dog (2)cat (3)horse (4)pig :

(l)dog (2)cat (3)horse ( 4 ) picjj: 5
Woof !
Meow!
Wi nnie !
Oink !
Hamma l Speak

S
s a szrmaztatott
Ez a program, amdy minden osztlynl csak a legszernyebb
funkcionalitst valstja meg, a virtulis tagfggvnyeket a lehet6 legtisztbb formjuk-
ban mutatja be. Ngy osztlyt deklarlunk: kutyt, macskt, lovat s disznt, mindegyi-
ket az emlsbl szrmaztatva.
A 8. sorban az eml6s Speak () fggvnyt virtulisnak deklarljuk. a 16, 23,
30. s 36. sorban a szrmazlatott osztlyok fellrjk a Speak () fggvny eredeti meg-
val6stsL
317
A felhasznlt arra szltja fl a program, hogy vlasszon, melyik objektumot hozzuk
ltre, majd a kivlasztott mutatk bekeriiInek egy tmbbe a 44-65. sorban.
Aprop
Dinamikus kts
Igen rdekes az, hogy fordtsi idben mg nem lehet tudni, mely objektumokat kell
majd ltrehozni, s gy mely Speak () metdus meghvsra lesz szuksg. A pt r
mutat objeklumhoz ktse csak futsi idben trtnik meg. Ezt hvjk di namikus
ktsnek (vagy futsidej ktsnek), ami a statikus kts (vagy fordltsi dej kts)
ellentte.
Hogyan mlkdnek a virtulis fggvnyek
Amikor egy szrmaztatott objektum, pldul egy kutY:1 (oog) ltrejn, clszr a b{IZis-
konslnlktora, majd a oszti ly konstruktora hvdik mcg. A '17. 1
bra nwtatja, hogy hogyan pl fel a kutya objeklum II lt rehozsa un'in. Figyeljk
meg, hogya memriban az eml6s "rsz" szrnm lefoglalt helynek a folytatsa a kutya
"rSZ" helye.
,-----,,,
Em", "" I--_E_m_"_,_-.j
Kutya
17.1 i b",
Kutya objektum
KI/f)vl objektulII (/ ltrel/OzStI utll
Amikor egy objektumban virtulis fggvnyt deklarlunk, az objektumnak nyomon
kell kvetnie ennek a fggvnynek a szrmazkail. Tbb fordtprogram k-
szr e clbl egy virtuli s fggvny tblzatot, gynevezctl v-tblzatot. Ez minden vir-
tu::llis tpus szmra ltrejn. Minden ilyen tpus objektum tartalmaz egy virt ulis tb-
lzat mutat6t, v-mulal6t (vptr), amely a virtulis tblzatra mutat
Br a megval6stsok klnbz6ek lehelnek, minden fordtprogramnak meg kell 01-
dania ezt a feladatot; nem tved nagyot, aki ezt a vzlatot kpzeli el.
Minden objektum vptr mutatja hivatkozik egy v-tblzalra, amelyben minden virtu-
lis tagfggvnyre egy mUlat UlaI. Amikor a kutya eml6s . resze" U:lrejn, a vptr gy
iniciali7..ldik, hogy a7. eml6s osztly virtulis fggvnyeire mUlasson 07.2 bra).
VPTR
12
& Move
Mammal
& Speak
17.2 bra
Egy /)-I",ztllt/
Amikor egy kutya konstruktor meghv6dik s elkszl az objektum kutya r(:sze is, ak-
kor a vptr gy korrigl6dik, hogy a mutatk a kutya objektum fellrt tag-
rggvnyeire mlltass:mak (ha vannak ilyenek) , Ezt mutlllja a 17.3 bra.
VPTA -
l?
"""""
& Mammal: Move ()
& Dog: Speak ( l
""
17.3 bra
Egy Imt)'fI v-tblz(l/t/
Amikor egy mutat6t hasznlunk, I I vptr tovbbra is a helyes fggvnyre fog
mulami, az objeknun konkrt tpustl fgg6en. gy, amikor meghvjuk a Speak () -et,
a helyes fggvny indul el.
Nem juthatsz innen amoda
Ha egy kutynak van olyan metdusa (wagTai l ()), amely nincs meg az osztly-
ban, akkor azt nem lehet mutat6val elrni (hacsak nem hasznlunk tpuskonver-
zit kutya mutat,d). MinLhogy a wagTail () nem virtulis fggvny, s nincs meg
az osztly pldnyaiban, nem el kutya objektum (vagy leg.tlbbis egy er-
re val tipuskonverzi) nlkl.
Br t lehet alaktani az mutatt kutya mUL1tv, vannak ennl sokkal jobb s
biztonsgosabb megoldstok a WagTail () elrsre. A CH nem nzi j szemmel
320 rsz s
;iZ explicit tpuskonverzit, nlivel rejt. A tma rszletesen el6keru..
mg a 18. rban, amikor a tbbszrs beszlnk, illetve a sablonokn'
szl624. rban is.
Szeletels (slicing)
Figyelem, a virtulis fggvnyek bvszlllutatvnya C5.1 k mutat6kr.t vagy
ra Egy objektum rtk szerint val elkldse nem okoz virtulis
hvst. A 17.3 Lista ezt mutatja be.
11.3 Ulti - Az adatol< 1 .... _,"" dk szerinti plllm6te,6ted ko, fllicl ... "",
0 , /1 17.3 Lista - AdaLszeletels az rLk szeri nt va16
l: <ios t ream>
2 .
3 : clasA Mammsl
4: (
5 : public :
6 : Hamme1() : itsAge{l)
7 : ( )
... paramtertadskor
8 : virtuel void Speak () const { std: :cout "Hammal speak! \0";
9: protected:
10: int itsAgc;
ll : } ;
12 :
13 : class Dog public Mammal
14 : {
15 : public :
16 : void Speak()const ( std, : cout 'Woof!\n'; )
17 : ) ;
18 :
19 : class Cat : public Hamma!
20 :
21 , public:
22 : void Speak()const { std :: cout 'Meow!\n'; }
23 , };
24 :
25: void ValueFunc tion (Hamma!) ;
26: void PtrFunction (Hammal');
27: void ReFunction (Mammal&);
28 :
29 : int ma in()
30 : {
31 : ptr=O;
32 : int ehoiee ;
33 : while (1)
34 : I
35 : bool fQuit = fa!se ;
36 : std :, eout "(1)d09 (2) eat (O)Quit: ' ;
37 : std : : ein choiec;
38 : switch lehoi ee)
39 ;
40 : case O;
41 ; fQuit = true;
42 : break;
43 ; case 1 ;
44 ; ptr = new Dog;
45 ; break;
46 ; case 2 ;
47: ptr = new Cat;
48 ; break;
49 ; default ;
50 : ptr - new Hammal;
51 ; break;
52 : }
53 : if (fQult)
54 : break ;
55 : PtrFunction(ptr) ;
56 : RefFunction(*ptr) ;
57 : ValueFunction (*ptr) ;
58 : )
59 : ret urn O;
60 :
61:
62 : void ValueFunction (Mammal HammalValue)
a sznnaztatott
.. II Ez a fggvny hvdik meg utoljra
6] :
64 : MammalValue.Speak{);
65 : }
66 :
67 : void PtrFunction (Hammal " pMarorna.l)
68 :
69 : pMammal->Speak(l;
70: }
71 :
72 : void RefFunction (Mammal & rMammal)
7]: {
74 : rMammal . Speak ();
75 : )
Kimenet
(l)dog (2) cat (O)Quit :
Woof
Woof
MilIMlal Speak!
(l) dog (2lcat (O)Quit :
Meow!
Meow!
Hammal Speak!
(ll dog (2)cat (O)Quit :
1
2
O
322 1 V. rsz s tbbalaksg
A 3-23. sorban az kutya s macska oszllyok leeb'Yszerusleu vltozatait dekla-
rljuk. Hrom fggvnyt is deklarlunk, PtrFunc t ion (). Re fFunct i on (), s
Va lueFunc tion (l nt'!ven. Ezek egy eml6s mutatt, eml 6s hivatkozst illetve eb'Y em-
objektumot vrnak par-amterknl. Mindhrom fggvny ugyanntteszi: meghvja
a Speak () metdusl.
A fel hasznfll vlaszthat kutya s macska kztti vlasztsnak megfelel6en kszl el
egy mulat a tpus!".! a 38-52. sorban.
A kimenet sora szerint a felhasznl a kutyt v{L!aszlja. A kutya objektum a dinami-
kus mem6riatertlleten kszl el ti 44. sorban. Ez a kutya azln mut;ltknt, hi vatkozs-
knt s rtk szerint keiii i tadsra <l hrom fggv(:nynek. A mlllat6 s a hivatkozs
virtulis tagfggvnyeket hvnak meg, gy soron a Dog->Speak () fggvny ke-
lill meghvsra. Ez ltszik a felhasznl vlasztsa utni kt sorban.
A feloldott mutatt mr rtk szerint adjuk t. A fggvny egy eml5s objektumot vr (er-
r61 tanskodik a paramter-szignatrja), gy a fordtprogram lccsonktja a kutya objek-
tumOt llZ . rszre". Ily m6don <I Z Speak () met6duS<1 kerl meghvsra,
ahogy azt a klmenetben a felhasznl vlaszt<s.'l utni h;lrmadik sorb<ln lthatjuk.
llatkrerlenllUcet a macskval is vgrehajt juk, h:lsonl eredmnnyel.
Virtulis destruktorok
Gyakori megolds, hogy egy szrmaztatott objektum mutatjt adjuk t Oll, ahol a b-
zisosztly mUlatjt vrja a program. Mi trtnik egy ilyen mulat trlsekor?
Ha a destruktor virmlis (ahogy annak lennie kel!), akkor a dolog trtnik:
a szrmaztatott osztly destmktora hvdik meg. Mivel a szrma zt:Holt osztly
destruktora automatikusan meghvja a bzisosztly destruktort is, ezrt a teljes objek-
tum mdon
A levonhat tanulsg: ha osztlyunkban akad akr csak egyetlen virtulis fggvny is,
akkor a destrl.lktornak is virtulisnak kell lennie .
Virtulis msol konstruktorok
Ahogy korbban mr emltettk, a konstnlktorok nem lehetnek virtulisak. Ennek elle-
nre vannak helyzetek, anlikor programunk ktsgbeesetten prbl beszuszakolni va-
lahova egy bzisosztJybeli objektumot mutatI, s prblja megszerezni a ltre-
jv6 szrmaztatott objektum msolatt. Ennek a problmnak jl bevlt megoldsa,
ho
b
')' egy msol mel6dusl hozunk llre a bzisosztlyban, majd vi rtuliss tesszk.
A msol metdus ltrehozza az aktulis objektum msolatl, s ezt adja vissza VissZ. 1 -
trsi rtkknt.
Mivel minden szrmaztatott osztly fellrja a msol metdust, a sznnazlatoU oszt-
lyok pldnyai jnnek lt re ennek hasznlatval. A 17.4 lista mutatja, hogyan.
11.4 Usta - Virtulis msol konstruktorok (virtualcopy.cpp)
o: II 17.4 Lista - Virtulio mo016 konotruktor
1 , <iostream>
2 ,
3 : cl ass Hammal
1 ,
5 : public :
6: MammalO :itElAge{ l ) ( std: : cout 'Mamrnal constructor . . . \n "; l
7 : vir.tual -Hammal() ( std :: cout 'Mammal dcstructor ... \n '; )
8 , Mammal (const Mammal & rhs) ;
9 : virtual void Speak () const ( std :: cout spp.akl \n" ;
10: virtual Mamma1* Clone{) ( return new Mammal{*thisl; )
11 : int GetAge()const ( return itsAge; )
12 :
13: protected:
14 : int itsAgc;
15: );
16:
17: Mammal::Hammal (const Hammal & rhs) : itsAge{rhs . GetAge{)
18: (
19: std : :cout 'Hammal Copy Constructor ... \n";
20:
21 :
22 : class Dog
23 :
24 : public :
public Mammal
25 : Dog() { std: : cout 'Oog constructor ... \n"; }
26 : virtual -Dog() ( std: : cout 'Dog destructor . .. \n"; )
27 : Dog (const Dog & rhs) ;
28 : void Speak()const ( std : : cout 'Woof!\n ' ; )
29 : virtual Mamma l* Clone() ( return new Dog( *this) ;
30 : l ;
31 :
32 : Dog : : Oog(const Dog & rha) :
33 : Hammal (rhs)
34 : {
35 : otd :: cout 'Oog copy constructor ... \n" ;
36 :
37 :
38 : class Cat public Marnmal
39 : (
40 : public :
41 : Cat() std : : cout "Cat constructor ... \n"; )
42 : virtual -Cat () { std:: cout "Cat destructor . .. \n"; }
324 1 V. rsz s tbbalaksg
43 :
44 :
45 :
46 : } ;
47 :
COlt (const Cat &) :
void Spcak()const ( std:: cout "Meow!\n' ; l
virtual Mammal* Clone() { return new Cat {*this ) ;
48 : Ca t : : et (const COlt: & rhs) :
49 : Mammal(rhs)
50 : {
51 : std: : couL "Cat copy constructor ... \n' :
52 :
53 :
54 : enum ANIMALS { MAMMAL, DOG, CAT};
55 : const int NumAnima1Typcs = 3;
56 : int main()
57 :
58 : Mamma1 theArray[NumAnimalTypes];
59 : MaITunal" ptr ;
60 : int choicc ,i;
61 : for (1 = O; i<Numl'u1ima1Types ; i ll )
62 : (
63 : std:: cout '(l)dog (2)cat (3)Ma=1 : ",
64 : std: :cin choicc ;
65: switch (choice)
66: {
67 :
68:
69 :
70 :
71 :
72 :
73 :
74 :
75 :
76:
77:
78:
case DOG:
ptr = new Dog;
break;
case CAT:
ptr = new Cat ;
break ;
default :
ptr = new Mamma1:
break;
theArray r i J = ptr;
79: Manunal OthcrArray [NumAnirna1Types) ;
80 : for (i=O; i<NumAnima1Types; iH)
81 : (
82 : theArray[il >Speak() ;
83 : OtherArray [il '" t hp.Array [i j - >Cl one () ;
84 :
85 : f or (i=O;i<NumAnima lTypcs ; i ++)
86 : OtherArray [ i]->Speak() ;
87 : return O;
88:
- 1 : (l)dog (2)cat (3)Mammal: 1
2 : Hammal constructor .
3 : Dog Constructor . ,
4: (l)dog (2)cat (3) Mammal : 2
5 : Hamma1 const ructor ...
6 : Cat constructor ...
7: (ljdog (2)cut (3)Mammal: 3
8: Mammal constructor ..
9 : Woof!
10: Mumma1 copy constructor ...
11: Dog copy constructor . .
12 : Meow!
13: Mamma! copy constructor . .
14 : Cat copy constructor . .
15: ManI/nal speak!
16: Mamma! copy constructor ..
17: Woof!
18: Meow!
19: Mamma! speak!
EI.
17. 6ra A s a sznnaztBtott
A 17.4 Lista igen hasonlt az kett6hz, attl eltekintve, hogy egy j virtulis t3g-
fggvny is megjelem az osztlyban: a clone () . Ez egy mutat6t ad vissza t:gy
jonnan ltrehozott objekLUmr:a, mikzben meghiv6dik a msol6 konstmktor,
aminek nmagt ("thiS) ;ldja t konstans 1livatkozsknl.
A kutya s a macska is fellrja a clone () met6duSl, mclyben nmaguk msolatt ad
jk t msol konstruktoruknak. Mivel a clone () vinulis fggvny, ennek hatsr..!
tnylegesen ltrejn egy virtulis msol konstnlktor, ahogyez:I 83. sorban ltszik.
A felhasznlnak Iehet6sge van kutya, macska vagy emt6s kzl vfllasztani, melyek
ltre is jnnek a 6576. sorban. Minden vlaszt{lsnak megfelel egy mulat, melyet a 77.
lthat trol unk.
Ahogya program sorban vgiglpclel az egyes itercis lpsekben a tmbn, minden
objektumra meghvja a Speak () (82. sor) s a clone () met6dust (83. sor). A clone ()
meghvsnak eredmnye egy mUI,l l lesz, amely az eredeti objekmm m.solmra mu
tat. Ez egy jabb troldik a 83. sor szerint.
A kimenet c1s6 sorban a felhasznl a kutya ltrehozst vlasztja (vagyis az l-est).
Az s a kutya konstruktorai elvgzik Ugyanez megismtl6dik ma(.:5-
kra s eml6sllatra is a kimenet 4-8. sorb.m.
A kimenet 9. som mutatja a7. objektum, a kutya megsz6lalst (az for ciklus-
ban, a 82. sorban). 1\ virtulis Speak () fggvnyt hvj uk meg, s a Speak ()
mcgvalsts fut le. Ezek utn a clone () fggvny kvetkezik, s mivel ez szintn vi r-
tulis, a kutya klnoz met6dusa lp munkba. az msol
konsrruktom, majd a kUlyk msol konstruktora indul el.
326 1 V. resz s !bbalaksg
Ugyanez ismtl6dik a macskra (kimenet 12-14. sora) majd az emlsre (kimenet 15-16.
sora), Vgl vgigjrjuk frissen keletkezett tmbnket (kimenet 17-'19. sora, a program
85-86. SOI<.l), s megsz61altatjuk j objektLlmainkat
Az a f6 klnbsg e megkzelts s a msol konstruktor hasznlata kzn, hogy itt
a progmmoz6nak kifejezetlen meg kell hvnia a c l one () fggvnyt. A msol
konstruktor 3momatikusan meghvdi k, amikor lemsoldik egy objektum. J6 tudni,
hogy minden szrmaztatott oszt{ilyuan megrhatjuk sajt fellr c lone () fggvnyOn-
ket, br ez a megkzelts sokat ronl a helyzet n!galrnassgn,
A virtulis fggvnyek kltsgei
Mivel :1 virtulis fggvnyeket tartalmaz6 objektumoknak gondoskodniuk kell egy v-
t:blzat karbantarcsrl , ennek van nmi tbblet Ha kis oszt:.'l lyrl
van sz, vrhatlag nem fognak m(ls osztlyok rkl6dni, r, ern rdemes vir-
tulis fggvnyekbe bonyoldni .
Ha brmilyen t:lgfggvnyt virt ulisnak deklarlunk, ezzel mr meg is fizettk a v-
tblzat kltsgeinek nagy rszt (hab r minden tov:'ibbi megvalsts foglal mg nmi
memri:!terii letet). Innent61 kezdve szeretnnk majd dekb-
r{llni a destruktorc is, hogy vrhatlag minden egyb tagfggvny is
les? .. Vessnk szigor pillantst minden nem-virtulis lagfggvnyre, s gon-
doljunk bele, hogy mivel indokolhat, hogy ez nem virtulis.
Helyet
Hasznljunk virtulis fgg;v:nyeket ,
ha arm szmtunk, hogy osztlyunk-
bl ezek fognak.
Hasznljunk virtulis dest11.lktorokat,
ha m:.'lr van virtulis fggvnyOnk.
Krdsek s vlaszok
Holytel ..
Ne jelljk a konstruktorokat virtu-
lisnak.
Krds: Mil111e neveznnk ki minden tagfilgguiin)'t vi11ulisnak?
Vlasz: Az virtulis fggvny ltrehosra komoly kltsgterhet r a v-tblzat
Az ezt tbbJetkltsgek mr elhanyagolhatak. Sok C++ programo-
z gy vli, hogy ha mr van egy virtulis fuggvnynk, akkor mr mindegyiket annak
rdemes kinevezni. Ms progmmozk ezzel szemben gy vlik, hogy csak indokolt
esetben szabad virtulis fggvnyt deklar.'ilni.
17.6 ... A s a szrmaztatott
Krds: Tegyk fel, IIogy bZ/sOSZll)'llllkban van egy SomeFunc () nemi viltulis fi/gg-
lJIl)', flterhelttink, azaz elfogad egy vagy kl egesz paramle/1. Egy szrmaz-
ta/ott osztlybanfclt1/tj/lk az ''8J'JXlnlmteres vltozatot. Mi l/tl/ik, ha a szrmazta-
tott osztly egJl muta/ja meghvja CI ketparam(2teres vltozatol?
Vlasz: Az egyp;mulltcres vltozat fellrsa elfedi a bzisosztly sszes ilyen
fggvnyt. Ily mdon fordtsi hibt kapunk, amely aITl fog panaszkodni , hogya hi-
bsan meghvoll fggvny csak egy egsz paramtert vr.
Gyakorlatok
Ebben az rban ;1 tbbalaksggal s a szrmaztatott osztlyok szpsgeivel ismer-
kedhetlk meg. Vlaszoljtmk most meg nhny krdst s vgezznk CI nhny fel-
adataI ludf\sunk vgett!
Kvfz
1. l..ehcl-e gy mdoslani a slicing . epp progrdmOt 07.3 Lista), hogy
a () fellrsval hvjuk meg a szrmaztatott Speak ( )
fggvnyt?
2, Honnan mdja a program, hogy melyik virtulis fggvnyt kell mcghvni, ha
:lZ objeknunok egy a tartoz vltozban vannak?
3. Milyen tpus mel6dus nem lehet virtulis?
4. II tbbalaksg?
Feladatok
L Mi trtnik, ha a sz!rmaztatott osztly nem rja fl l a bzisosztly valamelyik
virtulis fggvnyt? Tegye megjegyzsbc a virtmethod. epp program 07.1 Lis-
ta) 2l. sort, melyben a kutya osztly Speak () fggvnynek deklarcija lL El
md kpzelni olyan pldt, ahol ennek van rtelme?
2. Mi trtnne, ha:\ s licing . epp program (17.3 Lista) 8. sorbl kitrln
a virtual szt a bzisosztly Speak () fggvnynek tlcfincija e161? Mirt
nem hv6dnak meg sohasem a fellr fggvnyek? (ScgL<;g: rdemes megnz-
ni az els6 krdst.)
3. Prblja futtatni a fejezet minden egyes pldaprogramjt. Prb{lljon ki a knyv-
ben olvashat.tl cltr6 rtkeket is, hogy jobban rezze, hogyan is
a fenti programk6clok.
327
32s 1 V. rsz s tbbalaksg
Vlaszok a kvzkrdsekre
1. Kzvetlen! nem. Br ltre lehet hozni a fggvnyb61 egy kutya (oog) v ltoza-
Lot, eZll:oha nem hvm meg a fordtprogram, mivel a vrt paramterv:.'iltoz6
a bzisosztlybl val (emI6s; Mammal). A Val ue Function-nek pedig sajnos
csak az a vltozat;! kerl meghvsra, amelynek a paramtere.
2. A y-t .. . blzat tartja nyilvn ezeket az informcikaL Ennek a tblzatnak ,IZ admi-
nisztrcija jelenti II virtul is fggvnyek lbbletklL'>gt a norml fOggvnyek-
hez kpest.
3. A konstruktor (belertve a m5016 konstruktort is),
4. A lbba1aks.'ig szerint gy tekintjk a sz:.'irmntaloU oszLlyok pldnyait. mint-
ha azok a bzisosztlyb61 volnnak. Mintha ugyanannak az osztlynak fbb
megjelensi formja lenne.
18. RA
A tbbalaksg kifinomult
hasznlata
Ebben az 6rban a sz:
Mi a tpusvlt s (casting down) s mikor rdemes hasznlni
Mik az elvont adattpusok
Mik az res virtu lis fggvnyek
Problmk az egyszeres
Az leckk sorn nl<1r beszltnk a szrmaztatott objektumok alaposztlyaik
tbbalak kczclsr61. Uthattuk, ho&'Y ha az alaposztlynak van egy Speak () tagfgg-
vnye, amelyet a szrmazt,ltott osztlyban felldefinilunk, akkor az alaposzIly tipusra
felksztett mutatban, amely a szrmaztatott osztlyra mutat, hel yesen a szrmaztatott
osztlyban felldefmiJt ragfggvny jm lVnyre. A 18.1. lista ezt az esetet
330 I v. rsz riild6ds s tbbalaksg
18.1. Lilla - VirldlllIItIfiiIIriaJeI (-..",
o: /1 18 . 1 Lista - virtulis t a g fggv nye k
1 , #include <iostream>
2 ;
3: c l ass Manunal
4.
5 : public :
6 : Mammal () : itsAge(l) ( std: : cout "Hamma l (eml 6 s )
.. konst.ruktor ... \n" ; l
7 : v i rtual -Mammal() { st d: : cout "Mammal (emI6a)
.. destruktor ... \n" ; }
8 : virtual void Speak() const { std: : cout " Egy Marm\al beszl!\n" ; J
9 : protected ,
10 : i nt itsAge ;
ll : };
12 :
13 : class Ca t: public Mumrnal
14 :
1 5 : p ublic :
16 : Cat{) ( std:: cout 'Cat (macska) konstruktor ... \n ";
17 , -Cat!) {std:: cout Car. (macska) destruktor ... \ n " ;
18 : void Speak()const. I std:: cout }
1 9 : } ;
20 :
21 , int ma i nl)
22 :
23 : Mamma1 " pCat", new Ca t ;
24 : pCat ->Speak( );
::lS : r eturn O;
26 :
Hammal (eml6s) konstruktor
Car. (macskalkonstruktor
Mij !
A 8. sorban a Spea k () tagfggvf!nyl virtulisknt hatrOZluk meg. A 18. sorban rdl-
definiltuk, majd a 24. sorban meghvtuk. Ne feledjk, hogy a pCat mUlatt a Marnma l
osztlyhoz vezettk be, dc egy Cat tpus objektum cmt rendeltk hozz. Ahogyan
a 17. leckben (Tbbahlksg s szrmaztatott D..';zrlyok) mr elmondtuk, ez a tbb-
alaksg lnyege.
De mi trtnik akkor, ha olyan tagfggvnnyel b6vljk a e at (macska) osztlyt, amely
nem alkalmazhat a Mamma l osztly pldnyaira? Tegyi.ik fel, hogy egy Purr ()
(dorombols) neV" tagfggvf!nnyel a e at osztlyt. A macskk dorombol nak,
de ms nem, Az osztlyunkat ekkor ekpp hatroznnk meg:
class Cat : publ i c Hammal
(
public :
18. ra
kifinomult hasznlata
Cat() { std:: cout 'Cat (macs ka ) const ructor ... \ n';
-Cat () ( std: : cout 'Cat (macska) destructor ... \ n';
void Speak () const { std:: cout 'Mij! \ n'; }
void Purr () const ( std :: cout 'rrrrrrrrrrrrrrrr\n' ; )
};
A problma a ha most meghvjuk a Purr () lagfggvnyt egy Mammal .tpu-
s" mutatn keresztl, fordtsi hibt kapnnk. A Pun () hvsa kor egy Borland ford-
t valami ilyesmivel vlaszolna:
'vi r t ulmethode. cpp' , E23l6 ' Purr ' is not a membe r o f 'Marruuul'
in function ma in () at l ine 50
Termszetesen mfts rordtk 111ft s hibazenettel llnnak Pldul valal11i ily\:!smivt::l:
error C2039 : 'Purr' : is not a member of 'Hammal '
Amikor a fordt megprblja feloldani a Purr () tagfggvnyt a Marrunal-hoz renddt
virtulis tblza.t alapjn, nem fog ilyen bejegyzst tallni. nehetjk a tagfggvnyt
az aJaposztlyba, dc ez nagyon rossz megolds lenne. Habr mint megolds, k&L<;(:gte-
lenl mQ"kclik, llZ aJ:lposztlyok felhgts.'l a sZllrmaztatott oszllyokra jellemz(5 met-
dusokkal igen rossz progl'l.lmozi gyakorl at, s egyenes t a nehezen k:lrbantarth:u6
kd ksztse fel.
Az egsz prohlma valjban a hibs tervezs eredmnye. ltalnossflgb:m az al aposz-
tlyra felksztett, de a szrmaztaton osztly pldnyval sszerendelt mutat azt jelen-
ti, hogy tbbalak osztlyknt szndkozunk h'l.<;znl ni, s ebben az esetben nem kel-
le ne olyan tagfggvnyek hvsval prblkoznunk, amelyek valamilyen szrmaztatott
osztlyra vonatkoznak.
Vagyis nem az a baj, hogya szrmaztatoll osZl1Uyokra jellemz6 ragfggvr1yekkcJ dol-
gozunk, hanem az, ha ezeket al aJaposltlyhoz ltrehozott mutatn keresztl prbI-
juk meg elrni. Egy tkletes vilgban, ha. ilyen mutatink vannak, nem kellene
az ilye n tagfggvnyek elrsre pr6blkm:nunk.
De termszetesen nem egy tkletes vilgban lnk. Id6nknt azon kapjuk magunkat,
hogy van egy csom alapobjektumunk, pldul egy llatkert tele eml6skkel. Egyszer
csak szrevesszk, hogy van egy macsknk (Ca t tpus objektum), amelyik a fejbe
vette azl az tkozott doromholsl. Ilyenkor ltalban csak egyetlen dolgaI lehetnk:
csalunk.
Csalni pedig gy lehet , hogy az alaposztly mutatnk tpust megvltoztatjuk
(casting) s . tpusazonostjuk
n
a szrmazlatott osztllyaI. Azt mondjuk a fordt6nak:
Fordt6! Programoz vagyok, s pontosan tudom, hogy ez valjban egy macs-
332 1 V. rsz s tbbalakiJSg
ka, gyhogy eredj, s csinld azt, amit mondok." Ez gy hangzik, mintha egy gengszter
mondan, mivel ekzben gy is viselkednk; ki er6szakoljuk egy macska (Cat) viselke-
dst egy (Manuna l) lpus elemre hivatkoz mulalbl.
A feladat vgrehajtshoz a dynamic_cas t opertort fogjuk hasznlni. Ez az opertor
gondoskodik arrl, hogy amikor tpust vlrunk, biztonsgosan tegyi.ik azl. Segt tovb-
b gyorsan megtallni azokat a rszeket a kdban, ahol ltnk ezzel a lehet&ggcl,
gy azonnal eltvolthatjuk amint megjtt a jzan esznk.
A dolog II mO"kdik: ha van egy olyan aJaposztly tpus mutat6nk,
mint II Manun",!, s ehhez a mural6hoz eb')' olyan szrmaztatott osztly pldnyt ren-
deljk, mint a Cat, akkor a Mammal mutatt, mint tbbalak elemet haszn;lhatjuk a vir-
tu lis tagfggvnyek elrsre. Ekkor, ha egy Cat tpus objekmmot akarunk rajra ke-
resztl elrni, annak is kifejezeuen a purr () tagfOggvnyl, csinfilnunk kell egy Cat t-
pus lllulatt a dynamic_cast opertor segtsgvel. Az alaposzt{lly mut:lt6 ellen6rz-
se futsid6bcn trtnik. Ha az talakts lehetsges, az j Cat tpus mutatnk ltrejn.
Ha vi szont az talakts nem lehetsges, vgl mgsem Ca t tpus objekturnra hivat-
kozmnk, az j mutatnk rtke null lesz. A J8.2. Lista ezt mutatja be.
18.2. Uoto-Dl ....... (aooIIoa1. mB --IG.........-
(dynallllccalt.cpp l
O, /I 18.2 . Lista - Dinamikus t pus konverzi
l : 'include <i.ostrcam>
2 , u!:ling std: : cout ; II a program hasznlja az std: : cout hivst
,.
4: class Mammal
5 : (
6 pubU c :
7: Mammal(l : itsAge{l) ( cout "Mammal (em1 6s )
wo konstruktor ... \n ";
8 : virtual -Marnmaol () ( cout "Marnmaol (emI6s)
wo destruktor ... \n" ;
9 : virtual void Speak() const ( cout "Egy Manunal
10 : prot ect ed :
l l : int itsAge ;
12 : ) ;
1) :
14 : class Cat: public Mammal
15 :
16 : public :
wo beszl ! \n"; )
17 : Cat () ( cout "Cat (macska) konstruktor ... \n' ;
18 : _Ca t {) { cout "Cat (macs ka) des trukt or ... \ " " ;
19: void Speak () const { cout "Mij ! \n' ; }
20: void Purr() const { cout "rrr r r rrrrrr\n' ; }
21 : };
22 :
18. ra A tbbalakClsg kifinomult hasmlata 1333
23 : class Dog : public Hammal
24 : (
25 : public:
26 : OOg{) ( cout 'OOg (kutya) konstruktor ... \n";
27 : -Dog() { cout "Dog (kutya) de s t ruktor ... \n';
28 : void Speak () cons t { cout 'Va! \n" ; }
29: );
30 :
31:
32: int main(}
33: {
34: const int NumberMamma1a ,. 3;
35: Hammal- Zoo[NumbcrMammalsJ:
36: Mammal- pMammal;
37: int choice,i:
38: for (i=O; i<NumberMamma1s: i++)
39: {
40: cout "( l)Kutys (2)Macoka : ",
41: std : : cin c hoicc ;
42: if (choice "" l)
43: pMammsl = new Dog:
44: else
45: pMarnmal " new C<lt;
46:
47: Zoo[i] " pMalMlal;
48:
49:
50: cout '\n';
51 :
52 : for (i=O; i <NumbcrMammals ; iH)
53 : (
54 :
55:
56:
57 :
58:
59:
60:
61 :
6! :
63 :
64 :
65 :
66 :
Zoo[i]->Spcak{) :
Cat *pRealCat" dynsmic_cast<Cat *> (Zoo[ij);
if {pRealCat}
pRealCat->Purr() ;
else
cout 'Hha, ez nem macska!\n';
delete Zoo [ i] ;
cout "\ n";
67: rcturn O;
68 :
IGmenet
(I)Kutya (2)Hacs ka : l
Hammal (eml6s) konstruktor.
Dog (kutya) konstruktor . . .
334 1 V. rsz rij6ds s tbbalaksg
(llKu t y a (2) Mac!lka : 2
Hammal (em16s1 kons truktor .. .
Cat (macska) konstruktor .. .
(l)Kutya (2)Macska : 1
Mammal (emlos) konstruktor ...
Dog (kutya) konstruktor ...
Va !
Hha, ez nem macska !
Hammal (cm16s) destruktor ..
Mij
rrr r r rrrrrr
Hammal (em16s1 deHtruktor ...
Va !
Hha , nem maCSkll !
Mamma l (em16s) des t rukt o r .
EI. S
A 38.48. sorokb:Ln :l felhasznl vlasztsa szerint adunk hozz Cat vagy Dog objekru-
mokat a Mammal tpus mutatk tmbjhez. Az 52. sorban vgigmegynk a tmb ek ....
mein, majd az 54. sorban mindegyik objektum speak () mCl6c\ust meghvjuk. A tag-
fggvnyek tbbaJ:.kknt viselkedve klnbz6 eredmnyekkeltrnek vi ssza: A ku-
tyk ugalnak, :I m:,cskk nyvognak.
Az 59. sorban egy Cat tpus objektumon szeretnm meghvni ;1 purr () (dorombols
tagfggv nyt , dc nem szeretnm abban az esel!)en, ha Dog tpus objektummal van
dolgom. Az s6. sorban has7.0ll dynamic_cast opertor gondoskodik r61a, hogy
az objektum, ami nek a purr () tagfggvnyt hvjuk, biztosan Cat tpus legyen. s in
tallhat a kulcsmomentum: Ha eat lpus, a rnutat nem null , gy megfelel
az 58. sorb:m tallhm felttelvizsglatnak.
Elvont adattfpusok
Gyakr:m ksztnk osztlyhierarchikat. Ha pldul ltrehozunk egy Shape (skidom)
osztlyt alaposzlly gyannt, majd szrmazlatjuk a Rectangle glal:.1p) s
Circle (kr) osztlyokat, mris hierarchia keletkezett, ha nem is valami bonyolult Ez-
utn a Rectangle osztlybl tovbb szrmaztathat juk a Square (ngyzet) osztlyt,
nunt a ngyszgek egyik specilis kpvisel6jl.
Mindegyik sZi rmaztatOlt osztly felldefmilja a Draw () (rajzo!), s a getArea () (teru-
letszmts) metdusokat s mg msokat. A 18.3. Lista a Shape osztly lecsupaszton
megval6stst mutatja a sznnaztaton Cir c1e s Rectangle osztlyokkal.
18. ra A
18.3. Ut .. - SIkldom auttyok (.h.pecl .... cpp)
O, II 18 . 3 . Lista - Sikidom osztlyok
1 , lincludc <iostream>
2 ,
3 : class Shape
4: (
5 , public :
6 : Shapc() (l
7 : virtual -Shape(){)
kifinomult hasznlata 335
8 : virtual long GetArea() { return -1 ; } II hiba
9 : virtual long GetPcrim{) { return -1; }
10 : virtual void Draw() {)
11 : );
12 :
13 : class Circle
14 :
public Shape
15 :
16 :
17 :
18 :
19 :
20 :
public :
Circlc (int radius) : i tsR!!Idius {radiusl (l
-Ci rel e () {}
long GetArea{) ( return 3 itsRadius
long GetPerim() { return 9 * itsRadius;
void Draw ( ) ;
21 : privata:
22 : int i tsRadiu$ ;
23 : int itsCircumference ;
24 : };
25 :
26 : void Circ!e: :Draw()
27 : (
itaRadius ;
}
28 :
29 :
30 :
31:
std: : cout "KOr rajzolst vgz6 utastsok helye! \n";
32 :
33 :
34 :
35 :
36 :
37 :
38 :
39 :
40 :
41 :
42:
43 :
44 :
45 :
class Rectangle
(
public :
public Shape
Rcctangle(int len, int width) :
itsLcngth (len), itswidth(widt h) ()
virtual -Rectangle{) {}
virtual long GetArea () ( return itsLength * i tsWidth; )
virtual long GetPerim() (return 2 *i tsLength + 2 *i tsWidth;
v irt ual int GetLength{) ( return itsLength;
virtual int Gctwidth() { return itsWidth; }
virtual void Draw ( ) ;
private:
int itsWidth ;
int itsLength;
46 : ) ;
47 :
4B : void Rectangle : : Draw()
49 :
50 , for (int i =' O; i<itsLength; i++)
V. rsz s
51 :
52 :
53 :
54 :
for (int j = O; j<itsWi dth; jH)
55 :
56 :
57 :
58 :
std: : cout "x ";
std : : cout "\ n " ;
59 : class Squace : public Rectangle
60 : {
61 : public :
62 : Square{int len) ;
63 : Square(int len, int width) ;
64 : -Square(){)
65 : long GetPerim() (return 4 * GetLcngth() ; )
66 : } ;
67 :
68 : Squarc : : Squace (i nL len):
69 : Rectangle{len , l en)
70 : II
71 :
72 : Square : :Square(int len , int wldthl :
73 : Rectanglellen,width)
74 :
75 : if (CetLenoth() != GetWidthi
76 : std : : cout "Hiba, ez nem egy ngyzet ...
77 :
78 :
79 : int main ( )
80 :
81 : int choice ;
82 : bool fQuit = false ;
83 : Shape " sp;
84 :
85 : while (1)
86 : {
... inkbb egy Tglalap?\n" ;
87 : std:: cout "(l)KOr (2)Tglalap (3)Ngyzet (O)Kilps : ",
88 : sLd : : ein choi ce ;
89 :
90 : s witch (choice)
91 : (
92 : case l :
93 : sp = new Circle(5) ;
94 : break ;
95 : case 2 :
96 : sp = new Rcctang1eI4.6);
97 : break;
98 : case 3 :
99 : sp = new Square (5) ;
100 : break ;
101 : def.ault :
102 : fQui t = t rue ;
103 :
104 :
105 :
106 :
107 :
108 :
109 :
110 :
l B. ra
break ;
if (fQuit.)
break;
sp->Draw() ;
std:: cout "\n" ;
111 : r eturn O;
112 :
(l)KOr (2) 'rgl a lap {3)Ngyzct (O ) Kil ps : 2
xxxxxx
xxxxxx
xxxxxx
xxxxxx
( l )KOr (2) Tqlal ap {3) Ngyzet ( O)Ki lps : 3
xxxxx
xxxxx
xxxxx
xxxxx
xxxxx
(l)KOr (2)Tglalap (3) Ngyzet (O)Kilps : O
A 3-11 . serok kztt hatroztuk meg a Shape (skidom) osztlyt. A getArea () (terlet)
s getPerim () (kerlet) met6dusok hibval trnek vissza, a Draw () (kirajzol)
tagfggvny pedig nem csinl semmit. Vgeredmnyben nem is tudjuk pontosan, hogy
milyen skidomr6l V:1n sz. Csak a skidomok tpusait (kr, tglalap) nldjuk
kirajzol ni, a skidom, mint elvont fogalom nmagban nem lerajzolhat6.
A eire l e (kr) osztlya Shape leszrmazottja, amely felldefinilja a fent emltett h-
rom ragfggvnyt. Figyeljk meg, hogy nincs szksgnk jabb vir t ual ku1c:ssz6m,
mivel ezt is rklik HZ :t laposztlyt61. m annak sincs semmilyen negatv kvetkezm-
nye, ha mskm jrunk el, ahogy tesszk ezt a Ree tangl e (t6g1al ap) osztly megh:Hro-
zsakor a 38-42. sorokban. Hasznos dolog szerepeltetni a vi r t ual kulcssz6t, egyfajta
dokumentdkOl hadd emlkeztessen bennnket, hogy a tagfggvny virtulis.
A Square (ngyzet) a Rectang l e osztlybl szrmazik, s ebben is felldefiniljuk
a getPerim() metdust, a tbbi t pedig vltozatlanul rkljk a Reetangle osztlybl.
338 I V, rsz s tbbalaksg
Elgg zavar, hogy l Shape osztlyt is tudjuk pldnyostani , j volna, ha ezt mega ka-
dlyozhatnnk. A Shape osztly csak azrt van, hogy felletet adjon a bcl61e szrmaz-
latotl osztlyok szmm. Mint olyan, egy elvonl adattp/lsr61 ( abstract data type) van
sz6, vagy rvidtve ADT-rl.
Az absztmkl adaupusok egy-egy fogalmat jelentenek (mint pldul a skidom), s nem
objektumokat (mint pldul a kr) . C++-ban egy ADT mindig ms sz<"irmaztatott oszt-
lyok alapjul szolgl osztly, az ADT-k pldnyostsa rvnytelen mllvelel. Azaz, ha
a Shape osztlyt ADT-knt hatroztuk meg, nincs lehet6sgnk annak objektumknt
tn n6 pldnyostsra.
res virtulis fggvnyek
A CH tmogatj:l ;lZ elvont osztlyokban az res virtulis rggvnyck ltrehozst.
Az res virt1.llis fggvny olyan virtulis fggvny, amely felldefiniland6
a szrmaztatott osztlyokban. Egy virtulis fggvnyt gy hatrozhatlmk meg resk nt,
ha O kczd6rtkkelltjllk el, mint a pldban is:
virtual void Draw() O;
Brmely osztl y, amel y tartlllm<lz egy vagy tbb res virtulis fggvnyt, val6jban
ADT, s az A!rr-k pldnyost..1sa rvnytelen Ha mgis il yesmi vel prbl ko-
zunk, annak eredmnye egy fo rdtsi hiba. res virtulis fggvny szerepeltetse egy
osztl yban kt dolgol jelent a felhasznlsra nzve:
Ne pklnyosL<; uk az objektumot, sznnaztaSSlmk be161e.
Ne feledjk felldefinilni az res virtulis fggvnyeket.
Mindegyik osztly, amely ADT-bl szrmazik, Oresknl r kli aZ res virtulis fggv-
nyeket, azaz Felttlenl fell kell defmilnunk ezeket, ha pldnyostani szeretnnk
az osztlyunkat. Ennl fogva, ha a Rectangl e osztlya hrom res virtulis fggvnyt
tartalmaz Shape osztlybl szrmazik, a Rectangle osztlyban mindhrma! fell kell
definilni, klnben a Rect angle maga is egy ADT lesz. A 18.4. Lista elvo nt adattpus-
knt rja jra:l Shape osztlyt. Cserljk le a 18.3. Lista 3-11. soraib:m tal lhat Shape
osztly meghatrozst a 18.4. listban tallhat osztlydefincira (ezzel a 18.5. Listt
k:lpjllk eredmnyOl), majd futtassuk le jra a progf""dffiOl.
18.4. Ua .. - Elvo .. adatlip ok (adtcpp)
l : class Shape
2 : (
3 : public :
4 : Shape(){}
5 : virtual -Shape () {}
6 : virtual long Get ll rea () O
1 : virtual long GetPe rim{) = O;
18. ra A .
8 , virtual void Draw() O;
9 : private :
10 : l;
Figye!em!
Az adt.cpp nincs lefordfthat6 llapotban!
Ne veszdjnk a 18.4. lista !eforditsva! - ez csak a vltozsokat tartalmazza
a 18.3. listhoz kpest. A 18.5. lista (amely a 18.3. s a 18.4.listt sszefsl
svel keletkezett) az, amelyik lefordithat, prblkozzunk azzal.
18.5. Lista - A Sh.p. _y b.mutIIo Ivont .dottfpusk6nt 1.d1ah.pecl .... cpp)
O: /1 18 . 5. Lista - Skidom osztlyok
1 : lIincludc <iostream>
2 .
3 : ClASS Shllpe
4 : (
5: public:
6 : ShaDe () {}
7: virtual ~ S h a e () (l
8 : virtual long GetArea () O;
9 : virtual long GetPerim() =- O;
10: virtual void Draw () = O;
ll: };
12 :
1] : class Circ1c , public Shape
14 : {
IS: public:
16 : CI rclo (int radius) : itsRadius (radiusl {}
17: -Circle(){}
18 : long GetArea I) ( return 3 * itsRadius ,. itsRadius;
19 : long GetPerim() ( return 9 .. itsRadius;
20 : void Draw();
21: private :
22 , int itsRadius ;
23 : int itsCircumference;
24 : } ;
25 :
26 : void Circle: : Draw()
27 :
28 , std : : cout 'Kr raj zolst vgz6 utas tsok helye! \0' ;
29 :
30 :
31 :
32 : class Rectaog!e
33 : (
34 : public :
public: Shape
35 : Rectanglelint Ion, int widt h) :
36 : itsLength (len), itsWidth (width) l}
37 , virtual _Rectaoglol)l}
38 : virtual long Getl\rea(} I return itsLength * itsWidth; l
39 : virtual long GetPerim() (return 2*itsLength + 2"itswidth;
40 : virtual int GetLength() I return itsLength;
340 I V. rsz' rkl6ds s tbbalaksg
41 : virtual int GetWidth () ( return itsWid th ; )
42 : virtual void Draw () ;
4] : private:
44 : int itsWidth ;
45 : int itsLength;
46 : l;
47 :
48 : void Rect ang!e : : Draw ()
49 :
50 ,
51 :
52 :
5] :
54 :
for (int i
(
O; i<itsLength; i++)
(or (int j " O; j<itsWidth; j!. )
55 :
56 :
57 :
58:
std: : cout 'x ' .
std:: c(')ut "\n";
class square
(
public :
public Rectangle
Square(int; len ) ;
Squarc(lnt len, int width) ;
-Square () (l
!.l9 :
60 :
61,
62 :
63 :
64:
65 :
66 :
67 :
long GetPerim{) (return 4 GetLength() ; }
} ,
68: Square: : Square(int len) :
69 : Rectangle(lcn,len)
70: ()
71:
72 : Square : : Square(int l en , int width) :
73 : Rectangle(len,width)
74 :
75: if (Get Length () !. GetWidth () )
76 : std: : cout <:< "Hiba, ez nem egy ngyzet ...
77 :
78 :
79 : int main{)
80 :
81 : int choi cc;
82 : bool f QuiL '" f alse;
83 ; Shapc " sp;
84 :
85 : while ( 1 )
86 : {
... inkbb egy Tglalap?\n" ;
87 :
88 :
89 :
90 ,
91 ;
92 :
93 :
std: : cout "{ljKOr (2)Tglalap (3)Ngyzet {O)Kilps: " .
s t d: : ci n choice ;
switch (choice)
(
case 1 ;
sp = new Circle(5) ;
94 :
95:
96:
97 ,
98 :
99 :
100,
101 :
102:
103 :
104 :
105 :
106 ,
107 :
108 :
109,
110 :
18. ra A tbbalaksg kifinomult hasznlata 1341
break ;
case 2 :
sp '" new Rectangle{ 4, 6);
break ;
case 3 :
sp - new Square{5);
break;
default :
fQuit '" true ;
break ;
if (fQuit)
break;
sp->Oraw{) ;
std : :cout "'n";
111 : ret urn O;
112:
(l)KOr (2)Tqlalap {3)Ngyzet (O)Kilps : 2
xxxxxx
xxxxxx
xxxxxx
xxxxxx
(1)K6r (2)T6qlalap (3)Nqyzct (O)Kilps : 3
xxxxx
xxxxx
xxxxx
xxxxx
xxxxx
(l)Kr (2)Tqlalap (3)Ngyzct (O)Kilps : O
Lthat, hogya program mkdshez nem nylrunk. Az egyetl en klnbsg, hogy
most nem lehetsges a Shape osztly pl!ldftnyostsa.
Aprop
Elvont adattfpusok
Az elvont adanlpusok meghatrozsa gy trtnik, hogy az adott osztly defincij
ban szerepeltetnk egy vagy tbb res virtulis tagfggvnyt. res virtulis fggv
nyek meghatrozshoz pedig rjunk ", O -t a fggvny deklarcija utn. Pldul:
class Shape
{
virtual void Draw () = O; II res vi rtulis fggvny
} ,
342 1 V. rsz rkl6ds s tbb,l,ksg
Az res virtulis fggvnye k megvalstsa
jellemz6en, az elvont alaposztlyokban szerep16 res virtulis fggvnyeket nem imp-
lementljuk. Mivel ilyen tipus objektumot soha nem hozunk ltre, semmi szksg r,
hO!:,'Y megva l6stsl adjunk r. Az ADT tisztn egy fellet meghatrozsa km
kJnbz6 osztlyokat s7..:rmaztathatunk.
Ugyanakkor adhatunk megvalstst az res virtulis fggvnyeknek. A fggvny ek-
kor az ebbl az osztlybl szrmaztatott objektumok tagfggvnyeiknt hvhar6k, s
tbbnyire valamilyen ltalnos biztost annak a sZ:lrmazt:ltolt osztlyokban
felldefinilt fggvnyek szmra. A 18.6. Lista icmsolja a 18.3-ast, ezttal a Shape
osztlyt, mint ADT-t felruhzva a Dr aw ( ) res vi rt ulis fggvny megval6slsval.
A c i rcle osztly, mivel szmra ez klelez6, felldefinilja a Dr aw ( ) lagfggvnyt', dc
ami a tovbbi ill eti , visszahivaLkozik fel rel az alaposztly fggvnyre.
Ebben a pldban a tovbbi nem ms, mint egy jabb zenet kiratsa a kp-
erny6re, dc nem nehz elkpzelni, hogy az alaposzl ly egy ltalnos rajzolsi lpst
osszon meg a szrmaztatott oszllyok szmr.!, l:>ldiiul egy olyan ablak ltrehozst,
ahov az sszes skidom kirajzoldi k.
18.6. lista - res virtulis fOggvnvek meghatrozsa {implement.cpp )
0 , 1/ 18 . 6 . Lista - Ores vi r tulis fggvny ek meghatrozsa
l , Iinclude <lostretun>
2 ,
] , class Shape
4, (
5 , public !
6 , Shape () {}
7, vi rtual -Shape () ( )
8 : virtual long GetArea () = O;
9 , virtual long GetPe rim()= O:
10 , virtual void Draw!) : O:
ll , private :
12 : } ;
l]:
14 : vo id Sha pe : , Draw ( )
15 :
16 : st d: , cout "El vont ra jzolsi lpsek! \n" ;
17 :
18 :
19 : class Circl e public Shape
20 : {
21 : public :
22 : Circle ( int radi us) : i t sRadius ( radius} {}
23 : _Ci rcle( ) l )
24, long GetAr ea () ( ret u rn ] * itsRa dius * i t sRad ius;
25 , long GetPe rim() { r eturn 9 itsRadius; }
26: void Draw{) ;
27 : private :
28 : int itsRadius;
29 : int itsCircumference ;
30 : };
31 :
32 : void Circle : :Draw()
33 :
18. ra A tbbalaksg kifinomult hasznlata 1343
34 : std: : cout 'KOr rajzolst vgz6 utasitsok helye!\n';
35 : Shape : : Oraw();
36 :
37 :
]8 : cIa!>!. Rectangle public Shape
39 :
40 : public :
41: Rectanglelint len, int wi dth) :
42 : itsLcngth( l en), i tsWidth(widt h ) ( J
43 : virtual -Rectangl e () {}
44: long Ga tArea ( ) ( eetu!:'n itsLength * itsWi d th;
45 : long Ge t Perim() (return 2"' itsLength + 2"it 9Width;
46 : virtual int GetLength() ( rcturn itsLength ; )
47: virtual int GetWidth() ( return itsWidth ; J
48 : void Oraw() ;
49 : privata:
50 : int itsWidth ;
51 : int itsLength:
52 : } ;
53 :
54 : void Rectanole : :Oraw!)
55 : {
56 : for (int 1 '" O; l<itsLength; i++)
57 , {
58 :
59 :
60 ,
61 :
62 :
6] :
64 :
65 :
66 :
67 :
68 :
69 :
70 :
71 :
for (int j '" O; jdtswidth; j++l
std : :cout "x ";
std : : cout "'n";
Shape :: Draw() ;
class Square
(
public :
public Roc tangle
Square( int l en) ;
Square(i nt l en , int width) ;
-Square ( ) ( )
72 : long GetPcrim() (return 4" GetLength() ; )
7] : J;
74 :
75 : Squar e : : Square(int len) :
76 : Rectangle(len,lcnl
77 : {}
78 :
79 : Square , : Square(int len , int wi dth) :
344 1 V. rsz s tbbalaksg
80 : Rectangl e(l en,width)
81 :
82 : if (Get.Length (j !" Ge tWidth () )
83 : std: : cout "Hiba, ez nem egy ngyzet ...
84 :
85 :
86 : int main()
87 :
88 : int choice ;
89 : bool fQuit :: false:
90 : Shape * sp ;
91 :
92 : while (1)
93 : {
.. inkbb egy T glalap?\n" ;
94 : std:: cout "(l)KOr (2)Tglal<lp (3)Ngyzet (O) Kilps : ";
95 : std : : cin choice :
96 :
97 : s witch (chojce)
98 : (
99 : case l ,
100 : sp - new Circle(5) ;
101 : break;
102: case 2 :
103 : sp:: new Rect anglc (d,6);
104 : break ;
105 , case 3 :
106 : sp = new Square (5) ;
107 : break ;
108 : default :
109 : fQuit ,.. true;
110 : break :
lll :
112 :
113 :
114 :
115 :
116 :
if (fQuit)
break ;
sp->Draw () ;
std:: cout "\n' :
117 : return O;
118:
menet
(l)KOr (2)Tglalap (3)Ngyzet (O)Kilps : 2
XXXXXl(
xxxxxx
xxxxxx
xxxxxx
Elvont rajzolsi lpsek !
(l)KOr (2)Tglalap (3)Ngyzet (O) Kilps : 3
xxxxx
xxxxx
xxxxx
XXXXX
==x
Elvont raj zolsi lpsek!
(2)Tglalap (3) Ngyzet (O) Kilps: O
A 3-12. sorokban, meghalt'irozluk a Shape osztlyt egy elvont adaupusknt, mindh-
rom tagfggvnyt res virtulisknt megadva. Ne feledjk, hogy ez nem szksges.
Ha csak egyet is res virlulisktl1 adnnk meg, az osztlyunk ugyangy ADT lenne.
A getArea ( ) (:s geLPerim () ragfggvnyeket nem valstottuk meg, de a Draw ( )
fggvnyt igen. A Circ l e s Rectangl e osztlyok mindketten
a Draw () 11lgfggvnyt, s mindketten vissza hivatkoznak felfel az alaposzLly mel6-
dusra, kihasznMva :IZ elosztott mkdsbe>l
Az elvonatkoztats sszetett hierarchija
Valahnyszor cgy ADT-bl egy msik ADT-t sL1.rmazt.'mmk, el6jn, hogy bizonyos r-
klt res virtulis megval6stsunk, msokat viszont vlt07.<lthmul hagyjunk.
Ha ltrehozunk egy AnimaI (llatok) osztlyt, szerepelni fognak benne az Eat: ()
(eszik), Sleep() (alszik), Move () (mozog) s a Reproduce () (sL1porodik) res virtUl-
lis fOggvnyek. Aztn szrmaztathat juk mondjuk a Marnma l (emJ6s) s Pish (hal)
osztlyokat.
A tervezs sorn megllapthatjuk, hogy minden Hammal ugyangy szaporodik, azaz
a Hammal : : Reproduce () nt:m res lesz, mg az Eat: (), Sl eep (), s Move () maradnak
res virtulis fggvnyek.
A Mcllnmal osztlybl szrmaztaLhaljuk a Dog (kutya) osztlyt, amelynek fell kel! defi-
nilni" mindhrom megmaradl res virtulis fggvnyt, ezt pldnyosthat juk
az oS:d{l lyt.
ilyenkor azt hatrozzuk meg, hogy az llatok s az osztlya nem
pldnyoslhat, de minden eml6s rkli a szaporodsra vonatkoz eleme-
ket, azaz mr nem kell felldefinilni.
A 18.7. Lista a fenti elgondolst mutatja be az oszllyok lecsupasztott megvalst.sval.
346 1 V. rsz s tbbalaksg
1 B. 7. Usta - ADT-k szrmaztatsa ms ADT-kb61 {darivingadt.cpp)
o: II 18.7 Lista
l : II ADT-k szrmaztatsa ms ADT-kb61
2 : #include <iostream>
3 ,
4: enum COLOR { Hed, Green , Blue, Yellow, White, Black, Brown} ;
5 ,
6 ,
7 ,
8 ,
9 ,
10 :
ll :
12 :
13 :
14 :
15 :
16:
17 :
18 :
19 :
20:
21 :
22 :
23:
24 :
25 :
26 :
27 :
class Animal
(
public :
AnimaI (int) ;
1/ kzs alaposztly a lovak s madarak szmra
virtual -Animat() ( std:: cout "Anima! destruktor .. . \n"; )
virtual int GetAge() const ( return itsAge; )
virtual void SetAge{int age) ( itsAge = age ; )
virtual void Sleep() const z O;
virtual void Est() const = O;
virtual void Reproduce() const = O;
virtual void Move() const .. O;
virtual void Speak{) const = O;
private :
int itsAge;
Animal: :hnimal{int age) :
itsAge(agcl
(
std : : cout 'Animal konstruktor . . . \n";
28 : class Mammal public Animal
29 :
30 : public :
31: Manunal(int age) : Animal (agel
]2 : { std :: cout "Mammal konstruktor ... \n" ; }
3]: virtual -Hammal () { std :: cout "Harranal destruktor ... \n";}
]4 : virtual void Reproducc() const
]5 : ( std: : cout "Az eml6s0k szaporodsnak lersa . .. \n";
36: ) :
37 :
]8 : class FiSh public AnimaI
39 :
40: public :
41 : Fish(int agc) : AnimaI (a ge)
42: ( std :: cout 'Fish konstruktor ... \n" ;)
43 : virtual -Fish ()
44 : (std:: cout 'Fish destruktor ... \n";
45 : virtual void Sleep() const
46 : (std:: cout "a halak hortyogsa . . . \n" ;
47 : virtual void Eat{) cons t
48 : ( std ,: cout "a halak tkezsi szoksa .. . \n ;
49 : virtual void Rcproduce{ ) const
18. .. oA kifinomult hasznlata 347
50 : ( std :: cout 'a halak i kraraksi szoksa . . . \n" ;
51 : virtual void Move () const
52 : { std: : cout "a halak sz s i technikja ... \n";
53 : virtual void SpealcO const { }
54 : };
55 :
56 : clnss Horse
57: (
58 : public :
public Manunal
59 : Horse(int age, COLOR color) :
60: Mammal(agc) , itsColor(color)
61 : {std:: cout 'Horse konstruktor ... \n"; }
62 : virtual -Horse()
63 : { std : : cout 'Horse destruktor . .. \n'; }
64 : virtual void Speak () const
65 : (l:ItCl :: cout 'Nyi haha! ... \n ";
66 : virtual COLOR GetltsColor() const
67 : { roturn itsColor ; }
68 : virt ual void Sleep() const
69 : ( std : : cout OA l ovak alvsi szoksai ... \n' ; )
70: virtual void Eat() const
71: ( std: :cout "A lovak tkezsi szoksai .. . \n" ;
72: virtual void Move!) const
73: ( std , :cout 'A 16 futni szokott ... \n";)
74,
75, protectod,
76: COLOR itsColor;
77: } ;
18 ,
19: class Dog
80,
81: public:
public Hammal
82: Dog(int age, COLOR color) ,
83: itsColor(color)
81\, { std: :cout "DOg konstruktor . .. \n"; }
85: virtual -Dog()
86 : ( std: : cout "Oog destruktor . .. \n'; )
81: virtual void Speak()const
88 : ( std: : cout Va ! .. . \ n ' ; l
89: virtual void Sloop() const
90 : ( std: : cout 'A kutyk alvs i szoksai ... \n' ; )
91: virtual void Eat () const
92 : ( std: : cout "A kutyk tkezsi szoksai ... \ n';
93 : virtual void Move() cons t
94 : { std :: cout "A kut ya fut ni szokot t ... \n " ; }
95 : virtual void Reproduce() cons t
96 : ( std :: cout "A kutyk szaporodsa . .. \n" ; )
97 :
9S , protected:
99 : COLOR itsColor;
100 : l:
101 :
102 , int main ()
103 :
348 I v. rsz s tbbalaksg
104 : AnimaI *pAnimal =O:
105 : int choice ;
106 : bool fQuit = false;
107 :
108 : while (1)
109 : {
110 : std: : cout (l)Kutya (2)L6 (3)Hal (O)Kilps : ';
111 : std : : cin choice ;
112 :
113 : s witch (choice )
114 : (
115 : case 1 :
116 :
117 :
118 :
119 :
120 :
121:
122 :
123 :
124 ,
125 :
126 :
127:
128 :
129 :
130 :
131 :
132 :
133 :
134:
135 :
136 :
137 :
138 :
139 :
140 :
pAnima l
Ql;"eak ;
case 2 :
pAnimal
break;
3 :
pAnimal
break ;
default :
new Dog(5 , Brown) ;
new Horse(4, Black) ;
new Fish (5);
f Quit = true:
break;
if (fQuit)
break ;
pAnimal->Speak() ;
pAnimal->Eat () ;
pAnimal->Reproduce() ;
pAnimal->Move() ;
pAnimal->Sleep() ;
delete pAnimal ;
std : : cout "\n";
return O;
menet
(l) Kutya (2) L6 (3)Hal (O)KiIps: 1
AnimaI konstr uktor .
Mamma! konstruktor .
Dog konstruktor ...
Va ! ...
A kutyk tkezsi szoksai ...
A kutyk szaporodsa .
A kutya futni szokot t . . .
A kutyk alvsi szoksai .
Dog destruktor ...
Mamma! destruktor . . .
AnimaI destruktor . . .
(1)Oog (2)Horse (3)Bird (O)Quit: O
A 6-20. sorok kzn adtuk meg az Animal osztly, mint elvont adattipus meghatroz-
sl. Tartalmaz egy i tsAge () (kora) nem virtulis fggvnyt , valamint t msik
rese!: Sleep (l, Eat (), Reproduce (), Move (), s Speak ().
A Hammalosztly az Animal-b61 szrmazik, a 28-36. sarok kztt tallhat a meghat-
rmsa. Nem hoz ltre j tulajdonsgokat, de felldefinilja a ReprOduce () fggvnyt,
ltalnos formban leirva a sznporodsl az sszes eml6sre vonatkozan. A Fish osz-
tlynak (ell kell clefinb'lnia :l Reproduce () tagfggvnyt, mivel az kzvetlenl
az Animal OSZt lybl sz rmazik, s nem tudja felhasznlni a Mamma! osztly szaporo-
dsra vonatkoz !llliveleteket (ami egybknt gy helyes).
A Mammal-b61 SZ!lrma7.Latoll osztlyoknak nem keJl fel ldefini5lni II Reproduce () fgg-
vnyt, de meglehetik, ha afra nn szksg (mi nt a Dog osztly esetben a 95. s 96.
sorban). A Fish, a Horse s Dog osztlyok mind felldefiniljk az sszes maradk
tagfggvnyt, amelynek kvetkeztben ezek az oszt,1]yok pldnyosthat6k.
A program tnsben egy Anim!lltpus ml..nat6t hasznlunk a sz rmazta-
tott objektumok elrshez. Amikor a virtulis ragfggvnyckcl meghvjuk,
a futsid6beni hozzrendelseknek megfelel6en mindig a kvnt osztlyok tagfggv-
nyei futnak le.
Az AnimaI s M!lrnrMl osztlYOk pldnyostsra teu ksrlet fordtsi hibhoz vezetne,
mivel mindkett6 elvont adattpus.
Mely trpusok elvontak?
Az egyik programban az Animal elvont oszttily, a msikban nem az. Mi hat5rozza mcg
azt, hogy mikor kell egy oS7.tlyt elvontknt meghatroznunk?
A krdsre adott vlasz nem a val6 vilg valamely lnyeges <llapjn
cl, ez altl fgg, hogya progl"""J.mban mit rtnk valdi vilg alatt. Ha olyan programot
ksztnk, amely egy llatkertet vagy farmot modellez, az Animaltpus minden bi-
zonnyal elvont, mg a Dog egy olyan osztly lesz, amelyet pldnyosthatunk .
Egy msik esetben, ha egy kuryaketrecet szimullunk, a Dog osztlyt el-
vont osztlyknt tartjuk meg, s csak a kutyk fajtit (retriever, terrier, stb.) fogjuk pl-
dnyostani. Al. elvonatkoztats szimj&t az hatrozza meg, hogy milyen finomsg mel-
len szeretnnk megklnbztetni a tpusainkat.
349
350 I V. rsz s tbbalaksg
HoIya
Hasznljunk elvont osztlyokat, hogy
ltalnos biz.tostsunk
egyes kapcsold osztlyok szmra
Definiljunk fell minden res
vimJlis fggvnyt.
Uresknt hatrozzuk meg azokat a
fggvnyeket, amelyeket
fell akarunk defi niltatni.
Krdsek s vlaszok
Ne prbljunk elvonl osztlyokat
pldnyostani.
Krds: Miko,. beszhi.nk a ,, 1I117k6dsjelszivrogfCIttisr61''l
Vlasz: Arra az elkpzelC:sre vonatkozik, hogya megoszlOlt funktikat mozgassuk
fele egy kzs ll laposztlyba. Ha egynllbb osztly osztozik ugyanazon a mtlkdsi
mdon, ajfmlatos egy kzs ahlposzllyt tallni a szmra, ahol az adott fggvnyt
mcgva l6sthatjllk.
Krds: A IIl1ik6ds fc/szivroglattisa minden esetbell j dolog?
"lasz: Igen, ha mindig tbb osztly ltal hasznlt funkcikat sziv.1rogtatunk felfel,
nem j dolog azonban, ha amit mozgarunk, az valjban egy fellet. Az..'lZ, ha nem tudja
nnden szrmaztatott osztly hasznlni az adon tagfggvnyt, akkor hibs lps kzs
alaposztlyba tenni azt. Ha mgis ezt tesszk, futsid6bcn kell majd vltanunk atpusok
kztt, s eldnteni, hogy hvharjuk-e az adon metdust az adott mUlatn keresztl.
Krds: Mir' rossz dolog cl dinamikus /pusvlls (dynamie eas/il/g)?
l/Ci/asz: A virtulis fggvnyek lnyege, hogya virtulis tblzat dntse el f'l.ltsid6ben
a programoz helyett, bogy mi a tpusa az adott objektumnak.
Krds: Mirl bajldjllnk elvon/ adallpusok ltrehozsval? Mirt nem htllrozzuk
meg nem elvon/kl/ t, s csak elkerljk CI pldl lyos/tst?
Vlasz: A legtbb C++-ban bevezetett szably, konvenci clja, hogyafordtra bz-
zuk a hibk kidertst, hogy eJkeriiljk a bekvetkez6 hibkat, s a vsr-
lk a hibtlan programot kapjk meg. Egy osztlyelvontknt meghatrozsa
1a.6ra- kifinomult hasznlata
(azaz, res virtulis fggvnyek szerepeltetse a meghatrozsban) a fordt szmra
azt jelenti , hogy jellje meg az sszes objektumot, amelyeket elvont osztl y pldnyo-
stsval akartak ltrehozni, s geneciljon fordtsi hibt. Megvan tovbb az az
is, hogy felhasznlhatjuk az osztlyokat ms al kalmazsokban, vagy tadhatjuk
ms programozknak.
Gyakorlatok
Miutn megismertk a tbbalaksgot, v1:lszoljuk meg a nhny krdst,
illetve oldjuk meg a feladatokat, hogy elmlyL'ik a tmban szerzet! tudsunkat.
Kvfz
1. Mi a klnbsg egy virtulis fggvny s egy felldefinilt fggvny kztt egy
alaposztlyban?
2. Mi II kmnb.'ig az res s nem res vimJlis fggvnyek kztt?
3. Az elvontak aZ elvont adattpusok?
4. Min helytelen az alaposztlyokba tenni olyan tagfggvnyekel, amelyek csak
egyetlen szrmaztatott osztly szmra hasznosak?
Feladatok
1. Mdostsuk a 18.7. Listban (derivingadt.cpp) bemutatott programot, gy,
hogy pldnyosL'iUnk A.nimal vagy Mammal tpus osztlyokat. Mit fog mondani
a fordt, s mil'L?
2. Gondolkodjunk zleti alkalmazsokban: milyen adhatnak szmunkra
az elvont adattpusok? Megjegyzs: A banksz;.mlk nagyon hasonlak, s hason-
l;:m is viselkednek, de ltezik egy csom banks7.mlatpus.
3. Mi trtnne a 18.2. Listban (dynamiccast. cpp) bemutatott progranunal, ha
az 58. sorban elrvoltannk az if felttelt Ca 60. s 61. sorblIll ugyangy). Mely
objektumok ml1kclnnek helyesen, s melyek eredrnnyeznnek hibt?
352 1 V. rsz s tbbalaksg
Vlaszok a kvfzkrdsekre
1. A vimJlis fggvnyek esetben arra szntunk, hogya szrmaztalOlt osztlyok-
ban felldefiniljk
2. A nem res fggvnyeket tartalmaz osztlyok pldnyosthat6k. Ha a vinulis
tagfggvnyek resek, nincs futtathat kd, melynek eredmnyekpp fordti
hibt eredmnye7., ha megprblunk egy ilyen osztlyt pldnyostani. Az res
virtulis fggvnyeket felldefmilni.
3. Valjban azrt elvontak, mert vannak res virtulis fggvnyeik, s nmaguk-
ban ncm pldnyosthat6k. Nem ksztbet6 bel61e konkrt pldny, szrmaztat-
nunk kell egy osztlyt az elvont osztlybl a megfelel6 tagfggvnyekkel, s
a sznnaztatott osztlyt pldnyosthat juk.
4. Egszen 6szintn gyenge tervezst felttelez. Elmletileg ,IZ abposztly meLdu-
S:1in:1k:1 legtbb, ha nem az SS:les szrmaztatoLL oszL{J lyra i11cszkcdnie
kell. Az elkpzels, hogya szrmaztats sorn eg(:s:ltsk kl az aJapmetduso-
k:1l, s nem az, hogy ne foglalkozzunk bizonyos r(:szcivcJ.
19. RA
Lncolt listk
Ebben az 6rban a kvetkez6kr611esz sz:
Mi az II lncollIista
Hogyan hozh,llunk ltre lncolt listt
IIogyan zrjuk egysgbe a funkcionalitSl az r(:vt:n
Lncolt listk s egyb struktrk
A tmbk olyanok, mint II Tupperware ednyek. Nagyszeru tro16helyet bi ZLost,l11ak,
de megvlLozLathat3tlan ti mretk. Ha tl nagy ednyt vlasztunk, akkor fel eslegesen
pazaroljuk Ha tl kicsit, akkor kimlhel II tartalma, s risi kosz
lesz a konyhban.
Az egyik megoldsi II lncolt lista hasznlata. A lncol t lista olyan adatszerke-
zet, amelyben kisebb trol6egysgek egymsbaH. Ebben a7. sszefggsben
a trol6egysgek olyan osztlyokat jelentenek, melyek a listba objektu-
mokat tartalmazzk. Az tlet lnyege abban ll, hogy olyan osztlyt ksztnk, ami egy
354 1 V. rOsz s tbb,laksg
ad .. telemet tartalmaz (pl. egy macskt vagy egy tglabpo, s rmutat a lista kvetke-
trolegysgre. Minden troland elemhez ksztnk egy tro16egysget, majd
a kvnalmainknak sszelncoljuk
Ezeket a kis trolegysgeket csom6pontoknak hvjuk. Az csompont alistafej,
az uw!s a lista rarka. A listknak hrom fontosabb vltozata vanj al egyszerbbt61
a bonyolultabb fel haladva:
egyszeresen lncolt li stk
ktszeresen h'incolt listk
fk
Az egyszeresen lncolt listban minden csompont a listaelemre mUlal.
Egy adott csompont megtalMshol a kell indulni, s az addig vez<::16
csornpontol, mint a kincskeres6 jtkba n CA lcvf!l a dvny alatt
A kl..Szerescn lncolt listb,ln mindkt irnyban lehet mozogni, s vissza-
fel is. A fa egy sszetett struktra, melyben minden csom6pont kt (vagy hrom) m-
sik csom6pomra mutathat.

19.1 bra
Llllcolt listk
A szmtsludomnyban ms, ezeknl bonyolultabb s .okosabb" s[n.Jktrkal is hasz-
nlnak; ezek ltalban egymshoz kapcsol d csompol1lokbl llnak.
Esettanulmny a lncolt listk hasznlatrl
Ebben a rszben egy esettanulmny kapcsn alaposan szemgyre vesznk egy lncolt
lisll. Ltni fogjuk, hogy miknt lehet sszetett adatstruktrk:tl ltrehozni, s - ami en-
nl is fontosabb - hogy hogyan hasznlhatk ki az tbbrtsgben s
egysgbe zrsban rej161ehet6sgek egy nagyobb projektben.
A felel6ssg truhzsa
Az objektum-oricntlt programozs eb'Yik alapelve, hogy minden objektumnak legyen
egy (j61 definilt) feladata, amil el tud vgezni, s ami nem szigon"ian az 6 h'l-
tskrbe tartozik, azt bzza msra.
Az aut remek plJ{tj:j c:wn elv megva16st5sCl11ak. fo. motor dolg:! :l forgal6nyom;ltk
biztostsa. Ennek a s:d:tosztsa nem az ei feladata; CL mr a sebessgvlt s a fogas-
kerekek A forduls lebet6sgt nem a motornak s a sebessgvltnak kell
biztostania: ez a kerekek teend6je.
Egy jl megtervezett gpnek sok kisebb-nagyobb, jl megrten rsze van. Mindegyik
jl vgzi ;1 sajt dolgt; egyiHt tudnak rm1kdni eb'Y magasabb cl rdekben. Egy jl
megLervezett program is hasonl6 minden osztly tudja a helyt, mint:l sze-
mek ti kttl mintlxm, s ezek egytt kiadnak pldul egy norvg mints pul6vert.
Az. alkot6rszek
A lfincolt listnk csom6pontokb61 fog llni. A csompontokat egy-egy absztrakt osztly
jelenti, pontosabban ennek h{lfOm fajtja lcsz: egy oJy:1n, amelY:1 lislafejct kpezi, lesz
egy farka a listnak (gondoljuk meg, mi lcsz ennek a feladata), s nulla vagy tbb kz-
tes csompont, melyek ri listba foglaland adatokat fogjk tartalmazni.
Figyeljnk arra, hogy ri lista s az adatok klnooz6 fogalmat takarnak. Elmletileg
mindenfajta adatot listba szervezhetnk. Nem maguk az adatok vannak sszekapcsol-
va, hanem a csom6pontok, amelyekben "mellesleg" adatok is vannak.
A program soron nem tud a csompontokr61j ez csak a listval dolgozik. A list-
nak azonban nmagban nem kell sokat tennie: egyszeruen tadja a munkt a csom-
pontoknak.
19.1 Lista -lncolt lista hasznlata (linkedlist.cpp)
o: II ********************************* ****** ********
] : II 19 . 1 Lista
2: II
3 : II Clja a lncolt lista szemlltetse
4: II
35s 1 v. rsz s tbbalaksg
5 : 1/
6 : /I
7 : 1/
8 , 1/
9 : 1/ Ez a program a lncol t listt objektum orientlt szcmsz6gbdl
10 : II kzelti meg . A lista t r uhzza a munkt a csom6pontoknak
ll : II A csompont egy abszt r akt adattipus . Hrom fajta csom6pontot
12 : II hasznlunk : fejet , lista f arkat s kOz tes csom6pontokat .
13 : 1/ Csak a kOztes csompontok tartalmaznak adatokat .
14: 1/
1 5 : 1/ A Pat a os ztl yt anna k bemut atsra hozzuk ltre, hogy a lncol t
16 : 1/ list ban objektumokut tar t halunk . (Pl . egy nOvekv6 szrnsorozatot . )
17 : 1/
18 : 1/
19 : linclude <iostrcam>
20 ,
21 : enum { kIsSrnal1er , kIst..arger , kIsSame} ;
22 :
23 : II ll. lncol t listb!l gyazand a da t osztl ya
24 : II A lncolt lista minden osztlynak kell ismernie k6t metdust :
25 : II Show (megmutatja az rtket) s Comparc
26 : II (visszatrsi rtke a relstiv pozci)
27 : clau Data
28 : (
29 : public :
30 : Datalint val ) :myValuelvnl){)
31 : {}
32 : int Compare(const Data &) ;
33 : void Show() { std: : c out myValue std : : endl ; )
34 : private :
35 : int myValue ;
36 : };
37 :
38 , II A Compare fuggv nnycl dOnthe t 6 cl egy egy a da t
39 : II elhelyezkedse II 1istban.
40 : i.nt Data : : Compare{const Data'" theOtherData)
41 : {
42 , if (myVnlue < the0therData . myValue)
43 : return kIsSmaller ;
44 , if (myValue > t he0therData . myValue)
45 : return kI sLargcr;
46 : else
47: reLurn kI sSame ;
48 :
49 :
50 : II tovbbi deklarcik
51 : class Node ;
52 : class HeadNode ;
53 : class TailNode;
54 : class Interna lNode ;
55 :
56 : II Az a lbbiak jeleni tik meg a lista csompont i objektuma i t
57 : II Minden szrmaztatott osztlynak fell kell i rnia az Insert s
_ a Show me t dust .
58 : class Node
59 : (
60 : public :
61 : Node () ()
62 : virtual -Node () ()
6] : virtual Node" Inscrt(Data ..
64 : virtual void Show() = O;
65 : private:
66 , );
67 :
68 : II Ez az aktulis objektumot hordoz csompont .
69 : II Esetunkben az objektum Data tipus
19. ra Lncolt li
70 : II K6s6bb, amikor a sablonokrl lesz sz6, ltni fogjuk,
71 : II hogyan tehct6 meg mindez mg ltalnosabban
72 : class InlernalNodc: public Node
73 , (
74: public ,
75 : Inter:"nalNodc(Oata .. theData , Node " next) ;
76 : virtual -Interna l Node() f delete myNcxt ; delete myOata ; )
77 , virtual Node" Insert (Data ' theData) ;
7B : virtual vojti Show()
79 , ( myData >Show() ; rnyNext->Show{) ; } II truhzs!
80 :
81 : private:
82 : Data" myData; II maga az adat
8] : Node ' myNext; II a lncolt lista kvctkez6 csompontjra mutat
84: };
85:
86 : II A konstruktor csak inicializl
87: InternalNode: : InternalNodefData .. theData, Node" next):
88 : myData(theData),myNcxt(next)
89: (
90: )
91:
9] :
94 ,
92 : II
1/
1/
II
a lista tartalma
Ha j elemet adunk a lJsthoz,
akkor ez egy a csom6ponthoz kerul ,
kell tovbb haladnia az j elemnek,
ami eldnti, hogy merre
hogy vgal helyre keruljn. 95 :
96 : Node" InternalNode : : Insert(Dat a theData)
97 :
9B :
99 : II Az j tag vagy nagyobb nlam?
100 : int resu l t = myData->Comparc (*thcDat a) ;
101 :
102 :
10] : switch(result)
104 : (
105 : II kzmegegyezs szerint az az vizsglat, hogy azonos-e
106 : case kIsSame: II tcsorgunk
107 : case kIsLarger: II az j adat elm ke rl
lOB : f
109 : InternalNode * dataNode =
110 : new InternalNode(theData, this) ;
lll , return dataNode;
357
358 1 V. rsz s tbbalaksg
112 :
113 :
114 : / / nagyobb nlam, gy tadom a kvetkez6 csom6pontnak,
115 : / / knl6djon meg VELE inkbb
116 : case kI sSmaller :
117 : myNext = myNext->Inscrt(theDatu} ;
118 : r eturn thi s ;
119 :
120 : return this ; 1/ a fordtprogram megnyugodhat
121 :
122 :
123 :
124 : / I A lista farka
125 : class TailNode
126 : {
127 : public:
129 : 'l'ailNode () ()
csak egy
public Node
129 : virtual -TailNode() (J
130 : virtual Node * Insert(Oata * theData) ;
131 : virtual void Show() { }
132 : private:
133 : l;
134 :
135 : 1/ Ha hozzm rkezik egy adat. akkor annak elm kell kerl11nie.
136 : /1 mert n vagyok a vg, s SEMMI scm jhet utnam
137 : Node TailNode :: (Data * theData l
138 : (
139 : InternalNode dataNode = new Interna1Node(theData, this) ;
140 : rcturn dataNocle ;
141. :
142 :
143 : II A fej nem tartalmaz adatot, hanem rmutat
14 4: II az ada tlista elejre
145 : class HeadNode : public Node
146 : (
147 : public :
148 : HeaclNode();
149 : virtual _HeadNodc() ( delete myNcxt ; I
150 : virtual * Insert(Data *
151 : virtual void Show() { myNext->Show(); }
152 : pr ivate :
153 : Node * myNcxt;
154: } ;
155 :
156 : 1/
1/
Mihelyt ksz a fej .
ltrehozza a farkat 157 :
158 :
159 :
160 :
161 :
162:
HeadNodc, : HeadNade ( )
{
myNext .,. new TailNode;
)
163 : 1/ Semmi nem llhat a (ej igy tovbbadja a z adatot
164 : 1/ a csom6pontnak
165 : Node * HeadNode :, I nscrt( Data * theData)
166 :
167 : myNext = myNext->Inser t(theData) ;
168 : return thi s ;
169 :
170 :
19. 6ra-
171 : II Minden hatalmat n kaptam, s n nem fogok dolgozni
172: class LinkedList
173: (
174 : public:
175: LinkedList();
176 : _Li nkedList () { delete myHead; }
177 : void Insert (Data * theData) !
178: void ShowAl1{) ( myHead->Show{) ;
179: private ,
180: HeadNode myHead;
181, };
182:
183 : II Szletsemkor ltrehozom a lista(ejet
184: 1/ Az megalkotja a farkat
185: II igy az res lista mutatjo a fejre mutat,
186: II ez pedig a farokra . s kzt.k nincs sellVlli.
187: LinkedList: : LinkedList()
188: (
189: myHead = new HeadNode;
190 : )
191 :
192 : II truhzs, truhzs , truhzs
193 : void LinkedList : : Insert(Data pDaLa)
194: (
195 : myHcad->Insert(pData);
196: )
197 :
198 : II teszteloproqram
199 : int main()
200 : (
201 , Data * pDat.a ;
202, int val;
203 : LinkedList. ll;
204,
205 : II Krjnk a fe1haszn16tl nhny rtket
206 : 1/ s t egyk ezeket a listba
207 , for (;;)
208 : {
209 : std: : cout -What value? (O to stop) : - ;
210 : std: : cin val;
211 : if (lva!)
212 , break;
213 : pDat a = new Data(val) ;
214 , ll . Insert (pData) ;
215 : }
216 :
360 I V. rsz' s tbbalaksg
217 : II Most j rjuk be a listt s mutogass uk meg az ada tokat
218 : 11 . ShowAl 1() ;
219 : return O; 1/ II hatkr n s mcgs zani k
220 : }
menet
Whot value? (o
to stop) : 5
What value?
(o
to s t op) : a
Whac valuc?
(o to stop) : 3
Whot value7
(o
to
!S t op) : 9
What value?
(o
to
s t op) : 2
What va luc? 10 to stop) : 10
Whot value?
(o
to s t op) : O
2
J
5
,
,
10
EI. s
Az els6, ami a szemnkbe tlik, az egy felsorolsos tTpus hrom rtkkel:
kIsSmaller, kIsLa.rger, s kisSame (kisebb, nagyobb, egyel/l), A lista minden ob-
jektumnak ismemie kell a Compar e () fggvnyl ; ezek .1 felwrolsos vfiltoi' .k ennek
a fggvnynek a visszatrC!si rtkei.
A 27-36. sorban ltrejn az illusztrcis cl Data osztly, ennek Compare () metdusa
a 40-48. sorban kszl eL A Da t a osztlynak egyetlen stimC:rtkc van, amely ssze
tudja magt hasonllllni ( compare) egy msik Data osztly szml!rtkvel, illetve V'1n
egy Show () tagfggvnye is, mellyel ki lehet ratni a szmrtke!.
A lncolt li sta megrtsnek legegyszenbb mMja, ha vgign&zzk pldnkat, amely azt
haszn:lja. A 199. sorb:m kezddik a A 201. sorban egy Dat a objektum"l ir-
nyul6 mutatl hozunk lrre, a 203. sorban pedig egy helyi lncol t listt defjni:1Iunk.
A lncolt lista ltrehozsakor a 187. sor konstruktora indul cl. Ez csak annyillesz, hogy
elhelyez a memriban egy HeadNode (lis/aJf!) csom6jJ()//t) ubjektumot, s ennek d mt
tadja annak a myHead mutat6nak, ami a lncolt lista fe jt tartalmazza (180. sor).
A HeadNode elhelyezse meghvja a 158. sorban definilt HeadNode konstruktort,
amelynek felad<lta a Ta il Node memriafogl<tlsa s cmnek hozzrendelse a listafej
myNe xt ffiUlatjhoz. A TailNode ltrehozs<l meghvja a 138. sorban lthat
Ta ilNod e konstruktort, amely egy helyben kifejteu (munkl nem fggvny.
lncolt listk 361
ily mdon pusztn azzal, hob'Y elhelyeznk egy lncolt listt a veremben, ltrejn
nak feje s farka is, b kiplnek a kapcsolatok - ezt mutatja a 19.2 bra.
Lrlcolllisla
csomporlt Zr csomporlt
19.2 bra
A fc/Jcolllis/a l.!ezdt.ifflljJOla
A 207. sorban egy vgtelen ciklus A felhasznl szmr-
tkeket, melyek a h'inc.:olL lista elemei lesznek. B5rmeiuoyi rtket he lehet rni ; a O be-
rsval lehel befejezni a l:>evilelt. A kd 211. som Jtkeli ki a bevitt sZ{lmol, s ha ez
O, akkor kilp I I ciklusbJ.
Ha nem O-l rt be a felhasznl, akkor egy j Data objektum jn ltre a 213. sorban,
melyet a 214. sorban illesztnk a listiiba. Tegyk fel, hogy 15-t rt be a felhasznl.
Ez meghvja ri 193. sorban tallhat Insert () taglUggvnyt.
A lncolt li sta azon nni leoszt ja a listarejnek az objektum bcszr{ls5n:tk fele!6ssgc,
amely a 165. sorban tallhat Inuert () tagfggvnyt hvja meg. A fej sem viseli sokig
a munka terht, hanem azonnal , truhzza a myNext ltlll mut:llotl cso-
m6pontnak, amely (a legels6 pillanatban) a lista [<I rka. (EnMkezzilnk vissza, hogya fej
lt rejnekor :lZonnalltrejtt egy farokra mutat kapcsolat.) gy vglil a 137. sorban ta-
llhat Insert () tagfggvny vgzi el a piszkos munkl.
A TailNode: : Insert () tudja, hogya kapott objektumot kzvetlenl nmaga el kell
beilleszteni e. Azaz az j objektum kzvetlenl a lista farka helyre keru!. A 139.
sorban ltrehozunk egy j InternalNode (k6ztes csomjJom) objektumot, l<luva neki
az adatot s egy mulatt nmagra. Ez meghvja a% Int ernalNode konstruktort a 87.
sorban.
Az InternalNode konstruktora csak annyit csinl, hogy arm az objektumra inicializlja
a sajt myData mutatjt, amelyet Data p<lf".unlerknt mcgk<lpou, s a megkapon cso-
mpont cmre lltja a myNext mutatjt, amely jelen esetben a lista fa rkt jelenti.
(Emlkezznk, hogy a lista farka a sajt mutatjt adta t para mtcrOl.)
Most, hogy elkszlt az InternalNode, ennek a kztes csom6pontnak a memria-
cmt kapja meg a da taNode mutat a 139. sorban; ez a cm lesz aztn a Tail-
362 V. rsz s .
Node: : Insert () metdus visszatrsi rtke. Visszakerlnk a HeadNode : : Insert ()
tagfggvnyhez, amely a 167. sor szerint hozzrendeli a kapott fri ss InternalNode C-
mel a sajt myNext mutatjhoz. Vgl a HeadNode eimt megkapja a lncolt lista,
amely azln semmit scm csinl vele (195. sor), hiszen 6 mr rudja a HeadNode eimt.
Mirt bajldunk akkor ezzel a visszatrsi rtkkel, amit gyis eldobunk? Az Insert-ct
a bzisosztlyban (Node) deklarlruk. A visszatrsi rtk ms megval6stsok swmm
fomos. Ha a HeadNode : : Insert () visszatrsi rtkl, fordtsi hibt
kapunk. rdemesebb visszaadni a HeadNode-ol s elhajtani a kapun cmet.
Mi is trLnlleht? Bckcrlt egy adat a lncolt listba, melyet a lista t.adoll a fejnek.
A fej eZl vakon tovbbadta oda, ahov a sajt elem" (myNext) mut3lja p-
pen irnyult. Az alkalommal a fej ppen a lista farkra mutatoll, amely meghvsa-
kor rgtn ltre is hozott. egy kztes csompontol. Ennek elem"-e a lista
farka lett. A farok viSSzaadta a friss csompont dmt a(z 6l meghv) fejnek, amely t-
lltotta elem" mutatjt a friss csomponLr<I. ljen! Az adat a
helyre kellt, ahogy aZl a "1 9.3 bra is mUlat ja.
Az csompont beszrsa ut{tn a progmmvezrls visszatr a 209. SOrr.l. Ismt kir-
tkel6dik a felh:lsznl lt:11 megadott szm. Tegyi.ik fel , hogy cz most a 3. Ennek hat-
sra l(:trejn egy (lj Data objektum (213. sor) s beil1eszt6dik a li stba (214. sor).
lncolt lista
Kezd csompont Zr csompont
Bels csompont


"'"
19.3 bra
il lncolt lis/ti (jz elem />esnrsa Illll
A 195. sorban a lista jra tadja a fejnek a kapott adatot. A HeadNode: : Insert () most
is annak adja t ezt, akire a myNext mutat. Mint tudjuk, ez most az a csompont,
amelynek Data rsze 15-t tartalmaz. Ez meghvja az InternalNode : : Insert () me-
tdust a 96. sorban.
lncolt listk 363
A 100. sorban az akmlis Int er nalNode s..<;zehasonlitja a myData llal mulatott szm-
rtket (ami most 15) azzal a szmmal, ami a kapott t heData objektumban van (ez
most 3), mgpedig a Compare () tagfggvnnyel (40. sor).
Az sszehasonlts sorn az derl ki, hogya 15 (myValue) nagyobb, mint a 3 ( t he-
OtherData . myValue), gy a kIsLarger lesz a visszatrsi rtk. A vezrl s emiatt
a 107. sor,..1 kerl.
Az j Data objektum szmra ltrejn egy j I nternalNode csompont. Ennek nk-
vetkcz6 eleme az aktulis InternalNode objektumm fog mutatni. A frissen keletke-
zett InternalNode cme lesz az InternalNode : : Insert () visszatrsi rtke, melyet
a HeadNode megkap. az j csompont, melynek trolt s7..mrt ke ki sebb, mint
mint az akmlis csompont, beilleszl5dik a listba. Ez most a 19.4 brnak megfelel6-
en nz ki.
lncolt lista
II csompont
E--
BeIS6 csofTl!lOnt
19,4 bra
Zr csompont
Bets6 C10l11!lonl
VOlue .. 1S
Data
myNexl
A MI/col/lis/a a msodik elem lx'Szlrtm uM"
Tegyk fel, hogy a ciklus harmadik meghvsa kor a felhasznl B-at t be . Ez nagyobb
3-nl, de kisebb lS-nl, gy a kt kztes csompont kz kell kerlnie. Pontosan gy
fog minden trtnni, mim az pldban, azzal a klnbsggel , hogya 3-mal val
sszehasonlts Uln nem a kl sLarger, hanem a kl sSmal ler lesz a Compare ()
visszatrsi nke (azaz az akmlis objektumbeli 3 kisebb, mint a friss objekmmbeli 8).
Ez az InternalNode : : I nse rt () tagfggvny sszehasonlt elgaL'lsai kzl ez alka-
lommal a 116. sorban lev6 fut Ic. Ahelyett, hogy egy j csompontot hoznnk lrre (s
szrnnk be az aktulis elem el), az InternalNode tovbbadja az j adatot annak
a csom6pontnak, ahov a myNext mutat j ennek Insert () tagfggvnye hvdik meg.
Esetnkben annak a kztes csompontnak metdusa kerl meghvsra,
amelynek adaltagja a l5-t tartalmazza.
jra sszehasonltdnak az rtkek; most mr ltre kell hoznunk az j csompontot.
Ennek elem"-e a 15-t tartalmaz kztes t:sompontra mulat, s sajt c-
me annak a csom6pontnak kerul tadsra (visszatrsi rtkknt), amelynek adanagja
a 3-at tartalmazza, ahogy ez a 118. sorban ltszik.
Mindennek hatsra az j csomponl a lista megfelel6 helyre be.
Vgs6 eredmnyk nt pedig egy nagysg szerint. rendezett lista van a keznkben, fg-
getlenl an6l, hogy milyen sorrendben vittiik be az adatokat.
Mi a lncolt listk tanulsga?
Ahogy Dorothy mondja az "z, allagy varzslo'" vge fel: "Ha jm szvem vgyait
kvetem, nem megyek tbb messzebb il hts udvaromnl". Ahogy .mindentt j6, de
legjobb otthon", ugyangy prja nincs az cljrskzpont (jJrocedurtfis) programozs-
nak, amelyben egy vezrl6 metdus vizsglja meg az adatokat s a hfv6 fggvnyeket.
Ehben az objektum-orientlt megkzeltsben minden objektumnak megvan a de
jl definilt felel5ssgi kre. A lncolt lista csak a fejrl felel6s, ez viszont
azonnal tovbbadja az j adatot annak a csom6ponlnak, .unire mutat, fggetl enl att61,
hogy az ppen mi is.
A lista farka , ha adatot kap, azonnal ltrehoz szmra egy csorn6pontot maga el6tt, s
oda illeszti be. Ez csak ennyit tud: adatot kaptam - beszrom mag'lm el.
A kztes csom6pontok alig bonyolultabbak. Sajt adattartalmukat hasonltjk ssze
a kapott adattal, s ennek eredmnyt61 fgg6en beillesztik vagy tovbbadjk.
Figyeljk meg, hogy magnak a csom6pontnakfo,galma sincsarr61, hogy mikfnl7..ajlik
az sszehasonl1tsj ez az objeklumok dolga. A kztes csom6pont csak meg tudja krni
az objektumokat, hogy hasonltsk ssze magukat, s a hrom IchcL<;ges V{IIaSZ kzl
vr t:!gyel. Az egyiknek :1 hatsra beilleszti, a msik kett6 hatsra a tovbbadja
az adatOL, nem azzal, hogy mindez hogyan fog vgzdni.
Akkor ht kit: is a fe lel6ssg? Egy jl megtervezctt objektum-orientlt programban SGll-
ki. Minden objektum leszi a maga apr6 dolgt, s a gpezel si:'.pen mCkdik.
A lncolt lista szpsge, hogy brmilyen adat lehel a Data osztlyban. Esetnk-
ben ez egy egsz szm volt, de ez lehet akr tbb beptetl adattpus vagy brmi ms
objeknun (akr lncolt lista is).
Egy olY'1Il projektben dolgoztam, melyben fcjczetcket kellett ltrehozni,
melyek szveges bekezdseket tartalmaztak. Adatbzis trolta az adatokat, gy brme-
lyik fejezetet lehetett hvni. a dokumentum fejezetek lncolllislja voll; fe-
19. ra lncolt li
jezetcm, fejezeLS.cim, mg ez-az a majd bekezdsek l ncolt listja kvecke-
zeu. Ez utbbi minden egyes fejezctr61 lan.almazolt nmi informcit s magt a be-
kezds szvegL
A dinamikus memria hasznlata lehec6v teszi, hogy a lncolt listk minimlis mem-
rit foglaljanak el akkor, amikor a listk kis vagy rengeteg memrit, ha
nagy Igen fontos jellemz6jk, hogya trolt adatok mellliyisgvel arnyos
a mretk. Ezzel szemben a tmbk el6re lefoglalnak valamennyi helyet, ami egyszer-
re pazarl s s korltoz.-'s.
Aprop
Mirt nem hasznlunk mindig lncolt listt?
Joggal veldi k fel a krds, hogy ha a lncolt listk ilyen hatkonyak, akkor mirt
nem mindig ilyeneket hasznlunk? Azrt, mert ennek a hatkonysgnak ra van.
A lncolt listk szekvencilis azaz csak az egyik vgn lehet nekikez-
deni a keressnek, s lehet, hogy egszen a lista farkig vgig kell rgnunk magun-
kat a lncon (hogy megtalljuk a keresett elemet). Ez az elrsi md alkalmanknt
lass lehet.
Gondoljunk a telefonknyvre. Milyen lass lenne benne a keress, ha mindig vgig
kellene olvasnunk az az sszes szmol, mg rbukkanunk a minkre. A legtb
ben szeletelses technikval dolgozunk, azaz valahol a knyv kzepe ljn kezdjk
a keresst, vagy ott, ahol a kezdbelt sejtjk; aztn a tallattl fggen
valamelyik irnyban elmozdulunk, s ezt addig ismtelgetjk, amfg meg nem tal ltuk
a megfelel nevet. Szmtstudomnyi kifejezssel lve ez a logaritmikus keress.
Krdsek s vlaszok
Krds: Mil1l1oz'/Ink l/re lncofllislt, Ita egy tmb is IIIeJifeld a clnak?
Vlasz: A tmbknek rgztclt ml!relk van, ezzel szemben a lncolt listk mrete di-
namHcusan v{lltozhat futs kzben.
Krdes: MirI IJl'II6/1!)/ik el az adatohj ekllllll o/ a
Vlasz: Ha van egy jl lncol l li stnk a megfelel6 csomponlokkal, akkor ez
a program jrahasznosthat6 brmil yen adatobjektumok szmra, melyeket listba sze-
retnnk rendezni.
Krds: Ha ms objeklumokClt is/cl szere/ nnk ve/mi a listba, akJ.'Or akJ.'OI" lj lista t-
pust es lij csompollllpUSI kell defillilni?
Fiasz: igen. Szebb megoldst is lthatunk: majd a 23. r.:. ban, a sablonok lr
&'Yalsakor.
365
366 1 V. rsz s 'bbalaksg
Gyakorlatok
Ebben az rban egy sszeten adatszerkezettel, a lncolt listval ismer-
kedhettnk meg. SZ<1njunk most egy kis nhny krds megvlaszols:kJ s v-
gezznk el nhny feladatot, mg a tanultak frissen lnek emlkezetnkben!
Kviz
1. A Iist:knak melyik hrom tpust ismertk meg?
2. Mi a szerepe a fcj mutatjnak?
;. Mi a szerepe a mutatnak?
4. Mi kell egy ktszeresen 15ncolt listhoz?
Feladatok
l. Fuuassuk le a linkedlist . cpp progr.:lmol (19.1 Lista) nyomkvet6 mdban, s
lpegeslink vgig nhny csompont bcszrs{tn. Figyeljk meg, ahogy ezek
a mel6dusok egymst hvjk, s figyeljk meg a mutatk belltst is.
2. M6dostsuk a linkedlist . cpp programot 09.1 Lista) oly mdon, hogya Data
osztly az egsz helyett egy dupla pontossg szmot (doIIbie) tartalmazzon. Mit
kell lrni?
3. M6dostsuk tovflbb II linkedlist . cpp programot 09.1 Lista) gy, hogy a Data
osztly tbb beptelllpust Lartalmazzon (ne csak eg(:szet vagy lebeg6ponto-
sat). Mit kell trni? tlet: a .. kisebb" s dntshez szksg
lesz va1:lmifle kulcsmez6re.
Vlaszok a kvfzkrdsekre
]. Egyszeresen lflncolt, ktszeresen lncolt listk s a fk.
2. Ahogy II neve is mulat ja, ez II lista fejnek (vagy cSCSfiiKIk vagy kezdetnek) <.:-
mL tflrol ja. Igen fontos tudnunk, hogy hol is kezd6dik a lista, hogy elrhessk
az eb'Yes elemeket!
3. Ahogya neve is mutatja, ez a lista elemnek <.:ml trolja. gy is fel-
foghatjuk, mint a lista maradk rsznek a fejt. Ez a voltakppeni lncszem
a lncolt listban!
4. A lncolt listnak van fej- s farokmutatja, valamint az egyes csom6ponroknak
s mutatik. Ennl fogva brmelyik vgen kezdhetjk II ke-
resst, haladhatunk a msik vgpont fel.
VI. RSZ
Klnlegessgek
20. ra Klnleges osztlyok, fggvnyek, mutatk
21. ra Az eldfeldolgoz
22. ra Objektum-orientlt elemzs s tervezs
23. ra Sablonok
24. ra Kivtelek, hibakezels s nhny tancs
20. RA
Klnleges osztlyok, fggvnye k,
mutatk
Ebben az 6rban a sz6:
Mik azok a statikus tagvltozk s statikus ragfggvnyek
Hogyan hasznljuk a statikus tagvltoz6kat s statikus tagfggvnyckcl
Mik azok II barcfggvnyek s bartosztlyok
Hogyan hasznlhat juk II bartfggvnyeket specilis problmk megoldsra
Hogyan hasznljuk a tagfggvnyekre vonatkoz mutatkat
Statikus tagvltozk
Az eddigiekben gy kpzeltk el az objektumok tagvltoz6it, hogy azok egy adon ob-
jektumhoz tartoznak, s SCffilni kzk az osztly tbbi pldnyhoz. Ha van pldul t
macska objektumunk, akkor mindeb'Yiknek megvan a maga kora, sly,\ s egyb ada-
tai. Egyiknek II kora nem befolysolja a msikt.
370 I VI. rsz KilInl.gessg.k
Vannak helyzetek, amikor olyan informcikal szeretnnk szmon tartani , amely egy
osztly tbb pldnytl is fgg. Pldul kvncsiak lehetnk ami, hogy eddig ssze-
sen hny macska szletett, vagy hogy hny van mg letben.
A tbbi t:lgvhoz6t61 a statikus (static) tagvltozkat egy osztly minden pl-
dnya elrheti. tmenetel kpviselnek a globlis adatok kzn, amelyek a progmm
minden rsl-r61 valamint az adattagok kZlt, melyeket csak az egyes ob-
jektumok rhetnek cl.
Gondolhatunk gy a statikus tagvltoz6kra, mint amelyek nem az objektum hoz tartoz-
nak, hanem az osztlyhoz. A norml adattagok objektumonknt, a statikus adattagok
oS7.1[l lyonknr lteznek. A 20, l Listban deklarl unk t!gy Cat osZtlyt egy statikus adat-
taggal , II HOwManyCats-szel ( Hl1yMacskaVall). Ez a v51t oz6 kvel i nyomon II macsk;k
llszm5t; a macskk lLrehozsakor nveljk, pedig cskkent jk
;1 HowManyC<!Its rtkl.
20.1 Lista - Statikus adattagok hasznlata Istaticmember.cpp)
o: /1 20 .1 Lista Statikus adattagok
1 : hnclude <iostream>
, ,
] ,
"
5,
class Cat
public:
,.
7 ,
8 ,
9,
10:
Catlint age = 1) : itsAgelage) (HowManyCats++;
virtual -Cat() ( HowManyCats - ; )
11 :
virtual int GetAge() ( rcturn itsAge;
virtual void SetAge(int age) ( itsAge
static int HowManyCats;
12 : private:
13 : int itsAge ;
14 :
15 : } ;
16 :
17 : int Cat : : HowManyCats - O;
19 :
19 : Lnt main()
20 : (
21 : const int MaxCats = 5 ;
22 : Cat *CatHollse [MaxCats ] ;
/.3 : int i ;
24: for li = O; i <MaxCats; i ++)
25 : CatHouse [ i) " new Catli) ;
26 :
27 : for li = O; i<MaxCats; i ++)
28 :
29 :
30 :
31 :
std: : cout "There are ";
std : : cout Cat: : HowManyCat s ;
std: : ecut " cats left ! \n" ;
age; )
20. ra
32 : std: :cout "Deleting the one which is " .
3] : std: :cout CatHouse[ij ->GetAge () ;
34 : std: :cout " years old\n";
35 : delete CatHouse[il ;
36 : CatHouse[il = O;
31 :
38 : return O:
39 :
There are 5 cals left!
Deleti.ng the one which ie O years old
There ara
,
cats left !
Deleting the one which
"
l ycars old
There are
,
cats left !
Deleting tho one which
"
2 years old
There ara
,
catll lef t !
Deleting the ooe which
"
,
ycars old
There arc 1 cats left !
Deleting th. ono which io 4 years old
A 3-15. sorb:1n egy egyszen1stett macska osztlyt deklarl unk. A lD.sorban deklar
lunk egy egsz tpus statikus tagvltoz6t, a HowManyCats-C1.
A HowManyCats deklar.'icija nem foglal le egy egsz szmnak vlll6 mcmriahelyer. El -
lenttben a nem-statikus vltozkkal, semmifle helyfoglals nem trtnik egy Cat ob-
jektum pldnyosulsakor, mert II HowManyCats tagvltoz nem rsze az objekt umnak.
Emialt kln kell inicjalizlni a 17. sorban.
Gyakori hiba, hogy elfelejtjk defi ni lni az osztlyok statikus tagvltoz6it. Fi gyeljnk
arra, hogy ez ne trtnjen meg! Ha netn mgis el6fordulna , a linkcr eZI egy hibaze-
nettel jelzi, pldul az albbi mdon Cllorlandnl):
' Er ror : Unresolved external ' Cat : : HowManyCa ts' referenced
from C: \PROJECTS\STATICHEMBER.Oru"
Azaz : feloldatlan kalso ' Cat : : HowManyCats , hivatkozs a ... f j lb61
Vagy minl a kvetkez6 sor (msfajta linkelt hasznlva):
toCat : ,HowManyCats
Azaz: hinyz hivatkozs :
Ezl nem keH meglenni az itsAge szmra, mivel ez nem statikus tagvlloz6, s mindig
ltrejn, amikor egy macska objektum megszletik - in ez a 25. sorban val6sul meg.
371
372 1 VI. resz Klnlegessgek
A macska ko nstruktor..! inicializlja a kort, s eggyel megnveli a statikus tagvltozt
a 6. sorban. A destniklor eggyel lecskkenti ezt a 7. sorban. gy mindig aktulis marad
a ltrehozott, de mg nem trlt macskk ltsz ma a HOwManyCa ts-ben.
A 19-39. sorban a l macskt pldnyost, s l>cmkja egy CatHouse
( MacskaHz) tmbbe. Ennek sor n tszr hv6<lik meg a konstruktor, gy a HowMany-
Cats tszr nve16dik meg a kezdeti O
A program ezutn egy ts ciklusban nzi vgig a tmb L clemt , s az aktulis macs-
ka mUlll16 trl se rendre kiirja, hogy hny macska l mg. A kimcnctb6lltszik,
hogya kezdeti 5-r61 (hiszen vgl is 5 macskt hoztunk 161re) minden trl ssel eggyel
cskken" macskk sz ma .
Figyeljk meg, hogy a nyilvnos vlLOZ6, gy kzvetl enl a r6program
kezelheti. Nincs okunk arra, hogy ilyen mdon tegy(ik ki veszlyclmek ezt
a tagvltoz6l. Jobb volna privu lenni a tbbi t.1gvltoz6val egyll, s inkbb egy nyil-
vnos hozzfr6 fggvnyt kellene megadni , hiszen gyis c5.1 k macska pldnyokon
keresztl szeretnnk hozzfrni /:! hhez az adathoz. I-Ia netn macsk:! nlkl is szeret-
nnk manipullni eZl HZ adatot , k l alternalivnk van: nyilvnos cl6rslinek fll /:!ghagy-
ni, vagy irni hozz cgy statikus lagfggvnyl.
Statikus tagfggvnyek
A sm(ikll s lagfggvnyek olyanok, mint a statikus tagvltoz6k: nem objekturnhoz tar-
toznak, hanem egy osztlyhoz. gy anl kl is mcghvhat6ak, hogy lenne pldnyunk
az adott osztlybl , ahogy az a 20.2 Listban is ltszik.
20.2Usta - Statikus tagfggvnvek hasznlata (staticfunction.cpp)
0 , 1/ 20 . 2 Lista St.atikus tagfl1ggvnyek
l : U nclude <iost r e am>
7. :
3 : class Ca t
4 : (
S : public :
6 : Ca t (int age '" l) :it sAge ( age) (HowMnyCats++;
7 : virtual -eat ( ) ( HowMa nyCats-- ; J
8 : virtual int GetAge() { return i tsAge ; }
9 : v i r t ual void SetAge( int age) { it sAgc '" age ; )
10 , static int Ge t HowMany () { return HowManyCat s l l
11: privat e :
12 , int i tsAgei
l ] : stat ic int HowManyCats;
14 : };
15 :
1 6 : int eat : , HowMa nyCat s = Oi
17 :
20. ra
18 : void TclepathicFunction();
19 ,
20 : i nt main()
21 :
22 : const int MaxCats '" 5 ;
23 : Cal *CatHouse[MuxCato) ;
2 4: int i;
25 : for (i '" O; l<MaxCato; l -H)
26 : (
27 :
28:
29 :
Ca tHollse{i] = new Cat(i) ;
TelepathicFunction();
30 :
31 : for ( i = O; i<MaxC",t9 ; i )
32 : (
33 : deletc CatHouse[i l;
34 : TelepathicFunction();
35 :
36 : return O;
37 :
38 :
39 : void TelepathicFunction ()
40 : {
41: std: : cout "There are
42 :
43 :
Kimenet
There
""
'I'hero .ro
There
ar,
There aro
There ar,
Thcre ar,
There
ar,
There are
There .,.re
There are


" cats nlive!\n" ;
1 cats alive
2 cats alive
,
cats alive
,
cats alive
S cats alive
4 cats alivc
3 cats alive
2 cats alive
1 cats aU ve
O cats alive
Cat : :GetHowMany ()
Ebben a prog'dmban (az ellenttben) privl elrs\1nek deklarltuk a How-
ManyCats stati kus tagvllOz6t a Cat dckbrftci6jnak a 13. sorb.m. A Get HowMany ()
nyilvnos hozzfnS fggvnyt viszont stmikusnak s nyilvnosnak adtuk meg a 10 .
.sorban.
Mivel a GetHowMany () nyilvnos, brmelyik s mivel statikus-
nak deklarftlluk, nincs szksg macskra a meghvshoz. Ezrt rt 41. sorban l-
16 'l'e lepathicFunction () el tudja rni a nyilvnos s statikus hozzfr6 fggvnyt,
373
374 1 VI . rsz Klnlegessgek
br magukhoz a macskkhoz nincs hozzfrse. Te rmszelesen az macska
objektumokon keresztl is meg lehetne hvni a Get HowMany () fggvnyt a
ban, mint ahogy brmely ms hozzfr fggvnyt is.
Aprop
A this mulat
A statikus tagfggvnyeknek nincs thi s mutatjuk, teht nem is lehet kons-
tansknt deklarlni . Mivel a t his mutatn keresztl rik el a tagfggvnyek is
az adattagokat, a stati kus tagfggvnyek csakis stati kus adattagokat tudnak elrni.
Egymst tartalmaz osztlyok
Mint ahogy az mr a korbbi pld5kon is 1(uszott, az osztlyok ada ttagjai lart<1lmazhal-
jii k ms osztlyok objektumpl dnyait. A C++ programozk gy mondjk, hogya kl-
56 osztly tartal mazza a bels6 osztlyt. gy pldul egy Employee ( Alkalmazott) osztly
tartalmazhat karakterl nc objektumokat (az alkalmazottak nevhez) s egsz szmokat
is l fizets hez) stb. A 20.3 ListMml egy mgis hasznos String OSZTlyt
ptnk feJ.
20.3 lista - A String osztly (string.hppl
o: /1 20 . 3 Li sta A St rinQ osztl y
1 : linc1ude <iostream>
Z: linc1ude <string . h>
3 , class String
., : {
5 : public ,
6 , /1 Konstruktorok
7 , String () ;
8 ,
"
10 :
11 :
String{const
Stri ng (cons t
-St ring() ;
char "const) ;
St ring ... ) ;
lz : 1/ tlterhelt oper torok
13 : c har & operatorf ] (int of f set) ;
14 : c har operator[ l (int o f fset) const ;
15 : String operator.(const String&) ;
16 : void operator.={const String&) ;
17 , Stri ng & operator; (const String &) ;
IB :
19 , 1/ Eltal nos hoz z f 6ro fuggvnyek
20 : i nt GetLen ()const ( retur n itsLen;
21 : const c har * GetString () const { return itsString ; }
22 : 1/ stat i c i nt Constr uctorCount ;
23 :
24: pri vate :
25 : String(int) ; II privt kons t ruktor
26 : char * i t sStdng ;
27 : int it5Len ;
28 : ) ;
29 :
30: II az a laprtelmezett konstruktor O bjtos karakterlncot hoz ltre
31 : String " String()
32: (
33 : itsString = new char[l) ;
34 : i t sSt ring[Oj = ' \0 ';
35 : itsLen=O ;
36: II std :: cout \tDefault string constructor\n ;
37 : II ConstructorCount++ :
38: }
39 :
40: II privt (segd) konstruktor, csak osztlymet6dusok
41 : II hasznljk meghatrozott mretu j karakter lncok
42 : II ltrehozsra. Nullal tltve.
43 : String : : SLr ing (int len)
44 : (
45: itsString = new char[len+l];
46: int i;
47: for Ci = O; i<_len; 1++]
48: itsString]i] = '\0' ;
49: itsLen=len:
50 : II std: : cout "\tString(int) constructor\n" ;
51 : II ConstructorCount++:
52 : )
5) :
54 : String : : String (const char * const cString)
55: {
56 : itsLen = strlen(cString);
57 : itsString = new char[itsLen+1] ;
58 : int i;
59 : for ( i = O; i<icsLen ; i ++)
60 : itsString[i] = cString(i];
61: itsString[itsLen] .. '\O';
62 : II std : : cout \tString (char*) constructor\n";
6): II ConstructorCount++;
64 : }
65 :
66 : String : : St ring (const String & rhs)
67 : (
68: itsLen=rhs.GetLen() ;
69: itsStri ng '" new char[itsLen+l];
70: int i;
71: for ( i " O; i<itsLen; i++)
72: itsString[i] = rhs{i) ;
7) : itsString[itsLen] = ' \0 ';
74 : I I st d : : cout \ t String (Stri ng&) cons tructor\ n ;
75 : lj ConstructorCount++ ;
76: )
77 :
375
376 1 VI. rsz Kmnl.gessgek
78 : String : o-String ()
79 : {
80 : delete [J itsString;
8l: itsLen - O;
82 : II std : : cout "\tString destructor\n";
83 : ,
84 :
85 : II Egyenlosg oper t or ; felszabadtja a lefoglalt memrit ,
86 : II majd msolja a karakterlncot s a mretet
87 : String& String: : operator=(const String & rhsl
88 : {
89 : if (this -- &rhsl
90 : return *this ;
91 : delete t J it 5St ring ;
92 : itfiLcn-rha . GctLcn() ;
93 : itsString " new char[itsLen+l l;
94: int 1;
95 : for (i " O; i<i t sLcn ; i ++ )
96 : iLsStri ng [ i.) '" r h p, [ i] ;
97 : itsStrir'\g[itI:lLen] '" ' \0 ';
98 : rcturn *this ;
99 : II st.d :: couL " \LString operaLor.=\n" ;
100 : )
101 :
102 : Ilnem konstans eltols opertor ,
103 : II karakterre vonatkoz hivatkozst ad vissza ,
104: I I {QY megvltoztathat6 !
105 : char & String : : operator[} (int offset)
106 : {
107 : if (offset> itsLen)
108 , return itsString(itsLen-1) ;
109: else
110 : return itsStr1ng(offset] ;
III :
112 :
113 : II constant offset op erator for use
114 : Ilon const ob jects (see copy constructor ! )
115 : char String : : ope r atorl ) (int o f fse t ) const
116 : (
117 : if (offset> itsLen)
118 : return itsString[itsLen-l l ;
119 : e l se
120 : return itsString[offGet] ;
ln:
122 :
123 : II j karakterlncot hoz ltre, t adva az aktul i s
124 : I I karakterlncot az dis- nek
125 : String String : : operat or +(const String& rhs)
126 : (
127 : int totalLen = itsLen + rhs . GetJ.en() ;
128 : int i,j;
129 : String temp(tota1Len) ;
130: for (i =. O; i<itsLen; i ++ )
131 : templi] = itsString[i ] ;
20. ra
132 , for (j '" O; j<rhs.GetLcn(); j++, iH}
133 : templi] '" rhs [ j];
134 : temD[totalLen]=' \0 ' ;
135 : return temp;
136 ,
137 :
mutatk
138 : II mcgvltoztatja az aktulis karatkerlncot, s nem ad viooza semmit
139 : void String: : opcrator+"'(eonst St ring& r hs}
140 : (
141 , int rhsLen " rhs.GctLcn();
142 : int totalLen = itsLen + rhsLen ;
143: int Lj ;
144 , String temp(tota1Len);
145 : for (i '" O; i<itsLen; i++)
146 : templi] - itsString[i];
147 : for (j '" O; j<rhs . GetLon() ; j++, i++}
146 , templi] " rhs li-itsLenl ;
149 : temp l tot a1Lan ] ='\0';
150 : *thie " temp ;
151 :
152 :
153: II int String ,: ConstructorCount O;
Kimenet
A progra rnnak [lines kimencle,
EI. 8
A 22.sorban deklarljuk a ConstructorCount statikus tagvlto z6t , s a 153. sorban ini-
cializljuk. Ezt a vltoz6t nveljk a karakterlne konstruktorban.
A 20.4 Listban lenrnk egy Employee ( Alko/mozou) osztlyt , amely hrorn kamkter-
lne objektumot tartalmaz. Figyeljk meg, hogy nhny sor megjcgyzsl:>e van tve;
ezek a fejezet vgi feladatokban kerlnek sz6ba.
Aprop
jrahasznosfthat6sg
A 20.3 lista kdja a string. hpp llomnyban van. Ha szksgnk van
a String osztlyra, beemelhetjk a 20.3 listt egy hnclude paranccsal. A 20.4
lista elejn pldul lthat egy lIinclude string . hpp sor; ennek rvn
hasznlhat juk programunkban a String osztlyt.
378 1 VI. rsz' Klnlegessgek
20.4 Lista - Az Employe8 osztly s a lemployeemain.cpp)
o: 'string .hpp
1: II Az iostrcam-ct mr beemelte a msik llomny
2 : using std : : ccut; /I Ez a fjl std: , cout-ot hasznl
3 ,
4 ,
S,
6 ,
7 ,
8 ,
9 ,
10,
ll:
12 :
13 :
14 :
1 5 :
16:
17 :
18:
19 :
20 ,
21 :
22 :
23 :
2'1 :
25 :
26 :
27 :
28:
29 :
30 :
31:
32 :
33 :
34 :
35 :
36 :
37 :
class Employee
(
public :
Employee() ;
Emp!oyca (char * char * , char * long) ;
:
Employee{con!:l t Employee&) l
Employee & operat or= (const Employee &) ;
const String & GetFirstName(} const ( return i t sFirstName ;
COn!:lC St ring & GetLastName() const { reLurn itsLastNamo; }
const St ring & Ge tAddress( ) const { return itsAddrass ; }
long Get.Salary() const ( .etu rn ltsSalary; )
void SctFirstName(const String & fName)
( itsFirstName = fName ; l
void SetLastNama(const String & INama)
{ itsLastName = IName; }
void SetAddress(const String & address)
( itsAddress = address; )
void SetSalllry(long salary) { itsSellary ol salary; }
private:
J,
String
String
String
long
itsF'irstName;
itsLastName;
itsAddress ;
itsSalary ;
Employee : : Employae() :
itsFirstName(") ,
i tsLastName(" " ),
i tsMdress ('"),
itsSalary(O)
38 : {}
]9 :
40 : Employee : : Employee (char * f i rstName , char * lastName,
41: char * address, long salary) :
42 : itsFirstName(first Name),
4]: itsLastName(las tName),
44 : itsAddress{address),
45: itsSalary(salary)
46 : {I
47 :
48 : Employee ::Employee (const Employee & rhs) :
49 : itsFirstNama(rhs.GetFirstName() ,
ra
so : itsLastName(rhs .GetLastName(}) ,
51 : itsAddress (rhs . Get Address () ),
52 : itsSalary(rhs .GetSalary(
53 : ()
54 :
55 : Employee : :-Emp!oyee() fl
56 :
57 : Ernployee & Employee: : operator: (const Ernp!oyce & rhs)
58 : {
59 : if (this == &rhs)
60 : reLurrl *this;
61 :
62 : itsFirstName '" rhs.GetFirstName();
6]: itsLastName '" rhs . GetLastNamc (l ;
64: itsAddress e rhs . GetAddrcss();
65: itsSa!ary '" rhs . GetSalary() ;
66 :
67 : return *thi o;
68 :
69:
70: int main()
71:
72: Employee Edie("Jane","Ooe","1461 Shore Parkway', 20000):
73: Edie.SetSalary(50000);
74: String LsstName('Levine') ;
7S : Ed.Le. Se t LastName (LastNamc) ;
76 : Edie . SetFlrstName ( 'Edythe" ) ;
77 :
78 : "Name: ' ;
79: Edie .GetFirstName() .GetString();
80: Edie.GetLastName() .GctString():
81: . \nAddress: ':
82 : Edie . GetAddreS9 () . GetString () ;
83 : . \ nSalary : " :
84 : cout Edi e . GetSalary() ;
85 : return O;
86 :
Name ; Edythe Levine
Address : 1461 Shore Parkway
Salary : 50000
A 20A Lista szemllteli az Employee osztlyt, melyben hrom karakterlnc objektum
van: itsFi rstName, itsLastName s itsAddress.
380 I VI. rsz Klnlegessgek
A 72. sorban ltrejn egy Employee pldny, s ngy adattal inkializldik. A 73. SOf-
ban az Employee hozzfr6 fggvnye, a SetSalary () hv6dik meg, az 50000-es
szmErtkkeL Egy igazi progmmban ez egy futsi meghatrozott dinantikus r-
tk vagy egy konstans lenne.
A 74. sorban egy C++ karakterlnc konstanssal inicializl6dik egy String objektum,
ami a SetL"stName() paramtere lesz a 75. sorban.
A 76, sorban az Employee tagfggvnye, a SetFirstName () fUlle, szintn egy karak-
terhnc konstanssaL Ha figyelt az olvas, szrevehette, hogy az Employee-nek
nincs olyan SetFirstName () t:1gfggvnye, amely karakterlncot fogadna el par.un-
terknlj a SetFirstName () konstans karakterJ{mcra val hivatkozo:st vr.
A fordtprogram megoldja czt, mert a 20.3 Lista 8. sora alapjn mr tudja, hogy ho-
gyan csi nlj on egy konstans karakterlncbl String-el.
A tartalmazott osztly tagjainak elrse
Az Employee objekmilloknak nin<_"S specilis hozzMrse a String tagv:ltoz6khoz.
Ha al Edie alkalmazott objektum megpr6biiln elrni sajt itsFirstName tl.lgvltoz6-
j,1nak itsLen tagvltoz6jt, az fordtsi hibt generl na. Ez igazbl nem jelem tl
nagy terhet. A fgsvnyek megfelel6 nyjtanak a String
osztlyhoz. Az Employee OSztlyban nem kell tbbel foglal kozmmk a megval6sts
rszleteivel, mint amennyit mondjuk az itsSalary egsz vltoz konkrt infonnci-
trolsi mdja miatt kellene.
A tartalmazott osztlyelrsnek korltozsa
Figyeljk meg, hogy a String osztly biZtostja a +" opertort (operator+).
Az Ernployee teIVez6je azzal akadlyozta meg, hogy az operator+ meghvhat legyen
az Employee objekmmokra, hogy gy deklar lt minden karakterlnc hozzfr6 fgg-
vnyt, (mint pldul a Get FirstName () -et is), hogy konstans referencit adjon vi.ssza.
Mive! az operaton nem (is lehet) konstans fggvny, hiszen meg kell vltoztatnia
a hvott objektumot, a .sor hibt adna:
String buffer Edic.GetFirstName() + Edie.GetLastName();
A GetFirstName () cgy konstans $tring-et ad vissza, amire nem lehet az operator ...
meghvni.
Ez( a GetFirstName () tlterhelsvel tudjuk kijavtani.
Ne legyen az j fggvny konSlans:
const String & GetFirstName{) const { return itsFirstName;
String & GctFirstName{) { return itsFirstName; }
Figyeljk meg, hogy sem II visszatrsi rtk, sem maga a ragfggvny nem konSlans.
A visszatrsi rtk megvltozlatsa mg nem a tlterhelshez; vltozlarni
kell a fggvny konstans volln is. Azltal, hogy megadunk egy konstans s egy nem
konslans vllozatot is, a fordtprogram prnblja majd hvni a kom;tans vllozatot, ahol
csak lehet (pldul amikor :IZ gyff:lprogmm a GetFirstName-et prnblja hvni), s ha
nincs ms meghvja a nem konstans verzii (pldul az operator+ esetn).
A tartalmazs kltsge
Fontos tudni, hogy al Employee felhasznlja nnden egyes k3rakterlr1C lf:lre-
ho:disna k az rt megfizeti, amikor ltrejnnek a karakterlncok, vagy ha msolat k-
szl egy Employee pklnyr61.
rtk szerinti s hivatkozs szerinti msols
Amikor rtk szerint adunk t egy Employee objektumot, minden egyes tartalmaZOlt
kardkterlnc is lemsol6dik; ekzben pedig msol konstnlktorokat hvunk meg.
Ez igen kltsges, mcm6ria id6 tekintetben.
Ha cm szerint adjuk t az Employee objektumokat (mulatt vllgy hivmkoz.1st hasznl-
va), mindezt elkerlhetjk. Emiatt kemnyen dolgoznak a C++ programozk, hogy n-
hny bjtnl nagyobb objekuHnol ne kelljen rtk szerint tadni.
Barti viszonyban osztlyok
egy(ill hozunk ltre osztlyokat, egy csoportba tartoz mdon. Ezeknek
az sszeterelL oszt.\lyoknak szksgk lehet egyms privt adatlagjaira, m nem szeret
nnk ezeket az informcikat nyilvnoss tenni.
Ha egy osztly privt adatait egy msik osztly rendelkezsre szeretnnk bocstani,
akkor a friend ku1csszval kell ezt a . bartkoz" osztlyt deklarlni. Ez kiterjeszti
a msik osztly kezel6fellett, hogy lssa a bartosztlyt is.
hogya bartsg nem tranzitv. Anl mg, hogy Jska s PiSla a barra-
im, egymsnak nem bartai. A bartsg nem is Az, hogy egy barlommal
megbeszlem a lilkaimal, nem jelemi azt, hogy az gyermekeinek is meg szeretnm
mondani.
382 rsz
A bartsg mg csak nem is szinulletrikus: Az EgyikOsztly-t a MsikOsztly bart-
jnak deklarlva mg nem lesz a MsikOsztly az EgyikOsztly-nak is bartja. At-
tl , hogy te el szeretnd mondani nekem a titkaidat, nem biztos, hogy n is elmondom
neked a sajtjaimal.
A bartosztlyokat igen nagy krltekintssel szabad csak hasznlni. Ha kt osztly ki-
bogozhatatlanul sszefondoll, s gyakran kel! egyms adatait manipullniuk, akkor
megfontoland a barL'ig kimondsa. De legynk takarkosak: sokszor ugyanilyen
egyszeru nyilvnos fggvnyeket hasznlni. Ez teszi, hogy az egyik
osztlyt anlkl vhoztassuk meg, hogy a msik:LL jr.t kell ene fordtani.
Aprop
Egysgbezrs
Gyakran hallani C+ + programozktl, hogy arrl panaszkodnak, hogya ba-
rtsg alaknua az objektum-orientlt szemlletben oly fontos egysgbezrst.
Ez enyhn szlva tves megkzelts. A bartt deklarls egyszeren az oszt ly
csatolja a bartosztlyt; ez nem ssa jobban al az egysgbez-
rst, mint mondjuk a nyilvnos szrmaztats.
Barti viszony fggvnyek kztt
hogy II bartsgot nem egy teljes osztlynak szeretnnk megadni, ha nem
csak az osztly egy-kL tagfggvnynek. Ez meg is teheL6 oly mdon, hogy nem
az osztlyt deklarljunk bartnak, hanem a szksges tagfggvny(eke)r. St, igazbl
ennek nem is kell osztlyhoz tartoznak lennie; brmilyen fggvnyt kinevezhetnk
bacitfggvnynck.
Fggvnymutatk
Ahogya tmbk nevei olyan konstans mULatk, melyek a tmb demre mutat-
nak, a fggvnyek nevei is konstans muLatk magr:l a fggvnyre. Lehet deklar l ni ki-
feje%etlen fggvnyre vonatkoz mutatt, s ennek segtsgve! meg is hvhat lL fgg-
vny. Ez nagyon hasznos leheL pldul olyan program rshoz, amely a felhasznl :'iI-
tal adott bemenet alapjn hv meg fggvnyeket.
A fggvnymutatk megnsnek nehzsge az, hogy tulajdonkppen milyen tpus
objekrumr.t is mutatunk. Ahogy egy egsz szmra vonatkoz mutat egy egsz tpus
vltozra mutat, ugyangy a fggvnymutatnak egy adott visszatrsi tpus, adott pa-
r.tmler-szignatrj kell mutatnia.
20. ra
Nzzk a kvetkez6 deklarcit:
long j. func;Pt r) (int) ;
Ebben a funcPtr-l gy hatrozzuk meg, hogy ez egy mutat lesz (hiszen ott a jel
a nv el6tt), amely egy egsz szmol elfogad6 s egy h OSSl egszt visszaad6 fgg-
vnyre vonatkozik. A " funcPt r" kr zr6jelt kell tennnk, mert egybknt
az (i nt ) hats" [enne, azaz korCtbban haj t6dm\ vgre, mint
a mutat6fc1oldsi opertor e). Az zr6jclpr nlkl ez egy egsz szmot elfogad
fggvnyt jelentene, amely egy hossz egsz szmra vonatkoz mulall ad vissza. (Ne
feledj k, hogyaszkzknek ill nincs
Vi:r.sgljuk meg az albbi kt deklarci t:
long Func t ion (int);
long ( * func Ptrl (int) ;
Az els6ben a Punction () egy fi'lggvny, mely egy egsz szmOL v r, s egy hossz
egsz sz .. \ mra vonatkoz lll utatt ad vissza. A msodikban a funcPtr egy illU/a/,
amely egy filggvnyre vonatkozik, amely egy egsz szmot vr (:s egy hossz egszct
3d vissza.
A fggvnymutatk deklarcijban mindi g meg kcll adni 3 visszatrsi tpustj a mso-
dik zrjelben kell felsorolni az esetleges paramterek tpuslistij:t. A 20.5 Lista szem-
ll teti a f'ggvnymutatk deklarcijt s hasznilatt.
20.5listB - Fggvnymutatk hasznlata (ptrtofunction.cpp)
o: / / 20.5 Li s t a rOggvnymutat6k hasznlata
1 : Itinclude <iostream>
2 :
3 ,
, .
5,
6 ,
7 ,
8 ,
void
void
void
void
void
Squarc (1nt&,int&) ;
Cube (int&, int&) ;
Swap (int&, int & ) ;
GetVals(int&, int&);
PrintVals (i nt, int) ;
9 , i nt main ()
10 :
11 : void (* pFuncl (int &, int &l ;
12 : boo1 fQuit ,. false;
13 :
14 : int va1One=1 ,
15 : int choice ;
16 : whil e (fQuit == false)
17 : {
18 : s t d :: cout " (O)Quit (l)Change Va lues
19 : " (2l Square (3)CUbc (4)Swap : ";
20 : std: :cin choice ;
383
384 1 VI. rsz Kmnlegessgek
21 ,
22 ,
23 ,
2 <'\:
25 :
26 ,
27 :
28 ,
29 :
30 :
31 :
32 :
33 ,
34 :
35 ,
36 :
37 :
38 :
39 ,
40 :
41:
42 :
43 :
44,
45 :
46 ,
s .... itch (choice)
(
case 1 ,
pFunc = GetVals;
break ;
case 2 ,
p Func = Squa re ;
break;
case 3 :
pE"unc = Cube ;
break;
case 4 :
pF\mc = Swap;
break;
default ,
fQuit " true ;
break ;
if (fQuit)
break;
PrintVals(valOne, valTwo);
pFunc(va10ne, valTwo);
PrintVals(valOne, valTwo);
47, return O;
48 :
49 ,
50 : void PrintVals(int x, i nt y)
51 , {
52 : std: : cout x: x " y : y std : , endl ;
53 ,
54 :
55: void Square (int & rX, int & rY)
56 , (
57 , rX -= rX;
~ 8 rY -- rY;
59 ,
60 ,
61 : void Cube (int & rX , int & rY)
62 , {
63 , int tmp;
64 :
65 : tmp "' rX;
66 : rX ' = rX;
67 : rX = rX tmp;
68 ,
69 : tmp = rY;
70 , rY .= rY;
71 , rY = rY - tmp;
72 ,
73 :
20. ra
74 : void swap(inL & rX, i nt & rY)
75 : (
76: int temp ;
77 : temp" rX;
78: rX = rY;
79 : rY = temp;
80:
81:
82: void GctVals (int & rValOne, int & r ValTwo)
83 :
84: std : : cout "New value for ValOne : ' ;
85: std: : cin rValOne;
86 : std :: cout "New value for ValTwo : .;
87 : std: :cin rValTwo;
88 :
Kimenet
(OlQuit (llChange Values (2)SQuare (3)Cubc (4)Swap: l
x: l y:2
New valuc for ValOne: 2
New value for Val1'wo : 3
x: 2 y : 3
(O)Quit (l)Change Values (2)Square (3)Cubc (4)Swup : 3
x : 2 y:3
x: 8 y : 27
(OlQuit (l)Change Values (2)Square (J)Cube (4)Swap : 2
x:8y: 27
x:64 y : 729
(O)Quit (l)Change Values (2)Square (3)Cubc (4)Swap : 4
x : 64 y , 729
x , 729 y , 64
(O)Quit (l)Change Values (2)Square (3)Cubc (4)Swap : O
Bends
mutatk
A 3-6. sorban ngy fggvnyt adunk meg, azonos paramter-szignatrval (kt hivat-
kozs egszekre) s visszatrsi tpussal (void).
A ll . sorban deklarljuk a pFunc mutatt, amely egy olyan fggvnyre vonatkozik,
ami kt egsz hivatko7..st vr s (void) ad vissza. Az megadott
fggvnyck brmelyikre vonatkozhat ez a pFunc mutat. A felhasznlnak ismtelten
felknflljuk, hogy vlasszon a fggvnyek kzl, s ennek lesz a pFunc
belltva. A 43-45. sorban a kt egsz szm pillanatnyi rtkt kiratjuk, majd az aktuli -
san belliton fggvny lefultatsa utn jra megjelennek a sZ< mrtkek.
386 1 VI. rsz Klnleges,gek
Rvidftett frsmd
A fggvnymUlatt nem kell feloldani , br erre megvan a lehet6sg. gy, ha a pFunc
egy olyan fggvnymutat, amely egy egsz szmot vr s egy hossz egszet ad
ViSS7..a, s ehhez hozz is rcndeltnk egy fSb'Vnyt, akkor ez ktflekpp is
meghvhat:
pFunc(x) ;
vagy
(* pFuncl (xl ;
A kt vltozat egyenrtkiI. Az els6 nem ms, mim a msodik rvidtett rsmdja.
Fggvnymutatk tmbje
Ahogy pldul egszekb61 sszellthamnk egy tmbt, ugyangy deklarlhatunk
(adoll vi SSZ;ltrsi tpus s paramterszignat(Hiij) fgg:vnymutat6kbl is. (L;\5d
a 20.6 Lislt)
o: II 20 . 6 Lista Filggvnymutat6k tOmbje
1 : 'include <iostream>
2 .
3 : void Square (i nt&, int&) ;
<l: void eube (int&: , int &) ;
5 : void Swap (int&: , int &Ol ;
6 : void GetVala{in t&, int&) :
7 : void PrintVals (int , int) ;
8 .
9 : i. nt ma.in()
10:
11 : i n t
12 : i nt c hoice , i :
1 3 : COn!l t i n t MaxArray " 5;
14: vo id (pFuncArray [MaxArray]) ( i nt&, int& ) :
15 :
16 : f or (i=O ; i <MaxArray; iH-)
17 :
18 :
19 :
20 :
21 :
22 :
s td: : cout (l ) Change Values "
" ( 2 }Square {3 }Cu be (4)Swap: ";
std: : cin choice;
s witc h (choice )
2006ra' 1
0
1
case 1 : 23 :
24 :
25 :
26 :
27 :
28 :
29 :
30 :
]1 :
32 :
33 :
34 :
35 :
36 :
37 :
pFuncArray[il GetVal s:
break :
case 2 :
pFuncArray(i) Square ;
break ;
case 3 ,
pFuncArray [i I Cube;
break ;
case 4 :
pFuncArray[i] = Swap ;
break;
default :
pFuncArray ( i 1 O,
38 :
]9 :
40 : for ( i .. O;i<MuxArrIlY; i+'t )
41 : (
42 :
43 :
44 :
pFuncArray [i J (valOnc , valTwo) ;
PrintVals(valOne , valTwo) ;
45 : return O;
46 :
47 :
48 : void PrintVals(int x, int y)
49 :
50 : std : : cout 'x: x y : y std : :endl;
51 :
52 :
SJ : void Square (int & rX, int tit r'il
54 : (
55: rX .... rXi
56 : r'i ' ", rV i
57 :
56 :
59 : void Cube (int tit rX , int tit rYl
60 :
61 : int tmp:
62 :
63 : tmp = rXi
64 : r X * ", rX i
65 : rX = rX .. t mp ;
66 :
6 7, tmp = r'i i
68 : r.Y * - rVi
69 : r'i = rY tmp ;
70 :
71 :
72 : void Swsp(int tit rX, int tit r'il
73 : {
74 : int temp;
75 , temp '" rX;
mutat6k 387
388 1 VI. rsz Klnlegessgek
76 : rX rY;
77 : rY = temp;
78 :
79 :
80 : void GetVals (int & r ValOne, int & r Va l 'J'wo)
81 :
82 : std:: cout "New value for ValOne : " ;
83 : std: : cin rVa l One ;
84 : std:: cout "New va!ue for ValTWo : " ;
85 : std: : cin rValTwo ;
86 :
Flgyeleml
Legynk 6vatosak ezzel a pldaprogrammal!
Ahogy a knyv elejn emltettk, nem rtuk pldaprogramjainkat golyll biztons-
gra; nem kvettk a Hdefenzv programozs" elveit. Ha az 1, 2, 3 vagy 4 helyett
ms szmot Irunk be a fenti program bemeneteknt, hibt kapunk. A pontos hiba
zenet opercis fordftprogramt61 s a nyomkvettl is fgg; a hiba
oka az, hogy definilatlan fggvnyt prbltunk meghvni (lsd a 36. sort). Br nem
lenne nehz gy tfrni a programot, hogy ez ne fordulhasson ezzel sokkal
hosszabb s kevsb szemlletes lenne.
menet
(l)Change Values (2)Square
(l )Change Values (2)Sl:;Iuare
(1 )Change Values (2)Square
(l)Change Val ucs (2)SQuare
(l)Change Values (2)Square
New Value for ValOnc : 2
New Value
X : 2 y : J
x : 4 y : 9
for ValTwo :
x : 64 y : 729
x : 729 y : 64
x : 531441 y : 4096
Elemzs
3
(J}Cube (4) Swap : l
(J)Cubc (4)Swa.p : 2
(J)Cube (4 )Swap : 3
{J)Cube (4}Swap : 4
(J)Cube (4)Swup : 2
A 16-38. sorban ad a program a fel hasznl szmra, hogy vlasszon
a meghvhat fggvnyek kzl. Egy tmb elemeit rendre bellt juk a megclzott fgg-
vny eimre. A 40-44, sorban egyms utn meghvjuk ezeket a fggvnyeket (a 42. sor-
ban zajlik le a tmbelemnek konkrt fggvnyhvs). Minden hvs ut n ki -
rdnak az eredmnyek.
20. ra
Fggvnymutatk tadsa ms fggvnyeknek
A fggvnymmatk (vagy akr az ezekb61 kpzetttmOk) tadhat6ak ms fggv
nye knek, amelyek felhasznl hatjk ezeket, s alkalmas pill anatban meghvhatjk
a szksges fggvnyt a megfelel5 mUlat hasznlatval.
A 20.6 stt pldul lkletestherjk oly mdon, hogy a kivl asztott fggv(:nyl egy
msik f.iggvnynek adjuk t (a faprogramon kvl ), s ez fogja kirni az rtkeket,
meghvnia soron kvetkez6 fggvnyt , majd jm megjelenti az rtkeket. A 20.7 Lista
eZl a vltozatOT mutatja be.
20.7 Lista - fggvnymutatk tadsa egy msik fggvnynek paramterknt
lpassingptrfunction.cpp)
O, 1/ 20 . 7 Lis t a Fggvnymutat6k t adsa paramterknt
1 , h nc1ude <iol:itream>
2 : usin; namOApacc s t d ; / I e z a z llomny s td:, objektultlokut hasznl
3 ,
4, voi d Square (int&, int&) ;
5 : void CUM (i nt&, int&) ;
6 : void Swap (int&, int &1 ;
7 : void GetVals(int&, int&) ;
8 : void I'rintVals(void ( *)(1nt&, int&) , int&, inl.&) ;
9 ,
10 : int !MinO
ll : {
12 : int val0ne=1, valTwo=2 ;
13 : int choice;
14 : boo1 fQuit = false ;
15 :
16 : void ("pFunc:) (int&, int&) ;
17 :
18 : whi1e (fQuit ~ false)
19 : {
20 : cout . (O}Qui t (l)Change Values
21 : " (2)SQuare (3)Cube (4) Swap : ' ;
22 : cin choice ;
23 : s wi tch (cho i ce )
24:
25 :
26 :
27 :
28 :
29 ,
30 :
31 ,
32 :
33 ,
34:
35 ,
case 1:
pFunc '" Gc t Vals;
breuk;
case 2 :
pFunc = Square;
b reak;
case 3 ,
pFunc - Cube ;
break ;
case 4 :
pFunc = Swap;
389
390 I VI. rsz Klnlegessgek
36 :
37 :
38 :
39 :
40:
break ;
de fault :
EQuit = true ;
break;
if (EQuit -== true)
break;
41:
42:
43 :
44 :
PrintVals ( pF'unc, valOne, valTwo) ;
45 ;
46: ret urn O;
47 :
48 :
49: void PrintYals( void (*pFunc) (int&, int&),int& x, int& y)
50 :
51 :
52 :
53 :
54 :
55 :
cout 'X :
pFunc(x ,y ) ;
cout 'x:
X
x
56 : void Square (int & rX . int & rY)
57: (
58: rX *..,. rXI
59 : rY *= r'l;
60 :
61 :
62 : void eu be (int & rX, int & rY)
63 : (
64: int tmpl
65 :
66: tmp = rX;
67 : rX *= rX;
68 : rX = rX * tmp;
69 :
70 : tmp = rY;
71 : rY * : rY;
72 : rY = rY * tmp;
73 :
74 :
75 : void Swap(int & rX, int & rY)
76 :
77 : i nt temp ;
78 : ternp = rX;
79 : rX rY;
80: rY = temp;
81 :
82 :
y endl;
y endI ;
83 : void GetYals (int & rVal0ne, int & rValTwo)
84: (
85 : cout 'New va!ue Eor ValOno : ' ;
86 : cin rValOne ;
87 : cout 'New vaIue for ValTwo : ' .
88: cin rYalTwo;
89 :
20. ra
menet
(O)Quit (l)Change Values (2)Square (3)Cube (4)Swap: l
x: 1 y:2
New value for ValOne : 2
New valuc f or Val '!'wo: 3
x: 2 y : 3
(O)Quit (l)Change Values (2)Square (3jCube (4)Swap : 3
x : 2 y:3
x: 8 y: 27
(O)Quit (l)Change Values (2)Square (3)Cubc (4jSwap: 2
x: 8 y: 27
x:64 y:729
(O)Quit (l)Change Values (2)Square (3)Cube (4)Swap: 4
x:64 y:729
x: 729 y : 64
(O)Quit (l)Changc Values (2)Square (3)Cube (4)SwQP: O
Bemz.
A 16. sorban deklarnljuk a pFunc fggvnymut3tt, ami kt egsz hivatkozst vr s
res a visszatrsi rtke. A 8. sorban deklarljuk a PrintVals () fggvnyt , amely h-
rom p;mun{:lCI1 vr. Az egy fggvnymul<lt (ami kl egsz vr s res
a visszatrsi rtke), a m:lsodik s harmadik pedig egy-egy egszre ul:116 hivatkozs.
A felhaszn;'\16nak j ra felajnljuk a fggvnyvl aszrs
Kerlsenek egy C++ programoz6t, s krdezzk mcg t6le, mit jelent az :11bbi dekhlmci6:
void PrintVals(void (*) (int&. int&l,int&, int');
I1yesft!le dekbrci6t nyilvn nem tl sron hasznl az ember, s val6szntleg a kedves
olvas is egy kt!ziknyvbl fogja kikeresni, ha neln ilyesmire szksge lesz. Lehel
azonban olyan ritka helyzet, amikor pp egy ilyen dcklardval lehet megoldani egy
programozsi feladatol. A fenti krdsre a kvetkez6 a vlasz: ez egy olyan fggvny
deklarcija, amelynek res (void) a visszatrsi rtke, paramterknt pedig egy
fggvnymutatt vr (melynek kt p:H"Jmtere egy-egy egsz hivatkozs), illetve mg
kt egsz hivatkozst. Ezt olvashat6bban fogalmazhat juk meg a typedef segtsgve!.
A typedef hasznlata fggvnymutatkkal
A void (*) (int&, int') konstrukci hasznlata enyhn szlva knyelmetlen. Egy-
szenstsknt hasznlhat juk a typedef ku\csszt. Deklarljunk egy VPF tpust olyan
Fggvl:nymutatknt, amely kt egsz hivatkozst vr s res a visszatrsi rtke.
A 20.8 Listban jrafogahnazzuk a 20.7 Lista elejt, s a typedef segtsgve! kt l-
psben deklarljuk a Print Vals () fggvnyt .
391
392 1 VI. rsz Klnlegessgek
20.8 lista - A ftIggrinymutat61c OIVaShat6bb _ (lIIiogtypedef.cppl
o: II 20 . 8 List a typedef hasznl ata
1 : 'lnclude <lostream>
2 : uslng namespace std; II ez az llomny std:: objektumokat has zn l
3 .
4 : voId Square (int&, lnt&) ;
5 : voidCubc (in t& , int ,\,) ;
6 : void Swap (Inl&, inl &) ;
7 : void GetValsCint&, i nt&) ;
8 : typedef void ( *VPF) (int'\' , int&)
9 : void PrintVals(VPF, int&, int &) ;
10 :
ll : i nt maln ()
12 :
13 : int vn I One=l , v aI Two=2 ;
14 : int choice ;
15 : bool fQui t ~ false ;
16 :
17 : VPF pf'unc ;
18 ;
19 : while (fQuit ~ false)
20 ; {
21 : cout . (O)Quit (l)Change Val ues'
22 : "{2)Square (3)Cubc {4)Swap : ";
23 ; cin choice ;
24 : s witch {choicel
25 : (
26 : case l :
27 : pFunc ~ GctVals ;
28 : break;
::19 , case 2 ,
30 : pFunc = Square ;
31 , break ;
32 : case 3 :
33 : pFunc " Cube ;
34: break ;
35 : case 4 :
36 : p Func - Swap;
37 : brea k;
3B : defaul t :
39 : f Qui t - t rue ;
40 : break;
41 : )
42 : if (fQuit == true)
43 : break;
44 : PdntVals ( pFunc , valOne, va l Two) ;
45 : )
46 ; return O;
47 :
48 :
49 : voId PrintVa ls{ VPF pFunc,lnt& x, l n t& y)
50 :
20. ra
51 :
52 :
53 :
51\ :
55 :
56 :
57 :
58 :
59 :
60 :
61 :
cout 'x:
p F'unc( x, y) ;
cout 'x:
void Square
rX
,
-
rX;
rY
'-
rY;
x y .
x y .
(int & rX. int & rY)
62 : void Cube (int &: rX . int &: rY)
63 :
64 : int t mp ;
65 :
66 : tmp ::: r X;
67 : rX .. = rX;
68 : rX r X tmp ;
69 ,
70 : t mp = rY;
71 : rY * ,. rY ;
72 : rY = rY tmp ;
73 : }
74 :
75 : void Swap(int &: rX, int &: rY)
76: (
77 : int temp ;
78 : temD -' rX;
79 : rX rY;
80 : rY = temD;
81 : )
82 :
y
y
e ndl ;
cnd1 ;
83 : void GetVAls (int rVolOne, int &: rVal'I\.Po)
84 : (
85 : cout "New vAluc for ValOne : "
86 : cin rVAIOne ;
87 : cout 'New vAlue for ValTwo : ' ;
88 : cjn rValTwo ;
89 , )
Kimenet
(O)Qu i t (l)Cha nge Values (2)Squar c (3)Cube ( 4 )Swap : l
x : 1 y : 2
New value for ValOne : 2
New value for ValTwo : 3
x: 2 y : 3
(O)Quit (l)Change Values (2)Square (3}Cube (4)Swap : 3
x, 2 y : 3
x : 8 y : :n
mutatk
394 1 VI. ,sz' KOInl.gessg.k
(O)Quit (l)Change Values (2)Square {3)Cube (4)Swap: 2
x; 8 y: 27
x:64 y :72 9
(O)Quit (l)Change Values (2)Square (3)Cube (4)Swap : 4
x:64 y : 729
x:729 y,64
(O)Quit (l)Change Values (2)Square (3)Cube (41Swap : O

A 8. sorhan a typedef segL'igvel deklarl juk a VPI" fggvnytpusl, amely kf:t pam-
mtert vr (egy-egy egszre vonatkoz hivatkozst), s (ires a visszatrsi rtke.
A 9. sorban dckbrljuk a PrintVals () fggvnyt, amely hrom pamrntcrt vr: a:l el-
56 VPF tPlIS, a tbbi egy-egy egszre vonatkoz hivatkozs. 1\ 17. sorban mr a VPI"
tpussal deklarlharjuk a pFune fggvnyt.
A VPI" definci6jval sokkal vilgosabb vlik ennek a tpusnak a hasznlata, pldul
:L pFune s a PrintVals () deklarcija kor. A typedef igazbl csak egy szinonimfu
boz ltre; a 20.7 s 20.8 Lista csak az olvashatsgb,Ln tr el egymstl.
Tagfggvnyekre vonatkoz mutatk
Eddig a pillanatig csak olyan fggvnymutatkat hasznltunk, amelyek osztlyon kv-
li , ltalnosan hasznlhat fggvnyekre vonatkoztak. Termszetesen tagfggvnyek-
hez is gyrthatunk mutatkat.
Tagfggvnymulatt ugyanolyan szintaxissal lehet ltrehozni, mint amit eddig is h:lsz-
nlrunk norml fggvnymuratk esetben, csak a jel el6tt meg kell adni az osztly
nevt s a hatkr operton (kt kett6sponlot) is. l-la pldul a pFunc a Shape oszlly-
beli tagfggvnyre mutat, amelynek res (void) a rtke, paramterknt
pedig kt egszet vr, akkor az albbi mdon lehet deklarlni:
void (Shape: :*pFunc) (int, int);
A tagfliggv6nyckrc vonatkoz mutatkat ugyan!,'Y lehet haszn:'ilni, mint az egyb
fggvnymutatkat, kivve azt, hogy csak a meghvand osztlybl val objektumok-
kal kpesek dolgozni. A 20.9 Lista hemutatja a tagfggvnyekre vonmkoz mutatk
hasznlatt.
Figyelemi
A fiiggvny neve vagy cme?
Nhny fordtprogram nem teszi lehetv, hogya fggvny nevt hasznljuk me-
mriacme helyett. Ha a fordtprogram hibt vagy figyelmeztetst ad az albbi
programra, prblja az albbi mdon megvltoztatni a 71 -76. sorokat.
71 : case
" 72 : pFunc
o
& Marrunal : : Speak ;
73 : break ;
74 : default :
75 : pFunc
o
& Manunal: :Move;
76 : break:
A programokban is ilyen mdon korrigljuk ezt a fajta hibt (vagyis egy
jl eltallt & jellel a fggvny neve
Borland fordtval nincs ilyen problma.
20,9 Usta - Tagfggvnyekre vonatkoz mutatk hasznlata (ptrtomember.cpp)
o : / / 20.9 Lista Tagfllqqvnyekre vonatkoz mutatk
l: linclude <iostream>
2 ,
3 : enum BOOL U'ALSE , TRUE) ;
4 ,
5 : class Mammal
6 : (
7: public :
8: Manunal() : itsAge(l) (
9: virtual -Ma.mmal() ( )
10: virtual void Speak() const = O:
ll: virtual void Move() const = O;
12: protected:
13: int itsAge:
14: ) ;
15 :
16: class Dog : public Mammal
17 :
18: public :
19 : void Speak ()const { std :: cout "Woof!\n" ; }
20 : void Move() conl'lt ( std: : cout 'Walking to heel ... \n" ; )
21: ):
22:
23: class Cat
24 :
public Ma.mmal
25: public :
26 :
27 :
28 : ) ;
29 :
void Speak {)const
void Move() const
std:: cout "Meow!\n' ; )
std : : cout ' slinking ... \n' ;
396 1 VI. rsz' Klnlegessgek
30 : class Horse
]1: (
public Mammal
32 : public :
33:
34 :
35: };
36 :
void Speak()const
void Move() const
std: : cout "Winnie!\n"; l
std :: cout "Galloping ... \n" ;
37: int main()
38:
]9: void (Hammal : :*pFunc) () const ,,0;
40: Mamma1* ptr "0:
41: int AnimaI;
42: int Method;
4 3 : boo1 fQuit " false ;
44:
45: while (fQuit "" false)
4 6 : {
4 7 :
48 ;
49 :
50 :
51 :
52 :
53 :
54:
55 :
56 ;
57 :
58:
59 :
60 :
61 :
62 :
63 :
64 :
65 :
66 :
67 :
68 :
69 ;
70 :
71 :
72 :
73 :
74:
75 :
76 :
77 :
78 :
std: : cout "( OlQuit (l)dog (2)cat (J)horse: " ;
std: : cin Animai;
switch (AnimaI)
(
case l :
ptr " new Dog ;
break;
case 2:
ptr " new est;
break;
case ]:
ptr = new Horse;
break;
default:
fQuit = true;
break;
if (fQuit)
break;
std: , cout (1)5peak (2)Move :";
std, : cin Method;
switch (Method)
{
case l ;
pFunc Mammal : : Speak;
break ;
default:
pFunc = Mammal : :Move ;
b r eak;
79 : (ptr->*pFunc) (J ;
80 ; delete ptr;
81 :
82 : return O;
83:
20. 6ra
menet
(O)Quit (1) Dog (2)CaL (3}Horse : 1
(1)Speak (2)Move : 1
Woof!
(O)Quit (1)oog (2)Cat (3)Hor sc : 2
(1)Speak (2)Move : 1
Meow!
(O)Quit ( 1) Oog (2)Cat (3)!-!orse: 3
( 1 )Speak (2)Movc : 2
Galloping
(O)Quit (1)Oog (2)Cat (3)Horse : o
Az 5-14. sorban a Mammal (emls) absLtr..kt adattpust deklar:lljuk kt virtll{llis
metdussal; ezek a Speak () s a Move () . A Mammal alosztlyai a Dog, ;1 Cat s
a Horse (azaz a klltya, a macska s a 16), mindegyik feIOlrj:\ a Speak () -et s
a Move ()-ol.
A f6program megkrdezi a felhaszn lt, hogy melyik Jlatfajtt hozzuk ltre. Ekkor lt-
rejn 11 mum6riban az AnimaI-nak megfelel6 s cme bukerl ti ptr nm-
tmba a 49-63. sorban.
Ezutn eldntheti a felhasz.nl, hogy melyik metdlIst szereln meghvni. A dnts-
nek metdus cme bekerl <I pFunc mutatba. A 79. sorb,1n lefuuatjuk a lt-
rehozotl osz.tly kivlaszto!! tagfggvnyt; a ptr mUlat a ltrehozott osztlyra, s
a pFunc segtsgvel rjk el <I megfelel6 fggvnyt.
Vgl a 80. sorban trls kvetkezik; a delete paranccsal fclsz:lbadtjuk a ptr ltal
mutatott dinamikus memriaterleleL Fontos, hogy nem a pFunc-ra szabadt juk r
a delete-et, mert a ... egy kdrszletre irnyul 6 mutat, nem pedig egy memriafoglal
objektumra. Az effle ksrletet a fordtprogram kiszri egy hibajelzssel.
Tagfggvnyekre vonatkoz mutatkbl ll tmbk
Ahogy a norml fggvnymlltatkat tmbbe lehet szervezni, ugyangy a tagfiiggv-
nyekre vonatkoz mutalkat is. A tmb a tagfggvnyek cmeivel iniciali-
zlhat, melyek ks6bb meghvhatak az adon tmbelemre hivatkozva.
A 20. 10 Lista mutatja ezt a
397
398 VI. rsz
20.10 usta - TagflIggvnyeIcre __ 6IhI ___
,"rnyptrfunctioo.cppl
o: II 20.10 Lista TagfOggvnyekre vonatkoz mutat6kbl tmbje
1: linclude <iostream>
2 .
3 : class Dog
4: {
5 : public :
6 : void Speak()consL ( std : : couL 'Woof!\n'; )
7 : void Move () const ( std:: cout 'Walking to heel ... \n";
8 : void Eat() const ( std :: cout "Gobbl ing feod . .. \n ", l
9 : void Growl{) const { etd:, cout 'Crrrrr \n" , }
10 : void Whimper () const { std: : cout 'Whining no i se!! ... \n"; }
ll : void RollOver () const ( std : : oout 'Rol l ing over ... \n '; )
12 : void PluyOead () const
13 : { std:: cout "Is t his the end of Li t tIe Caesar?\ n ' ;
14 : } ;
15 :
16 : typedef void (Dog : ," PDF) ()const
17 : int main()
IB : {
19 : const int MaxFuncs '" 7;
20, PDF DogFunctionslMaxFuncsJ
21: {Dog: : Speak,
22 : Dog' ::Move,
23 : Dog : : Eat,
24 : Dog : : Growl,
25: Dog , :Whimper,
26: Dog : : RollOver,
27 : Dog : : PlayDead
28 : l;
29 :
30: Oog* pOog ,.0 ;
31 : int Method ;
32 : bool f Quit " false :
33:
3 4: while ( !fQuit)
35 : (
36 : std :: cout ' (O)Quit {l)Speak. (2) Move (3)Eat (4) Growl';
37 : s t d :: cout ' (5) Whimper (6)Roll Over (7)Pl a y Dea d : " ;
38 : s t d : : cin Method ;
39 : if (Method ,,= O)
40: {
41 :
42 :
43 :
44 :
45 :
46:
47 :
else
{
fQuit '" true ;
break;
pDog = new Dog;
(pDog - >*DogFunctions[Method- lJI {l ;
48 :
49 :
50 :
51 : return O;
52 :
menet
20. ra
delet e pDog;
(O)Quit (l)Speak (2)Move (3)Eat (4)Growl (5)Whimper (6)Rol l Over (7)Play
Dead: l
Woorl
(O)Quit (l)Speak (2)Hove (3)Eat (4)Growl (5)Whimper (6)Roll Over (7)P!ely
Dead: 4
Grrrrrr
(O)Quit (l)Speak (2)Move (3)Eat (4)Growl (5)Whimper (6)Roll Over (7)Play
Dead : .,
Ia this the end of Littie Caesar?
{O)Quit (l)Speak (2)Move (3)Eat (4)Crowl (5)Whimpcr (6)Roll Over (7)Play
Dead: O
A 3-14. sorb:ln ltrebozzuk a Dog osztlyt h6llagfggvnnyel, melyek mindegyike azo-
nos visszatrsi tpusCl s pammter-szignatrjll. A 16. sorban typedef-fel definiljuk
a PDF tpust, amely egy olyan Dog-tagfggvnyre vonatkoz mUlat, amely nem vr
par<untert s nem is ad vissza semmit, dc konstans. Ez ugyann, mint a Dog hllag-
fggvnynek a paramter-szignatrja.
A 20-28. sorban dekbrljuk il DogFunctions amely a hL lagfggvnyt fogj:"!
tarta lmazni; ezek mem6riacmeivel inicializljuk.
A 36-37. sorban a felhasznlt vlaszts el llt juk. Hacsak nem lp ki (O -Quit), lt-
rejn egy j Dog objektum a dinamikus mem6riaterleten, majd a tmb megfelel6 in-
metdusa kerul meghvsra a 47. sorban. Ez jfent egy olyan sor, amellyel vizs-
gzt:uni lehet ct C++ programozkat, hogy vajon tudjk-e, mit csinl:
(pDog->DogFunctionsIMethod-lj) () ;
Valljuk be, ez gy egy kiss ezoterikus, de ha a programban valami miau ppen ragf8b",-
nyekb61 ll tblzatm van szksg, ez Cf,'Yszerub s 0lvashat6bb teszi a kdot.
400 I VI. rsz Klnlegessgek
Krdsek s vlaszok
Krdi'!>: Mil1 haszll/llnk slatikus vllozkal, ha lehel globlisakails lIasZ/llni?
\fIasz: A statikus vltozk ha16kre egy osztlyra korl tozdik, igy csak ezen osztly
pldnyaibl rhetek el: nyilvnos vltoz6 csetn explicit s teljes osztlynv-meg-
adssal, vagy esetleg egy statikus tagfS&",nyen keresztL A statikus adatok tpusa
az osztlyhoz kl6dik, s a szigortou elrs, illetve :I Z erds tpusoSs{lg miatt biztons-
goslibban hasznlh:Hk, mint a globlisak.
Krds: ANr/ "aszt/lnnk slaukus lagfggvnyel-.:cI, lIa lehet glo/:Jlisakal is !taszlll"i?
Vlasz: A statiku.s lagv:i ll oz6k egy osztly hatkrbe tm1.07;nak, s Csak az adott osz-
t(lly objektum{m keresztl rl1et6ek el, vagy kifejezett s teljes osz!lynvvel, mi nt pl-
dul C1U8sName: : Funct;.ionName ( ).
Krds: Mir/ nCIII Icsszf}k mindcll osztlyul/kal aZOIl oszt{}'Ok barlaiv, amelyeket
hasznlllak?
Vlasz: Egy o..o;ztly baru nyilv{mt:'isa napvilgra hozza a megval6.sts rszleteit s la-
7.tja az egysglx:zrst. A cl :lZ, hogy az osztlyok megvalstsnak a rszletei lehe-
t6leg maradjanak rcjrvc ms osztlyok eI6t1.
Gyakorlatok
Az elmlt rban megisrnerkedtnk a klnleges osztlyok, f.iggvnyek s mUlatk vi-
lgval. Yllaszoljunk meg nhny krdst s vgezznk cl nC:hny fel::tdatot, hogy el-
1l1lyL<;k ezzel k:lpcsol:ltos tudsunkat.
Kvz
1. Mi II .szerepe a statikus adatugoknak egy osztlyon beled?
2. Mi a szerepe a statikus tagfggvnyeknek egy osztlyon belLil?
3. Milyen e16nye van annak, hogy llrehozzuk II string. hpp llomnyt (20.3 Lis-
t:I), ahelyett, hogy beillesztennk tartaImt II 20.4 Listba, ahol haszn5ljuk?
4. Milyen e16nykkel jr a bartosztlyok hasznlata?
20. ra "1 I mutatk 401
Feladatok
1. Vegyk ki a megjegyzsb61 a string . hpp llomny (20.3 Lista) cout lIIastsait
(36, 50, 62, 74, 82, s 99. sor), majd futlassuk le az employeelllain. epp progra-
mot (20.4 Lista). gy lthatv vlik, hnyszor hvdnak meg a konstruktorok,
destruktorok s opertorok.
2. Mdostsuk gy a ptrarrayfunction . cpp programot (20.6 Lista), hogy helye-
sen kezdje a felhasznl ltal bevitt rtkeket! (tlet: Mi troldik eJ a tmbben
rvnytelen bevitel esetn? Ne felejtkezznk el a 42. sorrl!)
3. Hasonltsuk ssze a string . hpp ll omnyban (a 20. 1 tistban) definilt String
osztly lehet6sgeit azzal a szabvnyos knyvtrral, amely a fordt6programrnal
(:rkezett. A Borland fordtprogram esetn ez a Sg, Sg tmk, J l1alom me-
npont Referellcia rszre katti ntva el. A sg6ablakhan ltszani fog
a <string>
Vlaszok a kvfzkrdsekre
1. Az osztly sszes objeklumhoz csak egyetlen pldnyban lteznek. Lehet6v
teszik, hogy az Oszt<'ilypldnyokra vonatkoz fontos kzs adatokat nyil vnrart-
suk (pldul a ltez6 pldnyok darabszmt).
2. A statikus adattagokhoz hasonloon aZ osztly sszes objektumhoz egyetlen vl-
tozatban pldnyosulnak. lt.1lban a statikus adauagok szolglnak.
3. A string. hpp-hez hasonl beemelend6 (illclllde) llomnyok ltrehozsval
lehet6v vlik, hogy ugyanazt a k6drszletet tbb programmodul is (esetleg
tbb munkatrsunk is) hasznlhassa. Ez egy remek programozsi gyakorlat; in-
kbb Jehet6sg, minL<;em a fordil6progmm elvrsa.
4. A ban'tok lehet6v teszik kzt mcgoszliist. Ahogya vdett el-
rs lehet6v teszi :LZ egymsbl szrmaztatott osztlyok kztt :lZ adatok s
rggvnyek elrst, mg a vilg tbbi rsze el6l mindez elzrva marad (gy
a priv,t s a nyilvnos "kztti" az elrsi mdjuk), hasonlkpp a ba-
rti elrs is a megfelel6 osztlyok, tagfiiggvnyek illetve az erre kiv{dasztott
I'i.iggvnyek kztt.
21. RA
Az
Ebben az rban a lesz sz:
Mil neveznk felt teles fordtsnak, s hogyan alkalmazhatjuk a gyakorlatban
Hogyan rhatlInk makr6k.11
Hogy:m hasznlhat juk lZ el6feldolgoz szolgltat.1sait hibakeressre
Az s a fordft
Valahnyszor elindtjuk egy program fordtst, az kapja meg azt.
Az e16feldolg07.6 is kikeresi II forrsk6db61 a neki szl utastsok:lt, amelyek
mindegyike egy kelt6skereszttcl (ji j pound) kezd6dik. Ezek az utastsok kivtel nl-
kl valamilyen szvegm6dostsi eljrst rnak le, amit az a forrnsk6don
fog vgrehajtani. Az eredmny egy j, tmeneti fOfrsfjl, amit progmmoz6knt ltal-
ban nem is ltunk. Ugyanakkor e16rhaljuk az eltfe1dolgoz6nak azt is, hogy ksztsen
egy mentst cbb6l a kztes llapotbl, hogy kso"bb tanulmnyozhassuk.
VI. rsz
A fordtprogram soha nem hasznlja az eredeti forrsfj lt, helyette mindig az
dolgoz kimenetn kezd cl dolgozni. A mr eddig is gyakra n ltott # include direktva
pldul arra utastja az el6feldolgozt, hogy keresse meg a parancs utn megadott fjlt,
majd annak teljes tartaImt szrja be a {Ydrancs helyre h'Y, mintha azt n magunk g-
pe1tk volna be. Amikor a fordt megkapja a fjlt, a beszrt tartalom mr on van.
A kztes llapot mentse
Gyakorlatilag valamennyi fordtnak van egy oly<ln kapcsolja, amivel msolatot k-
szthetnk az kimenetr61. Ezt a sz.olg5. ltatst bekapcsolhatjuk a grafikus
krnyezetUen, de megadhatjuk <I krdses kapcsolt a parancssorban is.
Ha teht valamirt kvncsiak vagyunk az kimenetre, olvassuk el a for-
dt6programunkhoz mellkelt dokumentcil. BiztOsan benne lesZ a megolds.
A #define direktfva hasznlata
A IIdefine direktvval egy karaklerlncokon vgezhct6 hclycueslst rhatunk e16.
Nzznk egy p ldt:
IIde(if\tl EIG 512
Ez az elCfeldolgoznak szl utast.ls azt jelenti, hogy brhol, aho1 a BIG szveget ltja,
cserlje azt le 512-re. Fontos hangslyozni , hogy itt a k .. raklerlnc szt nem annak
C++-os rtelmben hasznljuk. A IIdefine di rektva utn tulajdonkppen egy jelet
(tokent) adunk meg, ami a sl6 ltalnos rtelmben vve egy karakterlnc, s amit
a kMszvegben egy msik karakterlncr:1 fog le<::serlni az fggetlen1
att l, hogy a7. egy karaktcr!{111ccal, egy ll andval , egy tmbbel vagy brmi egybbel
kapcsolatban bukkan-e fel. N7.znk taln egy konkrt esetet:
Idefine BIG 512
int myArray [BIGI;
Ilyenkor az cl6fcldolgoz ltal el6llloll kztes fjl II kvetkez6t fogja tartalmazni:
int InyJ\r ray [ 512 J ;
figyeljk meg, hogya ltdefine lJ(;lSts mr nincs sehol. Az elGfeldolgoz a kztes
k6dbl eltvoltja az sszes neki szl utastst, v'lgyis azokal a fordtprogram soha
nem is ltja.
21.ra-
A #define hasznlata llandkkal kapcsolatban
A idef i ne egyik leggyakoribb felhasznlsi mdja az llandk definilsa. Amim eZl
mr kor.ibban is emltelllik, ez aO! esetek tlnyom tbbsgben nem valami j tl et,
mert az el6feldolgoz6 egysl.cru szveghelyettestst vgez, a kontexmst, vagy a tpuso-
kat soha nem elemzi. ppen ezrt sokkal biztonsgosabb a const kulcssz6t hasznlni
ilyen helyzetekben.
A #define s az #ifdef hasznlata vizsglatok vgzsre
A #dcfine direktva hasznli(at{lnak msik mdja az, amikor mindssze :umyit kzlnk
l tala :IZ clfcklolgozv;!l, hogy egy karakter!{tnc - illetve az ltala kpviseltloken -
defini: !l. lr!wjlJk p61dul a kvetkez61:
BIG
A k(x.! rszeiben aztn megvjz'sgfl lh:ltjuk, hogy meghatrozotl-e ennek a token-
nek az rtk, S:l vizsg!i1at eredmnyt61 fgg6en vgeztethctnk el ms mGvelctcket.
Ehhez az lIifde [ s az IIlCndef direktvkat basznlhaljuk, melyek kzl az elM) :lkkor
ign, lm a tokcn del1nitilt, a msik pedig akkor, ha nem. Mindkt utashstmht eb'Y
fendif direktvnak kell zrnia, mg a kvctkez6 bezr k.lJX..-.;Q.c; zrjel
Az li fdef segitsgvel megfogalmazou relttel teht akkor ki igazra, ha
az utml tokent korbban mr def'ini:ltuk. Ha pldul egy felttelesen vgre-
hajtand nyomkvetsi utastlist szeretnnk bepteni a k6dba, azt a kvetkez6kppen
tehetjk meg:
U fdc f DEBUG
cou t 'OCbug dc fincd';
.cndif
Arnikor ez elrkezik az lIifdef direktvhoz, megnzi ti nyilvlintar-
( tblzatban, hogy szcrepel-e benne a DEBUG szimblum. Ha igen, :lkkor :IZ Itifdef
igazra ki, melynek kvetkeztben minden, a kvetkez6 !telse
vagy ltendiC direktv:ig szerepl6 k6dsor belekerl a fordtnak {uadotl kztcs kdba.
Ha ezzel szcmben a logikai vizsglat hamis rtket credmnyez, akkor az It ifdef s
a #else vagy direktva ltal hatrolt sorok nem kerlnek bele II Ic-
fordtand kdba. Kimaradnak, mintha soha nem is lenek volna.
Jegyezzk meg, hogy <lZ "i fndef az " i fdef logikai ellentte, vagyis ez akkor rtkel6-
dik ki igazra, ha az urna token a forrskd adott pontjn mg nem del1nilt.
405
406 1 VI. rsz Klnlegessgek
Az #else direktfva
Arnint a nv is sugallj a, az #else direktva az " ifdef vagy #ifndef s az II endi f k ~
ztt szerepelhet, s a feltteles utastsrendszer msik gt kpviseli. A eddig megis-
mert direktvk hasznlatra mulat pldt a 21.1. Lista.
21 .1. Lista - A #defin8 direktfva hasznlata lusingdefine.c
o: 1/ 21.1. Lista A Ide fine direktiva hasznlata
1 , 'define DemoVersion
2 : 'deHne OOS_VERSION 5
3 : 'include <iostream>
4 : int main ()
5 : {
6 : s td: : cou t 'CheckJng on t he dc f i ni t ione oC DemoVersion,
7 : 'DOS_VERSION {lnd WI NOOWS_ VERSION .. . \ n ";
B.
9 : *ifdef DemoVeraion
10 : std : : cout "DemoVersion defined . \n ';
11 : ~ l s II DemoVeraion
12 : std :: cout ' OCmoVersion not defi ned . \n ";
13 : Icndif /1 DemoVersion
H ,
15 : 'iEndef DOS_VERSTaN
16 : std :: cout "DOS_VERSION not de(ined! \n";
17 : "else II DOS_VERSION
l B: s td: : cout " DOS_VERSI ON dcfined "'S : "
19 : DOS_VERSION s t d :: cmU;
20 : ncnd if II DOS_VERSION
21 :
22 : li f def WINDOWS_VERSION
23 : std : : cout "WINOOWS_VERSION defined! \n" ;
24 : 'else II WINDOWS_VERSTON
25 : std: : cout 'WINDOWS_VERSION w",s not defined . \n" ;
26 : 'endif II WINDOWS_VERSION
27 :
28 : std : : cout "Donc . \n' ;
29 : rct urn O;
30 :
Check ing on Ule definitions o f DemoVersion,
OOS_VERSION a nd WINDOWS_VERSION ...
DcmoVers ion defined
OOS_VERSION defincd as : 5
WINOOWS_VERSION was not definc d .
Done.
21. 6ra Az
Az 1. s 2. sorokban definiltuk a DemoVersion s a OOS_VERSION Lokeneket. Kzlk
a nket is kapott CS). A 9. sorban az elfeldolgoz6val megvizsglt3ljuk,
definilva van-e a DemoVersion. Br ehhez a tokenhez nem tartozik rtk, .tzrt szere-
pel az bels6 tblz.ttban, teht a vizsglat logikai igazra rtkel6dik ki.
Ennek hatsra a 10. sor bekerl .. k6db .. , vagyis a kpernyre ki fog r6dni a megfele-
szveg.
A 15. sorban a DOS_VERSI ON dcOniltsgt, pontosabban annak hinyt vil'_<;gljuk. Mi-
vel az szmra. a OOS_VERSION token is definil t, ezrt a teszt rtke ha-
mis, ami azt jelenti, hogy nem a 16., hanem a 18. sor kerl bele a Icfordtand kdba.
Ht a DOS_VERSION helyre egyben behelycucst6dik az; rtk, vagyis a fordtprog-
ram vgl a kvetkez/'} kdsol1. fogja ltni:
cout 'OOS_VERSION defined as : 5 Gnd!;
Figyeljk meg, hogya DOS_VERSION else; az rintetlenl
hagyja, mivel az kztt szerepel a k6dban. C.<;ak a msodik
OOS_VERSION . ulnik el ", illelve kenU be helyre a ltk. Maga a fordtprog-
ra m teht ebben ;1 sorban mar csak az S-s szmot fogja llni ugyangy, mintha azt mi
gpeltk volna be a megfelel6 helyre.
Vgezetl a 22. sorban az el6feJdolgoz6 megvizsgJja a WINDOWS_VERSION token defi-
ni ltsgt. Mivel :IZ ezt megel6z6 kdban sehol nem szerepelt a
' dcfine WINDOWS_VERSION
sor, ezrt ez a token az szmra ismeretlen, nem definilt. A vizsglat
vgeredmnye gy logikai hamis, vagyis a lefordtand6 kdba nem a 23. hanem a 25.
sor kenil majd be.
Beszrs s annak vezrlse
Egy projekt {t lt alban szmos forrsfj lb6l ll. Alapvet6en sokflekppen lehet szervez-
ni egy kd szerkezctt, de objektum-orientlt tervezsnl az egyik legkzenfekv6bb
mdszer az, ha minden egyes osztlynak van egy sajt fejlcllom5nya C. hpp), benne
az oszL'ly deklarci6jval , s egy a konkrt megval6stsltanalmaz . cpp llomnya,
ami a tartalmazza.
A mai n () filggvnyt szintn egy nll. cpp llomny tarta lmazza. A ford-
ts sorn aztn valamennyi. cpp fjlb61 kszl egy trgyk6d llomny C. obj), ame-
lyeket vgl a linker sszeszerkeszt egyetlen funathat programm.
408 1 VI. rsz Klnlegessgek
Mivel a programok tbbsge s7.mos osztlyt hasznl, szmos helyen kell
a kdba beszrni az ezek deklarcijt L,1rtalmaz6 fejlcllomnyokat. Emellett az sem
ritka, hogyafejlcllomnyok egymsra hivatkoznak, vagyis egymst tltik be. lia pl-
dul van egy szrmaztatott osztlyunk, s ehhez tartozik egy kln fejlcllomny, ak-
kor ennek nyilvnvalan be kell emel ni e az alaposztMy fejlc ll omnyit is.
Kpzeljk el, hogy az AnimaI osztly deklarcij( az ANIMAL . HPP fjl tartalmaz-
za. A Dog osztlyt az AnimaI osztlybl szrmazt:ltjuk, ezrt a JX)G. HPP-nek be kell
szmia az ANIMAL. HPP-l is, Iliszen az tartalmazza az alaposzlllyal kapcso1:l1os inform-
cikaL Tegyk fel , hogy ltrchozunk egy eae osztlyt is, amelynek alaposztlya szintn
az Anima! oszt .. 'ly, vagyis a CAT . HPP-ben is szerepelnic kcll cb')' az ANIMAL. HPP-l be-
s7.r parancsnak. MrmOSI ha nmk egy olyan metdlIst, amely egyszerre hasl.nl C6t
s Dog tpus objekl'Umokat, akkor az ezt tartalmaz k6dnak egyarnt be kell emelnie
II CAT . HPP-t, s a rxx; . HPP-t, ami viszont azzal jr, hogya kztes k6dllnkban k6tSZt:r fog
szerepelni az ANIMAL. HPP t:1rt<1IIl1<l.
A helyzet teht rdekes, hiszen erre fordtsi hibt kell kapnunk, mivel nem deklarl-
ha\'unk egy oszt{llyt - jelen esetben az l'Inimal-L- ktszer, mg akkor sem, ha a k(:t
deklarci egybknt mindenben megegyezik. EZl a gy kerlhetjk meg,
ha vezreljk a fejlcl lJ omnyok beszrst Onclusion guards).
A mdszer egszen egyszen1. Szrjuk be az ANIMAL. Hpp elejre, illetve vgre a k-
sorokat:
ANIMAL_HPP
*define hNIMl'IL_HPP
... II ide jOn a fejlcllomny telj es tartalma

Ez a kdrszlet az szmra a jelenti: az ANTMAL.-HPP token
nem meghatrozoti, akkor tegyi.ik nz, amgy pedig mehetnk tovbb a
A Idefine s az lendif kztt szerepel a fej lc-.llomny teljes tartalma.
Amikor progmmunk els6 alkalommal be a fenti fejlcllomnyt, az
elolvassa az SOlt, amely igazra rtkelcJik ki, hiszen az ANlMAL_HPP token mg
soha nem szerepelt. Ennek a feldolgozs halad tovbb, a k6clba bekerl
a fej J6dll omny tel jes t:l l' talma, mellesleg pedig meghatrozott vlik az ANIMll.L_ HPP.
Amikor msodik alkalonuml pr6bljuk meg heszrni ugyanezt a fj lt, az
megint elolvassa az els6 son. Ekkor azonban a felttel mr hamis lesz, hiszeo
ANtMAL_ HPP- t az alkalommal definiltuk. Ennek megfelel6en az
elkezdi keresni a lIelse direktvt (jelen esetben nincs ilyen) vagy a kvet-
fiendif-ct (ez esetnkben egyben a fjl vge), s addig a pontig mindent kihagy.
Ez konkrtan azt jt!lenti, hogy gyakorlatilag nem tnnik senuni, hiszen a fej lcllo-
mny teljes tartaimt kihagyjuk, vagyis br kLo;zer szerepelt II kdban az AnimaI osz-
tly dekl arcijt tartalmaz rszlet beszrsa, mgsem keletkezik szintakti kai hiba.
21.ra -
A kdban szercpl6 szimblum neve CANH1AL_HPP) amgy teljesen lnyegtelen, de
az ltalnosan bevett szoksok szerint megegyezik a fejlcllomny nevvel h'Y, hogy
azt csupa rjuk, s a pontot Iccserljk alhzs karakterre. Hang5lyoz-
zuk, hogy ez csupn konvenci, nem a nyelv ltal tmasztott kvetelmny.
Tudta hogy ... ?
A beszrsi direktfvk vdelme
A fent bemutatott vdelmi mdszernek semmifle nincs. Hasz
nljuk teht btran, mivel bizonyos esetekben sok rnyi hibakeresst sprolhatunk
meg vele.
Szimblumok definilsa a parancssorban
Csaknem v:alamennyi C++ fordt Ichct6vI! teszi, hogy mindazt, amit a /ldefi ne direkt-
V'I s(!gts(;gvel magban a k6dhan dcfini:t1n{l11k, megadhassuk a par.Jncssorb:lll, vagy
az intcgr.lt rejleszt6i krnyezeten keresztl is. Ha teht a gy kvnja,
a 21. 1. Uslbl akr ki is hagyhatjuk az 1. s a 2. sort," DcmoVersion s a OOS_VE:R
SION szimblumokat pedig bizonyos fordtsoknl meg:ldhatjuk a parancs.'.orban, mg
ms esetekben simn kihagyhatjuk 6ket.
A programozk krben teljesen :'ihalno.'ian alkalmazott munkundszer:lZ, hogy
a nyomkvetshez hasznlt k6drszletckct fi fdef DEBUG s lendif direktvk kz
majd amikor nyomkvetst akarnak vgezni, akkor fOfclt{\skor a parancssorban
megadjk ezt a szimb6l u111QL. Ez rcndkvl s knyelmes mdszer :lml, hogy
a nyomkvetsi rszeket egyetlen mozdulattal kihagyhassuk al efordtott kdbl, de
eseln azonnal 6ket. Ha a vgs6 kdot fordtjuk, egy-
ki kell hagyni a param:ssorbl a DEBUG meghatrozst s ksz.
A meghatrozottsg megszntetse
Ha korbban meghatroztunk egy szimb6lumot, de a kd rszben trlni
szerelnnk azt, akkor hasznlhat juk az lIundef direktv;t. Ez egyszcren a "define el-
lentte, vagyis trli az bels6 tblzatbl a krdses tokent.
Feltteles fordfts
A Itdefi ne s a parancssori dcfincik, valamint az hfdef, "eJse s IIHndef direkt-
vk segtsgve l olyan kxlOl rhanmk, amdynek egyes darabjai att] kerlnek
bele alefordtott progmmban, hogy ppen nillyen IIdefine direktvk szerepelnek ben-
ne, vagyis melyek az aktulisan meghatrozott szimblumok. Ezt a lehet6sget felhasz-
409
nlhatjuk pldul egy olyan program fejlesztse sorn, amelynek kt platfor-
mon, pldul DOS s Windows alatt is keH, de nyilvn msknl. gy nem keU
kl kln kdoL ka rbantartanunk, elg egyetlen kdbzisra pteni a projektet.
A feltteles fordts msik nagy felhasznlsi terlete a nyomkvets, amikor a mr ko-
rbban emltett OEBUG szimblum meghatrozottsgt vizsgljuk a ponto-
kon. Errol a mdszerr61 amgy hamarosan is ejtnk mg szt az assert ()
kapcsn.
Makrknt megvalstott fggvnyek
A Itdcfi ne direktv{lt gynevezett mak.rfggvnyek megadsra is felhaszn1ilhatjuk.
A makr6fggvny olyan az elf"e1dolgoz ltal rtelmezett nyelvi konstl1.lkd, amely
form:lilag a fggv(:nyekllez teljesen hasonlan kpes argumentumokat fogadni. Ebben
az esetben persze a behdyettestf!st az vgzi el, a p:lrarnterek pedig ter-
mszetesen mindig karakterlncok. Nzznk taln egy pldt, ami rvilgt a dolog l-
nyegre. Definiljunk egy olyan TWICE nevl m3krfggvnyt, amely egy 1llegszoroz
egy szmot kelt6vel:
TWICE(x) ( (x) * 2 )
EZl :IZ j nyelvi konstrukcit megadsa utn a kdban a haslnlhatjuk:
TWICE(4)
Az ebben az esetben a TWICE (4) karakterlncot el fogja tvoltani a for-
rskdbl s kicserli 8-ra. Ez kiss rszletesebben gy trtnik, hogya behelyettests
eredmnyeknt ( (4) * 2 ) kdot az el6feldolgoz6 ki is nkeli , s ennek
az eredmnye keJiIl a makrfggvny hvsnak helyre.
Egy makrnak termszetesen egynl tbb paramtere is lehet, s brmely paramtert
egynl tbbszr is felhasznlhatunk az mivelet ler(lsa sorn. A kt taln
leggY'lkrabban hasznlt tbbparamteres makr, a MAX s a MI N defincija pldul
... kvetkcz6kppen fest:
#def i ne MAX(x,y) (x) > (y) ? (x) (y)
MIN(x,y) ( (x) "" (y) ? (x) (y)
gyeljnk r:, hogya makrdcfindkban a paramtereket krlzr zrjel pr nyit
tagjnak kzvetlenl a makr neve utn kell kvetkeznie, nem lehet kztk szkz.
ltalban is igaz, hogy az sokkal kevsb megbocst a flsleges res
karakterekkel kapcsolatban, mint a fordtprogram.
Lssuk, mi trtnik, ha megfeledkeznk
Ildefine MAX (x , y) ( (x) > (y ) ? (x) : (y ) )
Pr6bljuk csak ki, mit tud a MAX makrnak ez a vltozata:
int x = 5, Y = 7, Z;
z = M!\X(x,y);
21. ra I I
A fenti k6drszletct az ebben az esetben a ala ltja t:
int x = 5 . Y = 7 . z;
z .". ( x,y ) ( ( x ) > (y ) ? ( x ) , (y ) ) ( x,y )
Lthat, hogy a flsleges szkz miatt kznsges szvegbchdyettests trtnt
a makr6fID,>vny rtelmezse helyett. Az teht gy gondolta, hogy van
a MAX szimblum, amit a (x,y ) ( (x) > (y ) ? (x ) : (y) ) szveggel kell he-
Iyettestenic, hiszen ez szerepelt a definciban. s a maga mdjn igaza volt...
J Ja ellenben kivesszk azt a bizonyos extra szkzt, akkor a kztes kd a
kppen fest:
int x 5 , Y 7, Z;
z ". 7;
Mi ez a rengeteg zrjel?
Az olvas bizonyra <:!ksodlkozott non, mit keres az a rengeteg, mer6ben flsleges-
nek nn6 zrjel az eddig bemutatott makr6kban. Mag'l ,IZ ugyan nem
kveteli meg ezeknck a kirst, ugyanakkor szmos potencilis hibt kerlhetnk el
az1hal, ha mindent, az utols rszlctig akkur1nls.1n bez1r6jelezilnk. Effle nem vrt
mel1khatSOk ltalban akkor bukkannak fel, ha nem egyszeru szmokat vagy vlto-
zkat adunk t paramterknt a makrknak, hanem sszetettebb kifejezseket. A dol-
got megint egy pldn lehel igazn jl szemlltelni. Vegyk a mr ltott MliX makr6mlk
egy "zr6jelmentes1tett" v ltozatt, s nzzk m<:!&, hogyan mLTkc!ik:
Idefine MAX (x, y) x > y ? x : y
Ha parnmlerknt az S s 7 rtkeket adjuk l neki, minden a legnagyobb rendben. De
ha valami sszetettebb kifejezssel prblkozllnk, rgln rdekes dolgok lrtnnek,
Ezt szemllteti a 21.2. Lista.
21.2. Ulta - Mirt hasznlunk annyi zrjelet 8 makrkban .. , (usingparen,cpp)
o: 1/ 21. 2 Lista Makr6k kifejtse
1: .include <iost r cam>
2 ,
3 : CUBE(a) ( (a) .. (a) .. (a) )
4, #def ine THREE( a ) a .. a .. a
S,
: int mai n ()
7 , {
8 : long x = 5;
411
rsz
9 , long y
"
CUBE(x) ;
10: long
,
THREE(x) ;
ll :
12 : std : : cout
.y : y std: : end1 ;
13 : std : : cout z:
,
std: : endl;
14 :
l S : long
,
"
5 , b
"
7 ,
16: y CUBE(a .. bj ;
17 :
,
"
THREE(a+b) ;
18 :
19 : std : : cout
.y:
y std : : end1;
20 : std : : cout "z :
,
std: :end1;
21 : return 0,
22 :
Kimenet
y , 125
z : 125
y ,
1728
"
82
A 3. sorban cld"inilunk egy CUBE (kb) nevt1 makr6l, amelynl az a paramlen annak
minden egyes 711rjeibe tesszk. A 4. sorban llhat THREE makr6nl-
amely htsz61ag ugyanazt l mQ'velelel hivatott elvgezni - nincsenek zrjelek.
A makrk hasznlatr demonstrl kdban az 5 rtket adjuk :'it
paramterknt, s amint az a kimenetbl ltszik, mOkdik is szpen.
A CUBE (5) kifejt<:se az ( (5) * (5) .. (5) ) karakterl nc lesz, ami kiss pongyol-
nak runik, de az eredmnye ktsgkvl 125, ami helyes. A THREE (5) kifejtse ezzel
szemben egyszeruen 5 * 5 .. 5, ami szp, egyszeru, s szintn 125 az eredmnye.
s akkor jn a meglepets. A 15-17 sorokban paramterknt az 5 + 7 kifejezSI hasz-
nljuk. Ebben az esetben CUBE(5 + 7) kifejtse a kvetkez61csz:
( (5+7 ) * (5+7) * (5+7) )
EZl kicsit tovbb a.1aklva a kapjuk:
( (12) * (12) (12) )
Az eredmny pedig termszetesen 1728, amint az vrhat is. Lssuk, hogy teljest a m-
sik makr ugyanebben a sziruciban. A THREE (5 + 7) az munkjnak
eredmnyeknt a kvetkez6v vltozik:
5 + 7 * 5 + 7 * 5 + 7
21. ra
Mivel a szorzs magasabb precedencij mIlvelet, mint az sszeads, a fenti kifejezs
a
5 + (7 .. 5) -I- (7 .. 5) + 7
Ezt tovbb alaktva a jutunk:
5 t (35) + (35) + 7
Az eredmny 82, ami a sz6 egy bizonyos rt elmben ht'lyes ugy;m, de egyltaln nem
ezt vrtuk a makrtl. Nos, ezrt kell oda az a rengeteg zrjel.
Makrk, fggvnyek, sablonok
A CH rmkrival van nhny (sszesen ngy) problma, is a nagyobb d,u" .... bo-
km meglehet6sen ne hz vi sszafejteni, mivel minden makr denncijnak egyetlen sor-
ban kell szerepelnie. A backslash (\) karakwrrel ugyan beikWthaturlk sortrst, de
az igaJ' _:U megvallva ez nem sokat haszml. Akrmit tesznk, a nagyobb makrk egysze-
ruen nehz karb:mtartani.
A msik problmt a l1lakr6k mllkdsi logikja jelenti. A makr6kat :lZ
rtelmezi, vagyis az ltaluk helyettestsi nlliveletek mindannyiszor leflltnak, va-
lahr'yszor a makr6 felbukkan il k6db;U1. [la 12-szer haSzn{t[lI11k valamit, akkor
az l2-szer fogja "lefuttatni a m,lkrt, szemben ;I Z igazi fggvnyekkel,
amelyeknl csak egy hiv:ilkozs kerl a kdba. Ugyanakkor az is igaz, hogy a makrk
ltalba n gyorsabbak, mint a fOggvnyek, hiszen segtsgkkel a lefordtott kdban cl-
kerljk a fggvnyhvssal jr lbbletmunk:'it.
A feldolgozs mdjbl addik a harmadik problma is: maguk II makrk a kztes
kdba n mr nem szerepelnek, azokkal a fordtprogram egy:'iltal:'in nem tallkozik. Eb-
b6l kvetkez61eg a legtbb sem. I (a teht hibakeress sorn egy makfra
gyanakszunk, mindenrle krmnfont trkkket kell alkalmaznunk.
A legnagyobb problmI a vgre hagytam: a makrk nem tpusbizrosak. Egyrszr61
nagyon knyelmes, hogy egy makr6nak brmit tadhanmk par<Hnterkm, msrszt vi-
szont nagyon veszlyes is. Ez a szolgltats gyakorlatilag tkletesen alssa a C++
nyjtotta er6s tipizlst, gy a programozk ki is tkoztk. A megoldst a sablonok
hasznlata jelenti, a 23. rban lesz majd sz.
413
414 V1.r,,' ..
Karakterlncok kezelse
Az elfeklolgoz6 kt olyan specilis opertort bocst a rendelkezsnkre, amelyekkel
a m .. kr6kban felbukkan karakterlncokat lehet feldolgozni. A szvcgg(: alakt
Cstringi zing) opertor (I) akrnti is kvetkezik utna, azt kzt: zrt karakter-
lncc al aktja. Az opertor Cconcatenation operator; III) nevnek megfele16-
en kt karakterlncOl ch'Ycst.
A szvegg alakrt (stringizing) opertor
A szvegg/! alakt (slringizing) opertor, vagyis a ... gy hogy :IZ utna
velkez() szvegel - legyen az brmi - kz teszi, egszen a res
kanlkLc.:rig. ]-Ia teht ;l rjuk:
Idefinc WRITESTRING(x) cout #x
majd meghvj uk ezt rt lllakr61:
WRITESTRING(Thio io a string) ;
akkor az a kztes kdot fogja
cout "Thi s is a string" ;
Figyeljk meg, hogya fordtnak tadou k6dba a karaklerlnc (This is a string)
mr kett6!'i kztt szerepel, ahogy azt a cout megkveteli.
Az opertor
Az opertor (concatenalion operalor; II H) lehet6v teszi, hogy kl vagy tbb
karakterlncot egy j sz6v ssze. Az j sz a fordt szmra valjban egy
token lesz, ami t ks6bb hasznlhatunk egy osztly vagy v{jltoz6 nevekm, egy tmb
cmzsekor eltolsi rtkknt, vagy brmely olyan szitud6ban, amikor betl.1k sorozatt
v,hja a fordtprogram.
Tl:gyk fel pldul, hogy van t fggvnynk, amelyek:!l a kvetkez6kppen hvnak:
fQnePrint, TwoPrint, fThreePrint, fFourPrint, s f FivePrint . Ezek hasznla-
tl egyszcn1stcnd6 ltrehozhat juk a makr6l:
fdefine fPRINT(x) f 1111 x U Print
Ha ks6bb szksgnk van mondjuk az fTwoPrint fggvnyre, :Ikkor aZl
a fPRINT(Two) formban is meghvhatjuk. Teljesen hasonlan a fpRINT(Three)
forma a fThreePrint fggvnynvvellesz
21. ra
A 19. rban a lncolt listk kapcsn ltrehoztunk egy Pa rtsList osztlyt. En-
nek l listnak kiz rlag Li s t tpus elemei lehelnek. Tegyiik fel , hogy ez a mcbzer
valamilyen programmal kapcsolatban kivlan bevlik, s a sikeren szeret-
nnk ltreho7.0i llatok, autk, vagy szmtgpek listit is. Ez egyik megolds ilyenkor
az, hogy l kdrszletek szolgai tmsolsva! ltrehozzuk az Ani malLi s t ,
CarList vagy Comput e r"Lis t nevl1 osztlyokat is. Ez ugyan egyszen1nek tl1n-
het, de ha karban kell tartani a kdot, igencsak fjni fog a fejnk, hiszen brhol is ve-
zelnk be valamilyen mdostst, azt t kell vczctnnk az sszes tbbi helyre is. Sok-
kal elegnsabb s persze hatkonyabb is, ha makrkat s az sszeftzs ope-
rtort hasznljuk. me egy lehetsges megolds:
Rdefine Listof(Typel class Type'.List \
( \
public , \
\
private : \
int i tsLength; \
"
A fel1ti plda termszetesen kiss er6ltetett, hiszen leginkbb pcdaggiai clokat szol-
gi, m l lnyeg vilgos.111Itszik: ;I megfelel6 helyre beemeljOk :IZ sszes adatot s
metdusl. Ha magval a makrval kszen vagyunk, az AnimalList osztlyt eb'Yszeru-
en a hozhat juk ltre:
Listot (Animal )
Brmennyire ez az egyetlen sor az munkja nyomfl n talakul
az An:. mal List oSltly teljes deklart'lcijv. Persze azrt van problma is ezzel
a megkzt!ltssel , azonban majd a 23. rban lesz sz6 a sablonok k:lpcs.'n.
meghatrozott makrk
Szmos fordtprogram eleve tartalmaz nhny tucat ltalnosan hasznlt makr6l. Jlyen
pldul a _DATE_, a _TI ME_, a _ LINE_, s a _ FILE_. Minden ilyen makr6
ell s htul kt-kt alhzsjel hatrolja, amire csupn van szksg, hogy
ezzel minimlisra cskkentsk a felhasznl {Iltal definilt makrkkal val nvtkzs

Amikor az egy ilyen makrvaltallkozik, automatikusan elvgzi a szk-
sge.,; hclyeuestseket. A _ DATE_ hatsra pldul behelyeuesti az aktulis dtu-
mot, a _ TIME_ helyre pedig beszrja az A _ LINE_ s a _ FILE_ az akru-
lis sor szmt, illetve a forrsfjl nevt jelenti. gyeljnk r, hogy ezeket a makr6kat-
mint nlinden ms makrt - az kezeli, vagyis az rtkek a fordtsra s
nem a lefordtott program futtatsra vonatkoznak. Ha teht valahova bcszrjuk
415
rsz
a _DATE_ segtsgvel az dtumot, akkor az a fordts dtuma lesz, nem pedig az az
amikor a progr.ullot futtat juk. Ezeknek abepten makrknak ltalban a hi-
hakeress sorn vehetjk nagy hasznL
Az assertO bepftett makr
S7..3mos fordtprogram rendelkezik eb')' assert () nevtl deHnilt makrvaL
Az assert () viszonylag egyszeru: igaz rtket ad vissza, ha a neki param-
Lerkm tadou kifejezs igazra rtkel&lik ki, s vagy vgrehajtja a megadott urastssol1,
ha nem. A fordl6programok ezen a ponton eltr6 lehet. Szmos program
megll, ha egyassert () makr hamisf'J. ki. Msok csupn kivtelt dobnak
ilyenkor. CA kivtelekr61 s a hibk kezelsr61 majd a 24. rban lesz sz.) Az assert ()
makr egyik hasznos tulajdonsga, hogy al: el6fddolgoz Leljesen figyelmen kvl hagyja
il vele kapcsolatot kdol, ha ti DEBUG token nem def"iniftlt. Amg fejlesztjk a kdot, a le-
fordtott progmmb:m vgig benne lehetnek azok a rszk:Lck, amelyek a
gtik. Ugyanakkor nyilv{m rtelmetlen volna ezeket a programban is benne
hiszen az gy nagyobb s lassbb lenne. Ha az a!:l!:lert () -ct hasznltuk, a hi1:mkeress-
hez hasznlt k6dok egyetlen mozdulattal eltvolthat6k a bin:risbL
Termszetesen nem ktelez6 a fordt6progmm ltal felknft lt assert () makr6ra t
maszkodni. Megrhatjuk akr a sajt vltozatunkat is. A 21. 3. Lista egy ilyen egyedi - vi-
szonylag - assert () megoldsra nllltat pl: ld{ll.
12.3. Usta - Egyegyszertl assenI) makr megvalsftsa (simple8ssen.cpp)
o: /1 21 . 3. ListA 11.2 Assert() makr6
1 : #define DF.BUG
2 : linclude <iostream>
3 ,
4 : lifndef DEBUG
5 : Idefine ASSERT{x)
6 : 8else
7 : *define ASSERT{x) \
8 : H (! (x) \
9 : ( \
10 : std: : cQu t 'ERROR l ! Assert ' Ix " fai l ed\n'; \
11 : std:: cQu t on li ne _L! NE_ "\n" ; \
12 : std:: CQut in fi l c ' _FILE_ "\n' ; \
13 :
14 : lendit
15,
16: int main()
17 :
18 : int x 5 ;
19, 5td,:cQut 'First assert : \ n';
20 : ASSERT{x==5) ;
21 : 5td:: CQut ' \nSecond as sert : \n';
22 , ASSERT (x ! = 5) ;
23 : s td:: cout O\nDone . \n" ;
24 , r eturn O;
25 :
Figyeleml

21. ra
Egyes fordtprogramok a 21.3. lista 1-13 sorait tbb sorra darabolhat jk. Ilyenkor
ki kell trlnnk a kdbl a sortrseket, msknt nem tudjuk lefordtani. A probl-
mt amgy az okozza, hogy a opercis rendszerek, krnyaze-
tek s fordtprogramok karaktereket hasznlnak a sor vgnek jells-
re (..jsar karakte(), ami aztn a fentihez hasonl rtelmezsi gondokkal jrhat.
Aprop
Egysoros makr6k
A makrk kdjnak a sz mszaki rtelmben nem kell egy sorra korltozdnia.
A 1-13 sorokban lthat kd pldul inden ktsget kizran tbb soros, mgis
egyetlen makrt r le. Ez gy lehetsges, hogy minden sor vgn ott van egy
backslash N karakter is, amely elrejti az egybknt fizikailag jsor karak
tert, s a sorok sszefzsre utasftja az
gyeljnk r, hogy egy backslash segftsgvel csak egy jsor karaktert lehet .ha-
vagyis ez azon kevs szitucik egyike, amikor az egymst
res karakterek szmnak van.
menet
First assert :
Second assert :
ERROR !! Assert xl .. 5 flIIiled
on line 24
in file E:\adisk\cppin24 new\Hour21\simpleassert . cpp
Az sorban definiljuk a DEBUG szimblumot. Ea amgy megtehetjOk n pnranessor-
bl vagy az integrlt fejleszt6i krnyezet seglsgvel is, ami sokak szmm egysze-
mdja a nyomkvets ki- illetve bekapcsolsnak. Az assert () makr mcghat-
roz.st a 7-13 sorok tartalmazzk. Az ilyesmit ltalban egy fejlcllomnyba szoks
helyezni, amit esetnkben bizonyra ASSERT . HPP-nek neveznnk s a po n-
lon beszrnnk a forrsfjIokba.
A 4. sorban megvizsgljuk, hogy definilt-e a DEBUG szimblum. Ha nem, akkor
az assert () nem hoz ltre senunifle kdot. Ha azonban a DEBUG definilt llapotll ,
akkor a 7-13 sorokban ta llhat kd bekerl a fordtnak tadou fjlba.
418 VI. rsz'
Maga az assert () makr az .szmra tulajdonkppen egyellen nagyon
hossz par.mcs, amit jelen esetben hl rvidebb sorra trtnk az olvlIshatsg
rt. A 8. sorban megvizsgljuk egy paramterknt tadon kifejezs rtkr. Ha ennek
a kirtkelse hamis eredmnyt szolgltat, akkor II 10-12 sorokban lthat utastsokat
hajtjuk vgre, amelyek egy hibazenetet jelentcnek mcg. Ha ellenben a makr6nak t-
adolt kifejezs l1ke igaz, akkor semmi sem trtnik.
Nyomkvets az assertO makr segftsgvel
Mikzben runk egy programot, ott bell, mlyen II lelknkben s:dunos dologrl tud-
juk, hogy igaznak kell lennie. Egy fggvnynek az adon szitlllki6ban egy bizonyos r-
tkel kell egy mUlal6nak rvnyes dmCI kell tartalmaznia s gy tovbb.
Progr.m1()z{lsi hibr61 - tbbek kztt - akkor beszlnk, ha egy ilyen "alapigazsg" bi-
zonyos Il clyzlJtlJkben mgsem tel jesl. Pldul pontosan tudjuk, hogy egy 111uLat6nak
a rtkkcllwll rendelkeznie, a programunk mgis egy ezzel kapcso1:.nos hi-
bvallell. Az ilyen s ehhez hasonl 6 hibk 111egtallsban n:lgy segt.sgnkre lehet
az assert () mllkr6, de csak akkor, ha gyakran s :l szabadsggal
hasznljuk az ltalunk fejleszten kdban. Pldul valahnyszor rtkel adunk egy nlU-
tat6nak, vagy paramterknt tadjuk azt egy fggvnynek, le
az assert () segL'igve::l, hogy az rtke val6ban rvnyes-e. Ki csit ltalnosabban
fogalmazva vabllnyszor olyan he::lyzetet ltunk, amikor programunk egy
adott v ltoz6 adon fgg, ellen6ri;>;zk le az assert (l-lel , hogy valhan az
nk v:m-e abban a vltozban.
Semmifle kros kvetkezmnye nincs annak, ha az assert () makrot gyakran hasz-
nljuk. Ha kikapcsoljuk a nyomkvetst (vagyis nem definiljuk a DEBUG szimb6Ju-
mot), vabmennyi, az assert () -tel kapcsolatos kd a progr-.Jmbl, mintha on
se lett vol n:l. A hibakeress mellett az assert () ki fejezsei a kd egyfajta dokumcn:...
h'isM is jelentik, hiszen a karbantartst pontosan [{nhatja, hogy mely pontokon
mirc kell .lgyelnie.
A makr6k mellkhatsai
gyakori m kiss paranormli snak jelensg, hogy egy hib
csak akkor jck:ntkczik, ha eltvoltoll uk a lefordtott az assert () makrkh.
kllpcsolmos kifejezl!sekel. Ennek csaknem mindig az az oka, hogya programunk
kclse nem s7,.ndkosan ugyan, de fgg az assert () makrok ltal vgrehajtott m ..>
veletek, vagy brmilyen ms, hibakeresshez hasznlt kdrszletek mellkhatsait(
Nzznk egy pldt:
ASSER'J' (x - 5)
21. 6ra Az
lu szinte bizonyosan azt akartuk ellen6rizni, hogy x rtke valban 5, vagy valami ms
(x == 5). Ehelyett elkvettnk egy bosszant hibt, hiszen az tt rtkOl adtuk a vl-
toznak, vagyis mg ha eddig nem is 5 volt az rtke, most mr az. Tegyk fel, hogy
kzvetlenl ez az assert () e16tt volt egy fggvnyhfvs, ami valamilyen hibs
mCikds folytn nullra lltotta x rtkt. Az assert () kdj[lban sajnos :tmenetileg
kikszbljk ezt a csorbt, hislen visszallt juk az 5-s rtket. Mi vel pedig az rtk-
adsnak is van visszatrsi rtke, mgpedig maga az rtk, ezrt az x = 5 kifejezs
nem csak belltja x rtkt, hanem az assert () -nek is visszaadja azt. Mivel az 5 mint
visszatrsi rtk nem nulla, ezrt logikai igaznak felel meg, vagyis az assert () azt lt-
ja, hogy - az am6gy teljesen hilsan megfogalmazott - felttel teljeslt. sszessgben
teht elkvettnk kzvetlenl egyms utn kl olyan hibt, amelyek hatsai kiejtettk
egymst. Az x vlt07.6 rtke 5 (nan, hiszen mi lltottuk be), teht a program tklete-
sen mCikdik, egszen addig, amg be van kapcsolva a nyomkvets. Aztn amikor elr-
keznk a kibocstshoz, amikor kikapcsoJjuk a hi bakeressl, jn :l meglepets.
Most, hogy az ass ert () k6dja mr nem kenU bele a lefordtott ll omnyba, nincs tb-
b semmi, ami x rtkl 5-re vltoztam. A hibs fggvny viszont, ami x rtkt nul-
lzza ottmarad, teht progmmunk hibsan fog EZI konstmJva lennl'slete.';en
viss7.akapcsoljuk a 11yomkvetst, amire a hiba ... Ez az a dolog, amin j6t derl
az ember, ha tudja, mir61 van SZ, dc sirni tudna ha knytelen meglni.
Legynk leht vatosak a nyomkvetshez hasznlt k6c:lok mellkhatsaiv;J1. Ha pedig
olyan jelensget tallunk, amely kizrlag bekapcsolt nyomkvets mellett bukk:m fel,
az h'Yan(lsIOIt maga a nyomkvetshez haszn:'ilt kd legyen. Vizsgljuk meg, hol
lehet az a bizonyos f-urfangos mellkhat.s ..
Aprop
Mellkhatsok nagyon sok makr6han felhukkanhalnakl
Amint azt a 21.2 Lista 16. s 17. sorban lthattuk, makr6kat nem csak egyes vl
tozkkal vagy rtkekkel, hanem egszen sszetett kifejezsekkel kapcsolatban is
meghvhatunk. (Ilyen trtnik pldul az adott kd 9. s 10. sorban.) Ha azonban
ez az sszetett kd mdosftja egyes vltozk rtkt, annak nem vrt mellkhatsai
lehetnek. Tegyk fel pldul, hogya CUBE makrt az aH kifejezssel hIvjuk meg:
y = CUBE (aH);
Al ember ezt a sort olvasva gy gondoln, hogy a rtke csupn eggyel lesz na-
gyobb a makr kdjnak vgrehajtsa utn. Ez azonban nem Igy van, mgpedig
azrt nem, mert ilyenkor a makr a kvetkez kdd alakul az elfeldolgoz munk-
ja nyomn:
( (d++) " (a++) * (a++) )
Ez pedig bizony nem egy, hanem hrom inkrementlst tartalmaz, vagyis egyltaln
nem az trtnik, amire a kd olvastn szmItunk.
410 I VI. rsz Klnlegessgek
Osztlyinvarinsok
A legtbb oszLlyhoz olyan logikai felttelek, amelyeknek igaznak kell
lennik, valahnyszor lefuttatl.lnk egy az osztlyhoz tartoz tagfggvnyt. Ezeket a fel -
ttteleket nevezzk osztlyinvarinsoknak (class invariant). Ha pldul van egy CI RCLE
osztlyunk, akkor ennek egy invarinsa lehet az a felttel, hogy a sugr nem le-
het nulla. Hasonl an val6szml, hogy egy az ANIMAL osztlyba tartoz objekrumn l
a kor (age) mindig nagyobb mint nulla, de kisebb, mint 100.
Az elmondottak miatt ltalban hasznos, ha minden ilyen osztlyon be1l ltrehozunk
egy olyan Invarinats () nevtl metdust, amely akkor s csak akkor ad vissza igaz r-
tket, ha valamennyi osztlyinvarins vizsglata igaz rtket szolgltat. Ha ugyanis van
ilyen met6dusunk, akkor megtehetjk, hogy minden egyes metdushvs li ut n
vgrehajtunk egy asse'Ct (Invariants ()) hvst, s ezzel hogy minden
rendbt.!n van-e. Ezzel:) mdszerrel termszetb61 ad6dan azonnal jl behatrolhat6
az esetleges hib:!. Van persze kt olyan sZitu5ci6, amikor megengedhet, Ilogy
az I nvari ants () metduli nem adjon vissza igaz nket::1 konstruktor, ill etve
a destruktor teljes lefutsa nem biztos, hogy :lZ adolt objckrum a megfelel6 lla-
potban van. Az Invariants () metdus hasznlatt a 21.4. Lista szemllteti egy megle-
trivilis felptSll osztllyaI kapcsolatban.
o: II 21 . 4. Li sta Oszt1yinvarinsok
l : #define DEBlJG
2: *define SHOW_INVARIANTS
3 : finclude <iostream>
4: tinc1ude <string . h>
S ,
6 : tifndef DEBUG
7 : tdefine ASSERT(x)
8 , 'else
9 : tdefine ASSERT(x) \
10 , if (! (x)) \
ll : ( \
12 : std: : cout "ERROR! ! Assert #x " f ailed\n' ; \
13 , std:: cout on line __ LINE __ " \n" ; \
14: std:: cout in file __ FILE __ \n' ; \
15 : )
16: tendif
17 :
18: class String
19 : (
20 : public :
21 : II Konstruktorok
22 : String () ;
23 : String(const char
24 : St ring (cont String &) ;
25 : -String() ;
26 :
27 : char & operator[1 (int offset) ;
28 : char operator [) ( int offset) const ;
29 :
30 : Stdng & operator= (const String &) ;
31 : int Ge t Len()const ( return itsLen; )
32 : const c har * GetSt ring() const ( return itsString; )
33 : bool Invariants () const ;
34 :
35 : privaLa :
36 : String (int) ; II private constructor
37 : char itsString;
38: unsigned short itsLen;
39 : ) l
40 :
41: II AZ alaprtelmezet t konstruktor ltrehoz egy csupa. O bjtbl 1l6
__ karakter l ncot
42: String : : String ( )
43: (
44 : itsString =: new char{l) ;
45 : itsString[OJ =: ' \0' ;
46 , itsLen",O;
47 : ASSERT(Invariants(j);
48: )
49 :
50: II Privt (kisegit6) konstruktor . Csak arra hasznljuk
51 : II hogy segitsgvel maqnak az osztlynak a met6dusai
52 : II ltrehozhassk a megfele16 m r t ~ karakterlncokat .
... Ez u t 6bbiekat nullkkal t lti f el .
53 : String : : String{i nt l en)
54 : (
55 : itsString = new char[len+1) ;
56 : for (int i '" O; i<=len ; i++)
57: itsString[iJ _ '\0';
58 : itsLen=len ;
59 : ASSERT(Invariants() ;
60 : J
61 :
62 : II K"lraktertOrnb tal akitsa String os ztlyba tartoz obj ektumrn
63 : String : : Str ing (const char * const cStr ing )
64 : (
65 : itsLen -' strlen{ cSt ring) ;
66 , it!lSt ring = new char[itsLen+1) ;
67 : for (int i = O; i<it sLen, i ++ )
68 : itsString[i) '" cString(i) ;
69 : itsString[itsLen]='\O' ;
70 : ASSERTtlnvariant.s() l ;
71 : l
72 :
73 : II Mso16 konstrukt or
74 : String : :String (const String & rhs l
75 : {
422 I VI. rsz
76 ,
77 : itsString :: new char(it.sLe n+ll;
78 : for ( int i = O; i<itsLen;i-H- )
79 : itsString[i] = rhs[i l;
80 : i tsString[itsLen] = ' \0 ';
81 : ASSER"{Invariants()) ;
82 : )
83 :
84 : II Destruktor : felszabad tja a dinamikusan lefoglalt memrit
85 , String :: String ()
86 , (
87 , ASSERT(Invariants();
88 : delete [l itsString;
89 : itsLen - O;
90 :
91 :
92 : II Az cgycn16sg opertornak tlterhelse. Felszabadtja a meg!ev6
93 : II 11lel1L6rit , majd lemsolja a karakterlncot s a mretet
94 : String& String :: operator=(cons t St ring & rhs)
95 : (
96 : lISSER"(Invariants();
97 : if (this :. ... &.rhs)
98 : retwrn *this;
99 : de!ete lj itsString ;
100 : itsLen."rhs .eetLen () ;
101 : itsString :: new char(itaLen+l] ;
102 : for (int i " O; i<itsLen; i++)
103 : i tsString [i]" rhs]il :
10<1: itsString[itsLenl - ' \0 ';
105 : ASSERT(I nvariants( ;
106 : return *th Ls ;
107 :
108 :
109 : 1/ Nem lland eltolsi (offset) opertor.
110 : II Egy karakter hivatkozsval tr vissza, amely igy rajta
lll : 1/ keresztl mdosithat .
112 : char & String: : operator]] (int offset)
113 : (
114 : ASSERT{Invariants( ;
115 : if (offset> itaLon)
116 : r eturn itsString [ i t sLen- ll;
117 : else
118 : return itsString [offset] :
119 : ASSERT(Invari a nts(;
120 : }
121 :
122 : II lland eltolsi (offset) opertor. Const objektumokkal
123 : II kapcsolatban hasznlhat (lsd a konstruktort!) .
124 : char String :: operator [] ( int offset) const
125 : {
126 : ASSERT(Invari ants () ) ;
127 : if (offsc:t > itsLen)
128 : return itsString [ i t sLen - 1 ] ;
129 : else
130 : return itsStr ing!offset] ;
131 : ASSERT(Invariants( ;
132 : }
133 :
134 , II Meggy6z6dnk rla, hogy vagy van a karakterlncnak rvnyes
135 : II hossza , i l l etve a mutat6 rt ke nem null , vagy hogy a hos s z is
.. s a mutat rt ke is nulla egyidejIlleg .
136 : bool String :: lnvariants(} const
131: {
138 : *i fdcf SHOW_INVARIANTS
139 : std:: cout String OK
140 : fendif
Hl : return ( (il::sLen 6o6o itsString) II (!itsLen 6o6o !itsString) ) ;
142 :
143 :
144 : class AnimaI
US :
146 : public :
147 : Animal{) : ltsAge(l),itsName('John Q. AnimaI')
148: (ASSERT(Invariants () } ;}
149: AnimaI (int, const String&);
150 : _Animall){}
151 : int GetAgel) ( ASSERT(Invariants() ; rcturn itsAgc;}
152 : void SetAge(int Age)
153, (
154 :
155 : itsAgc :: Age;
156, ASSERT(Invarianta();
157, J
158 , String&: Ge t Name I) ( ASSER'l' ( I nvariant s () ) ; return i t DName; )
159 : void SetNamelconst String& name)
160 , I
161 : ASSERT(Invariants();
162 : itsName _ name ;
163 : ASSERT(Invariantsl ;
164 : I
165 : bool Invariants () ;
166 : private :
167 : int itsAge;
168 , String itsName;
169 , );
170 :
171 , AnimaI : : Animallint age . const string& name) :
172 : itsAge(age) ,
173 : itsName (name)
174 : (
175 : ASSERT(Invariants()};
176 : )
177 :
178 : bool AnimaI :: I nvariant s ()
179 : {
180 : lifdef SHOW_tNVARIANTS
181 : std : : cout AnimaI OK
182 : !l end i!
424 1 VI. rsz Klnlegessgek
163 : return (itsAge > o && itsName.GetLen ( ;
184 :
185:
186 : int main ()
181 :
188: AnimaI sparlcy(S, 'Sparky');
189 : std: : cout "\n" sparky . GetName{) . GetString() is ";
190: std: :cout sparky.GetAge{) years old,";
191 : sparky.Set.Age(B) ;
192 : std : : cout "\n' .GetString() is ';
193: std: :cout sparky . GetAge{) years old,' ;
194 : roturn O:
195:
String
String OK
Sparky is
Sparky
OK String OK String OK String OK
OK AnimaI OK String OK
OK 5 years old. Anima!
6 years old . String
Stri ng
AnimaI
is Animal OK
String OK String OK
Anima I OK
OK AnimaI OR AnimaI OK
OK
Aprop6
A fordft6programt61 zeneteket kaphatunk
A fenti program fordtsa sorn az itt ltottakhoz hasonl figyetmeztet zeneteket
kaphatunk. Ezek azt tlftjk, hogy az assert () -tel kapcsolatos kdrszletek nme-
lyike soha nem kerl vgrehajtsra. Ez a kd teht ebben a formjban kiss fur-
csnak tnhet, de megfelel egy amgy szablynak: minden fggvny
elejn s vgn van benne egy assert () .
usinginvariants.cpp": W8066 Unreachablc code in function
String: :operator [] (int) at line 119
"usinginvariants.cpp : W8070 Function should rcturn a value
in function String :: operator [l (int.) at line 120
W8066 Unreachable code in function
String: : operator II (int) const at line 131
usinginvariants .cpp : W8070 Function should return a value
ln function St ring : : operator [ J (int.) const at line 132
Az assert () makr kdjt a 6-16 sorok tartalmazzk. Ha a DEBUG szimblum meg..
rozott, a makr6 hibazenetet jelent meg, ha a neki eadott kifejezs h<lmisra rtkel
ki. A 33. sorban talljuk <I String osztlyhoz cartoz Invariants () metdus
jt. A hozz lanmn definci a 136-142 sorokban lthat6. A konstruktor deldarnci.
a 22-24 sorokban lallhat, a 47. sorban pedig, miutn az objektum mr teljesen
meghvjuk az Invariants () metxlust, amel y ellen6rzi a folyamat helyessgL
21. ra
Ugyanez a minta ismll6dik meg a msik konstruktorral kapcsolatban is. A destruktor
ezzel szemben csak az el6tt hvja mcg az Iovarinals () metdust, micl6tt megkezden
az objektum lebontst. Az sszes tbbi, az osztlyhoz tartoz tHgfggvny futsnak
megkezdse s a m(iveletek befejezse utn is vgez, vagyis meg-
hvja az Invariant s () -t. Mindez jl demonstrlja a c++ egyik alapetvt:
a konSLruktoroktl s destruktoroktJ eltekintve a tagfggvnyek csak rvnyes llapot-
ban objektumokon m01<.dhetnek, s azokat rvnyes llapotban is kell hagyniuk.
A 165. sorban lthat al AnimaI osztly sajt Invariants () metdusnak deklarci-
ja, amelynek megvalstsa a "178-184 sorokban olvashat. Figyeljk meg, hogya 148,
ISI , 154, 156, 161, s 163 sorokban inline fggvnyek formjban hvjuk meg
az Invariant s() metdust.
Kztes rtkek kifratsa
Amellett, hogy az assert () makr segtsgvel bizonyos felttelek telje-
slst, nha szksg lehet arra is, hogy menet kzben megjelenl.sk egyes vltoz6k,
mUlatk vagy karnklerlncok aktulis tarl:llmt. Ezzel pldul nyomon kvethet{5 prog-
r,ununk vgrehajtsa, s kisztirhet6k olyan apr m bosszant hibk, mint az eggyel
tlfut ciklusok A mdszer a 21.5. Lista szemllteti.
21.5. Usta - rtkek kilratsa DEBUG mdban (printingvalu8s,cpp)
Q : / I 21 . 5 . rtkek kHrat.sa DEBUG mdban
1 : 'inc1ude <iost.ream>
2 : 'defi ne DEBUC
3 ,
4 : DEBUC
5 : #dcfine
6 : " else
7 : "def ine PRINT( x ) \
8 : std :: cout "x ": \t" x st.d :: endl :
9 : tendU
IQ :
lt : int mai n ()
12 :
13 : int. x " 5 ;
14: loog y 738981 ;
15 : PRI NT {x ) ;
16 : for (int i " O; i < x; i H)
17 : {
18 : PRI NT{ i ) :
19 : )
20:
21 : PRINT (y) ;
22: PRINT{'Hi . " ) ;
23 : i nt. " &x;
24: PRINT(px) ;
426 1 VI. rsz Klnlegessgek
25: PRINT (*px) ;
26: return O;
27 :
"
5
i: o
i: 1
i: 2
i : 3
i: 4
y. 73898
"HL", HL
px : 1245064
" px : 5
A 4-9 sorokban megadOll makr6 kirja a neki tadott p:lmmt:tcr nkt. Figyeljk meg.
hogya cout-nak tadou els6 dolog a paramter karakterestct[ (stringized) vltozata.
Ez teht aZt jelemi, hogy ha paramterknt mondjuk az x v,hoz6t admk l, akkor
a cout elszr egy 'x " kar,.lk((:!rJncot kap.
A couL param6tcrc minden esetben egy": \t" braklerlnc, :uni kir egy
kett6spontol, majd utna egy tabullort A harmadik maga a kirand v lloZ (jelen
esetben x), majd vgl egyendl, ami kirti a puffert s kir egy jsor karaktert.
A 24. sorban lthat kd vagy egy akimenetben bemutatotthoz hasonl rtket r ki
(ilyen a Borland fordtv:ll el6:'illrtot.l kd), vagy olyasmit mint a Ox2100 . Ennek a sor-
nak" teht fordtfgg6.
Nyomkvetsi szintek
A kifejezeuen nagy s sszetett fejlesztsi projekleknl az embernek ltalban tbh
a kapcsol:ltos ellen6rzsi lehet6sgre van szksge annl, mint ho;"\
a DEBUG szimb6lumot ki s bckapcsolhatja. Il yenkor megadhanIOk nyomkvetsi .;,
teket, s az el6feklolgoz6 ezek vizsglat.1 alapjn dntheti el, hogy a makrk kz
melyek kerljenek bele alefordtand kdba.
Ha nyomkvetsi szinteket akanmk meghatrozni, nincs ms dolgunk, mint a
utn megadni egy szmot is. Ha mr szinteket adunk meg, ltalban hasznos, ha ..
vetkez6 ngyet klnbztetjk meg: HIGH, MEDIUM, LOW s NONE. A 21.6. Lista a
21. ra
Listban bemutaloU String s AnimaI osztlyok kapcsn mutatja be a nyomkvelsi
szimek hasznlatl. Helytekerkossg nliatt kihagyruk mi nden, az Invariants () -l61
klnbzo metdus kdjt, mivel azokat a vltozs nem rinti.
21.6. 1JsbI- A nyomkiiYet6slZintjei ldebugginglev .... cppl
o : II 21.6 . Lista NyomkOvetsi szintek hasznlata
1 : linclude <iostream>
2 : linclude <8tring.h>
3 .
4, enum LEVEl. { NONE, LQW, MEDIUM, HIGH } ;
5 .
6 , OEBUGLEVEL !iIGli
7 .
8 , hf OEBUGLEVEL < LQW 1/ Csak LOW, MEDIUM vagy HIGH lehet az rtke
9 , ASSBRT(x)
10 : #elsQ
ll : #define ASSERT(x) \
12 : if (! (xl) \
13 : ( \
14 : std : : cout "ERROR!! " #x
on line _LINE_ 15 ,
16,
17,
std : , eout
std : ,cout " in file" _FILE_
l
18, 80ndif
19 :
20: _if DEBUGLEVEL < MEDIUM
21: 'do fine EVAL{x)
22: 'else
23: 'doHne EVAL{x) \
" failed\n"; \
" \n "; \
"\n"; \
24: std::cout Ix ',\t" x std" endl;
25: 'endH
26:
27, 'if DEBUGLEVEL < IiIGli
28: #define PRINT(x)
29 :
30 , IIdefine PRIN'I'{x) \
31 : std: , cout x std: : endl ;
32 : llendif
33 :
34 : class String
35 : {
36 : public:
37 : II Konstruktorok
38 : String{);
39 : String{const char const) ;
40: String(const String &) ;
41: -String () ;
42 ,
43 : char & operator[ l (int offset) ;
44 : char operator[] (int offset) const ;
45 ,
46: String & operator= (const String &);
428 1 VI. rsz Klnlegessgek
47 : int GetLen{)const ( r e turn itsLen:
48: const char * GetSt ring () const
49 : { return itsString; }
50: bool Invariants() cons t;
51 :
52 : private :
53 : String (int); / / Privt konstruktor
54 : char * itsString:
55 : unsigned short itsLen;
56 : );
57 :
5B : bool String : : Invariants() const
59 : (
60 : PRINT( " (String Invariants Checkad)") ;
61 : return ( (bool) (itsLen && I I
62 : ( ! itsLen Ct& ! ltsString) );
63 : }
64. :
65 : c1t1ss AnimtIl
66 : (
67 : public :
68 : Animal() : itslIge(I),itsName('John Q. AnimaI")
69 : (ASSERT(Invariants( ; }
70 :
71 : Animal(int, const String&) ;
72 : _Anima1() II
73:
74 : int GetAge{)
75: (
76 : ASSERT(Invariants();
77 : return itsAge;
78 : )
79 :
BO : void Setllge(int Age)
B1 :
82 : ASSERT(Invariants( :
B3 : it9Agc '" Age ;
84: lISSERT(Invariants(;
BS : }
86 : String& GetName()
87 : (
BB : ASSERT(Invariants( ;
89 : return i.t sName ;
90 :
91 :
92 : void SetName(const String& name )
93 : (
94 : ASSERT(Invariant s( ;
95 : itsName '" name ;
96 : ASSERT(Invariant9(;
97 : }
98 :
99 : bool Invariants() :
100 : private:
101 : int itsAgc ;
102 : String itsName;
103: };
104 :
21. ra Az
105 : II Az alapr t elmezett konstruktor O bjtokbl ll6
.. karakterlncot hoz ltre .
106 : String :: String ()
107 : {
108: itsString : new char]l]:.
109 : itsString[O) =. '\0' ;
110: itsLen .. O;
lll, ASSERT(Invariants () ) ;
112: )
113 ,
114: II Privt (kiscgit61 konstruktor. Csak arra hasznljuk
115, II hogy segitsgvel mag ntlk <IZ oszt lynak a mctdusai
116 : II ltrehozhassk ti megfelel6 m r t ~ karakterlncoktit .
.. Ez utbbiakat nullkkal tOlti fel .
117: String : : String(int len)
118: {
119 : itsString = new char[len+1];
120 : tor (int i = O; i<_len; i++)
121 : itsString[i) = '\0';
ll!2 : itsLcn.1en;
123 : ASSERT(Invariants( ;
124 : }
125 ,
126: II KaraktertOmbOt String tipus ob jektumm alakit .
127 : String : : String(const char * const cSt ring)
128 : (
129 : itsLen .. strlen(cString);
130 : itsString = new char[itsLen+ll;
131 , for (int i " O; i<itsLen; iHol
132 : itsString[i) = cString-[i};
133 : itsString[itsLen}=' \O' ;
134 : ASSE:RT(Invariants{);
135 : )
136 :
137 : II Msol konstruktor
1]8 : String :: String (const Stri ng & rhs)
139 : (
140: i tsLen=rhs.Getl.en();
141: itsString = new char]itsLen+l[;
142 : for (int i = O; idtsLcn;i++)
143 : itsString]i] = rhsli};
144 : itsString[i tsLen) = '\0';
145 : ASSE:RT(Invariants());
146 : }
147 ,
148 : II Destruktor . Felszabaditja a dinami kusan lefoglalt memrit .
149 : String : : _String ()
150 :
430 I VI. rsz
151 : ASSER'l'(Invariants(;
152 : de!ete I I itsString;
153: itsLen "- O;
154 : J
155:
156: /1 Az egycn16sg opertornak tlterhelse . Felszabadtja
157: 1/ a meglev6 memrit, majd lemsolja a karakterlncot
... G a mretet .
158: String& St ring: : operator=(const String & rhs)
159: (
160: ASSERT(Invariants( ;
161: iC (this == &rhs)
162: return
163 : delete [l itsString;
164: itsLcn=rhs ,GetLen () ;
165: itsString :: new char[itsLen+11;
166: for (int i = O; i<itsLen; i+-+-)
167, itsString(i] " r-hs[i] ;
168 : itsString[itsLenl = '\0';
169: ASSERT(Invariants( ;
170 : rcturn *this;
171 :
172 :
173 : II
il
il
174 :
175 :
176:
Nem lland eltolsi (offset) opertor. Egy karakter
hivatkozsval tr vissza, ame ly igy rajta keresztal
m6dosithat6 .
177 :
char & String: : operaLor[ ] (int
(
178: ASSERT(Invariants():
179: if (offset> itsLen)
180: return itsString[itsLen-1):
181: else
182 : return i tsString[offset l;
183 :
184: )
185:
offset)
186: II Alland eltolsi (offset ) opertor . Const objektumokkal
187 : II kapcsolatban hasznlhat6 (lsd a konstruktort!).
188: char String: : operator[) (int offset) const
189 : (
190 : ASSERT(Invariants());
191 : it: (offset> itsLen)
192: return itsString[itsLen- 1 ];
193: else
194: return itsString[offset) ;
195 : ASSERT(Invariants();
196: )
197 :
198 : AnimaI : : Anima1 (int age , const String& name) :
199 : itsAge( age),
200: itsNallle(name)
201 : {
202 : ASSERT(lnvariants( ;
203 : }
204 :
205 : bool Animal :: Invariants ()
206 : {
207 : PRINT ( (AnimaI Invariants Checked) ') ;
208 : return (itsAge > O && itsName.GetLen{ ;
209 :
210 :
211 : int main()
212 :
213: const int AGE = 5;
214 : EVAL(AGE) ;
215 : AnimaI sparky(AGE. 'Sparky') :
21 , 6ra kl
216: std: : cout " \n' sparky . GetNarne() . GetString() ;
217 : std:: cout' is ' I
218 : std :: cout sparky . GetAge() years old. ' ;
219 : spnrky . SetAge (8) ;
220 , std: : cout ' \n " sparky . GetName( ) . GetString() i
221 : std:: cout ' is' ,
222 : std :: cout sparky . GctAgc() years old ."
223 , return Oi
224 :
AGE: 5
(String Invariants CheckedI
(String Invariants Checked)
(String Invariants CheckedI
(String Invariants Checked)
(String Invariants Checked)
(Stri ng Invarianto Checked)
(String Invariants Checkcd)
(String Invariants Checked)
(String Invariants Checked)
(String Invariants C h e c ~ e d
Sparky is (AnimaI Invariants Chec kedl
5 Ycars old . (AnimaI Inv",ri",nts Checkcd)
(Ani maI Invarisnts Checkcd)
(Ani mul Invariants Checked)
Sparky is (lmirnal Invaria nts Checked)
8 years old . (String Invariants Checked)
(String Invariants Checkcd)
II run again with DEBUG : MEDIUM
AGE : 5
Sparky is 5 years old .
Sparky is 8 years old .
431
432 1 VI. rsz Klnlegessgek
Aprop
A fordftskor zeneteket kaphatunk
Ennek a kdnak a fordtsa kzben is felbukkanhatnak ugyanazok a
zenetek, a 21.4. Lista kapcsn mr volt sz. Az. ok termszetesen
ugyanaz.
Elemzs
Az assert () makr k6djt a 8-18 sorok tartalmazzk. Ez ebben az esetben gy van ki-
ahtktva, hogy Im a DEBUGLEVEL nke alacsonyabb mint LOW (vagyis NONE), akkor
a nyomkvetsi kdok egyltaln nem kerlnek bele a fordtand llomnyba.
Ha a nyomkvets brmilyen szinten megengedett, akkor az assert () ml1kdsbe
lp. A 20-25 sorokban hthat6 EVAL nem kerl bele a k6dba, ha DEBUGLEVEL nke
alacsonyabb mint MEDIUM. Ez teht azt jelenti, hogy ha DEBUGLEVEL nke NONE vagy
I.OW, akkor EVAL nem kerl bele a k6dba.
Vgezetl a 27-32 sorokban lthat PRINT makr aktjvls hoz DEBUGLEVEL HIGH
lke szksges. Ez teht azt jelenti, hogy cz a makr mg a MEDIUM nyomkvetsi szin-
ten is hatst.dan, mikzben ezeken aszinteken EVAL s assert () mr ml1kdnek.
A PRINT makrt az Invar<!l.nts () metdus kdjban haswljuk egy zenet kirats-
ra . Az. EVAL a 214. sorban bukkan fel , ahol egy AGE nevO egsz lland ;tktulis rtk(:t
vizsglja meg.
Helyes
A makrk neveiben hasznljunk csupa
nagybetl. Ez egy lcalnosan elfoga-
dotl . .. alkalmazott szoks, vagyis ha
ncm taJtjuk hozz:'i magunkat, azzal
sszezavarhatjuk a tbbi programozt.
A makff&,>vnyek valamennyi para-
mtert tegyilk kerek zfjelek kz.
Krdsek s vlaszok
Helytelen
Igyekezznk olyan makrkat rni,
amelyeknek egyltaln nincsenek
mellkhatsi. Ne inkrementljunk
pldul makrn bell vltozt, vagy
ne adjunk rtket neki.
Krds: Ha a C++-nak vmmak az fe/dolgozI/l jobb szolgltatsi, akkor mil1 Vim
Illeg mg mil/dig benne ez ff sg is?
\llasz: El6szr is a C++ visszafel kompatibilis a C nyelvvel , vagyis annak lninden je-
lent6s szolgltatst tartalmaznia kell. Il yen az is annak minden direkt i-
21. ra Az
vjval s makrjval. Msodszor az elfeldolgoznak vannak olyan szolgltatsai,
amelyeket a CH programozk is s gyakran hasznlnak. Ilyen pldul
a beszrsi (inclusion guards).
Krds: Mirl hasznl/mk makfJriggunyeket, ha ugyanaz a Jeladatot igazi fiiggtJ-
nyekkel is megoldJ/aljuk?
Vlasz: A makr6fggvnyek nem igazi fggvnyek, mivel aZ el6feldolgoz fejti ki s
szrja be a helyre. Ezek tehl tulajdonkppen a kdolst esz-
kzk, hiszen nem kell jra s jra begpclnnk ugyanolyan, vab'Y nagyon hasonl
kdokat. Ugyanakkor az is igaz, hogy a sablonok jobb alternatvt jelentenek.
Krds: ms mdszer vagy cszk6z ll a a rendelkezsllkre az
helyett, ha hlbakercss I.:zbcll vltozk k6ztes nekeit szere/llllk kirallli.?
Vlasz: A legjobb alternativa a lltastsok (watch statements) hasznlata
egy nyomkvet6prograrnban. Ezzel kapcsolatban olvassuk el a
mellkell dokumentcijt.
Feladatok
Mo.st, hogy megismerkedtnk az szolgltatsaival s fel hasznlsi mdo-
zataival , megszerzett tudsunkat vlaszoljunk nhny krdsre s v-
gezznk el nhny gyakorlatot.
Kvrz
1. Hogyan trlhelnk makr6vltozkal?
2. Mikor kerlnek feloldsra a makrk, illetve lnikor kapnak rtket a szimblumok?
3. Hogyan alakthat juk karakterlncc egy makr valamely paramtert?
4. Milyen operntorral fz!1etnk ssze karakterlncokat egy makr6ban?
Gyakorlatok
1. Mooost.suk a 20. riiban bemutatott employeernain . cpp programot (20.4. Lista)
gy, hogy az ktszer be a string . hpp fejlcllomnyt. (Ismteljk meg
az els son.) Mi trll!nik fordtskor?
2. Alkalmazzuk az ebben az rban megismert mdszert a string. hpp fej ll!cll o-
mny beszrsnak vezrlsvel kapcsolat Onclusion guards). Pfbljuk meg j-
ra lefordtani az gyakorlatban mdostorr kdot. Mi trtnik?
433
434 VI. rsz
3. A dokumentci segtsgvel delt50k ki, hogyan adhatunk rtkel egy
makrvltoz6nak a parancssorban. rjunk egy olyan progrdmot , ami kirja a kp-
erny6re a makr6nak gy radott rtket.
Vlaszok a kvfzkrdsekre
1. Makr6kat az fundef direktva segtsgvel lehet trlni. Ez a mdszer egyarnt
mJkdik a magban a kdban, illetve a parancssorban megadott makr6kkal
kapcsolatban.
2. A makr6k kifejtse (vagyis a forrskd megfelel6 mdostsa) fordtsi id6ben
trtnik. Ez azt jelenti, hOb'Y az gy belltott rtkek fursid6ben mr
nem m6dosthat6k, hiszen azok abban a kztes k6dba kerltek be, amit a ford-
tprogram az el6feldolgoz6t6! megkapott.
3. A paramterek a karakterest6 (stringizing) opertor (It) segtsgvel alakthat6k
br:akterlncc. Ez tulajdonkppen csak annyit tesz, hogy kelt6s idz6jelek kz
z{lrj a a krdses argumentumot, akrmi legyen is az. Ezzt::l a m6dszerrellerrn-
szetesen mi magunk is lhetnk. Brmi, amit a makr6 k6djban kett6s
kz les7.nk attl kezdve konstans lesz, vagyis x" mr nem magnak az x vl-
toznak a tartaimt jelenti, csak egy
1. Az sszeli1zs opertora a U.
22. RA
Objektum-orientlt elemzs
s tervezs
Ebben az rban a lesz sz
Hogyan elemezznk problmkat objektuffi.orientlr szemszgb61
Ilogyan tervezzk meg a progmmunk:!.l objektum-orienl:'ilt szemsz("gb61
ttekintjk az elemzsi folyamatot, illetve ezek tltetst C++ nyelvre a terve-
zsi clokat szem tartva
Hogyan telvezhet.\ nk s j ra hasznosthat kdot
A fejlesztsi ciklus
Szmos knyvet s sszefoglalt rtak mr a fejlesztsi ciklusr61. Nhny a vzess mo-
dellt tmogatja, ahol a hatrozza meg, mire legyen kpes a program, a mrnk
hatrozza meg, hogyan pljn fel az, mil yen osztlyokat tartalmazzan, s gy tov bb,
436 1 VI. rsz KOInlegas.gek
a programoz feladata az !,'Y kialakult tervet s architektmt egybefonni. A prog-
ramoz ennl a megkzeltsnl mr a ksz tervet kapja meg, gy csupn annyi a fel-
adata, hogy megvalstsa az abban lert funkcikat.
Noha a vizess modell ktsgkvl azrt egymagban val6sznleg elg szeg-
nyes lenne igazn j programok rshoz. Fejleszts kzben van egy tennszetes s szk-
sges vissL1C5. 1lols a m.ir megrt, illetve a mg megrsra vr programrszek kztt.
Az tny, hogy a j C++ programokat alaposan megtervezik, elkezdenk az rdemi
programoList, azonban az mr nem igaz, hogy a telV nem vltozik a ciklus alan.
Hogy mekkora munkt ignyel az tervek elksztse, az termszetesen a prog-
ramunk fgg. Egy igen bonyolulL projektnek, melyen tucatnyi programoz
hnapokig dolgozik, nyilvn vilgosabb, kidolgozottabb telVVel kell rendelkeznie,
111il1t egy ujjgyakorlalknt megrt segdprogramnak, melyet egy nap egy progra-
moz kof:s7.tell el.
Ebben az rban olyan nagy s sszetett programok Ic jlcszl(:sre konccnl riUunk, me-
lyeket esetleg vekig fogunk s fejleszteni. Szftmos progrmnoz6 egyszeruen
lvezi, ha a:wkkal .t legjabb technolgikkal dolgozhat, melyek tudsa s segdesz-
kzci hatrdit rcszegetik. A CH nyelvet sok tekintetbe n ppe n arm terveztk, hogy se-
gl<;gvel egyre bonyoluhabb s bonyolultabb rendszereket fej leszthessenek a progr.l-
VlIgy progmmozi csapatok.
Egy riaszt6rendszer szimulci6ja
A szimulci egy a valdi viki g egy rsznek lersra alkotott szmtgpes model.
Szmos okbl szoktunk folyamodni. Egy j tervhez is meg ke:
rtennk azokat a krdseket, amelyekre vlaszt vntl1k a szimulcit61.
Kiindulskppen vizsgljuk meg a problmt: relkrtek minket, hogy
lljuk egy hz Egy ktszintes csaldi hzrl van sz6, mel y egy k ....
ponti tr kr rend(:!zelt ngy hl6szobval, berendezett alagsoTml s egy rnlyga-
rzzsal rendelkezik.
A rlclszinlcn a helyeken tallh.m6k ablakok: I trom a konyhban,
az egy a WC-ben, a nappaliban s a t{lrsalg6ban, valamint '.c"
ablak a bejmti ajt mellett. Ngy hlszoba tallhat az emeleten. Minden
kt ablaka van, kivve hl6szobl, ahol n!,'Y tallhat. A kt frdSZOIYd egy-e:;:\
lakkal rendelkezik. ngy kis ablak tallhat az alagsorban, egy pedig a gan"".
A lakk els6sorban a bejrati ajtt hasznljk kzlekedsre. Emellett a konrha
egy elhzhat vegajt, valamint kt ajt a garzson az autknak, illetve egr
al. alagsorhoz. Van tovbb egy pinceajt, amely a hlsbkertre nylik.
22, ra elemzs s tervezs 437
Az ablakok s az ajtk riasztval vdenek, emellen minden telefonon van va-
lamint egy nyomgomb kzveuenl az gy mellett a f6 hlszobban. Kltri riasztk
is va nnak, de ezeket krltekint6cn llitouk be ahhoz, hogy kis llatok vagy ma-
damk ne indtsk be
A riasztrendszer kzpontja aZ alagsor!>an tallhat, mely azonnal jelzst
ad, amint vabmclyik szenzor jelez. Amennyiben nem kapcsoljuk ki a riasztt a meg-
adolt bell, gy telefonon rtesti a Ha megnyomjuk a
a rendszer azonnal rtesti a rendrsget.
A riasztr.1 vannak ktve mg a tZ s fst valamint a is. Maga
a riasz16rcndszer kzpontj:! mely a heptett tartalk ramforrsnak s a
ll burkolatnak
Koncepciterv
Ebben a fzisban megprbljuk megneni, mit vr a a programt61. Mi
:l clja a progr:tmnak? Milyen kellene a szimuld6nak v;'i]aszt adnia? Megfe-
az albbi krdsek: .,A szenzor jelzse utn mennyi riasszan a rend-
vagy . Ki jtszhat6ak-e az ;ibl;lkriasztk gy, hogy nem fusson lx: l:rtcsts a rcnd-

A koncepci6terv ksztse megfelel6 id6szak arra, hogy tgondoljuk, mi van a progra-
mon bell s mi van kvl. Szerepel a rcnd6rsg a SZi111Ulci6blm? Hsze magnak
a szimullt rendszernek:l:l hz rias%l6renuszernek vezrlse?
Elemzs s az ignyek felmrse
A problma megfogalmazsnak fzisa utn az elemzs fzisa kvelkezik. Elemzs
kzben feladalunk segteni a hogy mcgrLo.;e, mit is egy ilyen prog-
n!mtl. Pontosan milyen viselkedst mutasson a progmm? Milyen beavatkozsi lehet6-
sgei lesznek a felhasznlnak?
Ezeket az ignyek rendszerint dokumentumokba ssze, amelyek felhasznlsi
e.settanulmnyokat is tanalmazhatnak. Hasznlati eseldiagr.:lm rja le a program viselke-
dst: a klcsnhatsokat s a hasznlati mintkat, segtve ezzel a programozt a rend-
szer cljainak megrtsben.
Tudta hogy ... ?
Egysges modellez6 nyelv (Unified Modeling language - UML)
Az ignyek felmrsnek. s az elemzs dok.umentlsnak egyik. lehetsges mdja
az egysges nyelv (Unified Modeling Language; UM L) hasznlata.
438 1 VI. rsz Klnlegessgek
Az. UMl hasmlatnak kt elnye is van: grafikus, vagyis ttekinteni, illetve
egysgestett formtumot hasznl, gy nagyon sokan - akr nem is -
megrtik. Noha az UML bemutatsa meghaladn a knyv terjedelmt (a tmban
mr szmos kivl knyv jelent meg), tudnunk kell , hogya hasznlati esetek bemu-
tatst is lehetv teszi. Objektum-orientlt fejlesztshez klnsen hasznos, hiszen
szmos absztrakt s egyb osztlytpust tmogat kzvetlenl.
J forrs a tmban: Teach Vourself UMl in 24 Hours, maly a Sams kiadsban je-
lent meg.
Magas s alacsony tervezs
Mi utn leljesen megrtettk a program cljt s az ignyeket a megfelel6 dokumen-
tumban rgztettk, hozzkezdhetnk a magas szinn1 telVezshez. Ebben a fzisban
a programoz nem foglalkozik a pl:nformmal, az oper.'icis rendszerrel, vagy a progra-
mozsi nyelv saj{ttsgaival. Ehelyett a rendszer koncentrl. Azt vizsglja,
mik annak a elemei, illetve hogy milyen klcsnhats les7. kztlk.
A problma egy lehetsges megkzeltse az, hogy flrelesszk a felhasznl6i fellet
kiabkt:'snak krd6scit s csupn a problmatr komponenseire koncentrlunk.
A problmalr azon problmk halmaza, melyeket a programunkkal megpr6bMunk
megoldani. Hasonl:tn a megoldstr a lehetsges megoldsok halmaza.
Ahogy haladunk a magas szi ntO tervezssel, vgiggondoljuk az objektumok felad:!lai!.
Mit csinlnak s milyr.:n informcikat tartalmaznak? Termszetesen vgig gondolj uk
is. Milyen objektumokkal vannak klcsnhatsba n?
Pldul vil gos, hogy vannak rzke16ink, egy kzponti riaSZl6rem.lsze-
runk, gombjaink, vezetkeink s tdefonjaink. Tovbb gondolva a dolgot szimu1:lnunk
kell szobkat, a padlt s emberek csoportjait, num pldul a tulajdonosokat va&'Y
a rend6rsget.
Az tovbb bonthat6ak mozgs, betrs, hang s stb. Ezek
rJ.:keltipusok, sz szerinti nincs. Vilgosan ltszik tebt, hogy az l! rzkel6
egy absztrakt adattpus (Abstract Data Type; ADT).
Absztrakt adattpusknt a Sensor osztly biztost interfszt az sszes rzke16tpushoz
s minden szrmazt,HOlt tpus sajt implememcival rendelkezik. A kliensek anlkl
dolgozhatnak az rLkel6kkel, hogy rudnk milyen tpus, mgis mindegyik a tpus-
nak fog viselkedni.
Egy j absztrakt adattpus ltrchozshoz teljes mrtkben meg kell rtennk, mit csi-
nlnak az - hogy ezt hogyan teszik, az szmunkra most lnyegtelen. Pldul
az aktv vagy passzv eszkzk? Vrna k valamely elemk fel melegedsre,
egy vezetk szakadsm, a tmts olvadsra, vagy esetleg szondzzk a krnyezet-
ket? Nhny rzkel6 lehet binris (riaszt vagy sem), de nhny kztes llapotokat is
felvehet (hny fok meleg van?). Az absztrakt adattpus interfsznek megfelel6en tel-
jesnek kell lennie, hogy kezelni tudja ezeket a szmtalan szrmaztatott osztlyban.
Egyb objektumok
Ahogy haladunk a tervezssel , szmos egyb osztlym is szksgnk lesz, hogy meg-
feleljnk a spcdfikdnak. Pldul ha naplzni szeretnnk az esemnyeket, akkor va-
egy id6zt6re is szksgnk lesz. De vajon az id6zt6 szltja meg :IZ (: rzke-
l6kel vagy minden maga kld helyzetjelentst?
A felhaszn:'i16 a kvetkez6kpp avatkozhat VI:! a n::ndszer lestheti, ki-
kapcsolhatja, il letve a programozilatja, teht szksgnk lesz valamilyen felhaszn li
felletre is, Esetleg ltn;hozhatunk cgy kln objektumot a szimulci6nkban a ri:lS2t6-
programhoz is.
Milyen osztlyaink lesznek?
Amint megoldottuk ezeket II problm:'kat, llZ osztlyok tervezsvel folytat juk a terve-
zst Pldul mr kiderlt, hogya HeatSensor osztlyt a Sensor osztlybl fogjuk
szrmaztami. Ha :lZ jelentst kld, akkor tbbszrs rkl6dsknt
a Timer osztly is a szli) osztlya lesz, vagy az csupn tagvltoz6 lesz.
A HeatSensor val6szfml1eg rendelkezik CurrentTernp () s SetTempLimit () tagfLigg-
vnyekkel , s rkli a Sensor SoundAlarm () fggvnyl is.
Rendszeres tma :\z objektum-orientlt tervezs kzben az egysgbezrus. Kpzeljnk
el egy olyan megold!ist, ahol a ria$zt6rendszer rendelkezik egy HaxTernp rtkkel. A ri-
aszt Ickrdezi a hmrsklctszenzortl az akmlis h6mrskletet s riaszt, h:\ tl mc-
leg van. Egyesek szerim ez megsrti al egysgbezrs elvt. jobb lenne,
ha nem a riaszt6rendszcr foglalkozna a elemzs rszleteivel, h:mem - br
vitathat - ezt II HeatSensor osztly tenn.
Tudta hogy ... ?
Egyb forrsok
Az objektum-orientlt felfogsrl rdemes elolvasnunk Matt Weisfeld The Object-
Oriented Thought Process (ISBN: 0-672-32611 -6) knyvt, mely mr msodik ki-
adsban jelent meg a Sams kiadn!.
440 I VI. rsz Kmnleges,gek
Akr egyetrtnk ezzel, akr nem, a problma elemzse kzben koncenLn lnunk kell
az ilyen dntsekre. Az elemzs folytatsaknt e1gondolkodharunk azon, hogy csupn
az s a Log objektum lssa-e az r.lkel aktivitibt, s maga az Alarm objek-
rum egyltaln ne tudjon rola, illetve ne foglalkozzon vele, vagy alkalmazzunk ms
megkzeltst.
az egysgbezns, ha nunden osztly koherens egsz s kt osztly nem
hajtja vgre ugyanazt. Ha a Sensor osztly az akrulis figye\st:n,
gy semelyik ms osztlynak nem s7.ahad vele foglalkoznia.
viszont a tbbi osztly bvtheti a szksges funkcionalitssal. Pldul ha
Sensor oszt.ly a figyelsn s naplz:s:rt, akkor ezt gyis meg
val6sthatja, hogy egy Log objektumm bzza az aktulis adatok rgztst.
A t(;vkcnys6gck les clhatroJsval II programunk t:gyszenlbben s kar
bantarth:n6 lesz. Ha a riaszt6rendszert egy fejlettebb modulra szeretnnk cse-
rlni, gy <rt interfsze az s a napl6z6rcndszer fej pontos s j61 definilt.
A riasztrt;:ndszerbeli mdost:1sok nem lehetnek hatss,ll a Sengor oszl..'ilyokm. Persze
ez fordtva is igaz.
Rendelkezzen a Heatflensor ReportAlarm() fSb'Vnnycl? Termszetese az sszes
szenzornak tudni;l kell riaSltst kldeni. Ebbl mris vil gosan kvetkezik, hogy
II ReportAlarm() a Sensor virtulis eljrs.1 kell legyen, val:Huim hogya sensor egy
absztrakt alaposztly lesz. hogyasensor osztly ReportAllI.rm () fgg-
vnye tl lllllnos a HeatSensor osztly szma fl , nonban :1 fellrt fggvny megad
ja azokat a par',untereket, melyeket csak az adhat meg.
Hogyan jelezzk a riasztsokat?
Amcnnyiben az riasztanak, gy rengeteg informcit kell tadniuk a rendt -
s(:gct trcsz objektumnak s a naplz objeknunnak. rdemes ltrehoznunk eb'Y
Conditions osztlyt, melynck a konstruktora szmos m rst vgez. A mrsek
luJtsg,nak fggvnyben lehet ak.'ir objekmm, akr egyszenl egsz LpL1S skalr (-rtL
Elkpzelhet6, hogya Condi tion objekmmot kzvetlenl a kzponti riasltobjekt
nak adjuk :t, vagy a Condilion objekmm az Alarm objektum alosztlya lesz, mely
tudja, mit kell tennie vszhclyzer csetn. az is, hogy nincs kzponti
jektum, ehelyeu az hozzk ltre a Condition objektumokat. Nhny
Condition objektum sajt magt naplzza, mg a tbbi II rend6sg elrsrt felel"
Egy megfclel6en tervezett, esemnyvezrelt rendszernek nincs szksge kzporn
ordintorra. Kpzeljk el, hogy a szenzorok fggetlenl fogadnak s kldenek
______________________________ ____
teket ms objektumoknak, lltanak be paramtereket, vgeznck mrsekcl, figyelik
a hzat. Ha hibt szlel nek, az Alarm objeknllll naplzza a problmt (pldul zene-
tet kld a Log objektumnak) s vgrehajtja a szksges lpseket.
Esemnyhurkok
Egy ilyen esemny vezrelt rendszer szimulci6jhoz a programunknak rendelkeznie
kell cscm6nyhurokkal. Az esemnyhurok gyakorlatilag vgtelen ciklus - ilyen pl-
dul a whil e (1) -, mely fogadja az opercis rendszer zeneteit (egl'kattints, billen-
lets, stb.), egyenknt lekezeli majd vissza ugrik az elejre, amg nem teljesl
a kilpsi felt tt!l. A 22.1 Lista cgy egyszeru esemny hurkOl mUlat be.
122.1 Usta - Egy egyszer esemnvhurok (simpleevent.cpp)
O, II 22.1 Lista
l: jinclude <iostream>
2,
3: class Condition
4. : (
5, public:
6: Condition () { }
7: virtual -Condition() ()
8: virtual void Log () = O l
9 : l;
10:
ll : c l ass Normal : public Cond i tion
l:t. : (
13: public :
14: Normal() ( Log() l l
15 : virtual -Norma1() {}
16: vj rtua1 void Log ()
17 :
18 : l;
19 :
( std : : ..:out ' 1. ogging normal conditions .. . \n' ; )
20 : class Error : public Condition
21: {
22: public :
2] : Error() ( Log();)
24 : virtual -Error() (l
25 : virtual void Log() ( st.d : : cout "Logging error!\n" ; )
26 : ) ;
27 :
28 : class Alarm : public Condi tion
29 : (
]0 : public :
31 : Alarm () ;
]J : virtual -Alarm () {}
J] : virtual void Warn() { std:: cout 'Warning ! \n" ; }
]4 : virtual void Log () { std:: cout "General Alarm 10g\o' ; l
I
4 4 2 1 ~ rsz KlIlnl.g.ssg.k
35 : virtual void Call() O,
36 : };
37 :
38 : Alarm::Alarm()
39 : (
40: Log();
41: Warn();
42:
43:
44: class FireAlarm : public Alarm
45:
46: public:
47: Firelllrm() {Log() ; } ;
48, virtual -FircAlarm() (j
49: virtual void Call{) ( std: : cout ' calling Fire Dept . I \n" ; )
50 : virtual void Log () { std :: cout "Logging rire call . \0' ; }
51 : ) ;
52 :
53 : int maln!)
54: {
55: int input ;
56: int okay :o 1;
57: Condition pCondition;
58: while (okay)
59: {
60: std : :cout (O)Quit (11Normal (2)Fire : '.
61: std: :cin input ;
62: okuy = input;
63: switch (input)
64: {
65 : ci!lse O:
66 : break;
67: c.!Ise 1:
6B : pCondition = new Normal;
69 : delete pCondition;
70 : break ;
71 : case 2 :
72 : pCondition = new F.ireAlarm;
73 : delete pCondition ;
74: break ;
75 : default :
76 : pCondi t ion'" new Error ;
77 : de l e t e pCondition;
7B : okay", O;
79 : break;
BO :
B1:
S2: return O;
S3:
(O)Quit {l)Normal (2)Fire : 1
II
____________________________ ______ _ii;
Logg ing normal conditions ...
(O)Quit (l)Normal (2) Fire : 2
General Alarm log
Warning!
Logging fire call .
(O)Quit (l)Norma l (2 )Fire : O
r
Az 58. s 81. sorok kztt tallhat esemny hurok egy .lkel6 szimulci6j{1t valstja
meg: rtest a normlis mLkdsr(51 vagy a tzrI. Megfigyelhetjk, hogy az rtests
hatsra lt rejn egy Conditi on tpus objektum, melynek konstruktor.! klnbz
tagfggvnyckct hv meg.
Virtw'ilis ragfggv6nyeket konstruktorb61 megbvva zav<lJ' tapasztalll:ltunk,
ha nem figyelnk oda, hogy milyen sorrendben hozzuk ltre az objektumokat. 1'61d{lUl ,
ha lt rehozzuk a 72. sorban tallhat FireAlarrn objektumOt, akkor e16szr II Condi-
tion, :lZ Alarm, s vgl a Fi reAlarm osztly jn IIre. Az larm konstrukl om meg-
hvja a Log-ot , dc ez az Alarm osztly Log () fggvnye, nem pedig a FireAlarrn-,
annak ellenre, hogy II I.og () fggvnyt virtutlisknL deklanlluk. Ez trtnik gy, merl
amikor :lZ Alarm konstruktora leful, akkor mC:g nem ltezik FireAlarm objektum. K-
56bb, ha mr !C:trcju II F'ireAlnrrn, II konstruktor ismt meghvja a Log () fggvnyt ,
ami mr a FireAlarm : : Log () .
PostMaster: egy esettanulmny
Ussunk most egy msik problmt, amelyen gyakorolhat juk az objekrum-ori entlt ter-
vezst. Az Acme Sofrware cg felbrelte az OlvasI egy j szoftver megalkol:lsra s
egy CH programozi csapat toborzs,ra. Jim Grandiose, az j termkek fejlesztsi
rszlegnek alelnkc a megbznk. Azt szeretn, ha megtelVcznnk s elksztcnnk
a PostMastert, egy olyan e-maii olvas programot , mellyel a klnbz6 szolgltatk
rendszert elrhetjk. A potencilis olyan zlclcmberekbl ll, "kik egy-
nl tbb e-maii szolgltatt hasznlnak, mint pldul: CompuSclVe, America Online,
Internet Maii, lotus Notes, s gy tovbb.
A felhasznl mcgt:tnthatja a PostMastert, hogyan csatlakozhat a klnbz6 c-maii
szolgltatkhoz. A PostMaster letiti a leveleket s egysges formban II fe1hllsz-
nl el, Ichetv tve az e-mailek rendezst, a vlaszt, a tovbbtst a szolgltatk
kztt, s !,'Y lovbb.
A PosrMas[er Profcssional - nlinc a PostMaster kvetkez6 veni6ja - szintn tervbe van
vve. Ez rendelkezni fog adminisztratv segd - titkr - mddal, ennek keretben a fel-
hasznl feJj ogostllat egy msik szemlyt az sszes vagy csak nhny e-maii elolvas-
444 1 VI. rsz KlIllnl,g, .. g,k
sval, rutin levelezsek kezelsvel, s &'Y tovbb. Tennszelesen mr a marketing
osztly is jelezte ignyt eb'Y mestersges intelligencival br komponensre, melynek
segtsgvel a PostMasler rendezhetn s prioritssal ltn el a leveleket
a trgyuk, ill etve a tartalmukban kulcsszavak alapjn.
Egyb is volt sz, pldul nemcsak levelek, de vagy
Internetes hrcsoportok kezelse. Nyilvnval, hogy az Acme nagy remnyeket fz
a POS1Master-hez, s piacra dobshoz idkerettel, de gyakorlatilag korltlan kll-
sgvetssel rendelkeznk.
Mrj ktszer, vgj egyszer
Megrendeltk az eszkzket s berendeztk az irodt. Ezutn els6 lpsknt pontosan
speci fik51juk lermket. A piac fe lmrse utn egyplatformos fejlesztst javasolunk
a f6nknkn<::k , de dntennk kell , hogy Unix, Macintosh vagy Windows legyen-e ez
a bizonyos egy?
Szmos fmszl megbeszlsnk voll Jim Grandiose-:z.1l. Kiderl, hogy tkleles dn-
ts nincs, teht kt rszre boOljllk a projektet: el6trre, vagyis a felh:'lsznl6i felletre,
s httrre, vagyis az adatbzisrt s kommunikcirt rszre. Hogy gyorsabban
haladjon a fejleszts, el6szr Windowsra fejlesztnk, ks6bb pedig Unixra s va lsz-
nIlleg Mac-re.
Ez az egyszen1 dnts szmos j krdst vet fel projckuel kapcsolatban. Azonnal nyil-
vnva lv ,vlik, hogy szksgnk lesz szmos fggvnyknyvtrrn, melyek feladata
a mcmri:lkezcls, a felhasznli felletek kezelse, valamilll a kommuni-
kci s : I Z adatbzis kezelse.
Gmndiosc r komolyan gondolja, hob'Y a projekt azon ll v:lgy bukik, hogy
en t ltjuk-e problmI. ppen ezrt arra kr minket, hogy csak a kezdeti elemzs s
telvezs utn toborozzunk koll gkat. Nekilnmk a problma elemzsnek.
Oszd meg s uralkodj
Hamar kiderl , hogy igazn tbb problmt kell megoldanunk. A projektet az albbi
nagyobb alprojektekre osztjuk:
Kommunikci: Az e-maii szolgltat elrse modemes kapcsolaton vagy hl-
zaton keresztl.
Adatbzis: Adatok trolsa a lemezre s visszaolvassa.
E-maii: A kJnbz6 e-maii formmmok olvassa s ltrehoz.. .....
22. ra Objektum-orienttt elemzs s telVezs 1445
Szerkeszts: Kvl fellet bil.tosftsa zenetek ltrehozshoz !s m6-
dostshoz.
Platform krdsek: A felhasznl 6i fellet elemei nek megjclentse minden plat-
formon.
Tervek a fejlesztsre, bvtsre.
Szervezs s temterv: az egyes fejl eszt6k igazgatsa s k6djaik kzti
gek kezelse . Minden csoportnak s kzzteszi a hogy utna
ennek It::hessen tervezni. A cgvezetsnck !s :I marketingeseknek
termszetesen tudniuk kt!ll , nukorra kszl el a termk.
Felvesznk egy menedzscn, aki a szervezsn s a felel. Ezutn felve-
sznk vezet5 programoz6kat, aki k segtenek az elemzsben s a tervezsben, valami nt
utna rszt vesznek II megval6stsban. Ezek a programoz6k az albbi csapato-
kat hozzk ltre:
Kommunikcis csoport: A betrcsz6s s egyb hlzati kapcsolatok kezelse.
Ok csomagokkal, :Idatfolyamokkal s bitekkel foglalkoznak, nem pedig maguk-
kal az c-maikkkel.
zenetek formtumrt csoport: Ez C5.'l pat felel a e-maiI for-
mtumok s a kanonikus formtum - PostMasler - kzti oda-vissza
Szintn ez a csOport foglalkozik az zenetek ICme7.re mentsvel s
ig6ny szerinti visszatltsvcl.
zenctszerkeszt6rt csoport: Ez a csoport felel6s a teljes rel hasznli fel-
mindegyik platformon. A feladata, hogy a httr s a kliensel-
d:.1 kzti kommunikci minl egyszen1bb s ignyeit tekintve minl le-
gyen, gy a termk kiterjesztse ms platfonnokra nem ignyli a forrs msols:t.
zenetformtum
gy dntnk, bOh'Y flretve a kommunikcis s felhasznl i felletet, el6szr az ze-
nel formtumval foglalkozunk. A tbbi csak azutn kvetkezik, bogy teljesen megr-
tettk, mir61 is van sz. Nem sek rtelme va n azon trni a fejnket, hogyan jelentjk
meg az informcikat, amg nem tudjuk, milyen informcikal kell megjelentennk.
A e-maii formtumok vizsglata sorn kiderl t, hogy sok hasonl6sg van
kztk a szmos klnbsg ellenre is. Minden e-maiI zenetnek van felad6ja, cmzett-
je s ltrehozsi dtuma. Csaknem minden zenet rendelkezik cmmel vagy trgysor-
ral, a levltrzs pedig egyszeru vagy sszetett szveg (formzsokkal), tanalmazhat
grafikt, esetleg hangot, vagy brmilyen egyb extrkat. A legtbb ilyen e-maii szolgl-
tats lehet6v teszi csatolt ll omnyok kezelsl is, melyet a felhasznl ms progmm
segtsgvel megnyithat.
44s l VI. rsz Klnlegessgek
korbbi dntsnket, mely szerint az eredeti formtumot ta lakt juk
Postl\1aster [ormtumv. Ezzel a megoldssal csak egy formtumot kell trolnunk, va-
lamint a lemezre rs/ olvass is egyszeruDb vlik. A fejlcben tallhat informcikal
cmzett, dtum, trgy, stb.) a levltrLSt61 elklntve troljuk. gy ha a fel-
hasznl keresni szeretne a fejlcekben, ezt anlkl leheti meg, hogy a lcvltrzst is
be kellt!ne olv:I:.nia rt progrdmunknak. felkszlnk arm az esetre is, ami-
kor a felh<lszn16 csupn csak a levl fejlct szeretn letlteni a szolgltattl a levl
trzse nlkl. A verl.ijban azonban [ellt jk ;. teljes e-maii-t.amit
azonban nem fel ttlen jelentiink mcg a fclhasznl6nak.
Az osztlyok kezdeti terve
Az elemzs ut:n megtervezzk a Message osztlyt. A szem tartvH -
tudjuk kezelni a nem e-mai i zeneteket is - ltrehozzuk az Email -
Message osztlyt a Message absztrakt alaposztlyb61. Az EmailMeosage oszt:'ilyb61
sz:'irmaztatjtlk a Pos tMasterMessage, InterchangeMessagc, CISMessage, PrOdigy
Message, stb. osztlyokat.
Az zenetek termszetesen objektumok lesznek a programban, azor, ban megalkotni
a objektl.lI11okat az, ami a legnagyobb az objektum-orientlt progra-
mozsba n. Nhny esetben, mint pldul zeneteknl, az els6dleges objektumok kics-
nek, mint lehetsges megoldsok. Gyakran hOSSL111 s komoly:.., gondolkoznunk kelJ
azon, hogy megtalljuk a megoldand feladathoz a objektumokat.
Ne essnk H legtbb terv nem lesz tkletes cls6 nekifutsrn. Kiindulskm
fogalmazzuk meg a problma lerst szban. Ksl-tsnk listt a lersban
f6nevekr61 s igkr61. A f6nevekb61 j esllyel <IZ objektumai nk lesznek. Az igk pedig
ezen objektumok metdusai (vagy akr objektumok is lehetnek). Ez nem bolondbiztos
megolds, de addig amg nem szerznk gY:Lkorlatot a tervezsben.
Ez vol t a knn}'\.1 rsz. Viszont felmenii a krds: Az zenet fejU:ce s
az zenet trzse kln osZtly legyen? Ha igen, szksgnk lesz prhuzamos hierardu-
ra: NewsGroupBody s NewsGroupHeader, illetve E."ma ilBody s EmailHeader?
A prhu:t.:unos hierarchia sokszor hibs tervezsre figyelmeztet . Gyakori hiba objek-
fejlesztskor, hogy ltrehozunk objekmmokat az egyik gon, mg ugyan-
ezek egy msik gon is jelen vannak. A hiernrchik frisstse s szinkronizlsa egy ic..
utn nyomasztv vlik, ez tipikusan egy karbantarti rmlom.
Termszetesen nincs szilrd szably, hiszen nha prhuzamos hierarchik bevezetse "'oC--
zet a problma leghatkonyabb megoldshoz. Azonban ha ilyen irnyt vesz a te["\"ez6
rdemes jragondolni a problmt, ltezik sokkal elegdnsabb mdszer is_
r
______________________________ ______
Ha e-maiI rkezik ,I szolgltattl, nem felttlen kapjuk meg kln a fcjJcet s kln
a trzset. Sok szolgltat egy nagy adatfolyamkt':nt kldi, amelyet a progl"Jffiunknak
kell sztbomania. Taln rdemes ennek kialaktani a hierarchit
Tovbb vizsglva a feladatot arra jutunk, hogy meg kell prblnunk
az zenet tulajdonsgait, szem tartVa j kpessgek bevezetsnek lehet6sgt s
az adaurols absztrakcis szintjt. Az objekrum rnlajdonsgainak sszegyj-
tsvel knnyen meghatrozhatjuk az adattagokat, illetve az esetleges egyb objekru-
fiakat, melyekre szksgnk lehet.
Az zeneteket trolnunk kell, akrcsak a felhasznli belltsokat, telefonszfimokat, s
gy tovbb. A tfirolsnak a hierarchia alj-n kell elhelyezkednie. Vajon kzs legyen
az zenetek s a belltsok aJaposzt!llya?
Egy vagy tbb kiindul6pont hierarchia
Az rkl6dssel kapcsolatban alapvet6en ktfle megkzelts ltezik: az egyik szerint
minden, vagy majdnem minden osztly cgy kzs 6st61 - il gykroszliilyt61 - ered,
a msik szerint megengedjk a tbbszrs rkl6d.'it. A kzs 6sosztly hogy
gyakran elkeri.\lhet6 a tbbszrS rkl6ds, htrnya viszont, hogy az irnplernenld
gyakran visszaszivrog az alafX)$ztlyba.
Az osztlyok egy halmaza gykeres struktrj, ha minden osztlynak kZS:lZ 6se.
Gykrrel nem rendelkez6 hierarchiknl nem minden osztlynak ugyanaz az &osztlya.
Elhatroztuk, hogy tbb platformra fejlesztnk, azonb:tn a tbbszrs rkl6ds ssze-
ten s nem felttlen tmogatja minden fordt megfelel6cn az sszes pbtformon. igy
kzs gykrrel hierarchiban s egyszeres fogunk gondol-
kodni. Megkeressk azokat a helyeket is, ahol a tbbszrs szba jhet
majd. A hiemrchit fjtblommcntcsen felbonthatjuk s beil1eszthetj.lk a tbb-
szrs Ii
A osztlyok neveit p el, gy knnyen mcg ludjuk mond;:mi, mely
osztlyok szrmaznHk s melyek ms fggvny knyvtrakb61.
A pObject lesz a gykrosztly. Gya korlalilag ez az objektum az 6se minden ms osz-
tlynak. A pObj ect egyszen.1, csupn adalcsere lesz a szerepe.
Amennyiben gykrrel hierarchit szeretnnk, a gykrosztlynak ltal-
nos nevet adjunk (minl a pObjec t) s csak kevs kpessggel ruhzzuk fel. A gykr
objektumnak ltre kell tudni hozni az utdait s azokra, mint pObj e ct pldnyokra hi-
\atkozni. Cserbe az interfsz &'Yakran L,>zrdik a &'Ykrosztlyba.
448 1 VI. rsz Klnlegessgek
A hiera rchiban a pStored s a pwired osztlyok kvetkeznek. A pStored objektu-
mokat a lemezen troljuk (pldul ha nem hasznljuk a programot), a pWired objektu-
mok pedig modemen vagy hlzaton kldjk zenetekknt. Csaknem minden objek-
tumollernentnk lemezre, gy rdemes azt a gykrhez kzel elhelyezni a hiemrchi-
ban. Az sszes elkldu objektumot trolnunk kell, de nem minden trolt objekt umOl
kldnk el, igy jogosan szrmaztat juk a pWired osztlyt a pStored oszllybl.
Minden szrmaztatott osztly hozzfr a tudshoz (adat) s funkci onalit-
shoz (metdusok), s mindegyik egyedi kpessgekkel azl. kiroly61ag
a pWircd larl:.llmazhat plusz metdusokat, dc ezek a mOO(!ffit:s adattvitelrt lesznek
felelfisek.
Lchc(!';ges, hogy minden elkldtt objektumot t{irolunk, vagy minden trolt objektu-
mOt elkldnk, de akr az is el6fordulhat, hogya fenti kijelentsek egyike sem teljesl.
Ha csak nhny objeklumot trolunk s csak nhny trolt objektumot kolc!Onk el, ak-
kor a tbbszrs rkl6dssel kell dolgoznunk, V:lgy ms mdon kell megoldanunk
a problmt. Az egyik megolds, hogya Wired osztMyt a Stored osztly-
bl sz:"irma:a;njuk. s JlrehoZllnk met6dusokat a trolshoz, melyek nem csinlnak
semmit, vagy hibt jeleznek, ha az objektumot rnodemen elkldtk, de nem troltuk.
Vegyk szre, hogy nhny objektumot nem kell elkldenil nk, ll ycnek pldul a fel-
hasznli bell tsok. Persze minden kldtt objektum troland, gy az ennek megfe-
lel6 hicruchi l a 22. l-es bra mutatja.
PObjOO
pSto'ad
pWirad pPreferences pProvlder Info
I
pMeuage
22.1 bra
A l...>c:zdcli hierarchia
22. ra Objektum-orientlt elemzs s tervezs 449
Aprop
Fggvnyknyvtrak: Vsroljuk vagy frjuk?
Vsroljuk vagy rjuk? A tervezsi fzisban mindig felmerl a'krds, hogy milyen
rutinokat kell megirnunk s melyek azok, amelyeket megvsrolhatunk. Elkpzelhe-
mr kereskedelmi fggvnyknyvtrt hasznlni, mely
megoldst nyjt nhny vagy akr az sszes kommunikcival kapcsolatos krds
re. A dntsnl persze a licencdjakat s egyb, nem technikai jelleg krdseket is
figyelembe kell venni.
Gyakran ilyen fggvnyknyvtrakat vsrol ni, s a tnyleges problmra
koncentrlni, fgy nem kell jra feltallnunk a kereket. Akkor is rdemes elgondol-
kodni a vsrlson, ha nem kifejezetten C++-hoz szntk a a fggvny-
knyvtrat, de az alapfunkcii hasznlhatak. Ez szerepet jtszhat abban,
hogy tudjuk tartani
Interfszek tervezse
Fontos, hogya tervezs ezen szakaszban ne nyugtalankodjunk az impk:ment,d6 mi-
ali. Minden energi:'nk:lt az osztlyok kzti letisztult imerf!E!sLek rnegtervezsrc kell
koncentr.'ilnunk, majd pedig fel kell vzoJnunk, hogy az osztlyon bell milyen adatok-
1".1 s metdusokrn lesz szksg.
Gyakr::\n hasznos, h:l teljes mrtkben megrtjk aL alaposztlyokat, miel6tt a s7...rrnaz-
tatott osztlyokkal foglalkoznnk, teht a pObject-re, a pStored-re s
a pWired-re fogunk konccmrlni.
A pObject - I I gykrosztly - csupn olyan adatokkal s metdusokkal rendelkezhet,
melyek kzsek. Mondjuk minden objekmm rendelkezhetne egyedi azonost szm-
mal. Ltrehozhatnnk egy pID cpostMaster ID) vltOZI a pObject adatwgjaknt, de
tegyiik fel a krdst magunknak: Szksges-e ilyen azonost6s7..m olyan objek-
wmhoz, amelyet nem trolunk, ts nem is kldnk el? Ez persze felveti a kr-
dst is: Van-e olyan objektum, melyet nem t:irolunk, de rsze ennek a hieF.lrchinak?
Ha nincs ilycn objektum, rdemes mrlegelni a pObject s a pStored osztlyok
sszcvonst, azonban ha minden objektum trol t objektum, akkor mi alapjn tesznk
klnbsget? Ezt vgiggondolva afra a kvetkeztetsre jutunk, hogy nhny objektum,
mim pldtlul a cm objektumok, amelyet nmagban nem trolunk, jogosan szrmaz-
tathatnnk a pObject-b6I, hiszen ha troljuk, akkor azt csakis egy msik objektum r-
szeknttnnnc.
Jelenleg tehl egy kln pObject osztly mgiscsak hasznos lenne. Kpzeljnk el egy
mlistt, amely pAddress objekmmok lenne s noha nmagban
pAddress objektumot sose trolnnk, mgis rendelkezhemnek ezek az objektumok
egyedi azonostsz:mokkal , ami hasznos.
450 I VI. rsz Klnlegessgek
Prbakpp rendeljk hozz a pID--t a pObject oSlllyhoz, amely !,'Y nz ki minimlisan:
class pOjbect
(
public :
pObject () ;
-pobject ();
pID GetID{) const;
void SatID() ;
pr-lvate:
pID ltsID;
Szmos dolgot megfigyelhetOnk ebben az osztlydekl ar.:'ici6ban. Elszr is, n osztly
nem szrmaztatott osztly, ez ti gykroszlly. Msodszor: senuni jele az irnplementci-
nak, mg a GetID ( ) -t sem implementltuk, amely minden bizonnyal egy helyben ki-
rejlett (inline) met6dus lenne.
Harm:ldszor: felfigyelhetnk a const metdusnl, mely az interfsz rsze, nem az imp-
lement<Ci. V6g1 pedig bevezettnk egy j ad' lltpUSl pID nven. A pID itt inkbb t-
PlIS, mint tnyleges vlloz - jelenesetben nlkli long tpus -, mellyel rugalma-
sabb vlik a progr.llnunk felptse.
lia kidell , hogy nincs szksgnk el6jel nlkli long-ra , vagy az el6jel nlIriili long
nem elg nagy, egyszenen mdostjuk a pID-t. Ez a mdosts mindenhol jelentkezni
fog, ahol pID-Ve! dolgozik a program, nem kell megkeresni ti forrsk6dban az sszes
olyan helyet, ahol el6fordul ::t pID.
Most::t typedef segL'igvel a pID-t ULONG tpusnak deklarltuk, az ULONG-Ol pedig
cl6jcl nlkli long-knt deklarltuk. Ez felveti ::t krdst: v:ljon hova kerljenek ezek
a deklarcik?
Nagy projektek esetn a klnooz6 fjlokat is meg kell terveznnk. Projektnkbe n
az egyik hagyomnyos megkzeltst alkalmazzuk: minden osztly kln fejlc llo-
mnnyal s implementci6val (.CPP llomny) rendelkezik. Ezn az
vc OBJECT . HPP s OBJECT. cpp lesz. Hasonlkpp hozzuk ltre a pMessage osztly
deklarci6jhoz II MSG . HP?, az implementci6jiihoz pedig a MSG . ePF ii ll omnyt.
Prototfpus ltrehozsa
Egy olyan nagy projekt esctn, mint a PoslMaster is, nem hogy az els6 ter.
tkletes s teljes lesz. Knnyen belefutharnnk a fgg6leges sklzhatsg problm...
ba. Egyene,> t vezet a katasztr6fhoz, ha gy prbljuk meg ltrehozni az sszes g -
tlyt s kiegszteni az interfszeket, hogy mg egy sor kdot sem nunk.
______________________________ ____
Szmos igen j ok van arra, hogy mirt rdemes a tervet egy prototpuson kiprblni -
amely egy kevss elegns, de plda az alap deteinkre. Szmos tpusa van
a prolOtpusnak, melyek ntind ms s ms ignyeket elgtenek ki.
A felhaszn(116i interfsz prototpus lehet6v teszi a vgfelhasznl6kmlk sznt fellet
tesztelst
A funkcionlis prototpus nem foglalkozik a felhasznli felillettcl, viszont kiprblhat-
ak olyan kpessgek, mim pfldullevelek tovbbtsa vagy csatolt llomnyok kezelse.
Vgl pedig a felptssel kapcso];uos prototpus megadja a lebet6o,;get egy kisebb
progr..1111 fejlesztsre, valamint annak megbecslsf:re, vajon a tervezs tkrben k-
s6bb hogyan sklzhat a program.
Rendkvl fontos, hogy vgig vilgos,lk maradjan:lk a prototpus cljai. Dntsk el,
hogya felhaszn li felletet vizsgljlIk, a funkcionalitss<t l ksrleteznk, vagy mond-
juk a termk sklzhatsgra vagyunk kvncsiak. Egy a felptssel kapcsola-
tos j prototpus rosszul rja le a felhasznli fellilelel s persze ugyanez for-
dtva is igaz.
Az is fontos, ho!.'Y ne fejlesszk tl a prototpust, vagyis ne fektessnk bele annyi mun-
kl, hogy s:li:iksg esetn ne tudjunk knnyti szvvel megv{llni s kezdeni
az egszet.
A BO/BO-as szably
Egy amolyan tervezsi szerint <IZ a legclszen1bb, ha a munka szaka-
szban gy gondolkodunk, hogy az 8O%-ban a cloknak az,,--al a 8O%-val foglalko-
zunk amely a legtbb ember s7.mra fontos. Az maradk 20%-b:ln aztn foglal-
kozharunk a partikulris krdsekkel. Termszetesen vah'Y ulbb tallkozni fo-
gunk a "peremfellt:telek" krdsvel, de amg csak lehet, addig tartsuk magunkat a fcn-
li 8O/ 80-as szablyhoz.
Ennek megfelel6cn ltalban clszen1 a tervezst az alaposztlyokkal kezdeni, a m-
s()(llagos osztlyokat pedig egy id6re flretenni. Aztn ha mr azonostottuk a tbbsz-
rs osztlyokat, melyek apr klnbsgekl6l eltekintve hasonlan
kdnek, akkor megleheljk, hogy kivlasztunk egyet, s csak arra koncentrlunk,
al unokatestvreit pedig majd a vgn megvalstjuk.
.
4521 VI. rsz Klnlegessgek
Aprop
Parelo szablya
Van egy msik szably - a 80/20-as szably -, amely szerint a program els 20%-
nak megrshoz az 80%-ra van sruksg, a program htralv 80%-a pedig
az msik BO%t ignyli.
Na j, ez csak vicc. Az igazi szably szerint az 80%-a a munka 20%-hoz szk
sges, de egy egszen msik sszefggsben azt is szoktk mondani hogy egy cg
hasznnak 80%-a az gyfelek 20%-tl vrhat. Ezt a szablyt teht szles krben le-
het alkalmazni.
A PostMasterMessage osztly tervezse
Mindezeket szem el6n tartVa gy ctnrnk, hogy il tovbbiakban a ElostMa sterMessage
osztlyra koncentmlunk. Ez az az osztly ugyanis, amit a legkzvetlenebb mdon lU-
dunk el len6rizni.
Termszetesen az interfsz rszeknt a PostMasterMessage-nek a klnbz6 tfPllsok
kzt.i prbeszdet is bonyoltania kell. Azt remljk, hogy az egyb zenettpusok szol-
gltal6ival sikerlt majd szoros kialaktani , s meg t.udjuk szerezni 16-
llik az Ozenetformwmok specifikci6ir. Egyel6re .. zonban C$.1 k gyes t .. llgmsokra
tudunk hagy .. tkozni azok .. lapjn, amit az adol:{ rendszerekb61 kapllJnk.
A PostM!lsterMessage minden esetben rendelkezik felad6val , cmzettei, feladsi d-
tllmmal s trggyal, valamin( tartalmazza levl vagy zenet trzst s esellegesen csa-
tolt llomnyoka!. Ezek alapjn nyilvnval, hogy elrsi met6dllsokat kell majd r-
nunk ezekhez az :mribtumokhoz, a csatolt llom rlyok s a levl mretnek jelzs-
hez, s gy tovbb.
Nhny s7.0lglt .. t, melyekhez csatlakozni fogunk, b6vtett szvcgrormtllmot haszna.
vagyis olyan szvegel, mely utastsokat a s egyb, :t formzss:!l kapcso-
latos utastsokat (flkvr, is tartalmaz. Ms szolgltatk ugyanakkor nem tmo-
g:lIjk ezeket az attriblumokat, viszont esetleg sajt rormttunot hasznlnak
formtum szv(;!gek kezcl6sre. Az osztlyunk tch,t rendelkezni fog konvcrzi6s elj-
rsokkal, amelyek a szvegrormtumot szvegg alakitjk, illetve
PostMaster formtumra hozzk az egyb formtumokat.
Az alkalmazsfejleszti interfsz
Az alk:llmazsfejleszt6i interrsz (Applicalion Programming Interface - AJl!) ler.'isok es
rutinok egy szolgltats hasznlathoz. Szmos e-maii szolgltat elrhe-
t6v teszi sajt API-jt, igy a PostMaster is hasznlhatja az olyan kifinomult
22. ra
geket, mint pldul a szvegformtum kezelse vagy a begyazott llomnyok
Minden bizonnyal a PostMaster API-jnak kzzttele is hasznos lesz, hi-
szen gy ms szolgltatk szmr .. lehetv vlik a Posl1\1asterrel val egyiitunkds.
A PostMasterMessage-hez egy jl megtervezett nyilvnos interfszt keJlltrehoz-
nunk, a PostMasler API-jnak egyik legfontosabb rszt pedig az emltet! konverzis
f8!,lYnyek jelentjk majd.
A 22.2. listban lthat a PostMasterMessage felletnek pillanatnyi lersa.
Figyelem!
Mg csak meg se pr6bljuk...
A li sta nem definilja az alaposztlyt (Mai1MeSSage ), s emiatt nem is fogjuk tud
ni lefordftani.
22.2 Um - A Po.tM terM8IIag. interfsz (postmasterinterfaca.cpp)
o: 1/ 22 . 2 Lista. a PostMa.sterMessagc oszt l y
1 .
2 : class PostMasterHessaqe : publ i c MailMessage
3 : {
4 : public :
5 : PostMaatcrMcsaaqc();
6:
7 : Sender.
8 : pAddrc99 Rccipient.
9: pString Subject.
10 : pDatc crcationDate);
11 :
12 : II egyb konstruktorok jOnnek ide
13 : II ne fe1edkezzank el a mso16 konst r uktorr61
14 : II mint ahogy a storagc
15 : II s a wire (ormtum konstruktorokr61 sem
16 : II A kalnbz egyb formtumok konstruktorair61 se feledkczzQnk meg
17 : -PostMasterMessage() ;
18 : pAddress& GetSender() const;
19 : votd SetSender (pAddress&) ;
20 : II egyb adattag elrsi fOggvnyek
21:
22 : II opertor metdIJsokat ide . belertve az opertort is
23 : II valamint a konverzis rut i noka.t me lyekkel
24 : II a PostMaster azene t ck ms formtumra alakithat6ak.
25 :
26 : private :
27 : pAddress itsSender ;
28 : pAddress itsRecipient ;
29 , pString itsSubject;
30 , pDate itsCreationDate ;
31 : pDate itsLastModDate ;
32 : pDate itsRecciptDatc ;
454 1 VI. rsz Klnlegessgek
33: itsFlrstReadDate :
34 : pDate itsLastReadDate ;
35:. ) ;
A PostMasterMessage osztlyt a MailMessage osztlybl szrmaztauuk. Szmos
konstnlktort adtunk meg, melyek lehetv teszik PostMasterMessage objckrumok
ltrehozst ms zenelformtumokbl.
Szmos me16clllsL adtunk meg a klnbz6 adaLLagok elrshez s 016-
dostshoz, az operlorok pedig teszik zenet egy rsznek va!,')' egsz-
nek talaktst ms formnlffiokrn. A korbban trgyalt zenetolvas6 s trol fggv-
nyeket is fe1tnteltk.
Programozs nagy csoportokban
Mr ez a kezdetleges terv ;s elg arra, hogy lssuk, a k.i1nbzl' csopon.ok-
nak mil is kell megval6st:u,;uk, A Kommunikcis csapat mris kezdheti a kommum-
kcis hurrel kapcsobtos munkl, de meg kell egyeznie az zenetformtum cso-
portral annak a szik interfsznek a felptsr61, amelyen keresztl a kommunikci ..
httr szolgltatsa elrhet6ek lesznek.
Az zer,etfonm1rulll csapat v::rl sznO"leg egy interfszt kszt a Message OSZJ
Iyokhoz, ahogy azt mr korbban tettk, majd azzal a krdssel fog foglalkozni , ....
l<'roljuk s olvassuk ViSSz..1 :rz adatokat. Miutn tisztz6dtak az adaurolssal kapcsol.
krdsek, mris egyeztetni lehet a kommunikcis rteghez vezet6 interfszr6l,
Az lizenctszerkeszt6 ksztetst fognak rezni arra, hogya bels6 ZeT'
osztlyok rszletes felpHst szem tartva valstsk meg II szerkeszt6ket, ez
azonban kifejezett tervezsi hiba lelme. Nekik is egy interfszen kell kommup
klniuk :1 Message osztllYlII, az Ozenetszerkeszt6 objekrumok pedig csupn mim' ......
ismeretekkel rendelkezhetnek az zenetek strukrurjl illet6cn.
A tervezsi folyamattal kapcsolatos szempontok
Ahogy halad a projekt , jra s jra felmerl majd nhny tervezsi km,
Melyik osztlyba kenJljn egy adott funkcionalits vagy informci? Ez a
az zenet osztlyba vagy a cm osztlyba kerljn? A trolja ezt az m:
cit, vagy az zenet saj,t magt menl<;e el?
Az osztlyokat a titkosgynkkhz hasonlan csak minimlis tudssal
hzni, hogy a szksgesnl tbb adatot ne oszthassanak meg.
r
______________________________ ____
Tervezsi dntsek
A munka d<3rehaladlval szzval jelentkcwek majd tervezsi krdsek. Lesznek amo-
lyan globlis k6rdsek, pldul Ez mit csinljon
r
de akadnak majd specifikusak is
minL pldul "Hogyan brjuk mO'kdsrer,
Noha az implementci rszletei:1 progmm vgs6 formj ig nem biztosak, illetve n-
hny inlt!rfsz vltozi k vagy cserl6dik munka kzben is, mr a folyamat elejn is vil-
gos tervvel kell rendelkeznnk. Ltfontossg, hogy mg azelLL megrtsk, mit szeret -
nnk ltrehozni, miel6tt akr egy sor progmmk6dot is rnnk. A szoftverfejlesztssel
kapcsobtos cs6dk leggyakoribb oka az, hogya folyamat elej!.!n nem szletett meg
a megllapods arrl, hogy mi is az, ami kszL
Mi kor hozzunk dntseket?
Hogy legyen valami viszonytsi :llaplll1k azz.'li kapcsolatban, milyen is egy tervezt!si
folya mat, vizsg:'iljllOk meg egy konkrt krdst: mi lesz a menben? A PostMaster-ben
az els6 va lsznl:Tleg az nj zenet r.'s.'l" lesz, amely viszont felvet egy jabb krdst.
Ha l felhasznl ki vlasltja al zenet pontot, akkor pontOS:1fl mi fog
trtnni? lkrrejn egy szerkeszl6, amely :lZtn llrehozla az zenetet vagy cl6bb It!lre-
jn az zenet, amely ,lzutn ltrehozza a
A pal"'dncs, amin dolgozunk, az j zenet ltrehozsa, teht az (Jj Z(;!I1Ct
nik logikusnak. De mi trtnik, ha az iJzcnetrsa utn a felhasznl rgtn a Mgse
gombm kattint? tiszthb lenne el6bb a szerkeszt6t ltrehozni, mely ltre-
hozza (s birtokolja) az j zcnel(;!t.
Ennek a megkzeltsnek az a hibja, mskpp kell viselkednie
j zenet ltrehozsakor s mskpp egy mr meglv szerkesztsckor. Ha az zenet
mr korbban ltrejtt, tadjuk a szerkeszt6nek, gy csak egy kd szksl:ges, hiszen
mindi g egy mr mcglv zenetet kell szerkeszteni.
I la az zenetet hozzuk ltre ki hozza ltre? A men p;lrancs kdj,\ houa ltre?
lia igen, a kapja az 7.enet a szerkesztsi utastst, vagy ez a Mes sage osztly
konstmkl ornak rsze?
pillantsra ugyan van beJUle logika, hogya konstmktor csi nlja, e lvgre ha ltre-
hozunk egy zenetel, valszm11eg szerkesZleni is szeretnnk. Mindazonltal tervezsi
szempontbl ez nem j gondolat. is nagyon hogy mr az alapfe\te-
vsiJnk is hibs. Az ember gyakl".m kld affle . konzerv zeneteketn, pldul egy
a7. egyben tovbbt a renJszergazdnak egy hibazenetet. Ilyenkor nincs szksg szer-
kesztbre. M,sodszor - s ez taln mg az el6bbinl is fontosabb - a konstruktor fel-
.
I
456 1 VI. rsz Klnl.g.ssg.'
adata :lZ objektum ltrehozsa. Egy rendes konstruktor ne tegyen ennl se tbbet, se
kevesebl>cl. Ha egy Ozenerobjektum elkszlt, a konstruktor munkja vget r. A szer-
met6clusnak a konstruktorbl val meghvsa c5<1k sszekavarja a konstruktor
szerept msrsl:l sebezhet6v teszik az zenet objektumot a hibival szem-
ben is.
Ami pedig mg ennl is rosszabb, az az a tny, ho!,')' az edit metdu5 meghv egy m-
sik osztlyt - a szerkeszt6t- vagyis meghvja annak a konstnlktort is. Ugyanakkor
a nem alaposztlya a zenet osztlynak, nem is tanalm3zza t :I Z zenet
osztly, teht tkletesen szerencstlen, hogy az zenet ltrehozsa a
konstnlktornnak sikeres !efutsn mlik.
Vgl telj esen nyilvnval, hogy sose hvnnk meg a szerkeszt6t, ha ll1ag:t :lZ Ozenetet
sem sikerlt ltrdlo:t.ni, m:hpedig ennl a megold,snl ppen arrl van sz, hogya lt-
rehos sikr.::rl;! a szerkeszt6 sikeres hvst61 fgg. Ez teht (,!gy tkletesen kjfordtott
Vilgos, hogy csak nzutn hvhat juk meg a Message : : Edit ( ) -et, miutn
a 7.enet oszttily konslmklora teljesen lefutott.
Munka a
A tervezssel kllpcsolalos hibk feldertsvel kapcsolatban az egyik lehetsges meg-
kzelts lIZ, hogy mr a lenrezs illetve megvalsts kora; fzis.'iban ltrehozunk egy
vezrl6progr.lmot (dri ver program). A vezr16program oly:m fggv61Y melynek felada-
t.1 csupn fggvnyek mllkdsnek bemutatsa vagy Pld;ul a PostMas-
ter vezr16programj a rendelkezhet egy nagyon egyszen1 menvel, mely ltrehoz
PostMasterMessage objeknullokat, manipullja v,lgy ms mdon tesztel i ;1 ter ...
egyes rszeit. A vezrl6programot ppen ezn szoks is hvni .
A 22.3. Lista bemut atja a PostMlsterMessage kiss robllsztllsabb vfl llOZall, valamint
egy vezr16programot.
22.3 LII1a - A PostM .... rM .... ge Idrivllflll'Olfam.cpp)
o: II 22.3
l : #include <iostrcaffi>
2 : ttinclude <s t ring . h>
3 ,
<I : typedef unsighed long pDat e ;
5 : enum SERVICE { PostMaster, Interehange,
6 : CompuServe , Prodigy, AOL. Internet };
7 .
8 : class String
,.
10 : public :
11 : 1/ konstruktorok
12: String();
22, 6ra Objektum-orientlt elemzs s tervezs 1457
13 : String(const char const ) ;
14 : String(const String &);
15 : _String () ;
16 :
17 : II tlterhel t opertorok
18 : char & opcratorl) (int o f fset) ;
19 : char operator(] (int offset) const ;
20 : String opcral: or+(const String&) ;
21 : voi d String&) ;
22 : String & operator= (const String &);
23 : friend atd : : ostrearn & operator
24 : (std : : ostrearn& theStream, String& theString) ;
25 : II alap adattagelr6k
26 : lnt GetLcn()const { return itsLcn ; }
27 : const char GetSt.ring{) const { return it.sSt.ring ; }
28 : II stat.ic int Construct.orCount:
29 :
30 : privHte :
31 : St ring (int) ; II privt konstruktor
32: char ' itaString;
33: int. itsLen;
34 : } ;
35 :
36 : II az alap konstruktor ltrehoz egy O bjt hOSSZSg sztrin{Jet
37 : String: : String()
38 , (
39 : it.sSt.rlng = new char!l) ;
40 : itsSt.ring[O] '" '\0';
41 : itsLen=O ;
42: II st.d: : cout "\tDefault string construct.or\n";
43: II ConstructorCount++ ;
44 : )
45 :
46: 1/ privt (segd) konstruktor, melyet csupn
47 : II aZ osztly metdusai haslmlnak res sztringek
48: II ltrehozsra a kivnt mretben, Nullval tltjk fel.
49 : String : :String(int len)
50 : (
51 : j tsString new char [len+ l) ;
52 , int i;
53 : for ( i '" O; i<,.len; i++)
54 : itsString{l) = ' \0 ' ;
55 :
56 : 1/ std : : cout "\tString(int) constructor\n" ;
57 : II ConstructorCount.++:
58 : }
59 :
60 : /1 KaraktertOmbt alaktunk t sztringg
61 : String : : String(const char const cString)
62 , {
63 : itsLen -- strl en (cString) ;
54 : i tsString = new char [ i tsLen+l );
65 : int i-
66 : for ( i '" O; i<i t.sLen; i ++)
450 1 VI. rsz KUlnlegos,gek
67 : itsString[i] '" cString[i];
68: itsString[itsLen]='\O';
69 : II std: : cout "\tString(char*) constructor\n";
70: II ConstructorCount ++;
71:
72,
73: II msol konstruktor
74, String: : String (const String & rhs)
75 : I
76 : itsLen=rhs.GetLen() ;
77 , itsString := new char(itsLcn+ll;
78 : int i,
79 , for li = O; i<itsLen; iH)
80 , itsString[i] := rhs[i];
81 : ltsString[itsLen] = '\ 0 ';
82 : II std: : cout '\tString(St ring&) constructor\n',
83 : II ConstructorCount++ ;
84 :
85:
86: II destruktor, felszabadtja a lefoglal t memrit
87: String : : -String (j
88: (
89, delet e lj itsString;
90: itsLen = O;
91, II std : :cout "\tString destructor\n";
92:
93:
94: String& String: : operator= (const String & rhs)
95: I
96: if (this ... &rhs)
97 : return "this;
98: delete II itsString;
99: itsLen=rhs.GetLen();
100 : itsString new char[itsLen+l];
101: int i;
102: for (i .. O; i<itsLen; iH)
103 : itsString[iJ = rhs[i];
104: itsString[itsLen] = ' \0' ;
105 : return " thi s ;
106: II std :: cout \ tString operator:=\n' ;
107 :
108 :
109 : II nem konstans eltolsi opertor, mely
110: II a karakter pozcijt adja meg, me ly gy vltoztathat
111 : char &. Str ing : : oper ator[ ] (int offset)
112: {
113 : if (offset> itsLen)
114: return itsString[itsLen- l];
115 : elRO
116: return itsString[offset];
117 :
118 :
119, II konstans eltolsi opertor, melyeket
120: II konstans objektumokon hasznlunk (lsd msol konstruktor)
22. ra elemzs s tervezs
121 : char Stri ng : : operator [ ] (int offset) const
122 : {
123 : if (offset> itsLen)
124 : return itsString[itsLen-lJ:
125 ; else
126 : return itsString[of fset];
127 :
128 :
129: II ltrehoz egy j sztringet, mely az aktulis sztringet
130 ; 1/ hozzadja az rhs-hcz
131 : String String : : operator; (const String& rhsl
132 : (
133 : int total Len = itsLen + rhs ,GetLen () ;
134: String temp(totalLen) ;
135 : int i,j;
136 : for (i = O; i<itsLen; i+-l)
lJ7 : tcmp!i] " itsString[i);
138 : for (j = O; j<rha.GetLen() .. j++. iH)
139 : temp[i] = rhs[j ):
140 : temp[totalLen] .. '\O;
141 : return temp;
142 :
143 :
144 : /1 mcgvltoztatja az uktulis sztringet . nincs visszatrsi rtke
145 : void String : : operator+=(const String& rhsl
146: {
147 : int rhsLen = rhs.GotLen() ;
148: int totalLen .. itst,en .to rhsLen;
149: String temp{ totalLen) :
ISO : int i , j :
151: for ( l = O; i<itsLen: iH)
152 : templi] .. itsString[i);
153 : for ( j ,., O; j<rhs.GetLen(); j+t , iH)
154 : templi] It rhsli-itsLen];
155 : tcmp[totalLon] ='\0' :
156 : this .. temp ;
157 :
158 :
159 , II int String : : ConstructorCount O:
160 :
161 : std , : ostream& operator (
162 : std: : ostream& thoStream,
163 : String& theString)
164 :
165: theStream theString.GetString{) ;
166 : return theStream:
167 :
168:
169 : class pAddress
170 :
171 : public ,
172 : pAddress(SERVICE theService,
173 : cons t String& theAddress ,
174 : const St ring& t heDisplay) ,
f
460 I VI. rsz Klnlegessgek
175: itsService (theService ) ,
176: itsAddressString(theAddress ) ,
177 : itsDisplayString( t heDisplay)
178 : {}
179: II pAddress (String, String);
180: /1 pAddress() ;
161: II pAddress (const pAddress&);
182: -pAddress(){}
183: friend std: : ostream& operator (
184 : st.d : :ostream& theStream, pAddress& theAddress) :
185: String& GetDisplayString{)
186 : ( return itsDisp!ayString;
161 : private:
188: SERVICE itsService ;
189 : String itsAddressString;
190 : String itsDisplayStri ng ;
191 : ) ;
192 :
193 : std: : ostrearn& operat or
194: std: : ostrcam& theStream, pAddress& theAddress)
195 ,
196 : theStream theAddress . GetDisplayString() ;
197 : return theStream;
198 :
199 :
200 : class PostMasterMessage
201 : (
202 : public:
203 : 1/ PostHasterMessage () ;
204:
205: PostHasterMessage(const pAddress& Sender,
206: const pAddress& Recipient.
207 : const String& Subject,
208: const pDate& creationDate) ;
209 :
210: -PostMasterMessage(){)
211 :
212 : void Edit(); 1/ meghvja a erre az zenetre
213 :
214 : pAddress& GetSender () ret urn itsSender ; }
215 : pAddrcss& GetRec i pient ( ) {return itsRccipient;
216 : Stri ng& GetSubject( ) {rct urn itsSubject ;
217 : /I voi d Se tSender( pAddress& ) ;
218 : 1/ egyb adat t age l r6k
219 :
220 : /I
1/
opertor metdusokat i de , belertve az opert ort
valamint a kl1l0nbz6 konverzis rutinokat 221 :
222 : /1 melyekkel a Pos tMaster I1 zenetek ms formtumra alakthatak.
223 :
224 : private :
225: pAcldress itsSende r ;
226: pAddress itsRecipient;
227 : String itsSubj ect ;
228 : pDate itsCrea tionDat e;
22. ra Objektum-orientlt elemzs s tervezs 1461
229 : pDate itsLastHodDate;
230 : pDate itsRecoiptDato;
231 : pDat e itsFirstReadDate :
232 : pDate itsLastReadDate ;
233 : }:
234 :
235 : PostMasterMessage : , PostMasterHessage(
236 : const pAddress& Sonder,
237 : const pAddress& Recipient ,
238 : const String& Subject .
239 : const pDato& creationDato) :
240 : itsSender(Sender),
241 : itsRccipicnt(Recipient) .
242 : itsSubject(Subjcct) ,
243 : i t sCreationDate(creationDate) ,
244: itsLastModDate(creationDate) ,
245 : i t sFirstReadDate (O) ,
246: i t sLastReadDate(O)
247:
248 : s td: : caut " Post Master Message created. \0" ;
249 :
250 ,
251 : void PostMasterMessage : : Edit()
252 : {
253 : std :: cout "PostMasterMessage edit function callod\n";
254 :
255,
256:
257 : int main (l
258 ,
259 : pAddress Sender(
260: PostMaster, "j1ibcrty@PostMaster", "Jesse Liberty"):
261: pAddress Recipient (
262: PostMaster, "s1ibcrty@PostMastor",'Stacey Libcrty") :
263 : PostMasterMess8ge PostMasterMessage(
264 : Sender , Recipient, 'Saying Hello', O) ;
265 : std : : COllt "Messaqe review . . . \n " ;
266 : std: : cout "Prom: \ t \t'
267 : PostMasterMQS1HI.ge . CotSender () std :: end1 ;
268 : std: : cout ' Tc : \ t \t
269 : PostMasterMessage . CetRecipient () std :: endt :
270 : std : , ccut "Subj ect : \ t."
271 : PostMasterMessage.GetSubject() std: : endl;
272 : return O;
273 :
Post Master Message created.
Message review ...
From: Jesse Libcrty
To : Stacey Liberty
Subject : Say ing Hello
462 1 VI. rsz Klnleges,gek
A 4. sorhan a pDate tpust nlkli long-nak definiltuk. Nem ritka, hogya dtu-
mokat long tpus egszknt troljk. Gyakran ez olyan nknyes d5tumokt61, mint
pldul 1900 janur 1 . , eltelt msodpercek sz:mt tartalmazz<l. Progr::.munkIYd.n
csupn a helye van meg, de a pDate osztlybl valdi osztlyt is c.sinlhatunk.
Az 5. sorban a SERVICE egy konstans felsoroMs, mellyel kvethetjk, milyen tpus
a dm objektum: Post\'vIaster, CompuServe s gy tovbb.
A 8. s a 167 .. kztt talljuk a String interfsz{:t, valamint implcmentci6j;n, sz-
mos oly:tn rsszel egyetemben melyekkel az leckkben mr tallkozhattunk,
A String oSj(,tlyl az zenet osztly s az zenet osztlyt hasznl egyb osztlyok
hasznMjk, gy programunk llfonLossg eleme. Az zenet osztlyok teljessghez el-
engedhetetlen egy teljes (:s robusztus String oszt5ly.
A pAddress-t:l 169. sortl a 191. sorig terjede; szakaszban dekJa rltuk. Ez cstlpn
:lZ osztly alap funkdonalits{ll adj a s ahogy egyre jobban megnjk
a programot. Ezek az objektumok lt.fontossg elemei minden zenemek: a felad s
a dmzell <:me is ilyen tpus. Teljes funkcionalitssa. I br pAddress objekulmmal old-
juk meg lovbbtoll, megvlaszoll, slb. levelek kezelst.
A pAddress objcktum Celadala a megjelentell sZl"ring s a bels6 l!tv<'l.laszt sztring k-
vetse :I Z adou szolgltatshoz. Egy megvlaszolatlan k rds, hogy csupn egy
pAddress objektum legyen, vagy minden szolgltatstpushoz legyen megfel el6 310sz-
Jelenleg a szolgltatst egy konstans felsorolsbl vl:ISZljuk ki s "Address ob-
jekUlmban adauagkOl troljuk.
A 200. s 233. sorok kztt talljuk a PostMasterMessage osztly interfszt. A list-
ban az osztly mg magban szerepel, de hamarosan az rkl6dsi hierarchia rsz\'
tchetjk. l-la jratcrvezs sorn a Message osztlybl szrmaztat nnk, nhny tagvltG-
z bekcriilhctne az alaposztftlyba, illetve nhny aJaposzt5!ybeli tagfggvnyt fellb-
rIhatna agyerekosztly.
Az oszt{tly tc\jt:s L-nk mkdshez szksg lesz szmos konstruktorra, adattagelro
fggvnyre s egyb lagfggvnyre. Ez a programlista arra hvja fel a figyelmet, hogy
nem kelll00%-0s llapotban lennie a programunknak ahhoz, hogy vezrl6prograIllOl
rhassunk s nhny szempombl tesztelhessk azl.
A 251-254 sorokban egy csonka Edit () fggvnyt tallunk, csupn jelezlk, hOY3 ke-
rljn a fggvny, ha az osztlyunk mr teljesen lesz.
____________________________ ______
A a 257. s 273. sorok kztt runtettk fel. Jelenleg II program nem
csinl mst, mint meghv pr adattagc1r6 fggvnyt s a tlterhelt operlott
(oper-ator). Mindazonltal megfelele; kiindulpontot nyjt a PostMasterMessage s
II kerelrendszerrel val kisrletezshez - osztlyok mdostsa s a mdostsok hatsa.
Krdsek s vlaszok
Kerdc.>S: Miben kIII6nbzik a!apvetcn az objcktum-oriellllt elemzs s leroczs ti
II/egMzeltst6l?
\fa/asz: Az objektum-orientlt prog'ramozs technikk esetn az s
a progmmoz6k gy tekintenek II programra, mint fggvnyekrc, melyek
hajtamlk vgre adat.okon. Az objektum- orientlL programozs gy tekint <IZ adat. okra
s a velk kapcsolato." minl valamifle egsi'.re. Minden objektum tartal -
maz informcikat (;ldat) s k6pess6geket (fggvnyek) is. A procedurulis progr::lmo-
zs ezzel szemben a rggvnyekre koncentrl s <Irra, hogyan hatnnk ezek ;lZ adatokra.
gy tartjk, hogy mg Pascal s C prog unok eljrsok, addig a C++ programok oszt-
lyok gytjtemnyei.
Krds; Igaz-c az (IZ llts, 1I0&)1 az objekwm-orientlt programozs cm1ajfCI vC'gso
megolds az 6sszes programozsi problmra?
FIasz: Nem, 56t soha nem is szntk annak. Az viszont igaz, hogy nagy. sszetett
problmknl az objeknun-orientlt elemzs, tervezs s programozs olyan segdesz-
ad a progmmoz6k kezbe, mellyellekzdhet6ek a korbban lckilzdhetetlennek
hiu akadlyok is.
Gyakorlatok
Ebben a leckben az objektum-orientlt elemzst s tervezst sajtthattuk el. V!ilaszol-
junk most nhny krdsre s oldjuk meg a feladatokat, hogy elmlytsk II megszer-
zeLl tudst.
Kvfz
1. Programoz:1s megkezdse mit kell termnk?
2. Mit neveznk alkalmazsfejleszt6i fellernek (Application Progmmming
Interracei AP!)?
3. Mit csinl a
4. Mirt a nagy alkalmazsokat aprbb rszekre bontani?
464 1 VI. rsz Klnlegessgek
Feladatok
Ne feledjk, ti problmk megoldsai megrallhat6k a CD-n.
1. Vlasszunk egy kis problmt a ffiunknkbl vagy a mindennapi lellX51 s hajt-
suk vgre rdjta a leckben bemutatott lpseket.
2. M6doslL'iuk a 22.1 LiSl l (simpleevent . cpp) gy, hogy minden destruktort
vlL"nk egy az std: : cout kldtt (izenettel. Futtassuk le a programot s fl&'Ye1-
jk, mikor futnak le a destmktorok. Azt mr tudjuk, mikor futnak le
a konstruktorok, hiszen a napl zenet megjelenik.
3. Keressnk llZ [nterneten C++ osztlyokat s fggvny knyvtrakat. Nhnyat
mcgvizsglva gondolkozzunk el azon, hogy megvs6.rolnnk inkbb meg-
rnnk?
Vlaszok a kvfzkrdsekre
1. Kengeteg tennivalnk van a programozs megkezdse cl6tt: ignyfelmrs (mit
akar a vgfelhasznl6?), elemzs (mi szksges az ignyek kielgtshez?), s
tervezl!s (hogyan valsthatjuk meg a kvnt funkci6k:it?). Sajnos ll sok cg
gondolja gy, hogy . Ha mr itt ol ez a sok programoz, ht :Ikkor programozza-
nak. Kl rdekel, hogy nem teljes az ignylisca,"
2. Az API egy dokumenrum s eljrs mely lehct6v teszi egy szolgl-
tats hasznlatt. Nem kellrudnunk, hogyan mt.1kdik a mgtte ll kd, csu-
pn hasznljuk. A megvalsts rszletei rejtve maradnak el6ttnk.
3. A vezrl6program segtsgvel kiprblhatjuk s demonstrlhat juk a program
mr mesval6stou funkciit, illetve tesztelhet jOk az osztlyokat fejleszts kzben
Noha ez a program rendszerint teljesen nyers s egyszen1, segtsgvel megfi-
gyelhetjOk a program viselkedst s az elemei kztt fell p6 klcsnhatsokai..
4. A rszekre bonts egyik legnagyobb el6nye az, hogy tbb ember (vagy csopon
kztt oszlik meg a munka. Amg mi az egyik osztlyon dolgozunk, addig ms-
valaki egy msik osztllyaI foglalkozhat.
23. RA
Sablonok
Ebben az rban a kvetkez6k,61lesz sz:
Mik a sablonok s hogyan hasznljuk
Mil6\ jobbak a sablonok a makr6knl?
Hogyan hozzunk ltre osztlys.'lblonokat?
Mik azok a sablonok?
A 19. rban megtanulluk, hogyan ksztsnk lncolt listkat, amelyeket szpen bcc.:sa-
magoltunk, szakzsargonnal befoglaltuk (encapsulation): A lista csak a kezd6muLatr61
tudott, ami deleglta a munk:'t a mUlatknak, stb.
Az egyetlen zavar tnyez6 az voll, hogy a lncolt listnk csak egy adott tpus objek-
tumot tudott kezelni. Ms tpust sajnos nem tudtunk beletenni. Nem tudtunk pldul
Car vagy Cats objektumokat trolni benne, s semmi mst sem, ami nem egyezett
az eredeti listban tPUSS,11.
466 1 VI. rsz KOInl.ges.g.k
Korbban ezt gy oldoltk meg, hogy az j adattpusokhoz az objektum j verzijt
ksztettk eL Az objektum-orientlt vilgban egy List sosztlybl szrmaztathat juk
a CatsList osztlyt, s a LinkedList osztly kdjnak rszt felhasznlhat-
juk a Cats List deklarcijban. I-Ia azonban Car objekrumok trolsm akar-
juk befogni jdonslt lncoltlistnkat, az rklst meg kell ismtelnnk: j CarList
osztlyt kell ltrehozni , amelybe a kd egy rsze tmsol hat.
Egyik megolds scm Az mlsval a List osztlyt majd b6vte-
ni kelt , s rmlom lesz ezeknek a vl tozsoknak az rvnyestse a mr ltezt> szr-
maztatou osztlyokban.
A C++ egy viszonylag j adal(: ka, a sablon megoldst jelent a gondunkra. A divat jt
mllmakr6kkal szemben radsul a nyelv szerves rszt kpezi, vonatkozik r ti lpus-
ell en6rzs, s rendkvl sokoldal(lan hasznlhat.
Lchetv teszi, hogy ltrehozzunk egy ltalfinos cl osztlyt, majd egy parametrizlt
tpUSt itadv;l, a sablon aZt pldnyost ja.
A sablon pldnyosftsa
Sablon segitSgvel megtanthaljuk II fordtl, hogy ne cS3k nhny el6re megadott t-
pusbl hozzon Iire list.'it, hanem brmibl. A PartsList Part objeknunok listja,
a CatsList Cat objeknllnok listja. Az egyetl en dolog, amiben klnbznek az, hogy
mil yen tpus dolgoka! szerveznk listba. A sablonok esetben a troland tpus
az osztlydefinci6 paramtere lesz.
Pldnyostsnak hvjuk azt, amikor (egy osztlybl) objektumot, illetve egy sablonbl
konkr(:t tpust hozunk ltre. Az gy ltrejtt egyedi osztlyok :I s:lblon pldnyai.
A sablon definfcija
A parametrizlt List osztlyt (listasablont) a mdon dekJarljuk:
template <class T> II a sablon s a paramter deklarcija
class List II a parametrizlt osztly
public :
List () ;
II az osztly teljes deklarci ja
} ,
A sablonosztlyok deklarcijt s defincijt minden esetben a template kulcssz
cl6zi meg, amelyet :I pldnyonknt vltoz[athat paramter kvel. Az kdrsz-
leIben bemutatottlistasablonban pldul a listban trolt objektumok tpusa vltozhat.
Az egyik listapldnyba tehetnk Integer, mg egy msikba AnimaI objeknllllokat.
Pldnkban a c lass kulcssz jelzi , hogy a pammler egy tpus. Ezt kveti a T azonos-
t, amellyel a tovbbiakban a parametrizlt tpusra hivatkozunk a sablondefinciban.
A lista egy pldnya teht a T azonostt mindentt az int, mg egy msik a eat tpus-
sal helyettesti.
A parametrizlt lista int s eat tpus objektumokat trol6 pldnyait a
mdon deklarljuk:
Li st<int> anl ntList;
List<Cat>
Az anlntList objektum tpusa int , a CatList objektum Cat objektumokat trol
lista. Mostantl mr hasznlhat a List<int> tpus brhol , ahol a szokvnyos tpusok
is el6fordulnak: fggvny visszatrsi rtknl, fggvny paramtereinl stb.
A 23.1 List{tban a Lis t objektumot pllnunterezzk. Ez kiv{116 techinka sablonok gyr-
ts{tlloz: El6szr brjuk az objektumOl egy tpussal, ahogy ezt a 19. rn tet-
tk, majd ltalnoslsuk, hogy brmely tpust kezel ni tudja.
23.1 ulla - A parametrizlt listjk bemutatna lI oh listi.all Ipannli"'.pp)
o: II _ *
l : /I 23 . 1 plda
2 : II
3 : II Paramterezett lista bemutatsa
4: /I
5: /I
6, II
'1 : II
8 : /I
9 : 1/ Paramterezett lista objektum-orientlt megval6sitsa .
10 , /1 A List a z absztrakt Node tro16elcmnek deleglja a munk t .
ll : II Hromfle trol6elemet hasznlunk , zr6t s
12 , II kOzbnlsot . Csak ez ut6bbiban trolunk hasznos objektumot .
13 , II
14 , II
15 , II A Data os ztlyt azr:-t hozwk ltre, hogy pldnyai t
16 : 1/ a listban t roljuk.
17, 1/
IB , 1/ * **.**. *.**.**.*.**.* **.**.*.**. ** ***.*.***
19 : #include <iostream>
20 :
21 , enum { kl s Smalle r , kls Larger, kIsSame };
22 :
23 , II A listban t. rolhat6 Data osztly
24: 1/ Minden olyan osztlynak , melye t ebben a listban s ze r e tnnk
... t.rolni , rendelkeznie kell a kvetkezo kt met6dus sal":
25 : /1 Show: Kiirja az objektum rtkt .
26 : /1 Compa re : sszehasonltja kt ob j ektum rt kt,
... s meghat t"o zza a r e lat i v poz i ci6t.
468 1 VI. rsz Klnlegessgek
27 , class Data
28 : {
29 : public ,
30 : Data(int val) : myValue(val) {}
31 : -Data()
32 : {
33 : std :: cout "Data objektum tOrlse. melynek rtke :
34 : std::cout myValue " \n" ;
35 :
36 : int Compare(const Data &) ;
37 : void Show() { std : : cout myValue std: :endl; }
38 : privatc:
39 : int myValue ;
40: J;
41 :
42 : II A Compare metdust arra hasznljuk , hogy egy adott objektum
43 : II listbun elfoglalt helyt megllapitsuk.
44: int Data : :Compare(const Data & theOthcrObject)
4 5 : (
46: if (myValue < theOtherobject . myValue)
47 : return kIsSmaller ;
48: li (myValue > theOtherObject.myValue)
49: return kleLarger;
SO : else
51 : return kIsSame ;
52 :
53 :
54 : II Egy msik osztly, amit szintn a listban kvnunk trolni
55 : II Ebben a lncolt listban is a korbban emltett kt met6dusra
56 : II lesz szaksg :
57 : II Show: Kirja az objektum rtkt .
58 : II Compare: Osszehasonltja kt objektum rtkt. s relatv
.. podci6t ad vissza .
59 :
60: class Cat
61 : {
62 : public :
63 : Cat(int age} : myAge(age} (j
64: _Cat()
65 : {
66 : std: : cout myAge " ves macska tOrlse\n" ;
67 :
68 : i n t Compare (const Cat &) ;
69 : void Show()
70 :
71:
72 :
7] :
74 : private:
std, : cout "Ez a macska':
std: : cout myAge ves\n":
75: int m y A g
76 : } ;
77:
78 ,
23, ra
79 : II A Compare met6dust arra hasznljuk, hogy egy adott objektum
80 : II listban elfoglalt helyt megllapitsuk .
81 : int Cat : :Compare (const Cat & theotherCat )
B2 :
B3 : if (myAge < theOtherCat . myAge)
B4: return k IsSmaller ;
BS : i f ImyAge > theOtherCat . myAge)
86 : return kIsLarger;
87 : else
88 : return kIsSame;
89 :
90:
91:
92 : II A tro16objektumnak absztrakt adattipusa
93 : II Minden szrmaztatott tipusnak kell Sz Insert
.. s Show met6dusokat
94 : tcmplate <class T>
95 : class Node
96 : {
97 : public :
98 : Node () ()
99 : virtual -Node I) I)
100: virtual Node InsertIT theobject)zO;
101: virtual void Showl) = O;
102: private:
103: } ;
104:
105: ternp1ate <class T>
106 : class Interna lNode : public Node<T>
107 :
lOS : public :
109 : InternalNode(T * theObjcct , Node<T> next);
110 : -Interna1Nodel){ deleta delete myObject ;
lll : virtual Node<T> InsertiT theobject) ;
112: virtual void Show ( )
ll3: (
114 : myObject - >Show():
115 : myNex t->Showl);
116 : II delegls
117 : private :
US : T rnyObject ; II Maga az objektum
119 : Node<T> * myNext ; II a lista kOvet kez6 t ro16el emre muta t
120 : ) ;
121 :
122 : II A konstruktor csak inicializl
123 : tcrnplate <class T>
124 : InternaINode<T>:: InternalNode IT * theObject, Node<T> * next) :
125 : rnyObjectlthebject),myNext(next)
126: (
127 : )
128 :
129 : II A lsita velej e
130 : II Amikor a l i s t ba j objektumot tesznk,
131 : II tadjuk a tro16elemnek, amely ki tal lja
1
470 11n, rsz Kiilnlegessg.k
132 : /1 a helyt. s beszrj a a listba.
133 : templat c <class T>
134 : Node<T> ~ InternalNode<T> : : Insert(T * theObject)
135 :
136 : /1 Az j szerzet kisebb vagy nagyobb nlam?
137: i nt rcsult = myOhject->Colnpare(*thcObject) ;
138 :
139 : switch(result)
140 : {
141 : 1/ 11. tradici szerint, ha egyen16ek vagyunk, v az els6bbsg.
142 : case kisSame : / I {gy ez az g tvezet arra az esetre,
.. amikor nagyobb nlam
143: case kisLarger: 1/ Az j objektum elm kerl
144 : (
145: IntcrnalNode<'I'> ObjectNode =
146 : new InternalNode<T>(thcObject , t his):
147 : return Objcct Nodc l
1.48 :
149 : II Nagyobb nlam, teht adjuk t a kOvetkez6 tro16elcmnck
150 :
151 : case kisSmaller :
152 : myNext = rnyNext->Insert(thOObjcct) ;
153 : return this;
154:
155, return this;
156,
157:
158 , II A Tail trolelern csak r s z m szC!repet jtszik
159 , template <class T>
160: class Tai1Node : public Node<T>
161 : (
162 : public :
163: TailNoda(){}
164 : virtuel -TailNode(){}
165 , virtual Node<T> Insert (T .. theObject) ;
166 : virtual void Show() { }
167 : private:
168 : }:
169 :
170 : II Ha az Object tpus objektum hozzm kerl, mindenkppen elm
171: /1 lesz beszrva, hiszen n vagyok a zr6elem,
.. aki IllOgOt t mr semmi sincs.
172 : templat e <class T>
173 : Node<T> TailNode<T> :,Insert(T .. LheObject}
174 :
175 : Interna1Node<T> ObjectNode =
176 : new InternalNode<'J'>(theObject, this);
177: return ObjectNode;
178 :
179 :
180 , II A kezdd tro16elemben nincs objektum,
181 : 1/ csupn a lista 1egels6 el emre mutat
182 : templat e <class T>
183 : class HeadNode : publ ic Node <T>
184 :
185 : public:
186 : HeadNode();
187 : virtual { delete myNext; }
188 , virtual Node<T> * Insert(T * theObject) ;
189 : virtual void Show{) ( )
190 : private:
191 : Node<T> myNcxt;
192 : } ;
193 :
194 , / / Mihely 16trejn ti kezd6elem,
195: / / az nyomban maga mg teszi zr6elemct is
196: template <claGG T>
197 , HeadNode<T>: : HeadNodc()
198: {
199: !lIyN!:lxt : new TailNode<T>;
200 :
201 ,
202 : /1 A kezd6elem el6tt nincs semmi, :gy az objektumot
203 : II rgtn tovbbadhatjuk a kvet kez6 tro16el emnek .
204 , template <class T>
205 : Node<T> * HeadNode<T> :: Insert (T theObject)
206 : (
207 , myNext : myNext - >Insert(theObject) ;
208 : return this;
209 ,
210:
211 : II Minden munkt deleglok, de enym a dics6sg
212 : template <class T>
213 : class LinkedList
214 , {
215 : public :
216 , LinkedList();
217 : -LinkedList() { deiete myHead ; }
218 : void Insert(T theObject) ;
219 , void Showl\l1() ( myHead->Show() ;
220 : private :
221 : HeadNode<T> * myHead ;
222 : } ;
223 ,
23. ra Sablonok 471
224 : II Szletsemkor ltrehozom a kezd6eleme t . amely maga mg
225 : II he lyezi a zr6elemet .
226 , II Az res lista teht egy kezd6elcmb6l ll . amelyet azonnal a
227 : /1 zr6elem kvet , kztk pedig nincs semmi .
228 : template <class T>
229 : LinkedList<T>: :LinkcdList()
230 : (
231 : myHead = new HeadNode<T> ;
232 :
233 :
234 : 1/ oeleglj , deleglj, deleglj
235 : template <class T>
236 : void LinkedList<T> :, Insert(T * pObject)
237 : {
472 1 VI. rsz KilI6nl'llossgek
238 : myHead->Insert(pObject ) ;
239 :
240:
241 : 1/ Tesztprogram
242: int main ()
243:
244: pCat;
245 : Data * pData;
246: int val ;
247 : Li nkedList<Cat> ListOfCats ;
248 : LinkedList <Data> ListOfOata:
249:
250: 1/ a felhaszn16t61 pr rtket
251: 1/ s elhelye2:zk azokat II li stban
252 : for (;;)
253 : {
254 : std:: cout "Adj meg' egy rtket (O vge): ";
255 : std:: cin val;
256 : if (ival)
257 : break:
258: pest ncw Cat(val);
259: pOata: new Data (val) ;
260: ListOfCats.lnsert(pCat);
261: ListOfOata.lnsert(pData):
262:
263 :
264 : II vgigmegyOnk a listn s kirjuk az el emek rtkt .
265: std: : cout ' \n ' ;
266: ListOfCats.ShowAll();
267: std: :cout "\n",
268: ListOfData.ShowAll();
269 : std :: cout "\n ****,,***." \n\n";
270: return O; II A listk kikerlnek a hatkOrb61 , s megsemmislnek.
271:
Adj meq
"""
rtket (o vge) : 5
Adj meg egy 'rtket (o vge) : 13
Adj meg egy rtket {o vge} : 2
Adj meg egy rtket {o vge} : 9
Adj meg egy rtket (o vge) : 7
Adj meg egy rtket (o vge) : O
E,
a macsk.!! 2 ves
"'
a macska 5 ves
E,
a macska 7 ves
"'
a macska 9 ves
E,
a macska 13 ves
Data objektum trlse, melynek rt ke: 13
Dato objektum t r lse, melynek rtke : 9
Data objektum trlse, melynek rtke: 7
Data objektum trlse, mel ynek rtke: 5
Data objektum trl se, melynek rtke : 2
13 ves macska t rlse
9 ves macska t Or lse
7 ves macska trlse
5 ves macska t dse
3 ves macska tOrlse
23. ra Sablonok 1473
vegyk szre, mennyire hasonlt a 23.1 Li sta a 19. rn bemutatOllhoz.
A legnagyobb vltozs, hogy minden osztly- s metdusdcklarci6 el6tt a kvetkez6
preAx ll:
Lempl ate c 1ass <T>
Ebb61 ludja II fordt, hogy olyan tpussal parnmtereztk a listl, amelyet c&1.k a pld-
nyosts pillan:nhan fogunk megmondani. A lrol6elem Node osztlynak deklarcija
most pldul h'Y nz ki:
template <class T>
class Node
Eszerint :1 Node osztly nmagbrtn nem ltezik, de pldnyostani fogjuk a Cats s
a Data oszlll yaL A paramlCrczeshez hasznlt tpust T jelli.
Hasonlail, az InternalNode helyett most InternalNode<T> ll (T tpus Inter-
nalNode- ja). Tovbb, InternalNode<T> nem egy Data objeklumra es egy msik
Node-ra mutat, h.mem egy T tpus objektumra s egy Node<T> objektumm. Ez lmat
a 118. s a 119. sorban.
Nezzk meg alaposabban a 133-156. sorban definilt Insert mel6duSl. A logika
ugyanaz, de ahol korbban konkrt tpust (Data) hasznlrunk, Olt most T szerepel. Te-
ht, a 134. sorban a paramter mulat egy T tpus objekrumra. a pldnyos-
t{\skor, a fordt T helyre behelyettesti II megfelel6 tpust (Data s Cats).
A lnyeg, hogy az Internal Node az adattpust fggetlenl elvgzi a feladatt. Tudja,
hogyan hasonllSa ssze az objektumokat. Egyltaln nem rdekli, hogy a Cats objek-
tumok pontosan gy hasonltjk ssze egymst, mint a Data objekrumok. Valjban,
a Cats osztlyt jrarhat juk gy, hogy a kort nem trolja, hanem a szletsi id6bl
szksg szerint kiszmt ja. Az InternalNode-l ez egy cseppet sem rdekli.
474 1 VI. rsz
Sablontpus hasznlata
A sablontpus gy hasznlh:tt6, ahogy a tbbi tpus. tadhat fggvnynek paramter-
de lehet rtk is, mindkt esetben nkkel vagy referencivaL Ezt
mutatja be a 23.2 Lista. Hasonltsuk ssze a 23.1 Li stval!
23.21J1111- Pa_1Isto ......... (16aCOIt- __ 6YoI1
f--. l
1 : II 23 . 1 plda
2 : II
3 : /1 Paramtere2ctt lista bemutatsa
4 : / I
5 : II
6 : II
7, / I
8 , / I
9: II Paramterezctt lista objektum-orientlt megva16s1tsa.
10, II A List az absztrakt Node tro16elemnek delcglja a munkt.
11: II Hromf61c tro16elemet hasznlunk: kczd6t. zr6t s
12, II kOzba!s6t. Csak ez utbbiban trolunk hasznos objektumot.
13 : /1
14 : II
15 : II A Data osztlyt azrt hozzuk ltre, hogy pldnyait
16 : II a listban troljuk.
17 : II
18 : II **** ************** ********* **.**** ****** -******
19 :
20 : 'inc1ude <iostrcam>
21 :
22 ; enum { kIsSma1ler. kIsLarger , kIsSame} ;
23 :
24 : II A listban trolhat Data osztly
25 : II Minden olyan osztlynak, melyet ebben a listban szeretnnk
.. trolni , rendel kezni e kell a kOvetkez6 kt metdussal ,
26 : II Show : Kirja az objektum rtkt.
27 : II Compare: OsszehasonHtja kt objektum rtkt, s meghatrozza
_ a relatv pozicit .
28 : class Data
29 :
30 , public :
31 , Data{int val),myValue{val){)
32 : -Data ()
33 : (
34: std: : cout 'Data objektum tOrlse, melynek rtke: ';
35 : std: : cout myVa 1ue '\n' ;
36 :
37 : int Compare(const Dat a &) ;
38 , void Show() ( std: : cout myValue std : : endl ; )
23. ra Sablonok 1475
- --- - - - - ---------=-=---==""'-''----------' ..
39 : prlvate:
40 : int rnyValue ;
41 : J ;
42 :
43 : II A Compare met dust arra hasz n ljuk, hogy egy adott objektum
44 : II listban el f ogl al t helyt meg l l apitsuk .
45 : i nt Da t a : : Compare (const Data & t he OtherObj ect )
46 : {
47 : if (myVa l ue < theOthcrObject.rnyValuc)
48 : return kIsSmaller ;
49: if (myVal ue > theOtherObject . myValue)
50 : retur n kIsLarger ;
51 : else
52 : return kIsSame;
53 : l
54 :
55 : 1/ Egy msik osztl y , ami L szint n a listban kvnunk trolni
56 : II Ebben l lncol t lisLban i s a korbban emltett k t met6dusra
57 : II l esz
58 : /1 Show: Kirja az objektum rtkt .
59 : /1 Compare : sszeha sonltja kt objektum rtkt,
... s relatv pozicit ad vissza .
60 :
61 : class Cat
62 : (
63: public :
64 : Cat(int age) , myAge(ag-e) {}
65 : -Cat()
66 : (
67 :
68 ,
std: : cout !nyl\ge ' ves macs ka t Orlse\n" :
69 , int Compar e (const Cat &.) :
70 , void Show()
71 ,
72 ,
73 ,
74 , }
75 : private :
std : : cout " E'Z II macska .
std : : cout myAge ves\n" ;
76 : int myl\ge ;
77 : } ;
78 :
79 :
80 : II A Compa r e met 6dust arra ha!:\z n l juk, hogy egy adot t obj ektum
81 : II listban e lfogla l t helyt mcg11api tsuk .
82 : int Cat : : Compare (const Ca t & theOther Ca t)
83 : {
84 : if (myAge < theOtherCat.myAge)
85 : ret u rn kI ssmaller ;
86 : if (myAge > theOtherCat.myAge )
87 : r e t u r n ki sLarger ;
88 : else
89 : return kissame :
90 : }
91 :


476 1 VI. rsz Klnlegessgek
92 :
93 : II A lista trol60bjektumnak absztrakt adattipusa
94 : /I Minden szrmaztatott tipusnak felal kell definilnia
.. a z Insert s Show metdusokat
95 : template <class T>
96 : class Node
97 :
98 : public :
99 : Node(){}
100 : virtual -Node () {}
101 : virtual Node * Insert{T theObjectl"'O;
102 : virtual void Show() '" O,
103: private :
104 : ) ,
105 :
106: template <c l ass T>
107: class Int crnalNode : public Nodo<T>
108 :
109 : public :
110: InternalNode( T * theObj ect, Nodo<T> * next) ;
111: virtual -I nternalNode () ( delete IllyNext ; delete myObject : l
112 : virtual Node<T> * I nser t (T * theObjectl ;
113 : virtual voi d Show () I I delegls
114 : (
115 : myObject->Show() , myNext->Show() :
116 :
117 : private :
118 :
119 :
120: ) ;
121 :
T * myObject ; II Maga az objektum
Node<T> * myNext : II a lista kOvetkez6 t6ro16clcmrc mutat
122: II A konstruktor csak inicializl
123 : template <class T>
124 : InternalNode<T> : : InternalNode (T * theObject, Node<T> * next) :
125: myObjcct(theobject) .myNex t(next)
126 : {
127 : }
128 :
129: II A lista veleje
130 : II Amikor a listba j objektumot tesznk ,
131 : II tadj uk a tro16elemnek , amely kitallja
132 : II a helyt . s beszr ja a l iRt ba .
133 : template <c l ass T>
134 : Node<T> * I nternalNode<T> :: Insert (T theObject )
135 : (
136 : II Az j szerzet kisebb vagy nagyobb nlam?
137 : int rosul t '" myObject - >Compare( *theObject) ;
138 :
139 : switch{rcsu1t l
140 : {
141 : II A tradici szerint, ha egyen16ek vagyunk , 6v az els6bbsg.
142 : case ItlsSame : II ez az g tve zet arra a z esetre,
.. amikor nagyobb nlam
23. ra Sablonok 1477
143 : case kIsLarger : /1 Az j obj ek tum e lm kerul
144 : (
InternalNode<T> * ObjectNode : 145 :
146 : new InternalNode<T>(thebj ect, this) ;
147 : return ObjectNode;
148 :
149 : /1 Nagyobb nlam. teht adjuk t a kvetkez6 tro16elemnek
150 :
151 : case kIsSmal1er:
152 :
153 :
154 :
myNext = myNext->Insert( t hebject) ;
rcturn this ;
155 : rcturn thic ;
156 :
157 :
158 ,
159 : /1 A Tail trol el em csak rszem szerepet jtszik
160 : temp] ate <class 'I'>
161: class TuilNode : public Node<T>
162 : (
163 : publ ic :
164 : TailNode() (l
165 : vir t ual (j
166 : virtual Node.:T> * Insert(T * theobject) ;
167 : virtual void Show { ) { }
168 : privata :
169 : );
170:
171 : II Ha az Object tipu!'I objektum hozzm kerl, mindenkpptm elm
172: II lesz beszrva, hiszen n vagyok a zr6e1em, aki mOgOtt
.. m6.r semmi sincs ,
17] : temp1ate <class T>
174 , Node<T> Tai1Node<T> :: Insert(T thCObject)
175 : (
176 : Interna1Node<T> ObjectNode
177 : new Interna 1Node<T>(thCObject, this) ;
178 : return ObjeCtNOde ;
179 :
180 :
181 : II A kezd6 tro16e1emben n incs obj ekt um,
182 : II csupn a l i s t a lege1s6 e l em re mut a t
183 : t emplate <class '1'>
184 : c l ass HeadNode : pub l ic Node<'l'>
185 :
186 : public :
167 : HeadNode{) ;
168 : virtual -HeadNode() { d e lete myNext; }
169 : virtual Node<T> .. I nsert {T * t hebject) ;
190 : virtual void Show() ( myNext- >Show() ; }
191 : private:
192 : Node<T> * myNext ;
193 : };
194 ,
478 I VI. rsz KlIlnl.g.ssg.k
195 : 1/ Mihelyt ltrejn il kezd6elelll, az nyomban
196 : 1/ maga mg teszi zr6elemet is
197 : template <class T>
198 : HeadNode<T> : : HeadNode (J
199: (
200 : myNext '" new TailNode<T>;
201 :
202 :
203 : II A kezd6elem e16tt nincs semmi, igy az objektumot rOgtOn
204 : II tovbbadhatjuk a tro16clemnek.
205 : template <class T>
206 : Node<T> HeadNode<T> :: Insert(T " theObject)
207 , {
208 : myNcxt ., myNcxt->Inscrt (thcObject) ;
209 : return this ;
210 :
211 :
212 : II Minden munkt deleglok, de enym a
213 : template <class T>
214 : elauG LinkedLi ot
215 :
216 : public :
217 : LinkedList() ;
218 : ( delete myHead; )
219 : void Insert (T " theObject) ;
220: void ShowAll() ( myHead->Show() ;
221 : private:
222 : HeadNode<T> myHead;
223 : ) ;
224 :
225: II SzOletsemkor ltrehozom a kezd6elemet, maga mOg
226: II helyezi a zr6elemt.
227: II Az Ores lista teht egy kezd6elemb6l ll . azonnal a
228 : II zrelem kOvet. kOztOk pedig nincs semmi.
229: <class T>
230 : LinkedList<T> : : LinkedList()
231 : (
232 : myHead =: new HeadNode<T> ;
233 :
234 :
235 : /1 Oalogl j . deleglj , delegl j
236 : tcmplatc <c lass T>
237 : void LinkedList<T> : : Insert( T * pObject)
238 : (
239 : myHoad->Insert (pObject) ;
240:
241 :
242 : void rnyFunction(LinkedList<Cat>& ListOfCats);
243 : void myOtherFunction (LinkedList<Data>& ListOfData);
244 :
245 : II Tesztprogram
246: int main{)
247 :
248 : LinkedList<Cat> ListOf Cats ;
23. ra Sablonok 479
249 : ListOfData ;
250 :
251 : myFunction(Lis t OfCats):
252 : myOtherFunction(ListOfData);
253:
254 : II VgignzzOk a listt, s kirjuk az elemek rtkt.
255: std: : cout "\n" ;
256 : ListOfCats . ShowAll();
257 : std : :cout "\n" ;
256 : !>lsLOfData . ShowAll () :
259 : std::cout "\ n .. *. \n\n";
260 : return O; I I A listk kikerOlnek a hat6kOrb6l, s megsel1lllislnek.
261 :
262 :
263 : void myFunction(LinkedList<Cat>& ListOfCats)
264 :
265 : Cat pCa t;
266 : int val;
267 :
268: 1/ A felhasznl6 adjon meg nhny rtket,
269 : II amit II listba tesznk
270: for l;:)
271: {
272 : std : :cout " \nHny ves a macskd? (O vge):
273 : std: : cin val;
274 : if (Ivel)
275 : break:
276 : pCnt .. new Cat(val);
211 : ListOfCats . lnsert{pCat);
218 :
219:
280:
281:
282 : void myOtherFunction (LinkedT"ist<Data>& ListOfData)
283 : {
28-t : Data .. pData ;
285: int val;
286:
287: I I A felhasznl6 adjon meg nhny rtket,
288: /1 amit II listba tesznk
289: f or ( :; )
290 : {
291 :
292 :
293:
294:
295 :
296:
297 :
298 :
299 :
std : : cout 'Adj meg egy rtket (O vge) : ' .
std: : cin val;
if (!val)
break ;
pData = new Data{val);
ListOfData . lnscrt(pData);
480 I VI. ,sz'
Hny ves a macskd?
(o vge) : 12
Hny ves a macskd? (o v ge) : 2
Hny ves
,
macskd? (o vge) : 14
Hny ves a macskd? (o vge) : 6
Hny ves a macskd? (o vge) : O
Adj meg egy rtket (o vge) : 3
Adj meg egy rtkat (o vge) :
9
Adj meg egy rtket 10
vge) : 1
Adj meg egy rtket (o vge) :
5
Adj meg egy rtket (o vge) : O
E,
a macska 2 vec
E,
a macska 6 ves
Ez
,
macska 12 ves
E,
a macska 14 ves
Da\.a objekt..um LOrlse , melynek rtke : 9
Dat a objektum trlse, melynek r tke : 5
Data objektum tOrlsc , melynek rtke : 3
Dl;ltu objektum tOrlse , melynek rtke : 1
14 ves macska tOrlse
12 vel:! macska tOrlse
6 ves macIJka tOrlse
2 ves macsk", tOrlsc
Ez a plda majdnem ugyanaz, mint az e16z6, azt leszmtva, hogyaLinkedList ob-
jeknunokat refcrendval adjuk t az azokal feldolgoz fggvnyeknek. Ez rendkvl
fontos tulajdonsg. Miut:n a listkat pld,nyostotluk, teljesen definilt tpus objckru-
mokknt kezelhet6k: fggvny paramtereknt s visszmrsi 6nkeknt.
A szabvnyos sablon knyvtr
A szabvnyos sablonknyvtn (Standard Template Library - STL) a C++ szabvny defi-
nilja. Minden fordt, azt llljk, hogy szabvnyos, tartalmazza az STL-l .
Az STL sablonnal megvalslott trol60sztlyok, pldul tmbk, lisUk, sarok, vermek
stb, tovbb szmos kzs algoritmus, pldul rcndez(:s, keress stb. gytijtemnye.
Az STL clja az, hogy ezeknl a gyakran feladatoknl ne kelljen jra feltall-
nunk a spanyolviaszt. Az STI.-t tesztelik s javtjk, j a teljestmnye, s nem utolssor-
ban ingyenes! Ennl is fontosabb, hogy az STI jrahasznosthat. Mihelyt megtanulluk
s megrtettk a hasznlatt, minden programunkban alkalmazhatjuk, ahelyett, hogy
jra s jra magunk megirnnk.
23.6ra Sablonol1481
Mindig emlkezznk r, hogy a termelkenysg s a karbantarthatsg kulcsa
az jrahasznosts!
Krdsek s vlaszok
Kerds: Mi11 hasznljunk sablonl, amikor makrval is mego/dhatunk egyjeladatot?
Vlasz: A sablon!" ... tpuscllcn6r..:s vonatkozik, s integrlt rszt kpezi a nyelvnek.
Krds: Mi ti a paramterezltet jggwllysabloll s a szokvtillyosjligsvny
panl1nterei kztt?
Vlasz: Szokvnyos fggvny (nem fggvnysablon) megadott tpus paramte-
reken vgez /Jniveleteket, A fggvnysablon ellenben azl is lehet6v leszi, hogya pa-
mmtereket paramterezhessk.
Krds: M/I...'Or hasz nljunk sablol/t, s mikor
Vlasz: Hasznljunk s.1.blont akkor, ha a halmaza azonos, csak az oszclly ms-
ms tpusm al kal ma zz.1. azokaL Ha azon k:-tpjuk m:lgunkat, hogy kclot m:'isolunk, s
csak egy-kt tag tpus.1t v:.\ ltoztatjuk meg, ideje elgondolkodnunk a s.1.blon haszn:'i. lat1n.
Gyakorlatok
A sablonok megismerse utn pr6bljuk megv:.\laszolni, ill etve megoldani az albbi
krdseket s feladatokat, hogy a trgyban szerzett ismeretek megszilrdulj:mak.
Kvrz
1. Honnan tudja a fordt, hogy nem swkvnyOl:i osztlyt, hanem sablont definilunk?
2. A 22.1 pldban szerepl6 lncoltlista-sablon honnan tudja, hogy az j elemeket
milyen sorrendben kelJ beszrnia?
3. Hogyan cl eklarlunk egy osztlysablonbl objektumot, s hogyan jelezzk, mi -
lyen osztlyt kell ehhez hasznlnia?
4. Honnan tudja a fordt, mikor kell megsemmistenie a listban trolt objekmmokat?
482 1 VI. rsz' K11lnl'g,ssg,k
Feladatok
1. HasonlL'iuk ssze a 21.1 (parmlist . cpp) s 19. 1 (linkedlist . cpp) Hstkat!
szre fogjuk venni, hogy milyen a hasonlsg.
2. a fordtnk dokumentci6jban, hogy a szabvnyos sablonknyvtr
mely osztlyai vannak me
b
J\la16stva! Borland fordt esetben, hasznlja a sg6t
(Help) a f6 menben, majd vlasszon tmakrt (Help Topics) s vgl a bal ol-
dali ablakban hivatkozst ( Reference)!
3. Hasonlt.'>a ssze II 22.1 plda lncolt listjnak sablonjt a fordt dokument-
ci6j{lban list STL-oszlllya\1 Keresse mcg a hasonlsgokat s a k-
lnbsgeket!
Vlaszok a kvfzkrdsekre
l. A fordt a template <class T> prefIx miatt tudja, hogy sablont defil1i{llunk.
2. A krdses objektumok Compare () metdlls:'\n:lk hvsa :1 137. sorban
A fggvny rtelemmel megtltse a programozk, naz a mi feladatunk (vc-
gyk szemgyre a 44. s a 81. sorban kezd6d6 filggvnyeke. Ha egy kutykat
rcprczentl'il osztlyt is szeretnnk :I listban trolni, ahhoz is meg kellene r-
nunk az sszehasonlt fggvnyt.
3. Nzzk meg a 22.1 LiSla 247. s 248. sorM A recept a kvetkez(}: oablonnv
<paramterosztlynv> sablonobjektumnv.
4. Amikor a main fggvny visszatr, a lncolt li sta elhagyja a l1at6krt':t, gy
:IZ osztly destruktor.! lesz vgrehajlv.l. Minthogy a trolt elemeket a lista dina-
mikusan hozta ltre, a trlsk is a li sta feladata. Ezt ot 23:1 Lista 110. soriiban
lthatjuk.
24. RA
Kivtelek, hibakezels
s nhny tancs
Ebben az rban a sz:
Mik azok 1:1 kivtelek
Hogyan hasznljuk a kivteleket, s hasznlatuk milyen krdseket vel fel
Hogyan hibtlan kdot
Merre tovbb
Programhibk. tvesztsek. kdrnegromls
Knyvnk pldaprogramjai illuszlrcis cllal szlettek. Szndkosan kerl tk a hiba-
forrsok taglalst , hogy ne vonja el figyelmnker az ppen trgyalt tmktL Az les
programoknak azonban figyelnik kell a hibalehet6sgekrcj a valdi veU
programkdok legnagyobb rszt a hibkra val felkszls s a hibakezels teszi ki.
484 1 VI. rsz Klnlegessgek
Azt mondjk, hogy ha a vrosok is gy plnnek, mint a szoftverek, akkor az ar-
r.:!. jr harkly romba dmen a civilizcil. Mindenesetre tny, hogy szinte minden
kereskedelmi program, kztk a legnagyobb gyrtk termkei is tartalmaznak hibkat.
Komoly programhibkat.
Attl mg, hogy ezt tudjuk, ez nincs gy rendben. Brkinek, aki komolyan programo-
zsra adja a fejt, fontossggal afnt kell trekednie, ho&'Y robusztus, hib;1
nlkli programokat rjon. lltom, hogya szoftveri par legnagyobb s kiemelked6
problmjt a hibs, inswbil k6dok jelentik. Az mindenesetre tny, hogya program
megrsnak legklcsgesebb rs7.e a tesztels, hibakeress s a hibk kijavtsa.
Szmos olyan apr hiba van, ami gondot okozhat egy progr.lIn futsakor. Az
a rossz logika: a program azt csinlja, amit a progr.HTloz6 szeretne; csakhogy (5 nem
gondolta vgig dg alaposan II mcgval6stotl algoritmust. A msodik II szintaktika:
rossz kifejezsm6dot, fggvnyt vagy struktrt hasznltunk. Ez a kt leggYllkoribb, s
a legtbb programoz ezek trekszik. Sokkal mvaszabbak azok :1 hibk,
medyek csak akkor tkznek ki, amikor a felhasznl valami vratlan dolgot mvel.
Ezek a piciny, logikai tapos6aknk csendesen s zavartabnul meglapulhatnak. Amikor
mr gy minden rendben van, egyszer csak hirtelen - BUMM! - valaki rossz
helyre lp, s progr.uTlunk megfeneklik.
A kutatsok s a gyakorlati tapasztalat egyarnt azt mutatj k, hogya fejleszts minl
ks6bbi stdiumban kerl el6 egy hiba, annl drgbb a kijavtsa. A lego1csbbak
azok a probl mk s hibk, amelyeket sikerl mg a progmm megrsakor elkerlni.
Csak alig drgbbak azok, melyeket a fordt6program kidob. A C++ szabvny afra t
rekszik, hogy .1 fordt6progmmokb61 a lehet6 legtbb hibajelcntst s fi gyelmeztetst
kiprselje (mg fordtsi
A IcfordlOu programoknak azok a hibi sokkal olcsbbak, amelyek rgtn az fut-
tatskor kideriiinek (amelyek mindig sszeomlst okoznak), mim amelyek csak nag)'
ritkn okoznak problmt.
A logikai s szintaktikai hibknl nagyobb gondot jelentenek az esetleges hibk; ami-
kor pldul a programunk remekl mkdik, ha szmol ad meg a felhasznl 6, dc
sszeomlik, ha r be, Ms progmrnok akkor fagynak le, ha kevsnek bizonyul
a mem6ria, vagy ha kint felejtettilk a hajlkonyJemezl, esetleg ha a modem ppen
bontja a vonalaI.
A programozk az effajta trkenysg ellen gy kzdenek, hogy prbljk programju-
kat tenni. Goly1l6 az a progmm, amely minden futsidben elkpzel-
het6 esetre fel van ksztve, kezdve a bizarr felhasznli egszen a mem-
riahinyig. Ez a fajta programozs hasonlt a "defenzv amely abbl ll,
hogy nem bzunk a msik (esetnkben felhasznl6 vagy rendszer) udvari assg:i-
___ _ __________ "'24"-" ",6ra,,-0 -"Kiv .. ... '."""I .... ... s .., s"n..,h.., ... nyL' ... an ... ' ... cs
CJ
I,,48"'s '--__ --"""
ban, hanem azt felttelezzk, hogy brmilyen meglep esemny is megtnnhet.
Ha azonban elrell6ak vagyunk s felkszlnk az effajta dolgokra, akkor
az sszetkzs.
Fontos klnbsget tenni, a progrdmhibk kzn. Vannak ol}"dnok, amelyek abbl
addnak, hogy a programoz szintaktikai hibt vtelt. Vannak logikai hibk, amelyek
onnan erednek, hogy a programoz flrertette a feladatot vagy a megolds mdjt. V-
gl vannak olyan kivtelek, melyek szokatlan (m nem megjsolhatatlan) esemnyek
miatt lpnek fl, mint pldul az (memria vagy merevlemezhc\y) hinya.
Vratlan esemnyek kezelse
A programozk hatkony fordt6progr.lmokat haszn:l nak, s biztostkokkal
rakjk tele a kdot, amely Icbct6v teszi a programozsi hibk felfedezst. jra s jra
uekintik a tervet, 6s kimcrt6 tesztelst folytaUlak, hogy megtalljlik a logikai hibkat
A kivtelek azonb:m ms jelleguek. A kivteles krlmnyeket nem lehet teljesen kik-
szblni, csak felk(!szlni lehet clJuk, Felhasznlink szmtgpein id6nknt belelik
amemria; ilyer,kor az il krdi!s, hogy mit csinljon a program. Az albbi lehet6sgek
kzl lehet vJaszt:mi:
Hagyjuk sszeomlani a programot
Jelezzk a helyzetet il relhasznlnak, s elegnsan lpnk ki
Jelezzk a helyzetet a relhasznlnak, s tesszk s7Jlmra, hogy megk-
srclje a helyrelltsI S a folytatst
A progrnm maga javtja a problmI, s tovbb fut a felhasznl megzavarsa
nlkl
Nem muszj, S61 nem is kvnatos, hogy minden programunk automatikusan (!5 csend-
ben maga ksz\)ljn ki minden vratlan helyzetet, az azonba n nyilvnval, hogy
tbbet kell tennnk, mint hogy hagyjuk csak (Igy sszeomlani a programot.
A CH kivtelkezels tpusbiztos s szervesen mdszert biztost arra, hogy
megbi rkzzunk a program futsa kzben ritka, de megjsolhat esemnyekkel.
Kivtelek
A C++ nyelvben a kivtel egy olyan objektum, amely a kd egyik rszr61 a msikra
addik l: a hibt kivlt reszr61 a lubt rszre. Amikor bekvetkezik a kivteles
esemny, akkor azt mondjuk, hogy a program .tovbbdobon egy kivteltH; a kivtel
kezelst pedig .a kivtel elkapsnak
H
mondjuk.
486 1 VI. rsz Klnlegessgek
A kivtel tpusa dnti el, hogy melyik kdrszlet fogja kezelni a problmt; a tovbb-
dobott objektum tartalma (ha van), visszajelzst nyjthat a fdh<tsznI6nak. A kivtdke-
zels mgu hzd gondolat
Az efforrsok kezelse (pldul a memriafoglals vagy az llomnyok zrol-
sa) ltalban a program igen alacsony szintjn zajlik
Annak eldntse, hogy mi trtnjen akkor, ha meghisul egy alacsony szinnl
azaz, ha nem leheL a szksges mem6rit lefoghl lni v,lgy egy llomnyt
z5rol ni , ltalban magas;lbb szintG Imlvelcl, s hogya ft!lhasznM6
segtsgt is ignybe kell vennie a k6dnak.
A kivtelek gyors t jrst biztostanak a kd rszeit61 a hibake-
rszbez. bogy vannak rtegek, melyek fggvnyei
teremtenek pldul a mem6riafoglalsok felszmolsra, de ezek
nlkl is lehet olyan k6clot rni, amelynek nincs ms clja, mint vgign.mi a hi-
b:tfe1LLeleket.
Hogyan valstsuk meg akivtelkezelst?
A try blokk segtsgvel krbe lehet venni a veszlyesnek grkez6 k6drszletet. Eb-
ben a blokkban v5rjuk ti kivtel tovbbdobs5t.. Pldul:
try
(

}
A catch blokk kzvetlenl a try blokk utn kvetkezik; ebben kezelhet6ck a kivte-
lek. Pldul:
try
(
;
}
catchfOutOfHemory)
(
II Akkor lp letbe, amikor a memriahelyzeten kell segteni
)
catch(FileNotFound)
(
II Akkor lp letbe. amikor nincs meg a keresett fjl
)
A kivtelkezels lpsei a kvetkez6k:
1. Keressk meg a program azon rszeit, amelyek olyan kezdenek,
melyben kivtel keletkezhet, s vegyk krbe try blokkal.
24. ra Kivtelek. hiba kezels s nhny tancs 1487
2. Hozzunk ltre alkalmas catch blokko kat, hogy le.gyen hol elkapni a tovbbdo-
botL kivtel eket; kezelj k a mem6riap roblmka l s je1ezznk vissza a felhasz-
nl6nak, ha ez szb;ges.
Aprop
Tovbbdobs s elkaps
Amikor ki vtel kel etkezik, a vezrls azonnal az aktulis try blokkot k v t catch
blokkra kerl.
A 24.1 Lista szemllteti a try s a cat ch blokkok hasznlatt.
24.1 Usta - Kivtel tovbbdobsa (exceptions.cpp)
o: /1 24 . 1 Lista Kivtelek tovbbdobsa
l : #include <iostrearll>
2 ,
3 : const int DefaultSize " 10 ;
4 ,
5 : /1 definiljuk a "kivteles" osztlyt
6 : class xDoundary
7 : (
8 : public :
9 : xBoundary () {}
10: -xBoundary () ()
ll : privatc :
12 : ) ;
13 :
14 : class Array
15 :
16: public :
17 : II konstruktorok
18 : Array(int itsSize = DefaultSize) ;
19 : Array(const Array &rhs) ;
20 : -Array () ( delete [ l p'J'ype ; )
21 :
22 : II opertorok
23 : Array& operator=(const Array&);
24 : int& operator[) (int offS:t) ;
25 : const int& operator[ ] (int offSet ) const ;
26 :
27: 1/ hozzfro ft1ggvnyek
28 : int Get itsSize() const { return itsSize ; J
29 :
30 : II barcf ggvnyek
31 : fri end st.d : : os t. ream& operat.or (std: : ostream&, c onst Array&) ;
32 :
33 : private :
34 : int. *pType ;
488 1 VI. rsz Kiilnlegessgek
35 : int itsSize ;
36 : };
37 :
38 :
39 : Array " Array(int size} :
40 : itsSize (size )
41 : (
42 : pType '" new i nt [ size) ;
43 : for (int i '" O; i<sizc ; i++)
44 : pType[i] '" O;
45 : )
46:
47 :
48 : Array& Array :: operator= (const Array &rhs)
49 : {
50 : if (this ;: &rhs)
51 : return this ;
52 : delete [ 1 p'J'ype ;
53 : itsSizQ " rhs.GctitsSize() ;
54 : pTypc '" new int [ i tsSize) ;
55 : for (int i O; i<itsSize; i++)
56 : pType[iJ .. rhs[i] ;
57 : rcturn *this ;
58 :
59 :
60 : Array : :Array(const Array &rhs)
61 : (
62 : itsSize " rhs . GetitsSize () ;
63 : pType = new jnt[itsSize] ;
64 : for (int i = O; i<itsSize ; i++)
65 : pType[i] = rhS [i) ;
66 : }
67 :
68 :
69 , int& Array : : operator[] (int offSet)
70 : (
71 : int size = GetitsSize() ;
72 : if (offSet >: O && offSet < size)
73 : r eturn pType[offSetl ;
74: throw xBoundary() ;
75 : return pType[offSetl ; 1/ Az MSC lecsillaptsra .
76 :
77 :
78 :
... A Borland figyelme ztetst ad.
79 : const int& Array : : operator[] (int o ffSet) cons t
80 :
81 : int mysi ze = GetitsSize () ;
82 : if (offSet >= O && offSet < mysize)
8] : return pTYPe[offSetl;
84 : throw xBoundary();
85 : return pType[offSet ] ; /1 Az MSC lecsillaptsra .
86 :
87 :
... A Borland figyelmeztetst ad.
24. ra Kivtelek, hibakezels s nhny tancs 1489
8B : std: : ostr eam.& operator (std , : Qstream& output ,
89 , const Array& t heArray)
90 : {
91 : for ( int i = O; i<theArray.GetitsSize () ; i ++ )
92 : out put ' ( ' i " l " theArray[il std:: endl;
9] , return output ;
94 :
95 :
96 : int main()
97 :
98 , Arr<ly intArray(20) ;
99 : try
100 , {
101 , for (int j = O; j< 100; j++l
102 , {
10] : intArray[jl = j ;
104 , std :: cout 'intAr ray {' j
105 , " l okay . std, : endl ;
106 :
107 :
108 : cotch (xBoundary)
109 : (
110 , std :: cout "A bemen6 adatot nem sikerlt feldolgozn! . \n";
111 , l
112: std :: cout "Ksz.\n';
11] : return O;
114 :
not
intArray[O j okay ...
intArray[l l okay .
intArray [2 J okay .. .
intArray[31 okay .. .
intIIrray [4) okay .. .
intArray[51 okay .. .
intArray(6) okay .. .
lntArray [7 l okay .. .
intArray(8] okay . . .
intArray [910kay .. .
intArray [ 10] okay .. .
intArr8y(ll] okay .
intArray[12] okay ...
intArray[131 okay .
intArray[14] okay .
intArray[151 okay .
intArray[16] okay .
intArray[171 okay .. .
intArray[18] okay . . .
inLArray[191 okay . . .
A bemen6 adatot nem sikerOll feldolgozni .
Ksz .
490 I rsz ' Killnl.g.ssg.k
A 24.1 Listban egy lecsupasztott Array osztlyt hozunk ltre egy egyszeru kivt:tdkc-
lels bemutatsra. A 6-12. sorban egy igen egyszenl kivtel osztlyt dekl arlunk
(xBoundary). Figyeljk meg, hogy semmi, de senuni nem teszi ezt ;IZ osztlyt specili-
san kivtel osztll y. Voltakppen brmilyen osztly, bnnilyen mel6dusokkaJ s (ag-
vltozkkal vgan viselheti a kivtel szerept. Pusztn atl61lesz ez kivtel oS7.tly, hogy
eZI hasznljuk a tovbbdobsnl (thr ow) a 74. sorban, s ez kerl elk:lpsrJ. (catch)
II 108. sorban.
Az eltolsi (offset) opertor akkor dobja tovbb az xBound-,ry-t, amikor ,IZ osztly
gyflprogramja a tmb hatrain kvli elemet prbl elrni (74. &s 84. sor). Ez messze
tlmutat <1Z0n, ahogy a norml tmbk kezelik az effle 6k visszandnak br-
mi szemelet, ami ti hivatkozott mem6riacmen tallhat. Ez alkalmasint garantltan
sszeomlaszlj:1 :1 programol.
A 99-107. sorban ta llhat a try utastsblokk, amelyben sz{tz egsz szmot prblunk
meg bevinni II 98. sorban dekl:.n1h Lmblx:.
A 108. sorban kezd6dik a catch blokk, melyben a kivtelek el kapsa v: li k.
Aprop
try blokkol<
A try blokkal klnbz utasitsokat fogunk kzre, kezdve a try
kulcssz6val, s krbevve kapcsos zrjelekkel. pldul Igy:
tn'
(
Filggvny ( ) ;
l
catch blokkol<
A catch blokkban utastsok helyezkednek el, kezdve a catch kulcssz6val s a be-
zrjelezett kivteltipussaI. valamint krbevve kapcsos zrjelekkel, pldul Igy:
try
(
r' ggvny () ;
l
catch (Ou t OfMemory )
(
II vdelmi tevke nysg
24. ra Kivtelek, hibakezels s nhny tancs 1491

A try s catch blokkok hasznlata
A kivtelek hasznlatnak legnehezebb rsze annak kitalJsa, hogy hov
is tegyk a try blokkot. Nem mindig nyilvnval, hogy mi vlthat ki kivteleket. A k-
krds az, hogy hol kapjuk el a kivteleket. hogy olt lenne j to-
vbbdobni a mem6riagondokat okoz kivteleket, ahol amemria lefoglalsa trtnik,
mg az elkapsuk a program egy rszn lenne idelis, ahol a felhasznli fel-
lettel foglalkozunk.
Erdemes ott elintzni a try blokkokat, ahol a mem6ria s ms lefoglal-
sa, hasznlata zajl ik Ms dolog a lmbhatrok kezelse, a rossz adatok elb-
rL.lsa stb.
A kivtelek elkapsa
A mdon zajlik a kivtelek elkapsa: a program a kivtel dobsa utn meg-
vizsglja a hvsi vermet. Ez nem 111.1s, mint az adott pillanatig meghvoll rggvnyek
listja.
A hvsi verem trolja a vgrehajts tvonal {tt is. Ha a main () meghvja
az Allat : : KedvencteltSzerez ( ) fggvnyt, majd a KedvencteltSzerez () meg-
hvja az Allat ; : SajtBellitsok() -at, amely a lpsben
az fstream: : operator ( ) -t hvja meg, akkor mindez eltroldik a veremben. Egy
rekurzv fggvnyt tbb pldnyban is megtallunk a veremben.
A kivtelt a hvsi verem az sszes aktulis blokkban rvnyesti. Ahogy a veremben
fggvnyek soriit felgombolyt juk, a veremben helyi objektumok destnlktorai
rvnybe lpnek, s az objektumok megsemmislnek.
Mi nden try blokk utn van egy vagy tbb catch utasts. Ha a kivtel ilJcs:.:kedik va-
lamelyik catch utastsra, akkor az ahhoz tartoz utastlsblokk vgrehajtsll tekinti
a program a kivtel kezelsnek. Ha egyikre sem illeszkedik, akkor tov{lbb folytatdik
a verem felgngyltse.
Ha a grgets elr a (main) legelejre, s a kivtel mg mindig nincs elkap-
va, akkor a t erminat e () (befejezs) fggvny hvdik meg, ez pedig az abort ()
meghvsval vet vget a program futsnak.
Fontos tudni, hogy a kivtelek fe\gombolytsa egyirny folyamat.
a verem objektumai febzmoldnak, s nincs visszat; miutn sikeresen kezel-
tk a kivtelt, a program a kivtelt catch utastshoz tartoz try utastsblokk
utl n folytatja a vgrehajtst.
492 1 VI. rsz Klnlegessgek.
gy a 24.1 listban a vgrehaj ts a 111. sorban folytatdik, amely az els6 sor
az xBoundary-t kezeld catch utastshoz tartoz try utastsblokk utn. Emlkezznk
csak vissza: a kivtel keletkezse utn a vezrl s nem a kivtel tovbbdobsa utni
po ntrl folytatdik, hanem a catch blokk utn.
Tbb catch megadsa
Lehetsges tbb catch felttel t is megadni; ez eselben a megfeleld programrszek gy
sorakoznak egyms utn, mint a switch utastS elgazsai. Az alaprtelmezeu
(default) elgazsnak, vagyis a . kapj el mindent" eselnek a catch( . . . ) felel meg.
Flgyeleml
Vigyzatl
rdemes nagyon meggondolni, hogy egyms utn sorakoztassunk-e fel kt catch
utas t st, melyben az egyik egy myExeption bzisosztlyhoz, a msik pedig en-
nek specializlt , szrmaztatott osztlyhoz kapcsoldik (mint pldul
mySpecificExeption). A vgrehajts mindkt utastsblokkba be fog lpni. El-
hogy bi zonyos esetekben pont ez a szndkunk, de mindez nem vrt
kvetkezmnyekkel is jrhat. Jobb lenni.
Hivatkozs elkapsa - tbbrtlsg akivtelkezelsben
Kihasznlhatjuk a kivtelek azon tulajdonsgt, hogy 6k tul ajdonkppen tbbrt{en
kezelhel6 osztlyok. A kivtel cm szeri nti tadsvaJ haszmlbalunk egy rkl6dsi hi -
erarchit is a futsi id6ben keletkezett kivteltpus Icgmegfelel6bb kezel she. A 24.2
listban tbbrt(l"en kezeljk a kivteleket. A kimeneltansga szerint hromszor
[attuk II progl"J. mot: egyszer egy S msodszor egy SOOOO harmadszor pe-
d ig egy 12 elemG t mbbel dolgozrunk.
24.2 Ulla - Tbbrtll kivt8lkozels (pulya.coptions.cpp)
0 , II 24.2 Lista II A kivtel ek tObbrtG elkapsa
1 , #include <iostream>
2,
3 , const int DefaultSize = 10 ;
4 ,
5 : II A kivtelosztlyok de f ini lsa
6 : class xBoundary (l ;
7 ,
8 , class xSize
, ,
10 , public :
ll : xSize(int size) ,itsSize(sizel (l
12 , - xSize() (l
13 : virtual int GetSize () ( return itsSize ;
14 : v irtual void PrintError ( )
24. 6ra Kivtelek. hibakezels s nhny tancs ( 493
------------="""-'-""="-""'=""'-'''-'''''''''''-=''''-'''''-----: ....
15 : ( std: : cout 'Size error . Received :
16 : itsSize std : , endl ; )
17 : protected :
18 : int itsSize;
19 : l ;
20 :
21 : class xTooBi g : pub l ic xSize
22 :
23 : public :
24 : xTooBig(int size) , xSJ.ze(size) (j
25 : virtual voi d PrintError()
26 : {
27 : std: : cout "Too big! Received : ";
28 : std: : cout xSize : : itsSize std, : endl;
29 :
30 : ) ;
31 :
32 : class xTooSmal l
33 : (
34: public :
public xSi ze
35 : x'I'ooSmall(int size) : xSize(size} ()
36 : virtual void PrintError()
37 : (
38 : std: : cout "Too small! Received : ' ;
39 : std:: cout xSize::itsSlze std :: endl ;
40 :
41 , ) ;
42 :
43 : class xZero public xTooSma l l
44 : (
45, public :
46 : xZcr o( int size) , xTooSmal1{size) {}
47: virtual void PrintError()
48 : {
49 :
50 :
51 :
std: : cout Zero!! . Received : ";
std : : cout xSize : :itsSizc std: :cndl;
52 : ) ;
53:
54 : class xNegative
55 :
56 : public :
public xSize
57 : xNegative(i nt size ) :xSizc(si ze) (J
58 : v i r t ual vo i d PrintError()
59 : {
60: s t d : : cout "Negativel Rece ived : " ;
61 : std:: cout xSize :: itsSi ze std:: endl;
62 :
63 : } ;
64 :
65 : class Array
66 :
... sz
67, public:
68 : II Konstruktorok
69 : Array{int itsSize " DefaultSize);
70 : Array{const. Array &rhs) ;
71 : -Array () ( delete [l pType;)
72 :
73 : 1/ Opertorok
7 4 : Array& operator= (const Array&) ;
75: int& operator[) (int offSet ) ;
76 : const. int& operator[) (int offSet) const ;
77 :
78 : /1 Hozzfr6 f9gvnyek
79 : int GetitsSize() const { rcturn itsSize; }
80 :
81 : /1 Bartfggvnyck
82 : friend std: : osLrea.m& operator (std: : ostream&, const Array&);
83 :
84 :
85 : private:
86: int *pType:
87 : int itsSize;
88: };
89:
90: Array::Array(int. size} :
91: itsSize{size)
92: {
93 : if (size -- O)
94 : throw xZero(size) :
95 :
96 : if (size < O)
97 : throw xNegative(size) ;
98 :
99 : if (size < 10)
100: throw xTooSmal1(size);
101 :
102: if (si%e :> 30000)
103 : throw xTooBig(size);
104 :
105 : pTypa : new int [size] ;
106 : for (int i O; i<size: i H )
107 : pType[i ] = O,
108:
109 :
110 : int& Array: : operator[ ) ( int offset)
lll :
112 : int size = GetitsSi ze () ;
113 : if (offset :>= O && offset < size)
114 : return pType[of fset);
115 : throw xBoundary();
116 : return pType[offsetJ: II Az MSC boldogtsra van gy ;
.. a Borland figyelmeztet
117 :
118 :
__________________________ ____
119 : const int& Array : : operator!) (int offset) const
120 :
121 : int si ze = GetitsSize ():
122 : if (of fset >= O && offset < si ze)
123 : return pType{offsetJ;
124 : throw xBoundary{);
125 : return pType[offset): 1/ Az MSC boldogitsra van igy:
... a Borland figyelmeztet
126 :
127 :
128 : int main{)
129 :
130 : try
131 : (
132 : lnt choice ;
133 : std: : cout 'Enter the array size : "i
134 :
135 :
136 :
137 :
138 :
139 :
140 :
Hl :
142 :
std : : cin choi.ce;
Array intArray (choice) l
for (int j = O; j< 100; jH)
(
int.ll.rray[jl '" j:
std : : cout iotArra}' [ . j <c 'J okay ...
std: : endl;
143 , catch (xBoundary)
144 : (
145 :
146 :
std: : cout 'Unable to process your input!\n" ;
147 : catch (xSize& t heExcepLion)
148 : (
149 : thcException.PrintError();
150 :
151 : catch ( ... )
152 : {
153 : std :: cout 'Something went wrong,'
154 : 'but I've no idea what!' std: : end1 ;
155 :
156 : std : : cout 'Done . \n';
157 : return O;
158 :
- Enter the array size : S
Too sma11! Received : S
Done .
Enter the array size: 50000
Too big ! Received : 50000
Done.
Enter the array size : 12
intArray[O] okay .. .
intArray [l] okay .. .
496 1 VI. rsz Klnlegessgek
intArray[2] okay .
intArray[31 okay .. .
intArray[4] okay .. .
intArray[51 okay .. .
intArray[6] okay .. .
intArray [710kay .. .
intArray[BI okay .. .
intArray [910kay .. .
int Array [10] okay .. .
intArray[ll] okay .. .
Unoble to process your input!
Done .
A 24.2 Listban az xSize osztlyb<l11 megadunk egy virtw'ilis fggvnyt: a PrintError () -
t, amely kir egy hibazenetet s az osztly pillanatnyi mrett. Ezt minden kf:s{bbi osz-
t.'ily
A 147. sorban il kivtelt hivalkozsknt adjuk meg. Amikor a PrintBrror ()-t egy ob-
jekrumra hivatkozva meghvjuk, akkor a tbbrt"sg miau a megfelel6 PrintError ()
verzi kerl funatSI"<l. Els6 <lIkalommal egy 5 mretU tmbt klilnk, amely
a TooSmall (Tti/Kicsl) kivtel tovbbdobst eredmnyezi. Ezt az xSize kivtelt el is
kapjuk 3 147. sorban. A msodik alkalommal mr egy 50000 mrel tmbl krnkj
ekkor a TooBig ( TllNagy) kivtelt dobja tovbb a program. Ezt is a 147. sor kapja el,
de a tbbrlsg miatt a helyes hibazenet jelenik meg. Ilmikor egy 12 mrel
tmbt krnk, akkor a program mr benpesti a tmbt, egszen addig, amg
az xBoundary (:xHa/lVol1al) kivtel tovbbdobsra nem kenil - eZl a 143. sorban
kapja el a program.
Hogyan rjunk professzionlis programokat?
A sablonokkaJ s kivtcJekkel felvrtezve immr jl megalapozott, profi C++ eszkztr-
ral rendelkeznk. a legkzelebbi sarokba hajtannk a knyvet, tekintsnk mg
t nhny dolgot a professzionlis progmmok rsa rdekben. Mihelyt
a kedves olvas mr nemcsak progmmozik, hanem egy fejieszt6 csapat
tagja lesz, olyan mdon kell megrni a kdot, hogy az ne pp csak mt1kdjn, hanem
msok szmm is rLheL6nek kell lennie. A krscinek a k-
dot a kell karbantartania s mdostania, maj d a
esetleg msnak is, ha a elhagyja a projektet
24. ra hib.kezels s nhny tanc. I 497
Igazbl nem tl lnyeges, milyen kdolsi stlust vlasztunk, csak az fontos, hogy ez
legyen kvetkezetes. A kvetkezetes stlus segt kilallni, mi voll a progf'dffiOz6 clja
az adott rsszel , s megszabadt az olyan id6ignyes hogy pldul
azt kelljen keresglni, hogy mennyire volt a mltkor valamelyik fggvny.
Az in nknyes, de jl mkd6 irnyvonalak olyan a projekteken alapul-
nak, melyekben magam is dol goztam. Minden programoz kialakthatja persze a saj t-
jt stlust - ezeket tekinLSnk elindulsnak.
Ahogy Emerson mondja, rend a kis elmk tmasza ft, a kd kvetkezetes stlusa azn
nem egy rossz dol og. Nagyban megknnyli a progrdffioz &s munkatrsai lett, ha
egy csoport kzmegegyezseit betartjk. Ez nem jelenti azt, hogy a stlust teljesen rg-
zteni kell , his".en az j tletek s a tovbbfejlesztsek menet kzben szletnek, de
a kvetkezetessg minclcnki szmra megknnyti a kzs munkt.
Fontos megrteni, hogy tbbfle klnbz6 stlus van, s hogy kemny ell enll st vlt-
hat ki az al bbi irnymutats nhny pontja. Ne feledjk, hogy ezek alka lmazsa csak
egy
Zrjelek
A zrjelek igaztsa az egyi k legellentmondsosabb tma, ami szembelltja a C s
C++ progmmoz6kat. n az albbiakat javaslom:
Az sszetartoz6 zrjelek legyenek fOgg6legesen egyms alatt.
A defincik s deklarcik legkls6 zrjel prja legyen a bal marg6nl. A bels6
utastsoknl hasznljunk beljebb kezdst. A zfjelprok igazodjanak
a megfelel6 f6 utastshoz.
Az igazn hossz utastsblokkok eseln tegynk egy megjegyzst a z r6 zr6-
jeihez, hogy knn)'ll legyen azonostani a blokk cljt. Ha rnznk egy zjr6 z-
rjeire, s nem ltjuk, melyikhez tartozik - ez mr egy "igazn hossz utasts-
Pldul:
if
(
II renge t eg sor , kztk akr ms utasitsblokkokk
II renge t eg sor , kztk akr ms utasitsbl okkokk
/1 renge t eg sor, kztk a kr ms utasitsblokkokk
) II if (felttel"", true)
Ne rjunk a zr6jel sorba ms kdrszletet. Pldul:
if (felttel==true)
m++;
j ,. k ;
ValamiFggvny() :
/"24' .,.
" , .y, '
: < y
" ,.
, .. . . .
I. .'
. - .
rsz Klnl'g ... g,k
Hossz sorok
gy rjuk meg a programk6d sorait, hogy ne 16gjanak ll a sorok a kpcrny6 egyszerre
lthat t3rtomnyn. A kilg sorrszekel knnyt'i szem tveszteni, s bosszant, ha
vz.';zinlesen kell grgeulnk a szvegel. Sortrs esetn kezdjk beljebb az j SOlt. T-
rekedjnk sszeru trspontokr.a, s lehet61eg hagyjunk az eredeti sor vgn valamilyen
jelet (ahelyett, hOh'Y az j sor elejt kezdennk vele), hogy vilgosan ltsszon,
hogy annak a sornak mg folytat6Unia kell, s mg nincs vge az adott ponton.
A CH fggvnyek rvidebbek C nyelV11 trsaiknl, dc II rgi jtancs itt is megllja
a helyt: trekedjnk egyetlen kperny6n elfr6 fi.lggvnyek rsra.
A tabultorok hrom vagy ngy szkznyi mrel(iek legyenek. meg rla,
hogy szerkesztprogramunk valban gy alakt ja-e t II tabultorokat.
A switch utasftsok
Az elgazsokat azonos pozcikban rdemes megtartani:
switch(variablcl
(
case ValueOne:
l\ctionOne{) ;
break;
case ValueTwo:
ActionTWo() ;
break;
default :
assert("wd Action");
break ;
A program szvege
lljon itt nhny jtancs, hogy olvashatbb legyen a kd, Knnyebb a kd karbantar-
tsa, ha az albbiakat megtartjlIk:
Hasznljunk btmn trkz karaktereket az olvashatsg elsegtshe.
Az objektumok s tmbk egy dologra vonatkoznak; ne tegyiink sz6kzker
az objektumokra utal opertorok kz ( . ,->, [l).
Az egyoperandus opertorok kzvetlenl az operandushoz kapcsoldnak, gy
nem kell kzjk szkzt tenni. Tegyk a szkzt az opedtorok msik oldalf3.
Az egyoperandus opertorok a ! , _, H, - -, -, * (mutatk), & pustalaktsl
s a sizeof.
24. ra Kivtelek, hibakezels s nhny tancs 1499
A klOpemndus opertorok mindkt oldalra tegynk szkzt: +, =, .. , I, %, ,
,<,>,==, ["'.&, 1,&&, 11,? : ,=,+=stb.
Ne akarjuk a szkz hinyval kifejezni a sorrendet (4+ 3 *2).
A s pontosvessz6k utn (s ne el) tegyk a sz6kzl.
A zr6jelekhez (bell) ne rjunk sz6kzt.
A kulcsszavakat, mim pldul az if, vlasszuk el sz6kzzel: if (a == bl.
A megjegyzst hatroljuk el egy sz6kzzel a II
rjuk a mutat6 s hi vatkozs opcrtorokat kzvetlenl a tpusnv utn, ne pedig
a vltoz6nvhez. igy legyen:
char" foo;
int& the Int ;
s ne gy:
char .. foo;
int &thclnt;
Azonosrt6nevek
Nhny tlet az azonost6nevek clszen hasznlatr61:
Vlasszunk hossz azonost6neveket, hogy kifejez6ek legyenek. .
Kerljk a rejtlY($ rvidtseket.
Sznjunk s energilt a szvegezsre.
Rvid vltoz6neveket (i, p, x stb.) csak Olt hasznljunk, ahol a rvidst:g olvas-
hat6bb teszi a kdot, s ahol olyan nyilvnval a szerepk, hogy felesleges
lenne megmagyarzni.
NL azonost6nv hossza legyen arnyos a hat6krvel
NL azonost6nevek klnbzzenek mrtkben egymstl lerva s kiejtve
is, hogy ne lehessen 6ket knnyen sszekeverni.
A fggvnyek (s mel6dusok) nevei legyenek igk vagy kpzett
Search (), Keres (), Reset () , Visszallt () , FindParagraph ( ),
BekezdsKeress () , ShowCursor ( ), KurzortMutat () . A vltoz6nevek legye-
nek elvont f6nevek, lehet6leg egy msik f6nvvel e!:,'Ytl, pldu! count,
dbszm, state,llapot,windSpeed, szlSebessg,windowHeight,
abl akMagassg.
A nevek belZse s a nagybetk krdse
A s a nagybetk krdsei majd rgz!nek, amikor a kedves olvas rtall sajt
stlusra. Nhny tlet kvetkezik ebben a tmban:
rdemes az azonost6k neveit kvetkezetes mdon megvlasztani; hasznljunk
felvltva kis- s ahogy az alkalmas. A fggvnynevek, met6dusok,
500 I VI . rsz Klnlegessgek
osztlyok, a t ypedef s struct nevek kezd6djenek (ez[ gyakran
Pascal Stlusnak hvjk, mint pldul MyFunction). Az adattagok vagy helyi vl-
tozk nevei kezddhetnek (ezL gyakran Camel Stlusnak hvjk,
mint pldul myVariable)
A felsorolsos tpus kon:"itansait nhny olyan rdemes kezdeni, ami
az enum nv rvidtse (pldul ts a TextStyle helyet:
enum TextStyle
(
tsPlain.
tsBold,
tsItalic,
tsUnderscore,
) ,
Megjegyzsek
A megjegyz6sek nagyban megknnythetik a kd megrtst El6fordulhat, hogy
a programoz hetekig-hnapokig nem dolgozik egy progl"d.mmal, esetleg nagyobb fon-
tossg projektek kel van elfoglalva. Ez idei alatt knnyen feledsbe merillhet egy-egy
kdrszlet szerepe. Ha msnak kell majd foglalkoznia progl"amunkkal , akkor mg na-
gyobb nehzsgel jelenthet egy-egy rszlet megnse. A jl tgondolt, kvetkezetes
stlus megjegyzsek rsa megri a befekt etett energit. Nhny tlet a megjegyzsek-
re vonatkozan:
Ahol csak lehet, hasznljunk inkbb II megjegyzseket, semmint / * * I
stlus:lkat.
A magas megjegyzsek nagysgrendekkel fontosabbak, mint a feldolgo-
zs rszletei. Programunk tnyleges rtk! nveljk a megjegyzsekkel, ne csak
a mrett. Ennek pldul semmi rtelme:
n ++; II n rtkt eggyel megnvelj\1k
Ez nem ri meg a rsznt Inkbb a fggvnyck s kdrszletek rtelmt kell ki-
emelni. Fogalmazzuk meg emberi nyelven, mit csinl egy fggvny. Jelezzk a mellk-
hatsokat, a paramterek s a visszatrsi rtk tpust. Jegyezzk fel felttelezseinket
(vagy amil nem vrunk), pldi'iul: . n feltehet6leg nem negatv", vagy .- l-et ad vissza,
ha x lVnytelen". sszetett logi kai szerkezetben jellhet jk az adott kdrszletben r-
vnyes felttelezsnket.
Hasznljunk teljes mondatokat, kzponrozssal. Meghllja magt
az erre sznt Ne legynk rejtlyesek, ne hasznljunk rvidtseket. Ami
a kd rsa kzben napnl vilgosabbnak l11n ik, az nhny hnapon bell arcpi-
rtan kdsnek s rthetetlennek fog ltszani.
24. ra Kivtelek, hibakezels s nhny tancs 1501
A program, a fggvnyek s a fej lcllomnyok elejre rjunk sszefoglal6
megjegyzseket, amelybl kiderl az adott modul szerepe, bemeneti s kime-
neti jellemz6i, paramterei, az eredeti szerz6je s mindenfle vltozs (szerz6-
vel s dlummal).
Nyugodt szvvel hasznljunk elegend6 res sort, ha ez segti az olvasI annak
megrtsben, hogy mi is trtnik. Klntsk el a logikailag sszetartoz k6d-
rszleteket.
Hozzfrs
rdemes kvetkezetesen kezelni .t progmm rszeihez tartoz6 hov..fr&si szinteket.
Mindig rjuk kl a public, protected s private kulcsszavakat; ne tmaszkod-
junk az alaprtelmezsek hasznlatra.
El 6szr soroljuk fel a nyilvnos adatokat, majd a vdetteket, vgl a priv{tl vlto-
zkat. Minden csoportban a metdusok utn sorakozzanak az adattagok.
A megfelel6 k6dr6szben llj anak a konstnlktorok, majd a destmktorok.
Az azonos nevt1 tlterhelt fggvnyek egyms utn kvetkezzenek. Egy CSOIJOlt-
ban soroljuk fl a hozzfr6 fggvnyeket, ha csak lehet.
Fontoljuk meg a mel6dusok s az adauagok csoport onknt nvsorba
rendezst. A beemelend6 (f/ duda) llomnyneveket azonb,m mindenkppen
nvsorba n soroljuk fel.
Br a tlterhel s esetn a virtual kulcssz hasznlata nem ktelez6, mgis r-
demes h:lsznlni. Ez segt emlkezni annak virtulis szerepre, s a deklar.'ici6 is
kvetkezetes rnal"'.ld.
Osztlydefinfci6k
Trekedj nk arra, hogya metdusok defindinak sorrendje egyezzen meg a deklar-
cik sorrendjvel; gy knnyebb megtallni.
A fggvnyek cl efi ncii nl a visszatrsi tpust s az egyb mdostszkat helyezzk
cl egy kln hogya fggvnyek s osztlyok nevei a bal margn kezd6dhesse-
nek. gy sokkal knnyebb megtallni egy-egy keresett fggvnyt.
Beemelend llomnyok
Amennyire csak lehel.Sges, kerljk a fej lcllomnyokba val llomny-beemelsl.
A legjobb minimlis vlaszts az, ha csak annak az osztlynak a fej lcllomnyt emel-
jk be, amelyb61 az aktulis osztly szrmazik. mg beemelni azon objeklu-
mokt, amelyek a deklar.lt osztly tagjai. Az olyan osztlyok esetben, melyekre csak
mutat vagy hivatkozs irnyul, a tpus hivatkozs.
502 1 VI. rsz Klnlegessgek
Ne felejtkezznk el semelyik szksges fejlcllomnyrl azzal a felttelezssel, hogy
egy msik . cpp llomnynak majd gyis szksge lesz r, abba majd bizonyra
beemel6dik.
Figyelem!
Vigyzzunk a fejlc.kre
Minden beemelend (include) llomny elejre rjunk beemelsi tancsokat.
assertO
Hasznljuk bln:tn az assert () utastst. Segt a hibk megkeressben is, de amiatt is
hasznos, mert a kJs6 szeml16 szmra is vilgosabban ltszanak a programoz felte-
valamint az, hogy mit tarl a rvnyesnek 6s mil rvnytelennek.
const
llaszn!juk a const kulcssz6t, ahol csak lehet. Paramterekre, vll0z6kra s
Egy fOggv6nyb61 gyaknln szksg van konstans s r,em konstans vltozalra; nc
sproljlLk mcg egyiket sem, ha tnylegesen kell mindkett6. I.egynk m.gyon krlte-
kintl5ek, amikor konstansbl n(;!m konstanss tpusfltabktst vgznk (vagy
fordtva). Vannak helyz.etek, amikor csak ez jelent megoldst, de mcg eg-
szen biztosan arr61, hogy van rtelme a dolognak, s lssuk cl megjegyzl!:sscl is.
Tovbbi forrsok
Keml!:ny munka ll az olvas mgtt; s ezen informcik birtokban mr alkalmas
C++ programoz6nak tekintheti magM - ezzel egyLL mg nem befejezennek
a tanulsi folyamat. Mg rengeteg mindent el lehel sajttani, s mg sok knyvet vgig
kell rgni, amg a C++ progmmoz6b61 professzionlis lesz.
Hol kapunk segftsget s tancsokat
C++ progmmozknt a legels6 bekapcsoldni egy vagy tbb C++ konferencia
online szolgltatsba. Ezekben a csoportokban kzvetlenl el lehet rni C++ progf".J-
moz6k akik vlaszoJbatnak krdseinkre, tancsOl adhamak, s esetleges
tleteinknek mlyebb alapot biztostanak. Vannak s
internetes f6nullok is, valamint rtkes hrcsoportok (pldul
comp.std.C++ s trsaik).
24. ra JGv,tel,k, hib.k",I's s nhny tancs 1503
Ajnlott olvasmnyok
Tmmelen sok j C++ (s ltalnos programozsi) knyv ];loLt napvilgol. Nhny
ezek kzl:
SCQ1T MI!YERS: Effectil.'e C++ (Addison-Wesley, ISBN: 0201924889, 1997). Msodik
kiads.
MJCKEY WIU1AMS et aL: C++ UlIlcashedCSams, ISBN: 0672312417, 1999). A kifino-
mult C++ technikkhoz.
JESSI! LUlF.R1Y: Clouds To Code (\YIrox Press, ISBN: 1861000952, 1997). Betekintst
nyerhetnk egy valdi alkalmazsba, melyet C++ nyelven rtak, objektumkz-
ponl elemzssel s tervezsseL
JESSE LIBERlY Cl al.: SC/ms Tcacll YO/lrseIfC++ for liNUX ill 2 / Days(JSBN:
0672318954, 2000). Tovbbi tudnivalk a C++-rl s a progrJ.!l1ozsr61 Linux
krnyezetben.
Az albbi forrsokat is j szvvel ajnlom:
BJAJU-';Il STROUSTII.UI'; nu.! C++ Prosramming LallgL/age(Addison-\'(lesley, ISBN:
0201700735,2000); magyarul a Kiskapu Kiad6 gondoz<'sb:tn: A C++ progra-
mozsi Ilyc//JOSBN: 963930]175, 2001).
BJUAN W. K.1!1t.\lIGHAN s P.). PlI\UGER: 711C Elements of Programmillg SI)'le
(McGraw-Hill, ISBN: 0070342075, 1988)
STEVI! OUALLlNE: C Elements of Slyle: 771C Pl"Ogrammer's Slyle Mawull fal" ElegaJlI
C (fnel c ++ Programs (Hl.lngl)' Minds, ISBN: 1558512918, 1992)
DONALD E. KNUTH: 17IC Art of Computer Programmillg (3 M /e/es sorozat):
Fllndamelllal Algorilhms, Samillllmen"cal A/gor/tllms, s SOl1ing and Saarcllill/5
CAddison-Wcsley, ISBN: 0201485419, 1998)
711C Praclice aj Programmi llg by Briall \17. Kernighal1 and Rob Pil..'e(Addison-
Wcsley, ISBN: 02016] ,86X, 1999)
BRIAN W. KERl'ilGHAN s P.J. Pl.AUGER: Software Tools(Addison-Wesley, ISBN:
020103669X, 1976)
ClC++ Usersjoumal Chavi!ap), http://www.cuj.com
Vgl taln haszonnal forgaljkJpssE LmERTY: 711C Complete Idiol's Guide to
a C(lraer ln. Compu/er Programlllil1g dm rst (Que, ISBN: 0789719959,1999),
melyben sz esik arrl, hogy hogyan rdemes beveLni kpessgeinket egy re-
mek munka megszerzsnek rdekben.
Figyelem!
Maradjunk kapcsolatban!
rmme! fogadunk megjegyzseket, javaslatokat vagy tleteket ezzel a knyvvel
(vagy ms knyvekkel) kapcsolatban. Ltogassanak el honlapunkra
a http://Www.LibertyAssociates.com cmre (Jesse Libertyj s
a http://www.cobs.comoldalra(DavidB.Horvath.CCP).Alig vrjuk, hogy kedves
olvasnktl visszajelzst kapjunk.
504 1 VI. rsz KOlnlegessgek
Krdsek s vlaszok
Krds: Mirt hasznlnnk try blokkokat, ha van ltalnos kivtelkezels is?
Vlasz: A try blokk specilis kivtelkezelst tesz lehet6v az adon k6dblokkban. J-
magam ltalnos kivtclkezclst hasznlok, ha az egsz k6dm vonatkozan kell meg-
oldani valamit, viszont try blokkokba helyezek nunden specilis e,sete.
Krds: Mi a fccnd6m mg, hogy elrtem a k6nyu ue8re?
Vlasz: Folycassa a tanulst! Prblja ki ms pldaprogramjait, rjon sajt progmmokat,
s olvasson sokat a nyomtatott vagy a hlzaton tallhat6
Gyakorlatok
Vget rt a 24 tanra. Vlaszoljunk meg nhny befejez6 k6rd6st a kivtelkezelssel
kapcsolatban s lssunk neki egy feladatnak tudsunk meger6stsre!
Kvfz
l . Mi a try blokk szerepe?
2. Hogy lehet definilni a kivtel-tovbbdobst?
3. Mi a klnbsg a throw s a try kzttt?
4. Hogyan lehet megadni az alaprtelmezeuen letbe catch blokkot?
Feladatok
Ehhez:I fejezethez csak egyetlen feladat caItozik: Irnya nagyvi lg s a programozs!
Prblj:l ki a knyvhz mellkelt sszes pldaprogramot, s a fordt6programmal rke-
zetteket is.
Vlaszok a kvfzkrdsekre
1. A t ry blokkban tallhat6 ut.'lstsokra kivltd6 kivteleket az azt catch
blokk kezeli.
2. Minden programoz clksztheti sajt kivtel-oszt.lyait, melyet egy-egy alkalmas
tovbbdobssal (throw) hvhat letre. A kivtel kezelst a hOZ7... kapcsold6
catch blokk vgzi el.
________ _ _ ____ ...:2:.:4:.: . 6:::ra=-"-=Kiv":::'."I.",k..:: h", iba:::k:::9Z8:::I::::s:.::::s.::"::h::::"",y...:ta::"::::c:::s.J. I ", 50:::5 ___ .-
3. A t hrow egy kifejezetten krt kivtel, melyet maga a program hv meg CHous-
ton, egy kis baj v a n ~ . A try blokk viszont azt tudatja a fordl6progranunal,
hogy ha az adon k6clrszben kivtel keletkezik (brmilyen meghvott knyvtri
alprogmmban, az opercis rendszer szintjn vagy akr egy throw rvn), ak-
kor ezl kezelni szeretnnk a kapcsold catch blokkban.
4, Ha olyan catch blokkoL szeretnnk megadni, amelyben azokat a kivteleket ke-
zeljk, amelyeket ms cat ch bJokkok nem kaptak el (a switch-beli def ault
analgij ra), akkor a paramtcrnv helyett hrom pontot rjunk a zrjelbe:
catch( ... ) .
J
VII. RSZ
Fggelkek
A fggelk A binris s a hexadecimlis szmrendszerek
B fUggelk Gyakran hasznl t kifejezsek
A FGGELK
A binris s a hexadecimlis
szmrendszerek
Az ember az iskolban mr rgen megtanulta, nu fn terem az aritmetika. Fontos is ez
a tuds, elvgre mi lenne velnk nlkle a htkznapokban. Ha rnnznk egy rc('<.!u
Jra s azt ltjuk rajta rgtn ki tudjuk olvasni, miszerint Nem
is volt ezzel semmi gondunk egszen idig.
De most, hogy programozni tanulunk, jn II keltes meg II tiz(,!nhatos szmrendszer, gy
jra M kell gondolnunk, mi is az a 145. Ez persze tovbbra is cgy szmol. jelent, de ma-
ga II lel'l jelsoroz31 mr nem maga a szm, hanem annak a k6dja. s ez nagy klnbsg.
Na de kezdjk az alapoknl. Nzzk cS:lk meg, mi is II klnbsg a h:lrmas szm s
a kztt. A 3" az tulajdonkppen egy olyan kunkori jel a papron. A hrom Illint
szm ezzel szemben egy fogalom. A paprra n szmjegyet ennek a fogalomnak a kpi
megjelentsre hasznljuk.
A klnbsgttel taln mg nyilvnva16bb, ha belegondolunk, hogy a hrmat szmos
ms mdon is lerhatjuk. A szvegkrnyezetben a .', I I I, lU, s .... jelek va-
lamennyien ugyanazt jelentik: hrom,
j
510 I VII. rsz Fggelkek
A (zes szmrendszerben sszesen tzfle szmjegyet hasznlunk: 0,1,2,3,4,5,6,7,8,
s 9. Ennek a tz jelnek a kombinlsval brmely szmot lerhanmk. De nzzk csak
meg hogyan reprezentljuk pldul a tzet.
A fentieknek megfelel6en hasznihatnnk nlindenfle mdszereket is, te-
szem azt lerhatnnk egyms utn tz darab A-t, vagy rhatnnk azt hogy 1111111111. Ezek
is megtes7.ik. Az kori rmaiak pldul azt rtk: X. M. ltalunk manapsg hasznlt
rendszert az arabok talltk ki. Lnyege, hogy a szmok megadsban nem csupn
a szmjegyek szmtanak, hanem azok pozci6ja is. A szm vgn, vagyis a jobb szln
vannak az kvetik a s gy tovbb. A tizentt teht e rend-
szer szerin kt darabbl kell sszeraknunk vesznk egy dar.lb tizest, meg l d<lr.lb
egyest, (:s aZl rjuk: l S <.egy", .t").
A mdszerb6l kvetkezik nhny egyszen1 szably:
I. A Lles szmrendszerben tz szmjegyet hasznlunk (O-9).
2. Al oszlopok (hdyirtkek) tz harvnyai, vagyis vannak egyesek, Lzesek, szza-
sok, s gy tovbb .
. ri::! a harmadik pozci <I szlasok, akkor kl szmjeggyel legfeljebb a 99-el
tudjuk brizolni. Avagy kiss ltalnosabban megrogalmazva: n szmjegy segt-
sghellegfeljebb O s 10
n
-1 kz es6 szmokat brzolhalunk. Ilrom szm
jeggye! pld:"iul O s vagyis 999 kzt: cs6 s:dtmok
Ms szmrendszerek
Ha jl meggondoljllk, nincs abban semmi vletlenszen1, ho!,'Y a mindennapi letben
ppen a tzes szmrendszert hasznljuk, hiszen tz ujjunk van. a felbmersbl vi
SZOnt rgtn az is kvetkezik, hogy ugyanilyen jl hllsznlhatnnk brmilyen ms
rendszert is. Nzzk csak, mifle szablyokat hasznl nnak a nyolc ujj emberek:
l. sszesen 8 szmjegy hasznlhat (O-7).
2. A helyirlC:kck nyolc halvnyai, vagyis vannak egyesek, nyolcasok, hatvanngye-
sek s gy tovbb.
3. n O s 8
n
1 kz es6 szmok rh:n6k Ic.
Persze ha mindenfle szmrendszerekkel dolgozunk, akkor egy paprra lert jelsorozat
mst s mst fog jelenteni attl fgg6en, hogy milyen helyirtkek szerepel m.:k benne.
a flrertscket il yenkor a szm utn jobb als indexknt oda szoktuk r
ni, hogy milyen alap szmbrzolsra vonalkolik az adott forma. Ha teht tzes ala-
pon akarjuk brzolni a tizentt, akkor ezt rjuk: 1510.
Ugyanez a sz.1m nyolcas szmrendszerben gy fest: 17
8
. EZl persle mr nem tizenht-
nek olvassuk, hanem valahogy gy: "c!''Y bt nyolcas alapon". Hasonlan az ti-
zentt is olvashatjuk gy: "egy l tzes A lnyeg persze mindkt esetben a .ti-
hiszen ez az a szm, allut nlindkt fomla reprezentl.
_ _ ___________ ---'A"" fii,,'g"'g."'le""k'-'-" "A"b,"in", .. ris"",s".".'"he"x".d"."c"im","lis"","'","-m"re",n"dsze""r",."kLI "-5',,' _ ___ 0 /
Na de a nyolcas szmrendszerbeli brzols az mirt is ppen 17? Az 1 az jelenti, hogy
vegynk egyszer nyokat, a 7 pedig az egyesek helyn ll, vagyis ehhez mg hozz kell
tennnk htszer egyet. s meg nyolc az ppen ti7:ent, rendben is volnnk.
Vagy kpzeljk el a dolgot mg vizulisabban. Vegynk 15 csillagot:
** ** .. * *** ..
*****
Az emberek tbbsge ezt eleve gy rajzolja le, hogy csinl kl csoportol. leraj-
zol10 csillagot, aztn mg tt. Ez tulajdonkppen nem ms, mint a tzes szmrend-
szerbeli reprezentci, hiszen vettiink egyszer tzet s L<;zr egyet Na de lteznek ms
csoportostsi mdszerek is, mint pldul ez itt:
Ez itt nyolc csillag, meg mg ht, vagyis a tizent nyokas szmrendszernek
reprezentcija (17
g
),
A szmbrzolsi alapokrl
Lthat teht, hogyatizentt mindenf(!le szmr<:!ndszerben fel tudjuk rni. A szoksos
tzes szmrendszer aZl rhat juk, hogy 15, vagy ha preczebbek <lk<lnlnk lenni, <Ikkor
15
10
, kilences szmrendszerben ugyanez 16
9
, nyolcasbrln l7
1h
helesben 217' Ez az utol-
s tal n rdemel nmi magyarza\ol: hetes szmrendszerben ugyelr nincs
nyolcas szmj egy, vagyis a tizentt kt hetesbea s egy egyesb61 kell "sszeraknunk".
Nzzk, hogyan lehelne ltalnostani a folyamaIot, vagyis a szmok szrn-
rendszerek kzti Mrst. Vegyi.ink egy pldt , Tegyk fel , hogy egy tzes sZ{I1l11'end-
szerbeli szmol akarunk trni hetesbe. A hetes sztnrendszerben van egyes, hetes,
negyvenkilences, hromszznegyvenhrmas helyirlk, s gy tovbb. Na de mire is
valk pontosan ezek a helyirtkek, vagy ha gy telszik oszlopok? Ezek mlajdonkp-
pen a 70, 71, 72, 73 hatvnyoknak felelnek meg, s gy tovbb. Taln foglaljuk tblzal-
ba a dolgot az vgett:
4
343
,
3
2 1
7' 7'
49 7
Aprop
Bnnely szm nulladik hatvnye
Az matematika egy alapszablya szerint brmely szm nulladik hatvnya eggyel
70 = 1, 100 = 1,217,549,343
0
= 1.
512 I ini. rsz FOgg,lk,k
Az els6 sor a helyirtk sorszma. A msodikban lLhat ht hatvnya, a har-
madik pedig maga a helyirtk, vagyis ht hatvnynak rtke decimlis for-
mban. Ha egy decimlis szmot szeretnnk hetes alapra konvertlni, a al-
goritmus szerint kell eljrnunk. is keressk ki azt a legnagyobb helyirtket,
amivel mg oszthat a krdses decimlis szm. Ha pldul a decimlis 200-Z.1t szerel-
nnk tahlktani , akkor a 4 oszlop (343) mr nem j, mert ezzel osztva az eredmny
egszrsze nulla lesz. Egyszval ezzel a helyirtkkel mr nem is kell foglalkoznunk.
A ami rszt vesz az algoritmusban a 49-es helyirtk. Osszuk teht el 200-at 49-
cel. Az eredmnyegszrsze 4, vagyis a hetes szmrendszerbeli szmnak ezen a poz-
ci6jn a ngyes sz{im ll majd. A2 imnti oszts maradka 4. Ezt a soron kvetkez6
hclyinkkcl, vagyis 7-tel nem lehet osztani, pomosabban lehetni ppen lehet, csak
nulla lesz az egszrsze. gy a hetes szmrendszerbe li szm hetes hdyirtkn nulla
fog llni. Vgl maradtak :I l egyesek. Az nyilvnval, hogya ngybcn az egy ngyszer
va r' m(.!g, vagyis az egyesek helyn 4 lesz. Az eredmny teht 404,.
Nzznk t:d{111 mg egy pldt Tegyk fel, hogya 968
10
decimlis szmol szeretnnk
hatos szmrendszerben brzolni. Ehhez a tbl:izatra lesz szksgnk:
5
64
1296
4
6'
216
3
6'
36
2
6'
6
60
l
A 968-b:lIl nincs meg az 1296, (eht ezzel a helyinkkel mr nem kell foglalkoznunk.
/l.z eredmny tdik pozcijn mr nulla ll . 968-lIt 216-t:rl Q.o;ztva az eredmny egszre-
sze 4, :l maradk pedig 104. A negyedik helyinken teht 4 ll. A 104-et36otal o.o;ztva
az eredmny 2 a marndk 32. A harmadik helyinken szerepl6 szmjegy teht 2. a 32-[
60tHI osztva az erwmny 5 II maradk 2. a vgeredmny teht avagy tblzatosan:
5
,
3 2 l
6' 63
62
6' 6'
1296 216
36 6 l
O 4 2
5 2
li a val:HI1i1yen ms szmrendszerbl konvertlunk IrZeSfi:!, a m6dszer va lamivel egysze-
hiszen csak szorozni s sszeadni kell. Pldaknt vgi:!zzk cl :I fenti konverzi(
visszafel:
4216 864
236
72
5 6
30
2 1
2
968
A fOggeik A binris s a hexadecimlis szmrendszerek 1513
Kettes szmrendszer
A kettes szmrendszer a lehetsges szmrendszerek amolyan "als hatrt" kpviseli,
hiszen ill mr csak ktfle szmjegy el, egyes b nulla. A fem bemutatott
konverzis tblzat kenes s7.ml'endszerre a kvetkez6kppen fest:
Oszlop: 8 7 6
5
4
3 2 1
lIatvny: 27
2' 2' 2' 2' 2'
Ilelyirtk: 128 64 32 16 8 4 2 1
Nzznk meg iu is egy pldt a konverzi6m. Tegyk fel, hogy a 88
10
sz!imot szerel-
nnk viszontltni hinris formban. A 128-as helyirtkkel mr nyilvn nem kell roglal-
koznunk, mivel ez a 88-ban nincs meg. A nyolcadik helyirtkcn teht les7..
A 64 a 88-ban egyszer van meg, v:lgyis II hetedik helyirtk 1 lesz, az oszt!'IS maradka pe-
dig 24. Ebben a 32-es helyirtk nincs meg egyszer sem, teMl " hatodik pozci6n O lesz.
A helyil':rtk a 16. Ez megvan egyszer a 24-ben, vagyis az tdik helyirtk
1, a maradk pedig 8. Ebben ppen egyszer van meg a kvetkez6 helyirtk, vagyis
a negyedik helyen 1 szerepel majd, az ssze tbbi helyen pedig 0, hiszen ennl a rsz-
lpsnl nem keletkezett maradk, a konverzinak teht vge. Az eredmny:
o 1 O l 1 O O O
Az eredmny helyessgt termszetesen le is ha visszaalaktjlIk a femi
kt!llCS szil. rnrcndszerbe!i SZlmot decimlissil.:
l ..

" O 32 O
l 16

16
l 8 8
O
,

O
O 2 O
O
l
O
88
Mirt ppen a kettes alap?
A kettes S7.1unrendszen az teszi minden msnl a szmtgpekkel kap-
csolatban val hasznlatr.t, hogy rendkvli mdon hasonlt a gpek logikj-
ra, arra, amit egy szmt6gppel egyltaln meg \ehet oldani. A gpek na-
gyon butk. Fogalmuk sincs sl.iJ11okrl, utastsokr6l mcg programokrl.
A szmtgp nmikpp nem ms, num egy csom ramkr, amelyek-
ben vagy folyik ppen ram, vagy nem, egyegy csatlakozson vagy magas a feszlt-
sgszint, vagy alacsony.
514 1 VI I. rsz Fggelkek
A logika egyszerustse vgen a mrnkk nem klnbztetnek meg kztes fes7.ILSg-
szinteket, vagyis a szmtstechnikban nincs olyan, hogy kis feszlL'ig, kicsit na-
gyobb feszltsg, kzepes feszltsg, magas feszltsg meg risi feszltsg. Itt csak
annyi szmt, hogy .elg feszltsg" van-e, vagy ppen "elgtelen". A rendszer teht
rviden szlva bin{lris. Kicsit tovbblpve az ahsztrskd6k felptsben az .elg" meg
az .elgtelen" helyett egyszeruen annyit szoktak monelani hogy "igen" vagy .nem".
Esetleg az .igaz
H
s a . hamis" is. Akrmelyik terminolgit hasznljuk is,
a kt klnbz6 szintel kiv{116an lehet reprezentlni l -gyel s O-vaL Megegyezs sze-
rint 1 jelemi az .igen" vagy . igaz" nket, O pedig a vagy "hamiS" megfele16je.
Fontos azonban hangslyozni, hogy ez csak egy megllapods, vagyis elvi ak:ldlya
nem volna annak sem, hogy a dolog pp fordtva legyen.
Most, hogy tisztban vagyunk az alapelkpzelssel, taln mr az is vilgos mindenki
szmra, mirt ppen a kettes szmrendszer a "nyer6". Eggyel s nullval ppen aZT
lehet reprezel1llni, amire egy ramkr a szmitgpben kpes: van fesz ltsg, vagy
nincs. Minden, amit a szmtgp "tud" nem egyb, mint hogy melyik ramkr van p-
pen bekapcsolva, s melyik ki. Ami be van kapcsolva, az neki 1, ami nincs,:LZ 1.
Bitek, bjtok, nybble-ek
Miutn megegyezlk magunkkal s a hOZ7..nk hasonlkkal, hogy 1 fogja az igazat s O
a hamisat jelenteni, a binris sz.1mok, s azok szmjegei, il bitek fontossgukban a tbbi
szm fl emelkedlek. Mivel az els6 szmtgpek egyszerre 8 bitet voltak kpesek ke-
zelni , magtl addott, hogya biteket nyolcasval lltsuk be programoz{ls kzben. 1.11-
nen pedig mr csak egy lC:ps voll, hogy n bitnyokasok nevel is kapjnnnk: a bfijtok.
Aprop
Kis bjtok
A bjt felt, vagyis ngy bitet szoks nybbl e-nek nevezni. Taln azt is rdemes
megemlfteni , hogy ezt egyes helyeken ni bble-nek frjk.
Egy bjton, vagyis 8 biten sszesen 2S6 nket brzolhatunk. Hogy mjnJ
Nzzk meg a lehetsges helyinkeket. Ha minden bitet l-re lltunk, akkor a kelet-
binris szm decimlis rtke 255. Ha minden bit O, nkkor -termszetesen - O
lesz a decimlis rtk is. Mivel pedig ebben a szmbrzolsi mdszerben nincsenek
lyuknk, O s 255 kzlt brmely egsz szmOl kpesek vagyunk 8 biten megjelenteni.
Ez pedig ppen 256 rtk.
Mi az a KB?
J Ja meggondoljuk 210 (vagyis 1024) gy nagyjbl (vagyis WOO-rel).
Nos, ez egy olyan "dbbenetes hasonlsg" amit egyszeruen nem lehetett kihagyni
a terminolgia megalkotsa sorn, gy aztn az informatikusok a 210 byte
sget elkezdtk kilobjtknt emlegetni, s 1 KBnak lerni. "Normlis" esetben - nesd
a tudomny egyb terl etein - a .kilo" ugyebr ezret jelent, az a maradk 24
meg vgl is kit rdekel.
_ _ ____________ "A"f..,"g"g,..I .. "k_"-' A"b"in ... ... " ... s .. .. s .. '"h"' .x" .... d .... c ... im .. "' li .. s .. s"z ... m .. re ... n .. d=Sle= re ... k
J
I .. 5 .. 15 _____ .;,
Hasonlan laza szemlletet kvetve az 1024 * 1 024 cl 048576) elg kzel esett az egy-
millihoz, gy lett a megabjt, vagy 1 MB. s ha mr itt taltunk, mirt hagynnk abba
a dolgot. 1024 megabjt az - kis e1hanyagolssal- lehet 1 gigabjt (a giga ezer-
millit, vagyis egymillirdot jelent).
Binris szmok
A szmtgpek teht s nullkbl ll mintzatokat hasznlnak llunden-
nek a kdolsra. Egyesek s nullk kJolj5k azokat a gpi utastsokat, amelyek
az alapr:clmkrket vezrlik. Tgaz ugyan, hogy egyesek s nullk mindenfle halmazai
szmokk alakthatk a megismert szablyok szerinL, hiha volna azonban azt kpzelni,
hogya szmtstechnikban tnylegesen minden szm. Jcskn vannak olyan binris
jelsorozatok, <lmelyek jelentsket tekintve semmifle kapcsolatban nem llnak
a szmfogalommal.
Az. [ntel xR6 processzorok egyik utastsa pldul gy nz ki: 10010101. Termszetesen
senmli meg nem akadlyozhat bennnket abban, hogy tm "lefordlsuk" dccimlisra s
azt mondjuk: 149. Ennek a sz,'mnak azonban ebben az sszefggsben az gvilgon
semmi jelentse nincs . III msrl van sz.
Vannak binris szmok, amelyeket UlastsknL kell rtelmezni, mtisokat adatknt, VHgy
kdknl. Az egyik fontos kdolsi rendszer pldul az ASCII. Ebben a kdrendszerben
minden szmjegynek s rtsjelnek megfelel egy-egy 7 bites bin{lris szm.
A kis pldul a 01100001 binris k6d felel meg. Ez ebben az sszefggs-
ben nem szm, mert br mondhatjuk r, hogy ez nem ms mint 97
10
(64 + 32 + n, cle
azrt itt mgis a kis ,,<1" van sz6, nem m{lsr61. Sokan szoktk nt is mondani,
hogy az ASCII k6doi<sban a kis "a" a 97 felel meg, az igazsg azonban az,
hogy cz csak egy olyan apr tveds, amit nem szoktunk sz6v lenni. A helyes kijelen-
ts valahogy gy hangzik, hogya 97 binris rcprezcntlcij:t, vagyis a 01100001 az "a"
kdja. Az, hogy mi a 97-et emlegetjk, csak knyelmi szempont, semmi tbb.
Tizenhatos (hexadecimlis) szmbrzols
A binris szmokat elg nehz olvasni, gy szksg volt egy knyelmesebb, ttekinthe-
rsmdra. Ha binris sZmollzes smrendszerbe akanlnk trni, akkor - amint
lttuk - az algoritmus nem bonyolult ugyan, de hOSSl. A 16-os szmrendszerbe val
trs eZle! slemben egszen van benne benne egy egy-
szerustsi
Ennek megrrshez azonban meg kell ismerkednnk a lilenhatos, vagy kz-
nevn hexadecimlis szmrendszer logikjval. Alizenhatos smrendszerben
tizenhat szmjeg!:''Yel kell dolgoznunk, amelyek a 0, 1,2,3, 4,5,6,7,8,9,
A, B, C, D, E, s F. Az utols6 hal kivlasztsa tulajdonkppen
51s 1 VII. rsz' Fggelkek
volt. Azrt pont az A-F betket hasznljuk erre a clra, mert ezek minden billenty\1ze-
ten megtallhatk. A hexadecimlis szmrendszer helyittk-tblzata a
pen fest:
4
3 2 1
256 16 1
A hexadecimlisr61 decimlisra talakts termszetesen tovbbr.!. is csak szor-
zs! s sszeadst ignyel. Az FSC
16
.szm decimlis rtkr pldul a
pen kaphat juk meg:
F * 256 = 15 256 : 3640
8 * 16 = 126
C * 1 = 12 * 1 12
3980
lia az FC
l6
szmot bi nrisra szeretnnk lefordtani, .lkkor .1 lcgcgyszenbb mdszer ta-
ln az, ha elbb kiszmhjuk a decimlis rtkt, majd azt konvertljuk l kettes szm-
remlszerrc:
F * 16 = 15 * 16 240
C * 1 = 12 l = 12
252
A 252
10
decimlis rtk binris al11km konvertlsa a - korbbr61 mr ismert
- tblzat s algoritmus szerint trtnik:
Oszlop: 9
Hatvny: 28
Helyirtk: 256
8
27
128
A7. 256-os hclyi(;nk"n o $ZercpeJ.
l 128 maradk 124
l 64 maradk 60
l 32 maradk 28
l lGmaradk 12
l 8 maradk 4
l 4 maradk O
O
O
l l l l l 100
7
26
64
6
25
32
5
24
16
23
8
A vgeredmny teht a binris szm: 1111 1100.
3
22
4
2
21
2
1
20
A feladatot teht tulajdonkppen megoldottuk, de felfedezhetnk az egszben egy
egyszeru trkkt. Tekintsk ugyanis a fenti nyolc bitet kt ngybites egysgnek, s ve-
gyk szre, hogy ez lehet6sget ad e,gy "mgikus" talaktsra.
A fggelk A binris s a hexadecimlis szmrendszerek 1517

A jobb oldali bitngyes az 1100, ami decimlis 12-nek, vagyis hexadecimlis C-nek fe-
lel meg. A bal oldali bitngyes 1111, ami decimlis 15, vagyis hexadecimlis F. Rviden
teht a megfeleltetst sikeIl tallunk:
1111 1100
F C
lia a kt hexadecimlis rtket egyszeruen egyms mell rjuk, visszakapjuk az FC r-
tket, vagyis azt, az 111111002 binris rtket kaptuk. Nmi fejtrssel beltha-
t, hogy ez a ngyes csoportosts mindig ml1kdik, vah'Yis hossz bin-
ris szmot trhatunk hexadecimli sra gy, hogy a alkotott bitngyeseket egyen-
knt lefordtjuk, s a kapott hexadecimlis digiteket egyszeruen egyms mell rjuk.
Mi tbb, a dolog visszafel is tkletesen mkdik. Ha teht hexadecimlisr61 szeret-
nnk binrisrJ trni egy szmot, nincs ms dolgunk, mint a tizenhatos szmrendszer-
beli alakot klnll digitekre bontani, ezeket egyenknt trni binrisra, majd a kapott
bitsorozatokat egyms mell rni. Ha visszaemlksznk r, hogya kettes szmrendszer-
ben az ngy helyirtk rendre a 8, 4, 2 s 1 decim, lis rt kek nek felel meg, a he-
xadecimlis digitek egyenknti t rsa egsz egyszenen Lssunk taln
egy hosszabb pldt:
1011 0001 1101 0111
Az ebben a binris szmban helyin6kek a l, 2, 4, 8, 16, 32,
64, 128,256,512,1024,2048,4096,8192,16384, s 32768. Ha teht trjuk clecimlisra
az ismert algoritmus szerint, a kvetkez6t kapjuk:
1 x 1 1
1
x ,

,
1 x 4 4
O x 8 O
1 x 16
16
O x 32
O
1 x64
64
1 x
12'
128
l x 255
"
256
O x 512
"
O
O x 1024 O
O
x 2048 O
1 x 4096
"
4,096
l x 8192 8, 192
O x 16384 O
l x 32768 32 , 768
sszesen: 45 , 527
Ennek a decimlis rtknek a hexadccimlisra val trsa sorn a helyirt-
kekkel kell foglalkoznunk:
65535 4096 256 16 l
518 1 VII. re" Fggelkek
A 65535--s helyirtken nyilvn O lesz, hiszen 45527 nem oszthat ezzel a szmmal.
Az "rdekes helyirtk teht a 4096. Ez ll-szer van meg az eredeti szmban,
a maradk pedig 471. A hclyirtk a 256, ami 471-ben egyszer van meg,
a marddk pedig 215. Ebben a 16-os helyirtk 13-szor van meg (ez ssze-
szorozva 208), vagyis a maf"dd6k 7. sszessgben teht a fenti decimlis illetve binris
szmnak hexadecimlis rtk a 81D7.
Biztos ami biztos, ellen6rizzk le, hogy valban gy van-c:
B (11) * 4096 = 45.056
1*256=256
o (13) * 16 .. 208
7 * 1 = 7
CnS2cscn 45.527
E7. VOll teht::l "gyalogos" mdszer. Most nzzk meg, hogyan fest mindez
az imnt felfedezett "ngy bites rvidtssel", Az tvlt:tnd6 binris rtk ugycb:r
az 10'11000111010111, amelynek a kvetkez6 bitngyesek felelnek meg: 1011 0001
11010111. L,.ssuk, hogyan festenek ezek 3 ngyjegyi binris szmok egyenknt hexa-
decimlis reprezt::ntci6ban:
1011

1
,
1

1
1
,
2 2
o
, ,

o
1
,
8

8
Oss zes en : 11
Hexadecimlis :
0001

1
,
1

1
O
,
2 O
O
,
4

O
O 8

O
Osszesen : 1
Hexadecimlis :
1101

1
,
1

1
O
,
2 O
1
,
4

4
1 x 8

8
OS6 zesen : 13
Hexadecimlis:
0111

l x l l
l x 2 2
l x 4 II
B
1
D
O x 8 '" O
Osszcsen? 7
Hexadecimlis: 7
A hexadecimlis alak : BlD7
A mdszer teht in is
B FGGELK
Gyakran hasznlt kifejezsek
Ebben a fggell:!kben sszegyt1jttlk a leggyakrabban el6fordu16 szakkifejezsek a r-
vid meghatrozst Tanknyvr61 lvn sz a rendszerezs tekintetben felbukkans
sorrendjt tekintettk vagyis az rk szerint csoportostOLtuk a meghat-
rozsokat. gy ha az olvas a knyv hasznlata sorn olyasmivel ta l:'i.lkozik, amit nem
n, ehhez a fggeJkhez htralapozva gyorsan informcihoz juthal.
,
,. Ora
K611)'Vfiir (libl"01yJ - Olyan linkc[het6 (binris programjainkhoz szerkeszthet6) fjlok
amelyek rkezhetnek a fordt6progmmmal egyillt, de kln is mcgvs-
rol hatjuk, vagy mi magunk is ltrehozhat juk 6kel.
Fiiggvny (jilllction) - Egy viszonylag nll kdrszlet, amely egy bizonyos feladatot
hajt vgre. Ilyen feladat lehet pldul kt sZ;'m sszeadsa vagy v:llaminek a
re val krsa.
.'
520 I VII. rsz FOggelk,k
Osztly (e/ass) - Egy j tpus defincija. Az osztly adatok, s a rajtuk vagy velk dol-
goz fggvnyek
Fordtprogram Olyan program, amely kpes az ember sz.mm is olvas-
hat k6dszvegb61 (forrsk6dbO gpi kd llomnyt A fordts kl lps-
ben trtnik: el6bb egy tgykd llomny (object cooe) jn ltre, amit aztn a linker
(lsd a cmszt) futtathat programm alakt.
lilll...>er (szerl .... - Olyan program, amely vgrehaj that (futtathat) ll omnyt hoz
ltre a fordtprogram ltal el6llitott trgykd llomnyb l (object code).
Objektum-MzjJontt (object-orie1lted) - Programozsi metodol6gia, amely a proce-
durlis s a strukturli s programozs utni tekinthet6.
Amint arra neve is utal, ez a megkzelts gynevezett objeklumokk;l l (osztlyelemek-
kel) dolgozik, ezekhez rt!ndellulajdon.sgokat s viselkedsformkat. Gyakori, hogy
ezt a kifejezst c1s6sorb:ln markeLing clokkal nem megfelelO" sszefggsekben is
hasznljk.
00 - Lsd az objektum-kzpont cmszt.
ANSI (A/I/(-!I"Cfllll Natiol1al Standards Illslffute) - Nonprofit SZCIVCz.et, amely az Egye-
slt llamokban hasznlatos szabvnyokrt feJel6s. Szmos orszgnak, iIle(ve rginak
(pldul az Eurpai Uninak) is van hasonl szeIVezete. Ezek egyes esetekben a kor-
m:' myzat rszeknt mtlkdnek, m az ANSI nem kormnyzati szeIV. Tovbbi informci-
t a http: //www . ansi. org cmen tallhatunk.
ISO (Imemationtll Orgtlllizationfor Slalldardfzat;Ol1) - Egy az ANSI-hoz hasonl, de
a nemzetkzi szabvnyokrt fclcJ6s szeIVezeL Az ISO szintn nem kormnyzati szeIV.
B6vebb informcit a http : //www . iso. org cmen tallh:uunk.
2. ra
Fordts (coli/piliny - A forrskdot futtathat llomnny alakt folyamat lps.
ilyenkor a fordtprogmm eh'Y gynevezett trgyk6d llomnyt hoz ltre (. obj fj!),
amit, aztn a linker abkt fullathat programm.
Szerkesz/s (/i nkeis; lillkillg) - A forrskdot futtathat llomnny alakt folyamat
msodik lpse, amelyben a linker a fordtprogram ltal eJ6lltott tgyk6d ;.mom-
nyokbl sszeszerkeszti a nmathat programot.
Futtafhar program (execulable program) - Program, amely az opercis rendszer fel-
gyelete alatt kzvetlenl futtathat.
B fggelk' Gyakran kifojezsek 1521
(interpreter) - Az imcrpreler olyan program, amelyek a forrskdot a prog-
ram futsa kzben, soronkm alakilja gpi k6dd.
Pmcedulrilis programozs (procedl/ral p rogramm ing) - Olyan fejlesztsi paradigma,
mely szerint a program egy adathalmazon vgrehajtott sorozata.
Slmk/urll programozs (strclured programming)- Olyan programfejlesztsi paradig-
ma, melynl a megoldand fekldatot szisztematikusan egyre kisebb rszekre tagoljuk,
s a rszfeladatok megolds<ra rjuk meg a eljrsokat.
Begyazs (ellcapsulalioll)- nmagukat meghatroz, nll objektumok ltrehozsa.
Ada/rejts (data hiding) - Az objektum llapotnak elrejtse a klvi lg e161 privt adat-
tagok hasznl<lt:lval.
(inherilance)- j tpus ltrehozsa gy, hogy az csupn kiterjeszti egy m5r
tpus lulajdor,sgait,
T6bbafakrsg, polImorfizmlIs (jJolyI/JOIphism) - Az a kpessg, amikor szmos
pust CtpusvltozalOl) tudunk gy kezelni, mintha azok egyetlen alaptpus vl t07..atai
lennnek.
(preprocessor)- Olyan program, amely a fordtprogmm cltt fut Ic, s
vltoztatsokat vgez a forrsk6don, az abban tallhat il jellel sarok (dirckt-
vk) alapjn.
Megjegyzs (commenl)- Olyan szvegrsz a forrsk6dban, amely nem kpezi annak
integrns rszl, csup n II programoz s7.mra hordoz informcit.
Alrs (sz/glia/lra; sigllature)- Eb'Y fggvny neve s annak argumentumai egyttVve.
,
3. Ora
Vciltoz (varitibie) - Nvvel elltott hely a memriban, amelyben egy rtkel trol-
hatunk.
RAM (Random Access Memo/y) - Vletlen memria.
rrpus (type) - Egy objektum mrete s egyb jellemz6i.
(sig l/ed) - Olyan vltoz6tpus, amely pozitiv s negatv rtkeket egyarnt
trol hal.
522 1 VII. rsz Fggelkek
E/jellllkt7/i (1I115i8,I1OO)- Olyan vltoz[pus, amely kizrlag pozitv sz:'lmokat trolhat.
ASCII (Americali Stalldrd Code/or biformaliOlI E:.\:change)- A legtbb szmtgptpus
llal h:lszn:lt kdolsi eljrs, amellyel szmok, betk s rstelek rhat6k le numerikusan.
rzke1lysg a kis- (case-sensitiue) - Olyan helyzet, amikor logikai k-
lnbsg van a kis- s a nagybelkkellelt informci kztt. CA C++-ban pldul
a myVal s a Myval nem azonos objektumokat jelent.)
7i
J
msdefll1cl6 (type definilion)- E&'Y adattpus meghatrozsa. Az gy megadott tpus
ks6bb ugyangy hasznlhat, mint a beptett tpusok.
llal/d (cOI1Slalll) - Olyan trolsi egysgek, amelyek tartalma a progr::lIn ruLsa sorn
nem vltozik.
Beta szeriIIf cfland (/irem' cOl/stant) - Olynn rtk, ,unit kzvetl enl
a forrflskdba gpeltnk be. Ha pldul a kdban felbukkan valnhol n 35, akkor ez
egy lil er!i lis 1\ ll3ncl.
Szimbo/il.ms lfclI1d (symbolic cOllsf(mt) - Olyan tpussal s nvvel rtk,
amit 1\ lI andnak deklar.''ilunk. Ilyen lehet pld(1U1 egy anyag forr!tspontja (BoilingPoint).
Fe/sorolt l/'IIId6k (ellllll/ef'(/ted constants) - llandk nvvel rende[kez6 ha[ma2.1.
,
4. Ora
Utasts (statemel1t) - Olyan mdszer, amivel a vgrehajts menett, vagy egy kifejezs
kirtkelst tudjuk befolysolni.
Ores karakter (wftiteS/XIce)- Ilyen a szkz, a tabultor s az jsor karakter.
sszetett /ltasts (compoul1d statement) - Egy nyit s egy zr kapcsos zrjel kztt
megadott utast(\ssorozat, amely brhol felbukkanhat, ahol egyetlen utasts is.
Kifejezs (e;\pression) - Brmely olyan utasts, amely vissza;ld vnlami lyen rtket.
Opertor (opercuolj - Olyan szimblum, amely egy bizonyos utasts vgrehajtsra
kszteti a forclt6progrdmot.
Operandus (operand)- Matematikai szaksz, amely egy kifejezsnek azt a rszt jelli,
amely a benne opertor ltal feldolgozott adatnak vagy objektumnak felel meg.
B fggelk Gyakran kifejezsek 1523
opertor (assignmenl opel"Cltor; " ) - Hatsra az operlor baloldaln
szerepl6 operandus a jobb oldalon rtket veszi fel.
Ba//1k (l-lx/lue) - A bal rtk olyan openmdus, amely egy oper.tor baloldaln
szerepell1ct.
jobbtJrtk (r-vahwJ - A jobbrtk olyan opemndus, amely egy opertor jobb oldaln
szerepelhet.
Relcis opertorok (relatiollal ojJCnors)- Olyan opertorok, amelyekkel megllapt-
hatjuk, hogy kl szm egyenl6-e, vagy hogy az egyik kisebb vagy nagyobb-e, mim
a msik.
IlIkrcmCllllis (il/crementil1g) - Egy vltoz rtknek eggyel val nvelse (a ++
opcr:1torral vgezhet6
Dckrememltls (dccramcllting) - Egy vllOZ rtknek eggyd val cskkentse (a --
opertorral vgezhet6
opcrlor (prefu: opera/or)- Az inkrementl vagy dekrementl opertor olyan
hasznlata, amikor el6bb jut rvnyre az opeditor, s csak aztn nkel6dik ki a
zs (pldul ++nlyAge).
Uttag opertor (posrfix opera/ot) - Az inkrementl vagy dekrement51 opertor
oly:ul hasznlata, amikor cJ6bb kirtkel6dik a kifejezs s csak aztn jut lvnyre
az oper{tLor (p(:ldul myAge H).
Mi/ve/eff rangsor (precedencia,. precedence) - Ez a rang hatrozza meg, a fordt-
progrJ.mmlk - zrjelezs hinyban - milyen sorrendben kell kinkelnie az egyes
operlorokat.
,
5. Ora
Verem (stack) - Olyan specilis mem6riaterlet, amit az opercis rendszer automatiku-
san lefoglal a fut program szmm, s amely a fggvnyek s az 6ket hv
tek kzti kommunikcira szolgl. A vermet szoks is nevezni (lsd ott).
UFO (/..asI III First Out) - Az ilyen szervezs mem6ribl kiolvasskor legel6szr
a legutoljra ben rtk kerl e16.
Fgg/Jnydek/arci (function dec/araNoll) - Egy fggvny formlis lersa, ameJyool
a fordtprogram megrudja annak nevt, visszatrsi tpust, valamint hogy meiUlyi s
mi lyen tpus paramtere van.
524 1 VII. rsz FOgg,lk,k
Prototpus (prorot)'pe) - A fggvnycleklarci msik elnevezse.
Fiiggwnydefillci6 (fimcfiOll definilion) - A fggvny kdjnak lersa,
vagyis az a forma, amely nem csak a deklarciban megadott informcikallartalmaz-
za, hanem a konkrt megvalsLsl, a fggvnytrzset is.
Filggoony paramterlistja (funClion parameter lisO - Egy fggvny param-
terei nek felsorolsa, amely elvlasztva tartalmazza az argumentumok tipust
s esetleg nevt.
Helyi vltozk (local vtl1iables) - Olyan vltozk, amelyek csak egy adott fggvnyen
bell lteznek.
rvnyessgi Mr (scape) - A k6dnak az a terlete, egy adott v ltoz lthat
s
Globlis vltozk (globa! varlabfes) - Olyan vltozk, amelyek egy program brmely
pontjflr61 el rll ct6k,
6. ra
Iterci (ileralfoll) - Olyan mvelelSor, amely sorn ub'Y:mazt a vgez-
zk jra s jra.
Vgtelen ciklIIs (fl/fil/ ite loop) - Olyan mvelelSor, amely sorn ugyanazt a tevf:kenysf:-
gCt v{:gezzl k vg nlkl, Ez ltalban olyasmi, amit a programozk igyekeznek elke-
rlni, br bizonyos helyzetekben megvan a maga haszna,
SpagclrI/..>6d (spaghcll i codc)- Kevss stnlkturlt mdon, sSZeViSSL'l megrt program,
:Imely nehezen olvashat, Ncvt onnan kapta, hogy logikailag (Igy nz ki, mint egy tl
:unelyben gyakorlatilag lehetetlen kvetni egy-egy szl lefutst.
,
7. Ora
Kliellsck (eliel/IS) - Olyan osztlyok vagy fggvnyek, amelyek az lmlunk fejlesztett
osztlyt hasznljiik,
Tagvllozk ( member vun'ables) - Ezeket szoks adattagoknak (dala members) is ne-
vezni. Gyakorl atilag egy osztly sajt vltoz6kszlett szoks sszefoglal nven gy
emlteni.
Adal/agok (dala members) - Lsd a Tagvllozk cmsz61.
B fggelk Gyakran hasmlt kifejezsek 1525
Tagfggvnyek (membIT functions) - Ezeket szoks tagmetdusoknak (member
methods) is nevezni. Egy osztly sajt fggvnyeit szoks ilyen sszefoglal nven
emlteni.
Tagmetdusok (member methods) - Lsd a Tagfggvnyek cmsz6t.
Objektum (objectJ - Egy osztly egy eleme vagy pldnya.
Nyilvnos hozztfn'js (public access) - Nyi lvnos hoz7.frsr61 akkor beszlnk, ha
egy tagvltozhoz vagy tagfggvnyhe7. brmely ms osztly brmely met6dusa hozz-
frhet.
Privt hozzfrs (private access) - Privt hoz:lfrsrGI akkor beszlnk, ha egy tag-
vagy tagfggv6nyhcz kizrlag egy osztly sajt met6dusai, illetve a
szrmaztatott osztlyok met6dusai frhetnek hozz.
Hozzifrsi mefdusok (acccssor mCfliods)- Olyan metdusok, amelyek kifejezetlen
a privladattagokhoz val hozzfrs biztostsa vgett kszltek.
Mefdusdefiuci (mefl/od defi nit/on) - Olyan fggvnydefinci6, amely egy osztly
nevvel majd kt utn a fggvny neve s a paramterei kvet-
keznek.
Afap/1elmezett konsfmklor (defal/It constn./ctol:) - Olyan konstruktor, amelynek nin-
csenek paramterci.
,
8. Ora
lland lagfi./ggwny (constant member fUl1ction) - A konstans ragfggvny olyan
fggvny, amely nem vltoztatja meg egy osztly egyetlen tagvlroz6jnak rlkt sem.
IlIfcrjsz (nterJace) - Szoks osztlyfeJletnek vagy osztlyintcrfsznek is nevezni.
Azoknak az ac1atoknak s metdusoknak az sszessgt jelenti, amelyekhez ms
Iyok s fggvnyck hozzfrhetnek. Ez teht nem magnak az osztlynak a kdja, ha-
nem csupn azt mondja meg, hogyan hasznlhat az kvlr61. Ezt az informcit rend-
szerint egy klnll, kifejczcncn az adott osztlyhoz tartoz fejlcllomnyban trol-
jk, amit az sszes az osztlyt hasznlni kvn moclulnak be kell szrnia.
ImPlementci (implementation) - Szoks oS7.t.lyme!,'Valstsnak va!:,'}' osztlyimple-
menlci6nak is nevezni. Egy adott osztly kdjt s deklarciit nevezzk tb'Y-
Ez az a kd, amihez az interfszen keresztl hozzfrhetnk. Az osztlyok megvals-
tst rendszerint egy kln . epp fjlban troljuk, amit aztn trgy kd llomnny le-
526 1 VII. rsz Fggelkek
fordtva, vagy knyvtrba helyezve lehet hasznlni. Sok esetben a felhasznlnak csak
a trb'Ykd llomny s az interfsztler6 fejlci llomny ll rendelkezsre, amelyek-
kel hasznlhatja az adott osztlyt, de nem mdosthatja a kdjt.
,
9. Ora
Mu/al (pointel) - Olyan vltoz, amely egy mem6riacmel trol.
lndirekci (illdoreclioll) - Az a 3nlikor egy rtkhez az annak a cmt L1ro16
mutat segtsgvel frnk hozz.
DinCtmikuSCIII kezelt mell/ria (heap) - A mem6rin:-l k az a terlete, amely a k6dleti.i-
Jel, a globlis nvtr s a verem lefoglalsa utn mcgm:-lmd. Szoks eLL a rszt "szabad
trnak" is nevezni. Ez az a mem6riaterlet, ameJyb61 a new opertor s a mal loe ()
fggvny kihastanak egy-egy darabot a dinamikus trkezels sorn,
,
10. Ora
Eltvedt mutat (s/ray poil/tCr, dangling poillfer) - Olyankor beszlnk ltallxm err61
a amikor a mr fdszabadtOltuk azt a mem6riaterletet, amit II krdses
mutat cmez, mgis jra megprb,lunk onnan olvasni, vagy oda rni. Ez egy ltalnos,
ugyanakkor rendkvl nehezen felderthet6 hiba, mivel a mem6rihoz (rtn6 t6v(;!s
hozzfrs ltalban jval II lrlsi utasts mn kvetkezik csak be.
11. ra
llivatkozs (re/eret/ce) - Egy objektum lncve.
,
12. Ora
Hatkonysg (efficiellcy) - A programozk krben meglehet6sen - taln tiHzottan is-
tma. ltalban arrl van sz, hogy heroikus kzdelmek rn risi talakt-
sokat vgznk egy programon azrt, hogy mrtkben gyorsabb tegyk azt.
Taln ez a legfontosabb informci, amit programoznak szben kell tartania
a dologgal kapcsolatban, persze hacsak nem va ls rendszereket, orvosi
begyazott szoftverl, vagy raktairnyt kzpontok vezrlkdjl fejleszti. ltalban
jobb, ha a fordtprogramra hagyjuk, hob')' a hatkonysggal tr6djn.
B fggelk Gyakran hasmlt kifejezsek 1527
,
13. Ora
Felszni msolat (shallow copy) - Olyan mve\et eredmnye, amely egy objektum ak-
tulis rtkeit (adattagjai t) msolja l egy msik objektumba. Szoks tagonknti mso-
I.snak is hvni.
Mlysgi mso/ar (de,p copy) - Olyan msolsi eredmnye, amely nem csak
az adattagok aktulis rtkt msolja l egy j objektumba, hanem a mutatk ltal cm-
zeLl memriaterleteket is.
,
14. Ora
EgyopertmdusI opertor (Imal)' operato/o) - Olyan opertor, amelyegyel1en kifejez-
sen vgez valamilyen nniveletet. lIyen pldul az inkrementls opertora (aH). Ellen-
tte a klOperandus (binary) opertor, amelynek kt dolgot kelJ megadnunk. Ilyen
pldul az sszeads opertora, aminek a jobb s a baloldaln is kell legyen egy
operandus (a+b).
KtoperclI1dllsl. opertor (binal)1 operatolo) - Olyan opertor, amely kt dolgon kpes
valamilyen vgezni. Ilyen pldul az sszeads opefllora (a+b).
Hro1lloperandusI opertor (ten/alJI opcmtor) - Olyan opertor, amely hflrom objek-
tum megadst ignyli. 1\ C++ nyelvben mindssze egy ilyen van, a ? opertor, amit
a formban keH hasznlni:
a < ? IGAZ , HAMIS ;
Ha a megadott kifejezs rtke igaz, akkor az IGAZ gban utasitls fut le, el-
esetben a HAMIS g lp rvnybe.
Qperand1.lsszm (arity) - Egy opertor ltal ignyelt operandusok szma. A C++ eset-
ben ez az rtk lehet egy (unary operator), (binary operator) vagy hrom
(rernary operator).
,
15. Ora
Tmb (array) - Azonos tpus objektumok halmaza.
Tmhindex (subscript)- Az eltols nagysga e,gy tmbn bell. A C++-ban a myArray
tmb negyedik eleme a 3-as tmbindexen keresztl el gy: myArray [3 ] .
Karakter/nc (string) - Karakterek tmbje, amelynek vgt egy null karakter jelzi.
528 1 VII. rsz Fggelkek
16. ra
Ell/agyo/s (stubbing) - Az a mdszer, amikor egy fggvnyb61 ppen csak annyit
runk meg, hogy le lehessen fordtani a kdOl, a lnyeget pedig hagyjuk.
Fellilb,-ls (ovcrriding) - Az az cset, amikor egy szrmazratotl osztly funkci0-
nalitssal megval6st egy olyan fg&>vnyt, amelynek mr az alaposzrlyban is volt
megva16stsa. lIyenkor fontos, hogy a fellbrl6 fggvny visszatrsi tpusnak s
pamrnterl istjnak meg kell egyezni az eredelivel.
,
17. Ora
Virtulis lII e/dlls (vll1l1a/ lll etl/od) - Az egyik azon mdszerek kzl, amelyeken ke-
resztl :1 C+. mcgv:dstja a tbbalaksgot (polymorphism). Lnyege, hogy lt!11t!16v
teszi a sz:irma;.::LatOll objektumok alaposztlyba tartoz objektumknt val kt!ztdst.
Vil1//lls mel6t/l/stlJla (/J-tuble) - Olyan mechanizmus, amdy lt:hetvl! teszi
az objektumokon belli virtulis fliggvnyek kezelsl.
,
18. Ora
Absztrakt admlplls (abstract dala ly pe) - Angolul gyakran rvidtik ADT-nek.
Az absztrakt adatrpus inkbb koncepci6t, elkpzelst kpvisel, nem pedig egy konkrt
dolgol. Az pldul absztrakt adattipus, mg a konkrl.
Tisztn virll/lfsjiiggvny (pl/re tlint/al fU/lction) - Olyan virtulis fggvny, amil
a szrmaztatott osztlynak fell kell brlnia, mivel az alaposztlyban egyl-
taln nincs megvalstsa, nem tartozik hozz kd. Az ilyen fggvny teht az alaposz-
tlyb:1Il egy teljesen absztrakt funkcit r le.
,
19. Ora
Lncolt lista (linked list) - Olyan adatszerkezet, amely logikailag egymshoz kapcsolt
csom6polltokbl ll.
Egyszeresenlllcolllisla (singly linked list) - Olyan lncolt lista, amelyben a csom6-
pomok csak a soron csompontra tartalmaznak hivatkozst, visszafel nem.
lista (t/oubly linked list)- Olyan lncolt lista, amelyben a csom6pom-
ok az 6ket kvet6 s csompontra is tartalmaznak hivatkozsl.
B fggelk Gyakran kifejezsek 1529
Fa (tn>e) - Olyan sszetett adatszerkezet, amt:lyben a csompontok vagy ann
tbb msik csom6pomra tartalmaznak hivatkozst.
,
20. Ora
f r iend - Kulcssz, amely azt rja hogy egy osztly hozzfrhessen egy msik osz-
t: ly privt tagjaihoz is, ad,magokhoz s metdusokhoz egyarnt.
Sratik/ls adattag (static member data) - Olyan adaltag, amely az ltalnos adattagoktl
eltn5en nem replikl6dik a pldnyosts (objektumok ltrehozsa) sor.:in. Az ilyen
csak egy pldny ltezik, ehhez azonban valamennyi az adou osztlyba tar-
toz6 objektum hozzfrhet. Az ilyen adattagol ltalban arrd hasznljk, hogy segts6-
gvel nyilvntartsk a ltrehozott objektumok szmt, de trolhat ben-
ne brmilyen ms olyan info rmci is, amely valamennyi objcktumra vonatkozik.
Statikm tagft'/ggvll)'ek (staIIc member fi/llctiolls) - Ugyangy, ahogya statikus adatIa-
gok, ezek is csak egy pldnyban lteznek, s csak az adott Osztll yai kapcsolatban
hasznlhatk, az osztly elemeivel kapcsolatban nem. Termszetesen meghv:suknl
sem kell egy adon objektumr.t hivatkoznunk.
,
21. Ora
IIdefine - EI6feldolgoz6i direktva, amely va lamilyen karaklerlncokkal kapcsolatos
helyeuesitsi r elO:.
Token - Specilis jelentssel felruhzott karakterlnc.
22. ra
Vzess llater/all) - Olyan elj:rs, amelynl minden egyes rszmtlvelet vgreh .. jts-
nak megkezdshez be kell fejez6dni az sszes, rsznllivelet vgrehajt-
snak. Valamennyi llapot diszkrt s nmaga ltal meghatrozott. Ezt a megkzeltst
nem csak szoftverfejleszlsre lehet alkalmazni, hanem szmos ms dologra is. (Jlyen
logika alapjn trtnik pldul egy hz vagy egy aut megptse.)
Szimulci (simulalion) - Egy vals rendszer vagy rszrendszer mkdst ler sz-
mt6gpes modell.
Koncepci/elV (col1ceptllalizalioll) - Egy szoftverfejlesztsi projekt alaptlete.
Felhasznlsi esettanulmny (use case) - Egy rendszer felhasznlsi mdjnak lersa.
530 I VII. rsz Fggelkek
UMl (Ul1ificd Modeling Lallguage) Szabvnyos grafikus brzolsi rendszer, amely
a rendszerekkel szemben tmasztott ignyek lersban, illetve a tervezsben segt.
Problmatr (problem space) - Azoknak a Feladatoknak s problmknak a halmaza,
amelyeket egy programmal meg kvnunk oldani.
Megoldiistr (solution space) - Egy problma lehetsges megoldsainak halmaza.
Mcghajtprogram (d/ivel program)- A tesztprogram msik megnevezse.
23. ra
Sob/Oll ((emp/ale) - Olyan eszkz, amivel ltalnos met6dusokat vagy osztlyokat hoz-
hatunk Ezekb61 az ltalnos lersokbl aztn egy trusnak paramterknt trt-
n6 megadsv., 1 {l lIthatunk el6 konkrt oszt:llyokat vagy me16dusokat.
Pldtmyosils (fllstantialion)- Az a mOvelel amellyel egy o.'iztly alapjn egy objekm-
mot, vagy egy sablon alapjn egy lpust (oszllyt) hozunk llre.
,
24. Ora
KitXJt(J! (e:;(CepUO'l) - Olyan objektum, amit problma escln az egyik kdrszlet a m-
siknak tad, A a problms k6drerlet, :l fogad pedig az a kd, amely a probl-
mt kezelni kpes.
TRGYMUTAT
532 1 Trgymutat
#414
lf1f 414
#defi ne 50, 99, 404
#else 405
#endif 405
#ifder 405
#jfndef 405
#indude 377
~ n e f 409
.c9
.cbx 7
.cp 9
.epp 7, 9
.cxx 9
_DATE_415
_FILE_415
_LlNE_ 415
_TIME_415
-- 257
8O/ 80-as szably 451
A,
adattag 133
adattpus 38
address of 164
alaprtelmezett rtkek 234, 235
alaprtelmezett konstruktor 141
alias 196
alkalmazsfejleszl6i interfsz 452
!land 49
ANSI 4
ANSI szabvny 25
ANSI/ISO CH 4
API 452
Application Programming Interface
452
argumenmm 32
argumentumok 90
a rity 254
B
ASCII 41
assertO 416, 502
azonosL6nevek 499
balrtk 59
!r.uli viszonyban 381
BASIC 20
bziskonslruktor 300
bzismet6dus meghvsa 309
bzisosztly 293
bzisosztly inicializci6j:1 304
bzisosztly metdusai nak eJfedse
307
BCC32 11
begyazs 22
beptet! makr 416
beszrs 407
binary 251
Borland C++BuilderX 5
break 111
C, Cs
C++ 20
case 124
casting down 329
catch blokk 486, 490
clobjekrum 196
char 39
ci klus 107
cm 164
cm szerinti paramtertads 214
class invariant 420
COBL 20
compiler 5, 20
concatenation operator 414
const 50, 502
D
continue III
cOUl45
csompont 354
cskkents 60
DEHUG 409
deep copy 238
default 125
definci 81
dekrementls 60
<lelete 177
dereference 169
destruktor 141
destruktorok 298
dinamikus kts 318
dinamikus mem6ria 174
do ... while lvi
double 47
E,
egyenl6sg opertor 257
egymsba gyazott ciklusok 123
egyoperandus oper.tor 251
egysgbezrs 133, 382
egysges modellez6 nyelv 437
egyszercsen lncolt lista 354
el6feldolgozsi direktv{lk 25
25, 403
egsz 48
el6tag 61
else g 67
elvont adanpusok 341
encapsulation 22, 133,465
endl45
enum 51
rtk szerinti paramterwds 213
F
rte[mez6k 20
rvnyessgi kr 88
escape karakter 165
esemnyhurok 441
fa 354
fjlformlumok 417
fcj[(:cllomny 150
fejlcllomnyok 25
fejlesztsi ciklus 435
felel6ssg truhzsa 355
felsorolt .'illand6k 51
felszni msols 238
felillbrlat 305
[elillet 148
fellrs 305
float 41
for 117
fordlprogram 5
fordil6programok 20
free 180
friend 381
futsidej ktb; 318
futindex 265
fggvny 30, 79
Trgymutat 1533
fggvny argumentumai 89
fggvny definci6ja 83
filggvny prototpusa 81
fggvny tlterhelse 97
fggvnydeklarci 81,82
fggvnyek tbbalaksga 231
rggvnymutatk 382, 389
fggvnymutatk tmbje 386
fg&ovnyparamrer 32
ruggvnytlterhels 231
534 1 Tryymutlrt
G, Gy
H
I
gazdtlan mUlat 190
globlis nvtr 175
golyll 484
goto 107
gykeres struktm 447
h:lsznlaLi esetdiagmll1 437
heap 174
helyi vltozk 86
hilxlkeress 149
hivatkozs 196
hivatkozsok 221
hossz serok 498
hozzMrs 501
hozzfrs-szablyoz m6dos16sz
296
hOZ7..rendelsi vagy rtkad
opertor 57
IDE5
i z t e t t bomba 190
if utasts 66
IilNK3211
implementci 149
indude 45
indusion guards 408
indireclion 168
inheril ance 22
inkrementls 60
inliJle f'i\ggvny 99
intO opertor 260
intelligens fordtprogramok 223
J
K
interfsz 150
intcrpereter 20
InvariantsO 424
iostream 45
ISO 4
iterci 107
jtk 110
jobbrtk 59
karakterlnc-osztlyok 286
karaktertmbk 282
kategria 131
kerlsoszlop hibk 268
ktoper-d.ndus opertor 251
ktszeresen lncolt lista 354
kezd6nk 44
kifejezs SS, 57
kivtel 177
kivtelek 485, 486
kivrelek elkaps:1 491
kivtelkezels 485
kbor mutat 190
k6cltr 175
koncepciterv 437
konstans mutatk 191
konstans lllutat6val 217
konstans tagfggvny 147
konstruktor 140
konstruktorok 236, 298
konstruktorok rlllterhelse 236
konzolos alkalma:.:s 5
kzvetett elrs 168
L
M
lncolt lista 353
leak 176
lecsupaszts 293
linker S
lista farka 354
lislafej 354
liter dl 49
lg mulat 190
loklis vltozk 136
long 39
jwva lue 59
makr6fOggvny 410
makrk 4]5
makr6k mellkhatsai 418
maJloc 180
msol6 konstluktor 237
msol met6dus 323
MAX 410
megjegyzs 28
megjegyzsek 500
megoldstr 438
megval6sts 149
mellkhats 419
mlysgi msols 238
memriacm 164
mem6riafoglals 31:1
memriaszivrgs 176
mctdus 133
MIN 410
nmemonikok 20
modulo 59
modulus 59
mulat 183
mutatk 163
mutatk tmbje 278
mutal6lmbk 276
N, Ny
499
nevestett lland 49
nvtr 113
new 176
nvels 60
NULL 167
null pointer 167
nullmuta16 167
Trgymutat6 1535
nyelvi lland 49
nyomkvets 418
nyomkvets! szi nt ek 426
""
0,0
objecl code 20
objektum-kzpont paradigm:l 22
objektumok iniciali7..lsa 237
objektumtmbk 270
operandus 57
opertor 5$, 164
opertor operandusainak szm:. 254
opertor tlterhels 245, 247
operator+ 251, 252, 380
operator- 254
osztly kezel6fellete 150
oszt:'ilydefi nd6k 501
osztlyinvarinsok 420
oszrlymetdus megval6stsa 150
osztlyok 131
overloading 97
rkl6ds 22, 291. 329
sszefz6 opertor 414
sszetett utasts 56
53s 1 Trgymutat
p
R
paramterli sla 81
paramternek alapnelmezett rtke
95
paramler-szignanra 305
Pareto szablya 452
pldnyosts 135
polimorfizmus 22
polymorphism 22
postfIX 61
postfix inkrcmel'tl6 opertor 248
postfix opertor 248
precedencia 63
prefIX 61
prefIx opertor 246
preprocessor 25
preprocessor directive 25
private 296
problmatr 438
procedurlis 21
program szvege 498
programblokk 88
projekt 6
protected 296
prototpus 81
public 296
RAM 38
Random Acces Memory 38
referencia 174, 195
regiszter 175
relci6s opertorok 65
rvidtett rsmd 386
r-value 59
S, Sz
sablon defi nci6ja 466
sablon pldnyostsa 466
sablonok 465
sablonosztlyok 466
sablontpus 474
s hallow copy 238
signed 40
sizeofO 40
slicing 320
spagetti kd 108
stack 101, 175, 276
Standard Template Library 480
stalikus 370
statikus tagfggvnyek 372
statikus tagvltozk 369
STL 480
sucpyO 284
stringizing aper.hor 414
strncpyO 284
subscript 265
.switch 124
switch utastsok 498
symbolic 49
szabvnyos sabJonknyvtr 480
szrmaztats 292, 293
szeletels 320
szignatra 32
szimulci 436
szvegg ala kt opertor 414
T, Ty
tagfggvny 133
tagmetdus 138
tagok 132
tagonknti msols 238
tagvJtaz 133
tdrgykOu 20
tartdlm,lzntt 5)O\()
[clt:pts (J
[hb JRR
mUIJt 5--i
tpu,:, 1.'\1
tPllSdh:s 329
tbbajaksig 22,
tbbclimenzis tmbk T2
tmbk dekbr.1ciFl
273
tmb 265
tmb 278
tmbk elemei 266
tmbk c1<1kszfse 269
lmbk lSl
lmbk tHdsa 268
If)' blokk 4H6, 490
Iypeclel' 4'5, :W I
..
U,U
UML 437
unaf)' 251
IlnH'cd Modeling L1nguage 437
un.'>igncd 40
55
utols(mak be eJs6nek ki n 03sl-in-
tlrsl-out) elv 101
uttag 61
v
w
z
vad tllU1Jt 1(1-
vltoz
":lltm: rtke
dlto:t: lipus::l :.R
"r.1I1an ... k -f}O\:;
"gtehm ciklus 113
Trgymutat , 537
"letlen memna _\8
\crem 101, l-5. 2-6
virtulis destruktorok 322
viml:'ilis fggvnyek 313, 314, 329,
342
virtulis msol konstruktorok 322
visszahiv:llkoz.s 169
vil>Szatrsi rtkek 26
visszatrsi tpus 92
vzess modell 435
v-mutat 318
v-tbMzat 318
kllsgei 326
II
whik' 101{
whih .... lxIL'L <;6
\\ dd puintL'f 167

You might also like