You are on page 1of 259

xeqq Dnpxep

C CC C++ ++ ++ ++
BHBRHOTEKA RPOFPAMMHCTA
Copepauue
!"#$%&#'(%)*+......................................................................................................................................... 9
!"#!$%$!& !'! #()*% +),)..................................................................................................................... 9

,#)*- .. //0&0(+0 + 1'#*1+2 %!3%'............................................................................................ ..
$"#/# .. 3#,04 (56(# 070 %&(# 1(+$# % )++? .................................................................... .3
*-) .++......................................................................................................................................................... /3
+(! #%'!0!% !*%! .++................................................................................................................................ /5
0-0 1!+-+2 3+4 0$!,4 ................................................................................................................................ /6
$%.0)'20) .')# ) .+!'% 5(),(-66!()#-$!& ...................................................................................... /7
$"#/# 2. )+(*#1)+) )++ ...................................................................................................................... .9
5%(%6%$$7% ! 0)$.+-$+7 ........................................................................................................................ /9
const............................................................................................................................................................ 19
!"#$%&'# ( )(*+,(-#.$(# %/0#$"'....................................................................................................... 23
)8'-.+! *%9.+#!& ! :4$0;!!.................................................................................................................. 25
1/2+."( )#3."&(4.................................................................................................................................... 25
5#6#7689$+................................................................................................................................................. 28
:()(,%.";................................................................................................................................................. 29
+!57 ! )5%(-+)(7...................................................................................................................................... 33
<%*."68$"%6'.......................................................................................................................................... 33
=#."68$"%6'............................................................................................................................................ 40
56(.&+(&+*(# ............................................................................................................................................ 41
5#6#7689$+ %>#6+"%6%&............................................................................................................................ 46
$"#/# 3. 8#!"%(9 + !03%:#)(%)*- *+:%/............................................................................ 55
1+) +-0)% <-8')$7 ! "-1%6 )$! $4=$7? ............................................................................................. 55
56%/2#,'................................................................................................................................................... 55
1/?%)*'# 6#@#*(4.................................................................................................................................... 56
A+/2%*' 8.%&#6@#*."&%&+**'# ,+$6%.'........................................................................................ 56
.!$+-0.!. <-8')$)#................................................................................................................................ 57
5+6+,#"6(9%&+**'# "(>'...................................................................................................................... 57
5+6+,#"6(9%&+**'# B8*$C((................................................................................................................. 57
5+6+,#"6(9%&+**'# B8*$C(( $2+..%& ................................................................................................... 58
5#6#)+-+ >+6+,#"6+................................................................................................................................ 58
A+/2%*' . *#.$%2;$(,( >+6+,#"6+,(.................................................................................................. 59
=%2%3 &2%D#**'# >+6+,#"6(9%&+**'# "(>'!...................................................................................... 59
E+.2#)%&+*(#............................................................................................................................................. 59
0)68!$-;!! 5().+7> ! 5-(-6%+(!")#-$$7> +!5)# ......................................................................... 59
E#/#9%>+.*'# "(>' & %"$6'"'? /+9%&'? $2+..+? .............................................................................. 60
E#/#9%>+.*'# "(>' & 9+$6'"'? /+9%&'? $2+..+?................................................................................ 60
E#/#9%>+.*'# "(>' & >#6#,#**'? $2+..+ ............................................................................................. 60
$"#/# 4. +)1";,0(+<.......................................................................................................................... 63
4
)8(-8)+0- !.0'?1%$!9 # .+-$*-(+% ANSI ........................................................................................... 63
!(*"+$.(. (*(C((6%&+*(4 (.$2F-#*(3 .................................................................................................. 63
!(*"+$.(. >#6#?&+"+ (.$2F-#*(3.......................................................................................................... 66
<%*."68$"%6' ( )#."68$"%6'............................................................................................................... 67
$%.+-$*-(+$-& )8(-8)+0- !.0'?1%$!9 ............................................................................................... 69
4.')#$7% )8)"$-1%$!&............................................................................................................................. 69

,#)*- 2. 1%)/0((90 %!'#70(+< .................................................................................................. 7.
$"#/# 5. 54(90 51#3#*0"+............................................................................................................... 73
,'457% 40-"-+%'! ...................................................................................................................................... 73
46$7% 40-"-+%'! 0-0 !*!)6-................................................................................................................. 75
1>#6+"%6 - >............................................................................................................................................. 75
5+6+,#"6(9%&+**'# 8,*'# 8$+9+"#2(................................................................................................... 75
G#6+6?(4 8,*'? 8$+9+"#2#3 .................................................................................................................... 76
H6(B,#"(-#.$(# %>#6+C(( . 8$+9+"#24,(............................................................................................. 77
:% -"% %/?%)(".4 8,*'3 8$+9+"#2;?..................................................................................................... 78
5(!6%$%$!& ................................................................................................................................................. 78
I+9',#*%&+*(# 9*+-#*(4 NULL ............................................................................................................... 78
1"2+)$+ ( "6+..(6%&$+ ........................................................................................................................... 80
<J@(6%&+*(#.............................................................................................................................................. 82
$"#/# 6. /0&57+0 51#3#*0"+ + &0)1'+:*%'9..................................................................... 85
.%6-$+!0- #%*4@!> 40-"-+%'%9............................................................................................................ 85
<%*."68(6%&+*(# ...................................................................................................................................... 86
K*(-"%D#*(#............................................................................................................................................ 87
<%>(6%&+*(#............................................................................................................................................... 87
56(.&+(&+*(#............................................................................................................................................. 88
56%"%"(> @+/2%*+ &#)8L#7% 8$+9+"#24 ............................................................................................... 89
*%.0(!5+)(7 # C++..................................................................................................................................... 90
1+) =% 5)'41-%+.&? ................................................................................................................................... 90
5%).-#" %/0#$"%& .................................................................................................................................... 90
K$+9+"#2( "%2;$% )24 -"#*(4................................................................................................................. 92
K$+9+"#2( )24 -"#*(4/9+>(.(.................................................................................................................. 92
$"#/# 7. $'#(+ + &'5$+0 45&'90 51#3#*0"+......................................................................... 93
!$+%(:%9.$7% 40-"-+%'!......................................................................................................................... 93
=8/2(6%&+*(# (*"#6B#3.+ ....................................................................................................................... 93
M+.$(6%&$+ 8$+9'&+#,%7% %/0#$"+........................................................................................................ 94
G9,#*#*(# (*"#6B#3.+ ............................................................................................................................ 96
,(-$! ............................................................................................................................................................. 96
56#%/6+9%&+*(# 8$+9'&+#,%7% %/0#$"+ & 76+*;.................................................................................... 97
<6(."+22'................................................................................................................................................. 98
:+6(+C(( *+ "#,8 76+*#3......................................................................................................................... 99
G*$+>.824C(4 8$+9'&+#,%7% %/0#$"+................................................................................................... 102
56%&#6$+ 76+*#3...................................................................................................................................... 103
1/#.>#-#*(# .%72+.%&+**%."(............................................................................................................... 103
N6+*( ( &#)8L(# 8$+9+"#2(.................................................................................................................... 105
5%(%>)*$7% +!57 ..................................................................................................................................... /06
5%2(,%6B*'# 8$+9'&+#,'# %/0#$"'................................................................................................... 106
:'/%6 "(>+ 8$+9'&+#,%7% %/0#$"+ &% &6#,4 $%*."68(6%&+*(4 ....................................................... 107
G9,#*#*(# 8$+9'&+#,%7% %/0#$"+ &% &6#,4 &'>%2*#*(4 >6%76+,,'................................................ 107
5).(%*$!0!................................................................................................................................................ /07
:4$0+)(7.................................................................................................................................................... /08
$"#/# 8. 1%""01=++, 15')%'9 + +*0'#*%'9....................................................................... ...
6-..!#7 ! )5%(-+)( [ ] .......................................................................................................................... ///
5
56%&#6$+ 76+*(C ( >6(.&+(&+*(#........................................................................................................... 111
1>#6+"%6 [ ] . *#C#2',( +678,#*"+,(............................................................................................... 112
G,("+C(4 ,*%7%,#6*'? ,+..(&%&........................................................................................................ 112
M*%D#."&#**'# >#6#7689$( %>#6+"%6+ [ ] ........................................................................................ 113
:(6"8+2;*'3 %>#6+"%6 [ ] .................................................................................................................... 113
04(.)(7...................................................................................................................................................... //4
56%."%3 $2+.. 6+96#D#**%7% ,+..(&+................................................................................................. 114
<86.%6' ( 6+96#D#**'# ,+..(&'......................................................................................................... 115
1>#6+"%6' >6#%/6+9%&+*(4 ( %>#6+"%6 - >........................................................................................ 116
O"%-"% 9*+$%,%#................................................................................................................................ 117
!+%(-+)(7.................................................................................................................................................. //7
H$"(&*'# ("#6+"%6'............................................................................................................................ 118
5+..(&*'# ("#6+"%6' .......................................................................................................................... 118
O"% 28-@#? ............................................................................................................................................. 119
K/%7(#, *% 6+.>6%."6+*#**'# &+6(+*"' ............................................................................................ 119
P8-@(# &+6(+*"'................................................................................................................................... 120
G"#6+"%6 +/."6+$"*%7% ,+..(&+ ....................................................................................................... 121
)5%(-+)(7 0)''%0;!9............................................................................................................................. /23
64*(7% 04(.)(7 ! $-*%=$).+2 !+%(-+)()#....................................................................................... /24
O+."*'# $%>(( $%22#$C(3...................................................................................................................... 126
:*8"6#**(# ( &*#@*(# ("#6+"%6'...................................................................................................... 127
:6#,#**+4 >%,#"$+................................................................................................................................ 129
56(,#6..................................................................................................................................................... 131
$"#/# 9. *'#(3#1=++ + $0(+#"-(90 51#3#*0"+.............................................................. .37
+%($!.+7% 54+! *!"-9$-........................................................................................................................ /37
Q6+*9+$C((............................................................................................................................................... 137
1",#*+ .................................................................................................................................................... 138
R&+"("? .................................................................................................................................................. 138
)8(-"7 ! 40-"-+%'! ................................................................................................................................. /38
56%."%3 8$+9+"#2; %/6+9%& .................................................................................................................. 139
!"#$( %/6+9%&......................................................................................................................................... 140
1/6+9' +&"%,+"(-#.$(? %/0#$"%&...................................................................................................... 141
1/6+9' 8$+9+"#2#3................................................................................................................................. 144
<%,/(*+C(( ( &+6(+C(( ......................................................................................................................... 145
+(-$"-0;!! ! )+6%$-.............................................................................................................................. /45
Q6+*9+$C(( ( /2%$(6%&$( ....................................................................................................................... 146
<2+.. ConstPtr......................................................................................................................................... 147
<2+.. LockPtr .......................................................................................................................................... 149
!%9)+*(# ( 8*(-"%D#*(# %/0#$"%& ..................................................................................................... 150
K>6%L#**%# .%9)+*(# %/0#$"%&............................................................................................................ 151
1",#*+ .................................................................................................................................................... 152
#-(!-$+7 ................................................................................................................................................... /52
:2%D#**'# /2%$(6%&$(.......................................................................................................................... 152
:9+(,*'# /2%$(6%&$( ( %-#6#)(............................................................................................................ 153
M*%7%86%&*#&+4 %",#*+ ........................................................................................................................ 154
1>"(,(9+C(4 %/0#,+............................................................................................................................. 154
$%.0)'20) 5()@-'2$7> .')#................................................................................................................ /55

,#)*- 3. )(%/# % *+:#>..................................................................................................................... .57
$"#/# .0. 4(%60)*/0((#< :0'0&#,#....................................................................................... .59
,)6)6)(:$7% !%(-(>!! 0'-..)#......................................................................................................... /59
:9+(,%9+,#*4#,%."; >6%(9&%)*'? $2+..%&......................................................................................... 160
E%6,+2;*%# *+.2#)%&+*(#...................................................................................................................... 160
G*$+>.824C(4 >6%(9&%)*'? $2+..%&...................................................................................................... 161
6$)=%.+#%$$-& 5%(%*-1- ..................................................................................................................... /62
6
=&%3*+4 >#6#)+-+.................................................................................................................................... 163
N#"#6%,%6B*+4 )&%3*+4 >#6#)+-+........................................................................................................ 164
5#6#)+-+ /%2## &'.%$%7% >%64)$+......................................................................................................... 165
N68>>(6%&$+ >#6#)+- ( >6#%/6+9%&+*(4................................................................................................ 166
3+) %@% $% #.% ........................................................................................................................................... /67
$"#/# ... :'%+3/%&<7+0 ?5(1=++ + %!@01*9 1"#))%/ ............................................ .69
5()!"#)*&@!% :4$0;!!.......................................................................................................................... /69
make-B8*$C(( .......................................................................................................................................... 170
!(,&%2(-#.$(# $2+..' ( >#6#768D#**'# make-B8*$C(( .................................................................... 170
1>"(,(9+C(4 . >6(,#*#*(#, >6%(9&%)4L(? B8*$C(3......................................................................... 170
P%$+2(9%&+**%# (.>%2;9%&+*(# >6%(9&%)4L(? B8*$C(3...................................................................... 171
K*(-"%D+FL(# B8*$C(( ...................................................................................................................... 172
!*%&+ % )&%3*%3 >#6#)+-#: >6%,#D8"%-*'# /+9%&'# $2+..'............................................................ 172
E#" $%*."68$"%6+, $%>(3 ( %>#6+"%68 =!.................................................................................... 173
)8A%0+7 0'-..)#...................................................................................................................................... /73
G*B%6,+C(4 % $2+..#.............................................................................................................................. 174
SL# *#.$%2;$% .2%& %/ 8*(-"%D+FL(? B8*$C(4?............................................................................... 175
1>6#)#2#*(# $2+..+ >% %/0#$"8 ............................................................................................................ 176
5(%*.+-#!+%'!.......................................................................................................................................... /77
$"#/# .2. (0/+&+490 51#3#*0"+................................................................................................ .79
).$)#$7% 0)$;%5;!!.............................................................................................................................. /79
G*$+>.824C(4 8$+9+"#2#3 ( 8$+9'&+#,'? %/0#$"%&........................................................................... 180
56%(9&%)4L(# B8*$C(( .......................................................................................................................... 180
!.'2$( *+ 8$+9+"#2( .............................................................................................................................. 181
E#&#)8L(# 8$+9+"#2( ............................................................................................................................. 181
:#)8L(# 8$+9+"#2( ................................................................................................................................. 183
.$)#- ) *#)9$)9 5%(%*-1%..................................................................................................................... /84
K)&%#**+4 )&%3*+4 >#6#)+-+.................................................................................................................. 185
!+,%,%)(B($+C(4 ( >#6#?%)(,%.";.................................................................................................... 187
M*%D#."&#**+4 )&%3*+4 >#6#)+-+....................................................................................................... 189
5(!6%$%$!% $%#!*!67> 40-"-+%'%9................................................................................................... /89
<J@(6%&+*(#............................................................................................................................................ 189
I+.>6#)#2#**'# %/0#$"' ( >%.6#)*($( ............................................................................................... 189
E#"6(&(+2;*'# 6+.>6#)#2#**'# +6?("#$"86'................................................................................... 189

,#)*- 4. 5:'#/"0(+0 :#4<*-;.................................................................................................... .9.
$"#/# .3. :0'0$'531# %:0'#*%'%/ 5:'#/"0(+< :#4<*-;......................................... .93
5%(%,(4"0- )5%(-+)()# NEW ! DELETE................................................................................................... /93
56%."%3 .>(.%$ .&%/%)*%3 >+,4"(...................................................................................................... 193
E+.2#)%&+*(# %>#6+"%6%& new ( delete................................................................................................. 196
H678,#*"' %>#6+"%6+ new.................................................................................................................... 197
<%*."68(6%&+*(# . 6+9)#2#*(#, B+9.................................................................................................... 197
K*(-"%D#*(# . 6+9)#2#*(#, B+9.......................................................................................................... 198
0+) 45(-#'&%+ #7*%'%$!%6 5-6&+!?................................................................................................... /99
N2%/+2;*%# 8>6+&2#*(#............................................................................................................................ 199
:')#2#*(# ( %.&%/%D)#*(# >+,4"( & $2+..+?..................................................................................... 200
K>6+&2#*(# >+,4";F >%) 68$%&%)."&%, $2(#*"+............................................................................... 200
1/0#$"' $2+..%& ( >6%(9&%)4L(# B8*$C(( ......................................................................................... 200
K>6+&2#*(# >+,4";F . >6(,#*#*(#, &#)8L(? 8$+9+"#2#3................................................................. 200
5#6.>#$"(&'........................................................................................................................................... 204
$"#/# .4. %)(%/9 5:'#/"0(+< :#4<*-;.............................................................................. 205
.+()!+%'2$7% 8')0! ................................................................................................................................ 205
5%/2%-*%# %.&%/%D)#*(# >+,4"( ........................................................................................................ 205
7
!$6'"+4 (*B%6,+C(4 ............................................................................................................................ 208
!>(.$( .&%/%)*'? /2%$%&....................................................................................................................... 208
5)*.1%+ ..7')0........................................................................................................................................ 2/0
T+9%&'3 $2+.. . >%).-#"%, ..'2%$ ...................................................................................................... 210
K$9+"#2( . >%).-#"%, ..'2%$ .............................................................................................................. 211
:#)8L(# 8$+9+"#2( . >%).-#"%, ..'2%$ ............................................................................................. 211
=#.$6(>"%6' . >%).-#"%, ..'2%$ ....................................................................................................... 212
Q68)*%."( >%).-#"+ ..'2%$ ................................................................................................................. 213
5%).-#" ..'2%$ ( &#)8L(# 8$+9+"#2(.................................................................................................. 213
5().+(-$+.#- 5-6&+!............................................................................................................................. 2/4
=#2#*(# >% $2+..+,................................................................................................................................. 214
=#2#*(# >% 6+9,#68 ................................................................................................................................. 215
=#2#*(# >% .>%.%/8 (.>%2;9%&+*(4........................................................................................................ 215
=#2#*(# >% .6#)."&+, )%."8>+............................................................................................................. 215
56%."6+*."&+ ."#$+ ( $8-(.................................................................................................................. 216
$"#/# .5. 5:"%*(0(+0 :#4<*+..................................................................................................... 2.7
5)!.0 40-"-+%'%9.................................................................................................................................... 2/7
M+,+, %"$8)+ /#68".4 8$+9+"#2(? ...................................................................................................... 217
5%(.$ 8$+9+"#2#3 ................................................................................................................................... 220
*%.0(!5+)(7, 5)#.?*4 *%.0(!5+)(7.................................................................................................. 223
1/L## %>(.+*(# +6?("#$"86'.............................................................................................................. 223
:#)8L(# 8$+9+"#2(................................................................................................................................. 223
:+6(+C((.................................................................................................................................................. 227
1>"(,(9+C(4 & %.%/'? .("8+C(4?........................................................................................................ 229
-',)(!+6 8%90%(-.................................................................................................................................... 229
56%."6+*."&+ %/0#$"%&....................................................................................................................... 229
5%.2#)%&+"#2;*%# $%>(6%&+*(# ............................................................................................................ 232
:*#@*(# %/0#$"'................................................................................................................................... 233
H27%6(", T#3$#6+: 8?%) ( $%6,2#*(# & C++....................................................................................... 234
45')+$%$!% $- 6%.+%.............................................................................................................................. 236
T+9%&'3 $2+.. VoidPtr ............................................................................................................................ 236
582 &#)8L(? 8$+9+"#2#3 ........................................................................................................................ 237
G"#6+"%6 &#)8L(? 8$+9+"#2#3 ............................................................................................................ 238
H27%6(", 8>2%"*#*(4 ............................................................................................................................ 238
1>"(,(9+C(4........................................................................................................................................... 239
5%.2#)%&+"#2;*%# 8>2%"*#*(# *+ ,#."#............................................................................................. 239
5%(.5%0+!#7 ............................................................................................................................................. 239
$"#/# .6. )!%'1# 45)%'# ................................................................................................................. 24.
*).+45$).+2.............................................................................................................................................. 24/
5#6(,#"6 ................................................................................................................................................ 241
:*8"6( >#6(,#"6+ ................................................................................................................................. 242
H*+2(9 J$9#,>246%&................................................................................................................................. 243
5#6#/%6 76+B+ %/0#$"%& ....................................................................................................................... 244
.8)(0- 64.)(- 5) -',)(!+64 8%90%(-................................................................................................ 245
A+/2%* .2+/%7% )#.$6(>"%6+............................................................................................................... 245
A+/2%* .(2;*%7% )#.$6(>"%6+ ............................................................................................................. 245
G"#6+"%6' &#)8L(? 8$+9+"#2#3.......................................................................................................... 246
5#6#/%6 8$+9+"#2#3 ............................................................................................................................... 248
1>"(,(9+C(4........................................................................................................................................... 251
:*#@*(# %/0#$"'................................................................................................................................... 251
M*%D#."&#**'# >6%."6+*."&+........................................................................................................... 251
!/%6$+ ,8.%6+ ( 8>2%"*#*(# *+ ,#."# ................................................................................................ 251
E8D*% 2( &'9'&+"; )#."68$"%6'? .................................................................................................... 252
+)'20) *'& 5():%..!)$-'2$7> 0-.0-*%()# ..................................................................................... 252
<%*C#>C(( ,+"#6( &.#? %/0#$"%& .................................................................................................... 252
167+*(9+C(4 >+,4"( .............................................................................................................................. 253
8
5%(.$ >#6(,#"6+ .................................................................................................................................... 254
5#6#/%6 &*8"6( >#6(,#"6+................................................................................................................... 254
!/%6$+ ,8.%6+......................................................................................................................................... 255
5%.2#)%&+"#2;*+4 ./%6$+ ,8.%6+......................................................................................................... 255
!+),)#7% 5%(.5%0+!#7........................................................................................................................... 255
:'+"%60(+0. JAVA :'%*+/ C++ ..................................................................................................... 257


Enaropapuocfu
3BC DEFGC, DCD F HIJCK LMNGCK, OJKPCEC QROFS QNTUQBRORCEFUS QHFVDOS SEOGFS, WBOJX FY SOZEO JXHO
[UMUWFQHFB\ R OLEOS Q[FQDU. 0EFGC ]BO EUWBO JOH\VUU, WUS [MOQBO QBMCEF^X, [ODMXBXU PCJCREXSF
WUMEXSF PECWDCSF. 3BO QSUQ\ CH\BMNFPSC, CRBOMQDOGO ego F [UMROJXBEOGO DMFDC LNVF. 0MOSU BOGO, OEC
QXGMCHC PCSUBENI MOH\ R ZFPEF CRBOMC F UGO QUS\F. & GHNJODO JHCGOLCMUE QROU_ ZUEU .FELF F
QXEOR\KS $FDN, *ZU_-*ZUI F 8OJJF PC FY BUM[UEFU, [OLLUMZDN F [MOTUEFU, DOGLC [C[C EU SOG
NLUHKB\ FS LOQBCBOWEO RMUSUEF LHK FGM.
%QHF QWFBCB\ BUM[UEFU LOJMOLUBUH\I, BO QCSXU LOJMOLUBUH\EXU HILF, O DOBOMXY SEU FPRUQBEO,
MCJOBCIB R FPLCBUH\QBRU AP Professional. & R LOHGN [UMUL RQUSF, DBO Q QCSOGO ECWCHC [OLLUMZCH SOI
FLUI ]BO_ DEFGF F [MOLOHZCH ECZFSCB\ EC SUEK, WBOJX MCJOBC EU QBOKHC EC SUQBU. !EOGLC SEU DCZUBQK,
WBO EC SOI LOHI RX[CHC QCSCK HUGDCK WCQB\ BU[UM\ K OBLXYCI, C RX [XBCUBUQ\ [MOLCB\!
& OQOJUEEO JHCGOLCMUE *ZOEN +MNLO (John Trudeau) FP DOS[CEFF Apple Computer, DOBOMX_ R[UMRXU
[MULHOZFH SEU FPHOZFB\ EC JNSCGU QROF MCPMOPEUEEXU SXQHF F [UMUZFRCEFK R RFLU QUSFECMC LHK
O[XBEXY [MOGMCSSFQBOR .++. *CZU EU PECI, WBO K LOHZUE RXMCPFB\ SEOGFS QHNVCBUHKS ]BFY
QUSFECMOR, DOBOMXU [UMUZFHF MCEEFU RCMFCEBX ]BOGO DNMQC, [MUZLU WUS OE ECWCH [MFEFSCB\
PCDOEWUEEXU `OMSX, BO HF JHCGOLCMEOQB\, BO HF QROF FQDMUEEFU FPRFEUEFK.
"C ]BF GOLX SEOGFU HILF [ORHFKHF EC SOU OBEOVUEFU D .++ F OJaUDBEO-OMFUEBFMORCEEOSN
[MOGMCSSFMORCEFI. # GOHORN QMCPN ZU [MFYOLFB EUQDOH\DO FSUE $FH ,OHLQBU_E (Neal Goldstein),
'CMMF (OPUEVBU_E (Larry Rosenstein), 3MFD 8UMLCH (Eric Berdahl), *ZOE 8MIGGU (John Brugge), *]_R
.FSSOEQ (Dave Simmons) F *]_R 8\I]HH (Dave Buell). $FDBO FP EFY EU EUQUB OBRUBQBRUEEOQBF PC BO, Q
WUS RX EU QOGHCQFBUQ\ R ]BO_ DEFGU, EO FSUEEO OEF PCMOEFHF R SOI LNVN [UMRXU FLUF.
6OK JHCGOLCMEOQB\ MCQ[MOQBMCEKUBQK F EC EORXY DOHHUG FP Microsoft Corporation, DNLC K JXH [MFEKB,
DOGLC DEFGC JXHC [OWBF GOBORC BO UQB\ JXHF GOBORX [UMRXU 90 [MO^UEBOR F OQBCRCHOQ\ QLUHCB\
UTU 90 [MO^UEBOR. 3BC DEFGC EU JXHC EC[FQCEC [OL PECSUEUS Microsoft, [O]BOSN, [OZCHN_QBC, EU
OJRFEK_BU FY RO RQUS, WBO R EU_ EC[FQCEO. 0EFGC JXHC ECWCBC F [OWBF PCRUMVUEC LO BOGO, DCD K ECWCH
MCJOBCB\ EC Microsoft, F EFDBO FP MCJOBEFDOR Microsoft EU [OSOGCH SEU, EU [MOQSCBMFRCH DEFGN F EU
OLOJMKH UU.
*ZU_SQ 0O[HFE (James Coplien), SX EFDOGLC EU RQBMUWCHFQ\, EO BROK DEFGC Advanced C++
Programming Styles and Idioms ODCPCHC QCSOU JOH\VOU RHFKEFU EC SOU SFMOROPPMUEFU. 0EFGC
RUHFDOHU[EO MCQDMXRCUB BUSN EUBMFRFCH\EOGO FQ[OH\PORCEFK .++. $CLUIQ\, [O BROFS QHULCS [O_LNB F
LMNGFU CRBOMX.
$CDOEU^, YOWN [OJHCGOLCMFB\ 8\KMEC .BMCNQBMN[C (Bjarne Stroustrup) PC BO, WBO OE FPOJMUH BCDO_
QBMCEEX_ KPXD. ) [MOQBXY, [OQHULORCBUH\EXY KPXDCY BF[C SmallTalk EUFEBUMUQEO EU BO WBO [FQCB\, EO
LCZU LNSCB\. %QHF JX R .++ EU JXHO RQUY ]BFY BFYFY OSNBOR F PCGCLOWEXY [MCRFH, [MO[CHC JX
JHCGOLCBECK [OWRC LHK CRBOMOR, DOEQNH\BCEBOR F [MOWFY HFWEOQBU_ RMOLU RCVUGO [ODOMEOGO QHNGF.
8\KME, K HIJHI BRO_ KPXD 1UQBEOU QHORO, HIJHI DCD 1UMWFHH\ HIJFH LUSODMCBFI. .++
YNLVF_ OJaUDBEO-OMFUEBFMORCEEX_ KPXD EO OQBCH\EXU UTU YNZU.
Hseuueuun unu epope foro
"COLEO YOWN ROQ[OH\PORCB\QK QHNWCUS F FPRFEFB\QK [UMUL RQUSF, DOGO K OJFLUH R QROU_ DEFGU. 5OEKBFK
EU FSUI, DBO RX BCDFU, EO EC QROUS GOM\DOS O[XBU ([O LRNS QBCB\KS, O[NJHFDORCEEXS R ZNMECHU IEEE
Computer) K NPECH, DCD SEOGO HILU_ OJFZCUBQK EC EUQUM\UPEX_ [OLYOL D .#6;#9*%3 BUSU BCDO_ DCD
.0
.++. %QHF RX [MFECLHUZFBU D FY WFQHN, K QOZCHUI, WBO PCLUH RCVF WNRQBRC. 5NQB\ EU BCD QFH\EO,
WBOJX HFVFB\QK QEC, EO RQU ZU QOZCHUI.
& EU [MUBUELNI EC CRBOMQBRO FPHOZUEEXY R DEFGU FLU_. %QHF RX NRFLFBU R EU_ WBO-BO, [MFLNSCEEOU
RCSF FHF DUS-BO LMNGFS, QSUHO PCKRHK_BU, WBO ]BO RCVFY MND LUHO, Q[OMFB\ K EU QBCEN. 6CQBUMQBRO
EUBMFRFCH\EOGO FQ[OH\PORCEFK .++ MCQBUB OB QROJOLEOGO OJSUEC FLUKSF, C EU OB `OMSCH\EOGO
FPNWUEFK, BCD WBO R LU_QBRFBUH\EOQBF OWUE\ BMNLEO OLEOPECWEO O[MULUHFB\, DBO, WBO F DOGLC QDCPCH. &
EC[FQCH ]BN DEFGN, WBOJX DCD SOZEO JOH\VU HILU_ QSOGHF JXQBMO F JUPJOHUPEUEEO [ORXQFB\ QROI
DRCHF`FDC^FI, [O]BOSN RO[MOQCS CRBOMQBRC FLU_ NLUHKHOQ\ RBOMOQBU[UEEOU REFSCEFU. %QHF RCS ]BO EU
EMCRFBQK, [MFSFBU SOF FQDMUEEFU FPRFEUEFK F EC[FVFBU QROI QOJQBRUEENI DEFGN.
. LMNGO_ QBOMOEX, K RPKH EC QUJK QSUHOQB\ FQ[OH\PORCB\ EORXU FSUEC LHK QBCMXY DOE^U[^F_,
RXPXRCITFY EULOMCPNSUEFK, F EFQDOH\DO OJ ]BOS EU ZCHUI. +CDORC NZ RUHFDCK BMCLF^FK QOOJTUQBRC
.++, DOBOMOU [UMUFSUEORCHO [OWBF RQU OJaUDBEO-OMFUEBFMORCEEXU DOE^U[^FF: .8/$2+.. ([MOFPROLEX_
DHCQQ), .8>#6$2+.. (JCPORX_ DHCQQ), ,#"%) (`NED^FK DHCQQC) F B.L. .BOMOEEFDF [UMUFSUEORCEFK EU
OJOVHF REFSCEFUS LCZU BCDFU BMCLF^FOEEXU DOE^U[^FF ., DCD [OMCPMKLEX_ QLRFG (<< F >>). #CS EU
EMCRFBQK, WBO LHK QBCMXY FLU_ FQ[OH\PNIBQK EORXU FSUEC, [NQB\ LCZU R FEBUMUQCY KQEOQBF?
5MFKBUH\, RX OVFJHFQ\ Q RXJOMOS KPXDC.
& QLUHCH RQU ROPSOZEOU, WBOJX RQU `MCGSUEBX DOLC R ]BO_ DEFGU MCJOBCHF DCD [OHOZUEO, EO JUP
OVFJOD LUHO ECRUMEKDC EU OJOVHOQ\. *U_QBRN_BU BCD, QHOREO RCVC [MOGMCSSN NZU GOMFB QFEFS
[HCSUEUS, [MORUMK_BU, [MORUMK_BU F UTU MCP [MORUMK_BU SO_ DOL, [MUZLU WUS FQ[OH\PORCB\ UGO R
QROFY [MOGMCSSCY. 5OSEFBU: R ]BO_ DEFGU K LUSOEQBMFMNI MCPHFWEXU FLFOSX F DOE^U[^FF, C EU
QOPLCI JFJHFOBUDN DHCQQOR. #QU FLFOSX R[OHEU MCJOBOQ[OQOJEX, EO LCH\VU RCS [MFLUBQK LU_QBRORCB\
QCSOQBOKBUH\EO.
=D#BB U2)D#6
V*&+6; 1998 7.
Beepeuue
u kpafku osop
# ]BO_ WCQBF K OBRUWCI EC GHCREX_ RO[MOQ: "CWUS JXHO [FQCB\ UTU OLEN
DEFGN O .++? *CHUU R GOHORODMNZFBUH\EOS BUS[U MCQQSCBMFRCIBQK
EUDOBOMXU EUBMFRFCH\EXU ROPSOZEOQBF KPXDC. #QU ]BO LUHCUBQK
FQDHIWFBUH\EO LHK [OLGOBORDF D QHULNITFS GHCRCS, [O]BOSN SCBUMFCH
SOZEO WFBCB\ FHF [MO[NQDCB\ R PCRFQFSOQBF OB BOGO, ECQDOH\DO NRUMUEEO
RX RHCLUUBU BUSF FHF FEXSF BOEDOQBKSF QFEBCDQFQC .++.
.
-acfu
3aer uyua
ee opua kuura o
C++?
5O [OQHULEFS LCEEXS, EC MXEDU [MOLCUBQK [O DMC_EU_ SUMU 2 768 942 DEFGF O .++, EU GOROMK NZU O
RQUROPSOZEXY DNMQCY, OJNWCITFY [MOGMCSSCY, ZNMECHCY F QUSFECMCY Q DODBU_HKSF. ! RQU ZU R ]BOS
FPOJFHFF ECJHILCUBQK NLMNWCITUU OLEOOJMCPFU. 5MOQSCBMFRCB\ [OHDN DEFG O .++ R DEFZEOS
SCGCPFEU EFWNB\ EU FEBUMUQEUU, WUS HFBUMCBNMN [O JNYGCHBUMFF. # QNTEOQBF, RQU DEFGF [UMUQDCPXRCIB
OLEO F BO ZU F OBHFWCIBQK MCPRU WBO [O RUQN F DOHFWUQBRN ^RUBOR R LFCGMCSSCY F BCJHF^CY. 5O SOFS
[OLQWUBCS, 2 768 940 FP EFY [MULECPECWUEX LHK EORFWDOR, OMFUEBFMORCEX EC DOEDMUBEX_ DOS[FHKBOM
FHF [MULQBCRHKIB QOJO_ Q[MCROWEFDF [O QFEBCDQFQN .++. *HK BUY, DBO NZU PECUB KPXD F ZUHCUB
[OLEKB\QK EC QHULNITF_ NMORUE\, QNTUQBRNITCK QFBNC^FK OJOMCWFRCUBQK Q[HOVEXSF
MCPOWCMORCEFKSF F MCQYOLCSF. 1BOJX NPECB\ WBO-BO EOROU, [MFYOLFBQK LUMGCB\ GHCRN OBQILC F MCPLUH
OBBNLC. *HK PECBODC .++ BCDCK BMCBC RMUSUEF EU[OPROHFBUH\EC.
3BC DEFGC QORQUS LMNGOU LUHO. 5MUZLU RQUGO, OEC [MUL[OHCGCUB, WBO RX NZU RHCLUUBU .++. #UMOKBEO,
RX [MOGMCSSFMORCHF EC .++ R BUWUEFU GOLC-LRNY FHF JOHUU. .BCR ECQBOKTFS CQOS, EC RO[MOQ O
LOHZEOQBF RX [UMUQBCHF QDMOSEO OBRUWCB\ 5MOGMCSSFQB; BU[UM\ RCV BFBNH QDHCLXRCUBQK FP QHOR
.BCMVF_, .[U^FCHFQB, #ULNTF_, (CPMCJOBWFD, 5MOUDBFMORTFD (MCQQBCR\BU R ENZEOS
[OMKLDU). #X NZU PECUBU, WBO [UMUGMNPDC O[UMCBOMC EU FSUUB EFDCDOGO OBEOVUEFK D BUHU`OEEO_
DOS[CEFF, C DHCQQ-DOHHUD^FK RORQU EU QJOMFTU `FHCBUHFQBOR. $C RCVU_ [OHDU QBOFB DEFGC
.BMCNQBMN[C Annotated C++ Reference Manual, DOBOMNI R [MO`UQQFOECH\EXY MCPGOROMCY RX WCQBO
QODMCTUEEO FSUENUBU ARM F LCZU EU QWFBCUBU ENZEXS MCQVF`MORXRCB\.
%QHF RX NPECHF QUJK, LOJMO [OZCHORCB\ ]BC DEFGC LHK RCQ. %U SOZEO JXHO JX UTU ECPRCB\ .++:
[NB\ GNMN. .++ R EU_ O[FQXRCUBQK QORQUS EU BCD, DCD R DEFGCY LHK ECWFECITFY. $C ]BOS NMOREU .++
EU QBOH\DO KPXD, QDOH\DO ^UHCK QNJDNH\BNMC QO QROFSF FLFOSCSF, [MFUSCSF F QBCELCMBEXSF
CMYFBUDBNMEXSF MUVUEFKSF, DOBOMXU EU QHULNIB OWURFLEXS OJMCPOS FP `OMSCH\EOGO O[FQCEFK KPXDC.
)J ]BOS KPXDU RENBMF KPXDC MULDO N[OSFECUBQK Q DEFGCY F ZNMECHCY. )LEF [MOGMCSSFQBX
QCSOQBOKBUH\EO OJECMNZFRCIB RQU ]BF ROPSOZEOQBF F Q GOMLOQB\I QWFBCIB, WBO FPOJMUHF EUWBO
[OBMKQCITUU, [ODC EU RXKQEFBQK, WBO EUB EFWUGO EOROGO [OL QOHE^US. *MNGFS RUPUB, F OEF
QBCEORKBQK NWUEFDCSF [OLHFEEXY SCQBUMOR .++ D QOZCHUEFI, BCDFU SCQBUMC RQBMUWCIBQK QHFVDOS
MULDO. # ]BO_ DEFGU K [O[XBCHQK [MOHOZFB\ BMUBF_ [NB\ FQBFEEOGO [MOQRUBHUEFK QCSOQBOKBUH\EOU
FPNWUEFU. 0MOSU BOGO, DEFGC [MULECPECWUEC LHK BUY, DBO NZU LOQBFG PCRUBEO_ ^UHF, EO YOWUB
[OOJTCB\QK, [OJOHBCB\ R LMNZUQDO_ DOS[CEFF F [OVURUHFB\ SOPGCSF ECL OWUMULEO_ GOHOROHOSDO_.
ao C++
.++ KPXD, DOBOMX_ FPNWCUBQK [OQBU[UEEO. 'FV\ [OQHU BOGO, DCD JNLUB QLUHCE [OQHULEF_ VCG,
MCPMOPEUEEXU [MFUSX F `MCGSUEBX QFEBCDQFQC ECWFECIB QDHCLXRCB\QK R OJTNI DCMBFEN. 5O-SOUSN,
FPNWUEFU .++ WUS-BO EC[OSFECUB [OLaUS EC HF`BU. *PXE\! #BOMO_ ]BCZ. .++ ]BO
NQORUMVUEQBRORCEEX_ RCMFCEB ., Q QFH\EO_ BF[FPC^FU_ (DOBOMNI, R[MOWUS, [MF ZUHCEFF SOZEO
OJO_BF) F NLOJEXSF DOSSUEBCMFKSF //. 'IJO_ [MOGMCSSFQB EC ., UQHF OE EU YOWUB [OLCRCB\QK R
SUEULZUMX, LOHZUE LRFGCB\QK LCH\VU C 8\KME .BMCNQBMN[ (,OQ[OLF, JHCGOQHORF UGO) [MFLNSCH LHK
]BOGO OBHFWENI ROPSOZEOQB\.
.
.4
*PXE\! +MUBF_ ]BCZ. .++ YOMOVF_, YOBK F EU [OBMKQCITF_ OJaUDBEO-OMFUEBFMORCEEX_ KPXD
[MOGMCSSFMORCEFK. $U Smalltalk, DOEUWEO, EO WUGO OZFLCB\ OB KPXDC, MCJOBCITUGO Q BCDO_
GOHORODMNZFBUH\EO_ QDOMOQB\I? .++ ]BO Cobol 90-Y, [OHFBFWUQDF RXLUMZCEEX_ KPXD, DOBOMXU
GCMCEBFMNUB `FECEQFMORCEFU RCVUGO [MOUDBC RXQVFS MNDOROLQBROS. - NZ UQHF .++ LOQBCBOWEO WCQBO
N[OSFECUBQK R [HCEU, SOZEO ECLUKB\QK EC NLROUEFU JILZUBC. 3BO BOZU YOMOVO, [OBOSN WBO EFDBO
BOHDOS EU NSUUB O^UEFRCB\ [MOUDBX EC .++ F N[MCRHKB\ FSF. - WBO DCQCUBQK FEQBMNSUEBCMFK GHCPC
MCPJUGCIBQK, EU [MCRLC HF?
*PXE\! 5OQHULEF_ ]BCZ, RQU RXYOLKB. $O [OPROH\BU, GLU ZU RQU? 'F`B [OWBF [NQB. .++ ]BO EC
QCSOS LUHU EU QBOH\DO KPXD, QDOH\DO FEQBMNSUEB LHK QOPLCEFK RCVFY QOJQBRUEEXY KPXDOR. %GO
]HUGCEBEOQB\ PCDHIWCUBQK OBEIL\ EU R [MOQBOBU (QHORC !++ F >6%."%"+ MUZNB QHNY QROFS KREXS
[MOBFROMUWFUS), C R UGO [OBUE^FCH\EXY ROPSOZEOQBKY. "C DCZLO_ NMOLHFRO_ [MOJHUSO_ [MKWUBQK
DCDCK-EFJNL\ NSECK FLFOSC, FPKTEX_ KPXDORO_ `FEB, JHCGOLCMK DOBOMOSN [MOJHUSC BCUB [MKSO EC
GHCPCY. 5MOJHUSC MUVCUBQK BCD ZU ]HUGCEBEO, DCD ]BO QLUHCH JX *+."%4L(3 KPXD BF[C Smalltalk FHF
Lisp, EO [MF ]BOS RCV [MO^UQQOM EU LXSFBQK OB EC[MKZUEFK, C EC 4OHH-.BMFB EU MCQBNB CD^FF
[MOFPROLFBUHU_ WF[OR [CSKBF. .++ ROOJTU EU KPXD. 3BO SFMOROPPMUEFU FHF ECMDOBFD, SUEKITF_
Q[OQOJ SXVHUEFK.
$O RUMEUSQK D QHORN ]HUGCEBEX_. # [MOGMCSSFMORCEFF EC .++ LU_QBRNUB [UMU`MCPFMORCEEX_
[MFE^F[ *CO: 1BOJX LOQBFW\ FQBFEEO_ ]HUGCEBEOQBF, ENZEO OBDCPCB\QK OB QBMUSHUEFK D
]HUGCEBEOQBF. .++ RO SEOGOS [MULQBCRHKUB QOJO_ . QHULNITUGO [ODOHUEFK. $C[FQCEEXU EC EUS
[MOGMCSSX ]``UDBFREO DOS[FHFMNIBQK F JXQBMO MCJOBCIB. )E OJHCLCUB OWUE\ BMCLF^FOEEO_ JHOWEO_
QBMNDBNMO_ F QODMCTUEEO_ PC[FQ\I LHK SEOGFY MCQ[MOQBMCEUEEXY O[UMC^F_ (EC[MFSUM, i++). # EUS
UQB\ QROF QNTUQBRFBUH\EXU, GHCGOHX, [MFHCGCBUH\EXU F QRO_ ZCMGOE:
cout << 17 << endl << flush;
(UREFBUHF WCQBOBX KPXDC WCQBO EC[CLCIB EC .++. )EF [OHCGCIB, WBO RXQVUU LOQBFZUEFU QORMUSUEEO_
^FRFHFPC^FF KPXD, [OQBMOUEEX_ FQDHIWFBUH\EO FP CBOSOR F QDOJOD. 5O SEUEFI ]BFY BUMMOMFQBOR
OB QFEBCDQFQC, UQHF [MOQBNI [UMUSUEENI Q [UMROGO RPGHKLC EUROPSOZEO OBHFWFB\ OB RXPORC `NED^FF
FHF SCDMOQC ]BO ROOJTU EU KPXD, C VCMHCBCEQBRO LHK MCPRHUWUEFK [MCPLEO_ BOH[X. 0 QOZCHUEFI,
BUOMFK MCQYOLFBQK Q [MCDBFDO_. # MUCH\EO_ ZFPEF BOH[C [HCBFB HFV\ PC BO, WBOJX RFLUB\ KPXDF, R
DOBOMXY MCPEXU FLUF &'724)4" [O-MCPEOSN. 5MOQBXU F [OQHULORCBUH\EXU KPXDF EFDOGLC EU
[OH\PORCHFQ\ OQOJXS NQ[UYOS PC QBUEDCSF CDCLUSF_, C KPXDF Q JHOWEO_ QBMNDBNMO_ ORHCLUHF SCQQCSF.
.BOFB HF ]BOSN NLFRHKB\QK? #UL\ DOS[\IBUMEXU KPXDF [MFYOLFBQK FPNWCB\ F PC[OSFECB\, C LHK ]BOGO
FQ[OH\PNUBQK BO ZU QUMOU RUTUQBRO, Q [OSOT\I DOBOMOGO SX FPNWCUS F PC[OSFECUS UQBUQBRUEEXU
KPXDF. 5O[MOJN_BU-DC ECPRCB\ YOBK JX OLFE UQBUQBRUEEX_ KPXD JUP QNTUQBRFBUH\EXY, GHCGOHOR F
QDOJOD! & JX EU MFQDENH. #QU ECVF [OPECEFK R HFEGRFQBFDU GOROMKB O BOS, WBO ]BF [HOYFU
OQOJUEEOQBF BOH\DO NQDOMKIB FPNWUEFU DOS[\IBUMEOGO KPXDC F LUHCIB UGO JOHUU [OEKBEXS. i++ RO
RQUY OBEOVUEFKY )#3."&("#2;*% [OEKBEUU, WUS i:=i+1, C x=17+29 WFBCUBQK HNWVU, EUZUHF (setq
x(+17, 29)). (UW\ FLUB EU O QBMOUEFF DOS[\IBUMEOGO KPXDC, C QDOMUU O *+@#, .%/."&#**%,
QBMOUEFF. #QU NMOLQBRC .++ ]BO R OQEOREOS ECVF NMOLQBRC. 0OGLC RX ECNWFBUQ\ [OEFSCB\ F HIJFB\
UGO QBMCEEOQBF, DOGLC [UMUQBCEUBU JUQ[ODOFB\QK O SCBUSCBFWUQDO_ QBMO_EOQBF, JNLUB QLUHCE RCV
[UMRX_ VCG D LOQBFZUEFI ]HUGCEBEOQBF R .++.
.++ ECMKLN Q Lisp, Smalltalk F LMNGFSF LFECSFWUQDFSF KPXDCSF (R OBHFWFU OB .) OJHCLCUB QMULQBRCSF
LHK EFPDONMOREURXY SCEF[NHK^F_ Q DOS[\IBUMOS. #X SOZUBU QOPLCB\ QRO_ QOJQBRUEEX_ BF[ LCEEXY F
[OLQNENB\ UGO DOS[FHKBOMN BCD, WBOJX OE [MFEKH ]BOB BF[ PC RQBMOUEEX_. #X SOZUBU N[MCRHKB\
RXPORCSF QROFY `NED^F_, OJMCTUEFKSF D [UMUSUEEXS DHCQQOR, RXLUHUEFUS F OQROJOZLUEFUS [CSKBF,
FEF^FCHFPC^FU_ F NLCHUEFUS OJaUDBOR F RQU ]BO (R OQEOREOS) [MOFQYOLFB JUP [OBUMF
]``UDBFREOQBF FHF JUPO[CQEOQBF BF[OR. $O R OBHFWFU OB LMNGFY KPXDOR, UQHF ]BC QFHC JNLUB [MFSUEUEC
EU[MCRFH\EO, [MOGMCSSC EC .++ GMOYEUBQK. - UQHF NQBOFB [MOGMCSSC, GMOYENBQK RCVF DOHHUGF-
[MOGMCSSFQBX UQHF RX EU [MFLNSCUBU, DCD [OKQEFB\ QROF ECSUMUEFK F FQ[OH\PORCB\ [MCRFH\ENI
FLFOSN LHK OQOJUEEO QHOZEXY SOSUEBOR. 0CD FPRUQBEO, *ULCH QO QROFS QXEOS !DCMOS JUZCH F
PCBOWUEFK EC 0MFBU Q [OSOT\I DMXH\UR, QLUHCEEXY FP [UM\UR F ROQDC. *ULCH, GHCREX_ CMYFBUDBOM F
FPOJMUBCBUH\, Q[ODO_EO [OMYCH GLU-BO REFPN. %GO JUPMCQQNLEX_ QXE [OLEKHQK QHFVDOS RXQODO D
QOHE^N F N[CH R SOMU. >SSS $UB, [OZCHN_, CECHOGFK [OHNWFHCQ\ EUNLCWECK. #UL\ FSUEEO *ULCH
[OQBMOFH 'CJFMFEB BCDO_ QHOZEX_, WBO R [O[XBDCY RXJMCB\QK FP EUGO HILF HFJO NSFMCHF, HFJO
[O[CLCHF EC OJUL D 6FEOBCRMN. 6OZUB, [O[MOJNUS JOHUU QORMUSUEENI CECHOGFI? !Q[OH\PNK
.5
EFPDONMOREURXU ROPSOZEOQBF .++, RX LU_QBRNUBU, DCD QNMORX_ LUBUDBFR Q UGO QCDMCSUEBCH\EO_
`MCPO_: *ORUM\QK SEU K PECI, WBO LUHCI. 0OS[FHKBOM PCDCBXRCUB GHCPC F JUPSOHREO [OLWFEKUBQK.
.++ FEBMFGNUB QROFSF KREXSF [MOBFROMUWFKSF. %GO GFJDOQB\ HUGDO [MURMCTCUBQK R GHCREX_ FQBOWEFD
OVFJOD. "C ROPSOZEOQBF UGO MCQVFMUEFK EU [MFYOLFBQK MCQ[HCWFRCB\QK QDOMOQB\I FHF OJaUSOS DOLC.
)E ]HUGCEBUE R OLEFY MNDCY F O[CQUE R LMNGFY, [MOQB F QHOZUE OLEORMUSUEEO. 5OQHU EUQDOH\DFY HUB
MCJOBX RX BCD F EU SOZUBU MUVFB\, ROQYFTCB\QK FS FHF [MODHFECB\. *C, ECQBOKTF_ PECBOD [OEFSCUB
RQU DOE^U[^FF, HUZCTFU R OQEORU KPXDC F QDHOEKITFU WCVN RUQOR R UGO [OH\PN. 3BF DOE^U[^FF EU
RFLEX Q [UMROGO RPGHKLC; WBOJX [OEKB\ FY, EUOJYOLFSO R BUWUEFU EUQDOH\DFY HUB [XBCB\QK MUVCB\
QORUMVUEEO MCPEXU PCLCWF. $UDOBOMXU CMYFBUDBNMEXU [CMCLFGSX HNWVU RQUGO QOOBRUBQBRNIB
DOEDMUBEXS KPXDORXS MUVUEFKS. !Y EU[MCRFH\EOU QOWUBCEFU OJUMEUBQK YCOQOS, C [MCRFH\EOU
]HUGCEBEOQB\I.
Tpu eenukue upeu C++
) EUBMFRFCH\EOS FQ[OH\PORCEFF C++ EC[FQCEO BCD SEOGO, WBO K LCZU EU PECI, Q WUGO ECWCB\. #CS
DOGLC-EFJNL\ [MFYOLFHOQ\ RFLUB\ QBUMUOGMCSSX? . [UMROGO RPGHKLC OEF [OYOZF EC QHNWC_EX_ NPOM, EO
[OQHU SULHUEEOGO F REFSCBUH\EOGO MCPGHKLXRCEFK EC EFY [MOKRHKUBQK QHOE, Q[FMCH\ FHF WBO-EFJNL\
UTU. 1BOJX NRFLUB\ QSXQH R BOWDCY F [KBECY, ENZEO MCQQSCBMFRCB\ FY R DOEBUDQBU OJaULFEKITU_
BUSX. !SUEEO PLUQ\ DMOUBQK OLEO FP QCSXY JOH\VFY MCPOWCMORCEF_ [MF FPNWUEFF CMYFBUDBNMX F FLFOS
C++. .ECWCHC DCZUBQK, WBO [UMUL RCSF OGMOSECK DNWC MCPMOPEUEEXY [MFUSOR F EF OLEOGO [MCRFHC
BOGO, DCD FSF [OH\PORCB\QK. 3BC DEFGC ECNWFB RCQ RFLUB\ QHOEC. .NTUQBRNUB SEOZUQBRO
DHCQQF`FDC^F_ EUBMFRFCH\EXY CQ[UDBOR C++, EO K MCPLUHFH FY EC EUQDOH\DO [MOQBXY BUS:
0OQRUEEXU OJMCTUEFK.
,OSOSOM`EXU FUMCMYFF DHCQQOR.
5MOQBMCEQBRC [CSKBF.
# OQEORU DCZLO_ BUSX HUZFB DOEDMUBEX_ QFEBCDQFQ F QMULQBRC C++, F FY QORSUQBEOU [MFSUEUEFU
[OPROHKUB MUVCB\ QCSXU MCPEXU PCLCWF. .NTUQBRNUB SEOGO LMNGFY [MFUSOR F [MFE^F[OR, DOBOMXU BOZU
QBOFHO JX RDHIWFB\ R ]BN DEFGN, EO ]BF BMF DCBUGOMFF [OSOGCIB OMGCEFPORCB\ OWUE\ JOH\VOU
DOHFWUQBRO BUS R HOGFWUQDF QBMO_ENI QBMNDBNMN.
# [UMRO_ WCQBF [MFRULUE OJPOM SEOGFY RCZEXY CBBMCD^FOEOR QFEBCDQFWUQDOGO ^FMDC C++. $C[MFSUM,
SEOGFU [MOGMCSSFQBX C++ EU FSUIB JOH\VOGO O[XBC MCJOBX Q [UMUGMNZUEEXSF O[UMCBOMCSF F HFV\
BUOMUBFWUQDF PECIB, DCD OEF [MFSUEKIBQK. )DCPXRCUBQK, JOH\VFEQBRO [MOGMCSSFQBOR EFDOGLC EU
FQ[OH\PNUB VCJHOEX FHF OJMCJOBDN FQDHIWUEF_ F HFV\ EUSEOGFU NSUIB [OH\PORCB\QK [OBODCSF
RROLC/RXROLC PC MCSDCSF [MOQBU_VFY OJMCTUEF_ D OJaUDBCS cout F cin. # WCQBF / QBCMCIQ\
RXMOREKB\ NMOREF [OLGOBORDF WFBCBUHU_, PC[OHEFB\ [MOJUHX R RCVFY PECEFKY C++ F [OLGOBORFB\QK D
FGMU. 1CQB\ / SOZEO WFBCB\ OB DOMDF LO, JUGHO [MOQSCBMFRCB\ FHF [MO[NQDCB\ ^UHXU MCPLUHX R
PCRFQFSOQBF OB BOGO, ECQDOH\DO YOMOVO RX PECDOSX Q EICEQCSF C++.
+UMSFE $%.&#**%# %/6+L#*(# (indirection) OBEOQFBQK D MCPEXS DOEDMUBEXS BUSCS, OLECDO RUPLU
FQ[OH\PNUBQK OLEC F BC ZU DOE^U[^FK: DHFUEBQDF_ OJaUDB OJMCTCUBQK Q PC[MOQOS D LMNGOSN OJaUDBN,
DOBOMX_, R QROI OWUMUL\, [OMNWCUB MCJOBN BMUB\USN OJaUDBN. 0OQRUEEOQB\ QRKPCEC QO QMULEFS OJaUDBOS
R ^U[OWDU. !EOGLC GOLFBQK QHXVCB\, WBO ]BO O[MULUHUEFU [OWBF QOR[CLCUB Q O[MULUHUEFUS
)#2#7(6%&+*(4 (delegation), OLEOGO FP DMCUNGOH\EXY DCSEU_ OJaUDBEO-OMFUEBFMORCEEOGO
[MOGMCSSFMORCEFK. +US EU SUEUU, R C++ FLFOSX, FQ[OH\PNUSXU Q ]BO_ DOE^U[^FU_, F UU KPXDORCK
[OLLUMZDC RXYOLKB LCHUDO PC MCSDF BOGO, WBO QWFBCUBQK LUHUGFMORCEFUS R LMNGFY KPXDCY. # ]BO_ DEFGU
WCQBO FQ[OH\PNUBQK BUMSFE 8$+9+"#2; (pointer); RX RQBMUBFBU UGO R DCZLO_ GHCRU. 4DCPCBUHF C++
Q[OQOJEX EC SEOGOU. )EF SOGNB O[MULUHFB\, GLU R [CSKBF, EC LFQDU FHF R QUBF ECYOLFBQK OJaUDB, EC
DOBOMX_ OEF QQXHCIBQK; DOGLC OE NEFWBOZCUBQK; FPSUEKUBQK HF OE FHF LOQBN[UE BOH\DO LHK WBUEFK; F
LCZU BO, QNTUQBRNUB HF OJaUDB FHF [MOQBO [MULQBCRHKUB QOJO_ EUDNI OJHCQB\ R CJQBMCDBEOS
[MOQBMCEQBRU [CSKBF F RQU ]BO [MOFQYOLFB JUP CDBFREOGO NWCQBFK QCSOGO OJaUDBC, DOBOMX_ SOZUB
EFWUGO EU PECB\ OJ ]BFY EFPDONMOREURXY O[UMC^FKY. #OPSOZEOQBF, WBO F GOROMFB\, R[UWCBHKITFU,
OLECDO OEF OQEORCEX EC EUQDOH\DFY OWUE\ [MOQBXY FLFOSCY.
) [MOUDBFMORCEFF FUMCMYFF DHCQQOR GOROMFHF RQU DOSN EU HUE\ OLEF [O LUHN, LMNGFU JOHBCHF OJ
FSFBC^FF OJaUDBOR MUCH\EOGO SFMC. 8OH\VFEQBRO CMGNSUEBOR R MCREO_ QBU[UEF OBEOQFBQK D HIJOSN
OJaUDBEO-OMFUEBFMORCEEOSN KPXDN, F K RORQU EU ECSUMUE PCYHCSHKB\ DEFGN [O C++ QROFSF HFWEXSF
.6
RPGHKLCSF EC OJaUDBEO-OMFUEBFMORCEEX_ LFPC_E. +US EU SUEUU, OLFE DOEDMUBEX_ BF[ ECQHULORCEFK
7%,%,%6B*%# *+.2#)%&+*(# (homomorphic derivation) ODCPXRCUBQK FQDHIWFBUH\EO [OHUPEXS R
QOWUBCEFF QO Q[U^F`FWUQDFSF QMULQBRCSF C++. # GOSOSOM`EO_ FUMCMYFF RQU [MOFPROLEXU DHCQQX
[OHNWCIB QRO_ OBDMXBX_ FEBUM`U_Q OB EUDOBOMOGO JCPOROGO DHCQQC-[MULDC. 0CD [MCRFHO, SCB\ RQUY
JCPORXY DHCQQOR LURQBRUEEO WFQBC OEC EU QOLUMZFB EF OLEO_ [UMUSUEEO_, C RQU UU `NED^FF
KRHKIBQK WFQBO RFMBNCH\EXSF. # C++ Q ]BO_ DOE^U[^FU_ CQQO^FFMNIBQK SEOGFU [OHUPEXU FLFOSX
[MOUDBFMORCEFK F [MOGMCSSFMORCEFK.
"C DOE^U[^FU_ >6%."6+*."&+ >+,4"( (memory space) DMOUBQK EUWBO JOH\VUU, WUS OJXWEOU N[MCRHUEFU
[CSKB\I. 5UMUGMNZCK R C++ O[UMCBOMX new F delete, RX O[MULUHKUBU, GLU QOPLCIBQK OJaUDBX F DCD
OEF NEFWBOZCIBQK. 0MOSU BOGO, SOZEO QOPLCRCB\ CJQBMCDBEXU DOHHUD^FF, R DOBOMXY EU RQUGLC [OEKBEO,
Q WUS RX FSUUBU LUHO Q ECQBOKTFS OJaUDBOS FHF Q CJQBMCD^FU_. $C GOMFPOEBU NZU RFLEX DOEBNMX
EORXY MCQ[MULUHUEEXY OJaUDBEO-OMFUEBFMORCEEXY QBMNDBNM, MCPMCJOBCEEXY BCDFSF `FMSCSF, DCD
Microsoft, Apple F Taligent. 5MCRLC, RCS [MFLUBQK [UMUQSOBMUB\ EUDOBOMXU JCPORXU [MULQBCRHUEFK O
BOS, GLU ECYOLKBQK OJaUDBX F DCD OEF [UMUSUTCIBQK R LMNGOU SUQBO RQU ]BF BUSX K RXLUHFH R
DCBUGOMFI [MOQBMCEQBR [CSKBF. 5MOQBMCEQBRC [CSKBF [OPROHKIB O[MULUHFB\ BF[ OJaUDBC RO RMUSK
RX[OHEUEFK [MOGMCSSX ROPSOZEOQB\, DOBOMO_ LO OJFLEOGO EU YRCBCUB R C++. 0OEUWEO, SX
[OGOROMFS F OJ N[MCRHUEFF [CSKB\I, EO ]BFS LUHO EU OGMCEFWFBQK.
Kak ufafu sfy kuury
5UMUL RCSF EU MNDOROLQBRO Q GOBORXSF MU^U[BCSF LHK DOEDMUBEXY QFBNC^F_. .DOMUU ]BO QJOMEFD
BROMWUQDFY FLU_ F GOHOROHOSOD. %QHF D DOE^N DEFGF RX [OWNRQBRNUBU, WBO RCV CMQUECH [MFUSOR
[MOGMCSSFMORCEFK EC C++ MCQVFMFHQK, PECWFB, K LOQBFG QROU_ ^UHF, C NWFB\ RCQ, DOGLC F DCD
[OH\PORCB\QK ]BFSF [MFUSCSF, K EU QBCEN.
6CBUMFCH DCZLO_ OBLUH\EO_ GHCRX EUROPSOZEO & >%2*%3 ,#6# [OEKB\ JUP [MULRCMFBUH\EOGO PECDOSQBRC
QO RQUSF OQBCH\EXSF GHCRCSF. ! RQU ZU K [MFHOZFH SCDQFSNS NQFHF_, WBOJX SCBUMFCH HIJO_ GHCRX
JXH [OHUPUE EUSULHUEEO [OQHU PECDOSQBRC Q EU_ F WBOJX GHCRX HOGFWUQDF QHULORCHF LMNG PC LMNGOS, C
ECV ROOJMCZCUSX_ QHOE RXMFQORXRCHQK [OQBU[UEEO JFREF, NVF, YOJOB F B. L. 5OQHU [MOWBUEFK
DEFGC SOZUB [MFGOLFB\QK R DCWUQBRU Q[MCROWEFDC WBO-BO RMOLU HFWEO_ F OWUE\ DMCBDO_
]E^FDHO[ULFF [MFUSOR [MOGMCSSFMORCEFK F FLFOS C++.
"C SEOGFU GOLX FPNWUEFK F FQ[OH\PORCEFK C++ K NPECH, WBO LCZU N O[XBEXY [MOGMCSSFQBOR R
[OPECEFKY RQBMUWCIBQK [MOJUHX; R OQBCRVUSQK SCBUMFCHU WCQBF K [OQBCMCIQ\ RXMOREKB\ NMORUE\
[OLGOBORDF RQUY WFBCBUHU_. 3BO EU RQBN[FBUH\EOU O[FQCEFU KPXDC, C QDOMUU DMCBDCK QROLDC BUS,
DOBOMXU JNLNB FQ[OH\PORCEX R [OQHULNITFY GHCRCY. # GHCRU 2 SX QBMUSFBUH\EO [MOJUZFSQK [O
EUDOBOMXS OQOJUEEOQBKS KPXDC. ,HCRC 3 [OQRKTUEC VCJHOECS [OQBU[UEEO ]BC BUSC QBCEORFBQK RQU
JOHUU RCZEO_, [OQDOH\DN VCJHOEX [OLLUMZFRCIBQK RO RQU JOH\VUS WFQHU DOS[FHKBOMOR. # GHCRU 4
MCQQSCBMFRCUBQK OJMCJOBDC FQDHIWUEF_ EC OQEORU MUDOSUELORCEEOGO QBCELCMBC ANSI F [MFROLFBQK
[CMC PCSUWCEF_ O EUQBCELCMBEXY FQDHIWUEFKY, RQBMUWCITFYQK R MUCH\EOS SFMU.
1CQB\ 2 [OQRKTUEC MCPEXS BF[CS NDCPCBUHU_ OB GHN[XY LO GUEFCH\EXY. $C ]BOS `NELCSUEBU
[OQBMOUEC RQK DEFGC, F K NRUMUE, WBO ]BF QRULUEFK JNLNB [OHUPEX HIJOSN WFBCBUHI.
# WCQBF 3 MCQQSCBMFRCIBQK QBMNDBNMC F MUCHFPC^FK BF[OR F FUMCMYF_ DHCQQOR R C++. )QEOREOU
REFSCEFU NLUHUEO OLEOSN FP WCQBEXY QHNWCUR GOSOSOM`EXS FUMCMYFKS DHCQQOR. "COLEO SX
[OGOROMFS OJ OJaUDBCY DHCQQOR, [MULQBCRFBUHKY F LMNGFY HIJO[XBEXY BUSCY. 8OH\VFEQBRN WFBCBUHU_
QBOFB [MOWFBCB\ BMUB\I WCQB\ OB ECWCHC LO DOE^C, EO EFDBO EU PC[MUTCUB RCS [MOQSOBMUB\ UU F
OBOJMCB\ BUSX [O QROUSN RDNQN. ! YOBK RX JNLUBU [OHCGCB\, WBO PECUBU OJ NDCPCBUHKY RQU EC QRUBU, OEF
QORUMVUEEO EUOZFLCEEO QEORC ROPEFDENB R DOEBUDQBU GOSOSOM`EXY FUMCMYF_.
# WCQBF 4 ECQ [OLZFLCUB QCSCK NZCQECK BUSC C++ N[MCRHUEFU [CSKB\I. 4MORUE\ FPHOZUEFK
SUEKUBQK OB [MFSFBFREOGO LO EOMSCH\EOGO F QRUMYQHOZEOGO, EO OQEOREOU REFSCEFU NLUHKUBQK BUS
[MOJHUSCS, DOBOMXU SOGNB ROPEFDENB\ [MF [MOGMCSSFMORCEFF EC C++, F FY ROPSOZEXS MUVUEFKS EC
JCPU MCPEXY KPXDORXY QMULQBR. 'FWEO K QWFBCI, WBO ECWCH\EXU GHCRX ]BO_ WCQBF CJQOHIBEO
EUOJYOLFSX LHK QWCQBHFRO_ F [OHEO^UEEO_ ZFPEF R C++, EO UQHF RCQ, LO[NQBFS, QORUMVUEEO EU
FEBUMUQNUB [MO^UQQ QJOMDF SNQOMC OQBCR\BU [OQHULEII [CMN GHCR F PC_SFBUQ\ WUS-EFJNL\ JOHUU
[OHUPEXS LHK OJTUQBRC.
.7
Heckonuko cnoe o cfune nporparrupoeauun
#OB ]BF EUQDOH\DO QHOR: QBFH\ [MOGMCSSFMORCEFK SUEK EU ROHENUB. & LOQBCBOWEO DMCBOD? %QHF YOBK JX
[OHORFEC RMUSUEF, FPMCQYOLORCEEOGO EC [MCRFH\ENI MCQQBCEORDN `FGNMEXY QDOJOD, BMCBFHCQ\ EC
OJLNSXRCEFU [MOGMCSSX FHF UTU HNWVU EC OJTUEFU Q [OH\PORCBUHKSF, BO RQK OBMCQH\ MCJOBCHC JX
ECSEOGO ]``UDBFREUU. 0OEUWEO, ULFEQBRO QBFHK RUT\ YOMOVCK, EO K UTU EU RFLUH DEFGF FHF
MNDOROLQBRC [O QBFHI, DOBOMXU JX QBOFHF LCZU WCQOROGO QOJMCEFK GMN[[X R ECWCHU [MOUDBC. 0 BOSN ZU
EF OLEC DEFGC FHF MNDOROLQBRO [O QBFHI EU [MURMCBKB DOL EUCDDNMCBEOGO [MOGMCSSFQBC R EUWBO
OQSXQHUEEOU. # QNTEOQBF, QBFH\ WCQBO FQ[OH\PNUBQK DCD O[MCRLCEFU EULOQBCBDC REFSCEFK D QCSO_
[MOGMCSSU. $CDOEU^, K UTU EU RFLUH, WBOJX R Q[OMCY O QBFHU OLFE [MOGMCSSFQB R WUS-BO NJULFH
LMNGOGO, [O]BOSN HIJXU LFQDNQQFF EC ]BN BUSN QWFBCI JUQ[OHUPEO_ BMCBO_ RMUSUEF.
4 SUEK UQB\ QROF QOJQBRUEEXU [MFE^F[X F QRO_ QBFH\, EO R OQEOREOS K QOJFMCIQ\ OBDCPCB\QK OB QROUGO
[NBF F [OEUSEOGN [OH\PORCB\QK RQUSF QBFHKSF, Q DOBOMXSF SEU [MFYOLFHOQ\ RQBMUWCB\QK. 0EFGC
[OQRKTUEC KPXDORXS FLFOSCS, C EU MCQ[OHOZUEFI `FGNMEXY QDOJOD FHF MUGFQBMN QFSROHOR. $CLUIQ\,
SOU MUVUEFU JNLUB MCPLMCZCB\ RQUY WFBCBUHU_ R MCREO_ SUMU.
& BCDZU RUQ\SC ROH\EO OJOVUHQK Q [OLQBCRHKUSXSF (inline) `NED^FKSF DHCQQOR, OQOJUEEO Q
RFMBNCH\EXSF. # DCEOEFWUQDOS RCMFCEBU [OLQBCRHKUSXU `NED^FF LOHZEX RXGHKLUB\ QHULNITFS
OJMCPOS:
class Foo {
public:
void MemberFn();
};
inline void Foo::MemberFn()
{
...
}
# SOU_ DEFGU ]BOB `MCGSUEB JNLUB RXGHKLUB\ FECWU:
class Foo {
public:
void MemberFnO {...};
};
& O`OMSHKH DCD [OLQBCRHKUSXU LCZU RFMBNCH\EXU `NED^FF DHCQQOR, YOBK OLEF DOS[FHKBOMX
OBRUMGCIB BCDO_ QFEBCDQFQ, C LMNGFU OJMCJCBXRCIB UGO EU[MCRFH\EO. *UHCHOQ\ ]BO LHK ]DOEOSFF SUQBC.
%QHF JX BUDQBX RQUY [OLQBCRHKUSXY `NED^F_ [MFROLFHFQ\ OBLUH\EO, DEFGC PCSUBEO RXMOQHC JX R
MCPSUMCY, C MCPMXRX QBMCEF^ WCTU [MFYOLFHFQ\ EC QUMULFEN HFQBFEGC. +CD WBO EU OBEOQFBUQ\ D
[OLQBCRHKUSXS `NED^FKS QHFVDOS QUM\UPEO.
.CLFBUQ\ R HIJFSOU DMUQHO, PCROLFBU YOMOVNI SNPXDN, QBCR\BU [OL MNDN WCVDN WCK F [O[XBC_BUQ\
[OHNWFB\ NLOROH\QBRFU!
Cuufakcuc C++
"C GOLX [MU[OLCRCEFK C++ K NPECH, WBO [OLCRHKITUU JOH\VFEQBRO [MOGMCSSFQBOR C++ (RDHIWCK
QCSXY O[XBEXY) MULDO [OH\PNUBQK EUDOBOMXSF ROPSOZEOQBKSF KPXDC. 0OEUWEO, LUHO ]BO QNGNJO
FELFRFLNCH\EOU, EO [MF RQU_ QHOZEOQBF F GHNJFEU C++ EUJOH\VO_ OJPOM EU [ORMULFB EFDOSN. # ]BO_ F
LRNY QHULNITFY GHCRCY K [OQBCMCIQ\ RXMOREKB\ NMORUE\ [OLGOBORDF WFBCBUHU_ [UMUL BUS, DCD [U-
MUYOLFB\ D LU_QBRFBUH\EO FEBUMUQEXS BUSCS. 3BC GHCRC EU PCSUEFB Annotated Reference Manual FHF
LMNGOU Q[MCROWEOU MNDOROLQBRO RX EU EC_LUBU R EU_ [OHEO_ Q[U^F`FDC^FF KPXDC. & HFV\
MCQQSOBMI EUDOBOMXU KPXDORXU QMULQBRC, DOBOMXU WCQBO [OEFSCIBQK EURUMEO FHF EU [OEFSCIBQK
RORQU. 5MFLUMZFBU VHK[N F [MFGOBOR\BUQ\ D QBMUSFBUH\EOSN OJHUBN QFEBCDQFQC C++!
Repereuuue u koucfaufu
8OHBOREI O BOS, WBO BCDOU [UMUSUEEXU F LHK WUGO OEF ENZEX, [MO[NQDCUS. $CVUGO REFSCEFK
PCQHNZFRCIB LRU BUSX: DOEQBCEBEOQB\ F QMCREUEFU LFECSFWUQDFY OJaUDBOR QO QBUDORXSF.
const
0HIWUROU QHORO const, DOBOMOU R MCPEXY DOEBUDQBCY [MFEFSCUB MCPEXU PECWUEFK, OLEO FP QCSXY
FE`OMSCBFREXY R C++. *C, SUZLN ]BFSF PECWUEFKSF UQB\ DOU-WBO OJTUU, EO RCS RQU MCREO [MFLUBQK
PC[OSEFB\ RQU DOEDMUBEXU QHNWCF.
Koucfaufuue nepereuuue
%QHF [UMUSUEECK OJaKRHUEC Q DHIWURXS QHOROS const, PECWFB, OEC EU LOHZEC SUEKB\QK. 5OQHU
O[MULUHUEFK DOEQBCEBEO_ [UMUSUEEO_ RX NZU EU QSOZUBU FPSUEFB\ UU PECWUEFU FHF [UMULCB\ UU R
DCWUQBRU CMGNSUEBC `NED^FF, DOBOMCK EU GCMCEBFMNUB UU EUFPSUEEOQBF. (CQQSOBMFS [MOQBO_ [MFSUM Q
DOEQBCEBEO_ ^UHO_ [UMUSUEEO_.
const int j = 17; // !"#$% &'()*$(*$
j = 29; // +"#,-%, -($."(/" (" 0'#1(' 2"(%*,)%
const int i; // +"#,-%, '*)3*)*43"* ($.$#,('" -($."(/"
+MUB\K QBMODC EURUMEC, [OQDOH\DN R EU_ DOS[FHKBOMN [MULHCGCUBQK O[MULUHFB\ QHNWC_ENI [UMUSUEENI,
DOBOMNI EFDOGLC EU NLCQBQK FPSUEFB\, ]BCDF_ QBMCEEX_ GUEUMCBOM QHNWC_EXY ^UHXY DOEQBCEB.
#OOJTU GOROMK, RX QOOJTCUBU DOS[FHKBOMN, DCDO_ DOEQBMNDBOM OE LOHZUE FQ[OH\PORCB\ R DOEDMUBEOS
QHNWCU. %QHF JX [UMUSUEECK i OBEOQFHCQ\ D EUBMFRFCH\EOSN DHCQQN, BO [MF OJaKRHUEFF DOEQBCEBEOGO
]DPUS[HKMC [MFVHOQ\ JX KREO NDCPCB\ DOEQBMNDBOM F UGO CMGNSUEBX. int RXMOZLUEEX_ QHNWC_,
[OQDOH\DN EC QCSOS LUHU const int j=17; BO ZU, WBO F int j(17).
$O ROB DOS[FHKBOM NPECH, WBO EUWBO LOHZEO JXB\ DOEQBCEBEXS. )E [MOQX[CUBQK F ECWFECUB FQDCB\
OVFJDF EU BOH\DO `CDBFWUQDFU, EO F [OBUE^FCH\EXU. 0OS[FHKBOM EU MCPMUVFB FQ[OH\PORCB\ RCVU
DOEQBCEBEOU EUWBO R HIJOS EUDOEQBCEBEOS DOEBUDQBU, LCZU UQHF VUQBFHUBEF_ MUJUEOD MCPJUMUBQK R
[MOGMCSSU F LODCZUB, WBO R EU_ EUB EF OLEO_ OVFJDF.
const i = 17;
int& j = 1; // +"#,-%, 5'*'23 .*' 5'-0("" j 2'1"* /-2"(/*,)%
2
20
$U RCZEO, JNLUBU HF RX FPSUEKB\ RUHFWFEN, EC DOBOMNI QQXHCUBQK j. 0OS[FHKBOM [MUL[OHCGCUB, WBO
RCS 9+?%-#".4 ]BO QLUHCB\, F EC RQKDF_ QHNWC_ NQBMCEKUB FQDNVUEFU. !ECWU GOROMK, DOEQBCEBEOQB\
QRO_QBRO [UMUSUEEO_, C EU LCEEXY, [O]BOSN EUDOEQBCEBECK [UMUSUEECK EU SOZUB QQXHCB\QK EC
DOEQBCEBENI RUHFWFEN.
const u #define
*RU QHULNITFU QBMODF *# ]DRFRCHUEBEX:
const int i = 17;
#define i 17;
# [UMRO_ QBMODU O[MULUHKUBQK [UMUSUEECK, PCEFSCITCK EUDOBOMNI OJHCQB\ [CSKBF, C RO RBOMO_
SCDMOQ. )JXWEO OBHFWFK EUQNTUQBRUEEX, UQHF EU QWFBCB\ OLEOGO-LRNY HFVEFY BCDBOR, PCBMCWUEEXY EC
DCZLOU OJMCTUEFU D DOEQBCEBEO_ [UMUSUEEO_. )LECDO UQHF [UMUSUEECK KRHKUBQK GHOJCH\EO_ F
[MFECLHUZFB EUBMFRFCH\EOSN DHCQQN QO QROFS DOEQBMNDBOMOS, QFBNC^FK MUPDO SUEKUBQK.
*O[OHEFBUH\EXU QRULUEFK [MFRULUEX R MCPLUHU !EF^FCHFPC^FK GHOJCH\EXY OJaUDBOR ]BO_ GHCRX.
Koucfaufu e nepeucneuunx
5#6#-(.2#*(4 (#>(") EU OWUE\ VFMODO FQ[OH\PORCHFQ\ R KPXDU . [O OLEO_ [MOQBO_ [MFWFEU:
QFSROHFWUQDFU FSUEC DOEQBCEB FSUIB GHOJCH\ENI OJHCQB\ LU_QBRFK F JXQBMO PCYHCSHKIB
[MOQBMCEQBRO FSUE. # C++ ]BC [MOJHUSC FQWUPHC, [OQDOH\DN OJHCQB\ LU_QBRFK QFSROHFWUQDFY FSUE
OGMCEFWFRCUBQK DHCQQOS FHF QBMNDBNMO_.
class Foo {
public:
enum Status { kOpen = 1, kClosed };
};
// 60"-*' 4 57'87$22"
Foo::Status s = Foo::kOpen;
)JMCBFBU REFSCEFU OJHCQB\ LU_QBRFK LOHZEC JXB\ KREO NDCPCEC DCD R FSUEF BF[C, BCD F R
QFSROHFWUQDOS FSUEF. .HULORCBUH\EO, QFSROHFWUQDFU FSUEC kOpen F kClosed SOZEO FQ[OH\PORCB\ R
[MOGMCSSU F LHK LMNGFY ^UHU_. 0OS[FHKBOM MCQQSCBMFRCUB QFSROHFWUQDFU FSUEC [UMUWFQHUEF_ DCD
SCDMOQX, C EU DCD DOEQBCEBEXU [UMUSUEEXU. 3BO OJQBOKBUH\QBRO SOZUB ODCPCB\QK RCZEXS [MF
FEF^FCHFPC^FF GHOJCH\EXY [UMUSUEEXY (QS, LCHUU R ]BO_ GHCRU).
Ykasafenu ua koucfaufy
. NDCPCBUHKSF LUHO OJQBOFB EUQDOH\DO QHOZEUU, [OQDOH\DN [MFYOLFBQK NWFBXRCB\ LRC PECWUEFK: CLMUQ
F QOLUMZFSOU [CSKBF [O ]BOSN CLMUQN. # QHULNITUS [MFSUMU 7 ]BO NDCPCBUH\ EC DOEQBCEBN;
ECYOLKTF_QK R NDCPCBUHU CLMUQ SOZUB FPSUEFB\QK, EO QOLUMZFSOU [CSKBF [O ]BOSN CLMUQN EUB.
const int* p;
int i = 17;
p = &i; // 9'1('
*p = 29; // +"#,-%
.DCPCEEOU BCDZU OBEOQFBQK D QBMNDBNMCS F OJaUDBCS.
class foo {
public:
int x;
};
const foo* f = new foo;
f->x = 17; // +"#,-%, 57/)4'"(/" .#"($2 &#$))$ (" 0'53)&$"*)%
2.
Koucfaufuu ykasafenu
. DOEQBCEBEXSF NDCPCBUHKSF RQU ECOJOMOB: CLMUQ FPSUEKB\ EUH\PK, EO PCBO SOZEO FPSUEKB\
QOLUMZFSOU [CSKBF [O ]BOSN CLMUQN.
int i = 17;
int j = 29;
int* const p; // +"#,-%! :'#1(' ;<*, -$0$(' ($.$#,('" -($."(/"
int* const p1 = &i; // ='7%0'&
*p1 = 29; // 9'1('; 4"#/./($, ($ &'*'73> ))<#$"*)% 3&$-$*"#,,
// 2'1"* /-2"(%*,)%
p1 = &j; // +"#,-%
Koucfaufuu ykasafenu ua koucfaufy
0OEQBCEBEX_ NDCPCBUH\ EC DOEQBCEBN ([O[MOJN_BU-DC BMFZLX JXQBMO [MOFPEUQBF ]BO RQHNY!) FPSUEFB\
ROOJTU EUH\PK. 3BO EUFPSUEKUSX_ CLMUQ EUFPSUEKUSO_ RUHFWFEX.
int i = 17;
int j = 29;
const int* const p; // +"#,-%. :'#1"( ;<*, -$0$( ($.$#,(<? $07")
const int* const p1 = &i; // 9'1('
*p1 = 29; // +"#,-%
p1 = &j; // +"#,-%
Koucfaufuue apryreufu qyukuu
0OEQBCEBEX_ CMGNSUEB `NED^FF LOHZUE [OLWFEKB\QK BUS ZU [MCRFHCS, WBO F HIJCK LMNGCK
DOEQBCEBECK [UMUSUEECK.
void f(const int* p)
{
*p = 17; // +"#,-%
int i = 29;
p = &i; // 9'1(', (' -$."2?
}
// 60"-*' 4 57'87$22"
int i = 17;
f(&i); // ='7%0'&, @$&*/.")&/? $7832"(* (" ';%-$( ;<*, &'()*$(*'?
)JMCBFBU REFSCEFU CMGNSUEB, NDCPCEEX_ [MF RXPORU `NED^FF, EU OJKPCE JXB\ DOEQBCEBEXS. 3BOB
RO[MOQ ^UHFDOS OQBCUBQK EC NQSOBMUEFU QBOMOEX-[OHNWCBUHK. 5UMULCWC [O QQXHDU OQNTUQBRHKUBQK [O
BUS ZU [MCRFHCS, WBO F [UMULCWC [O CLMUQN.
void f(const int& p)
{
p = 17; // +"#,-%
int i = 29;
p = i; // 9'1(' (($ 87$(/ @'#$)
}
// 60"-*' 8#3;'&' 4 57'87$22"
int i = 17;
f(i); // ='7%0'&
22
Hekoucfaufuue apryreufu qyukuu
%QHF `OMSCH\EX_ CMGNSUEB `NED^FF OJaKRHUE EUDOEQBCEBEXS, BO F `CDBFWUQDF_ CMGNSUEB,
FQ[OH\PNUSX_ [MF RXPORU, BOZU LOHZUE JXB\ EUDOEQBCEBEXS.
void f(int*);
int i = 17;
const int* p = &i;
const int j = 29;
f(&i); // 9'1(', 5'*'23 .*' i (" &'()*$(*$
f(p); // +"#,-%
f(&j); // A'1" ("#,-%, 5'*'23 .*' j - &'()*$(*$
3BO UTU OLEO QMULQBRO, Q [OSOT\I DOBOMOGO DOS[FHKBOM QOJHILCUB [MFE^F[ ULFEOZLX DOEQBCEBEX_
RQUGLC OQBCUBQK DOEQBCEBEXS. *CZU UQHF `NED^FK f EC QCSOS LUHU EU FPSUEKUB PECWUEFK QROUGO
`OMSCH\EOGO [CMCSUBMC, ]BO EF EC WBO EU RHFKUB.
Koucfaufuue qyukuuu knaccoe
# DOEQBCEBEXY `NED^FKY DHCQQOR [UMUSUEECK this FEBUM[MUBFMNUBQK DCD NDCPCBUH\ EC DOEQBCEBN.
0OS[FHKBOM LCQB RCS [O MNDCS, UQHF RX [O[MOJNUBU ROQ[OH\PORCB\QK [UMUSUEEO_ this LHK FPSUEUEFK
[UMUSUEEO_ DHCQQC FHF EC_BF LHK EUU FEOU, EUDOEQBCEBEOU [MFSUEUEFU. .SXQH DHIWUROGO QHORC const
PCRFQFB OB UGO SUQBC R OJaKRHUEFF `NED^FF; LHK DOEQBCEBEXY `NED^F_ OEO, QHOREO JOMOLCRDC, BOMWFB
[OQHU QFGECBNMX `NED^FF.
class foo {
private:
int x;
public:
void f() const;
void g();
};
void h(int*);
void m(foo*);
void foo::f();
{
x = 17; // +"#,-%: /-2"(%"*)% 5"7"2"(($% &#$))$
this->g(); // +"#,-%: g ("&'*'7$% @3(&B/%
h(&x); // +"#,-%: h 2'1"* /-2"(/*, x
m(this); // +"#,-%: ("&'()*$(*(<? $7832"(* 4 m()
}
5UMRCK OVFJDC [O[XBDC FPSUEFB\ [UMUSUEENI DHCQQC WUMUP this. # DOEQBCEBEXY `NED^FKY DHCQQC
foo [UMUSUEECK this `CDBFWUQDF OJaKRHKUBQK DCD const foo* this;. #BOMCK OVFJDC QHOZEUU. !P
[MFRULUEEOGO `MCGSUEBC EUFPRUQBEO, FPSUEKUB HF `NED^FK g DCDFU-HFJO [UMUSUEEXU DHCQQC foo, EO ]BO
F EU RCZEO; OLEO_ ROPSOZEOQBF LOQBCBOWEO, WBOJX RCV DOS[FHKBOM MCPMCPFHQK EUGOLNITFSF RO[HKSF.
!P DOEQBCEBEO_ `NED^FF DHCQQC EUH\PK RXPXRCB\ EUDOEQBCEBEXU `NED^FF WUMUP this. 5OYOZCK
QFBNC^FK ROPEFDCUB Q BMUB\U_ F WUBRUMBO_ OVFJDO_ DOS[FHKBOM [O[XBCUBQK Q[CQBF RCQ OB QCSOGO
QUJK F EU LO[NQBFB [OBUE^FCH\EO O[CQEXU QBMODF.
)LFE FP RUMEXY [MFPECDOR [MO`UQQFOECHC C++ DHIWURXU QHORC const, OJFH\EO MCPJMOQCEEXU [O
`NED^FKS DHCQQOR. 'IJCK `NED^FK DHCQQC, DOBOMCK GCMCEBFMORCEEO EU FPSUEKUB this, LOHZEC JUP
SCHU_VFY MCPSXVHUEF_ OJaKRHKB\QK DOEQBCEBEO_. #[MOWUS, DCD RFLEO FP [MFRULUEEOGO RXVU
`MCGSUEBC, ]BC QBMCBUGFK MCJOBCUB HFV\ R BOS QHNWCU, UQHF RQU NWCQBEFDF DOSCELX QHULNIB RCVUSN
[MFSUMN F OJaKRKB DOEQBCEBEXSF .&%( `NED^FF, # [MOBFREOS QHNWCU ROPEFDCIB DCQDCLEXU OVFJDF.
1CQBO RXKQEKUBQK, WBO EULCREO DN[HUEECK JFJHFOBUDC DHCQQOR EU FQ[OH\PNUB DOEQBCEBEXU `NED^FF F
23
ECMNVCUB RCV [NMFBCEQDF_ QBFH\ DOLFMORCEFK. 6OMCH\: DOEQBCEBEXU `NED^FF DHCQQOR ENZEO
FQ[OH\PORCB\ HFJO Q [OHEXS `CECBFPSOS (ZUHCBUH\EO), HFJO EU FQ[OH\PORCB\ RORQU.
Cfekoeue u puuarueckue oLekfu
!EOGLC SEU DCZUBQK, WBO C++ HNWVU FPNWCB\ JUP [MULRCMFBUH\EOGO PECDOSQBRC Q C. # C++ WCQBO
FQ[OH\PNIBQK BU ZU BUMSFEX, WBO F R ., EO PC EFSF DMOIBQK QORUMVUEEO FEO_ QSXQH F [MCRFHC
[MFSUEUEFK. $C[MFSUM, ROP\SUS [MFSFBFREX_ ^UHX_ BF[.
int x = 17;
# C++ ]BO JNLUB ]DPUS[HKM RQBMOUEEOGO DHCQQC int. # . ]BO JNLUB... [MOQBO int. #QBMOUEEXU DHCQQX
FSUIB QROF DOEQBMNDBOMX. 4 DHCQQC int UQB\ DOEQBMNDBOM Q OLEFS CMGNSUEBOS, DOBOMX_
FEF^FCHFPFMNUB OJaUDB [UMULCRCUSXS PECWUEFUS. +UOMUBFWUQDF QNTUQBRNUB F LUQBMNDBOM, YOBK OE
EFWUGO EU LUHCUB F HFDRFLFMNUBQK RQUSF EOMSCH\EXSF MCPMCJOBWFDCSF DOS[FHKBOMOR R [MO^UQQU
O[BFSFPC^FF. #CZEO OQOPECB\, WBO RQBMOUEEXU BF[X PC OWUE\ MULDFSF FQDHIWUEFKSF [OLWFEKIBQK BUS
ZU JCPORXS [MCRFHCS, WBO F RCVF MCQVFMUEEXU BF[X.
#X LOHZEX [OEFSCB\ ]BN BUOMUBFWUQDNI OQOJUEEOQB\ C++, WBOJX [MCRFH\EO OBEOQFB\QK D QBUDORXS F
LFECSFWUQDFS OJaUDBCS F QRKPCEEXS Q EFSF [UMUSUEEXS.
Pasreeuue e cfeke
1BOJX RXLUHFB\ [CSKB\ LHK QBUDORO_ [UMUSUEEO_ R OJHCQBF LU_QBRFK JHODC, LOQBCBOWEO [MOQBO
OJaKRFB\ UU OJXWEXS OJMCPOS.
{
int i;
foo f(constructor_args);
// ="7"0 4<C'0'2 /- ;#'&$ 4<-<4$>*)% 0")*73&*'7< i / f
}
.BUDORXU OJaUDBX QNTUQBRNIB HFV\ R GMCEF^CY QOLUMZCTUGO FY JHODC. 5MF RXYOLU PC UGO [MULUHX
CRBOSCBFWUQDF RXPXRCUBQK LUQBMNDBOM. (CPNSUUBQK, [OHNWUEFU CLMUQC QBUDOROGO OJaUDBC LUHO
MFQDORCEEOU, UQHF BOH\DO RX CJQOHIBEO, QBO[MO^UEBEO EU NRUMUEX, WBO ]BOB NDCPCBUH\ EU JNLUB
FQ[OH\PORCE [OQHU RXYOLC PC [MULUHX OJHCQBF LU_QBRFK OJaUDBC. #QU `MCGSUEBX EC[OLOJFU
[MFRULUEEOGO EFZU RQUGLC QWFBCIBQK [OBUE^FCH\EO O[CQEXSF:
{
int i;
foo f;
SomeFunction(&f);
}
8UP FPNWUEFK `NED^FF SomeFunction EUROPSOZEO QDCPCB\, JUPO[CQUE HF ]BOB `MCGSUEB.
SomeFunction SOZUB [UMULCB\ CLMUQ LCH\VU FHF QOYMCEFB\ UGO R DCDO_-EFJNL\ [UMUSUEEO_, C [O
PCDOEN 6]M`F ]BOB CLMUQ ECRUMEKDC JNLUB FQ[OH\PORCE NZU [OQHU NEFWBOZUEFK OJaUDBC f. *CZU UQHF
QRUMYBTCBUH\EX_ CECHFP SomeFunction [ODCZUB, WBO CLMUQ EU QOYMCEKUBQK [OQHU RXPORC, WUMUP [CMN
HUB DCDO_-EFJNL\ EORX_ [MOGMCSSFQB SOLF`F^FMNUB SomeFunction, [MOLHFB QNTUQBRORCEFU CLMUQC
EC [CMN SCVFEEXY DOSCEL F 846!!! 'NWVU [OHEOQB\I FQDHIWFB\ BCDNI ROPSOZEOQB\ F EU
[UMULCRCB\ CLMUQC QBUDORXY OJaUDBOR.
uuarueckoe pasreeuue
1BOJX RXLUHFB\ [CSKB\ LHK OJaUDBC R DNWU (heap), ROQ[OH\PN_BUQ\ O[UMCBOMOS new new new new.
foo* f = new foo(constructor_args);
#MOLU JX RQU [MOQBO. )[UMCBOM new RXLUHKUB [CSKB\ F RXPXRCUB QOOBRUBQBRNITF_ DOEQBMNDBOM EC
OQEORCEFF [UMULCEEXY CMGNSUEBOR. $O DOGLC ]BOB OJaUDB NEFWBOZCUBQK? 5OLMOJEX_ OBRUB EC ]BOB
RO[MOQ PC_SUB [MFSUMEO BMUB\ DEFGF, EO K EU JNLN RLCRCB\QK R BUYEFWUQDFU LUBCHF F OBRUWN BCD: 0OGLC
24
DBO-EFJNL\ RXPORUB O[UMCBOM delete LHK UGO CLMUQC. .CS [O QUJU OJaUDB FP [CSKBF EU NLCHFBQK; RX
LOHZEX KREO QOOJTFB\ QROU_ [MOGMCSSU, DOGLC UGO QHULNUB NEFWBOZFB\.
Ykasafenu u ccunku
5O[XBDF QRKPCB\ NDCPCBUHF Q LFECSFWUQDFSF OJaUDBCSF WCQBO [MFROLKB D EULOMCPNSUEFKS. #
QNTEOQBF, OEF EU FSUIB LMNG Q LMNGOS EFWUGO OJTUGO. #X SOZUBU [OHNWFB\ CLMUQ QBUDOROGO OJaUDBC F
RX[OHEFB\ OJMCBEOU [MUOJMCPORCEFU, BO UQB\ MCPXSUEORCEFU (dereferencing) CLMUQC LFECSFWUQDOGO
OJaUDBC. ! EC BO, F EC LMNGOU SOZEO QOPLCB\ QQXHDN.
{
foo f;
foo* p = &f;
f.MemberFn(); // D)5'#,-3"* )$2 ';E"&*
p->MemberFn(); // D)5'#,-3"* "8' $07")
p = new foo;
foo& r = *p; // F)<#&$ ($ ';E"&*
r.MemberFn(); // A' 1", .*' / p->MemberFn()
}
0CD RFLFBU, RXJOM O[UMCBOMC . FHF -> PCRFQFB OB BF[C [UMUSUEEO_ F EU FSUUB OBEOVUEFK D CBMFJNBCS
QCSOGO OJaUDBC. (CP NZ SX PCGOROMFHF OJ ]BOS, [MCRFH\EXU ECPRCEFK ]BFY O[UMCBOMOR (. F ->)
.#2#$"%6' -2#*%& $2+..+ (member selectors). %QHF RX ECPORUBU FY BOWDO_ FHF QBMUHDO_ EC QUSFECMU
Q DODBU_HKSF, ECQBN[FB GMOJORCK BFVFEC, RQU [ORUMENBQK F [MUPMFBUH\EO [OQSOBMKB EC RCQ, C R LCH\EUS
NGHN DBO-EFJNL\ RXMOEFB QRO_ JODCH.
Hepocfafku cfekoeux oLekfoe
%QHF FQ[OH\PORCB\ O[UMCBOM delete LHK QBUDOROGO OJaUDBC, BO [MF JOH\VOS RUPUEFF RCVC [MOGMCSSC
[MOQBO GMOYEUBQK. - UQHF RCS (DCD F JOH\VFEQBRN FP ECQ) EU [ORUPUB, BO [MOGMCSSC ECWEUB RUQBF QUJK,
DCD MUREFRCK HIJOREF^C OEC JNLUB RXBROMKB\, RQKDFU GCLOQBF R MCPEXY SUQBCY [CSKBF, EO EU QDCZUB,
EC WBO ZU OEC MCPOPHFHCQ\. *UHO R BOS, WBO R JOH\VFEQBRU MUCHFPC^F_ C++ O[UMCBOM new PC[FQXRCUB
[CMN QDMXBXY JC_BOR [UMUL ROPRMCTCUSXS CLMUQOS. # ]BFY JC_BCY NDCPXRCUBQK MCPSUM RXLUHUEEOGO
JHODC. 5O EFS O[UMCBOM delete O[MULUHKUB, QDOH\DO [CSKBF PC NDCPCEEXS CLMUQOS QHULNUB OQROJOLFB\.
5MF RXLUHUEFF [CSKBF [OL QBUDORXU OJaUDBX O[UMCBOM new EU RXPXRCUBQK, [O]BOSN ]BF
LO[OHEFBUH\EXU LCEEXU OBQNBQBRNIB. %QHF RXPRCB\ O[UMCBOM delete LHK QBUDOROGO OJaUDBC, OE
ROP\SUB QOLUMZFSOU QBUDC ECL RCVU_ [UMUSUEEO_ F FEBUM[MUBFMNUB UGO DCD MCPSUM OQROJOZLCUSOGO
JHODC.
!BCD, SX PECUS [O DMC_EU_ SUMU LRU [MFWFEX, [O DOBOMXS QHULNUB FPJUGCB\ QBUDORXY OJaUDBOR UQHF
N RCQ EUB LU_QBRFBUH\EO RUQDFY LOROLOR R FY [OH\PN:
/. -LMUQ QBUDOROGO OJaUDBC SOZUB JXB\ QOYMCEUE F FQ[OH\PORCE [OQHU RXYOLC PC GMCEF^X OJHCQBF
LU_QBRFK OJaUDBC.
2. -LMUQ QBUDOROGO OJaUDBC SOZUB JXB\ [UMULCE O[UMCBOMN delete.
.HULORCBUH\EO, LHK QBUDORXY OJaUDBOR LU_QBRNUB YOMOVUU [MCRFHO: E($%7)+ *# >%28-+3"# (? +)6#.+
(2( +)6#.+ (? -2#*%&.
ocfouucfea cfekoeux oLekfoe
. LMNGO_ QBOMOEX, [CSKB\ R QBUDU RXLUHKUBQK Q GOHORODMNZFBUH\EO_ JXQBMOBO_ BCD ZU JXQBMO, DCD
DOS[FHKBOM RXLUHKUB [CSKB\ [OL LMNGFU CRBOSCBFWUQDFU [UMUSUEEXU (QDCZUS, ^UHXU). )[UMCBOM new
([O DMC_EU_ SUMU, UGO QBCELCMBECK RUMQFK) BMCBFB EUQDOH\DO BCDBOR EC BO, WBOJX MUVFB\, OBDNLC RPKB\
JHOD [CSKBF F GLU OQBCRFB\ LCEEXU LHK UGO [OQHULNITUGO OQROJOZLUEFK. 8XQBMOLU_QBRFU OLEC FP
RUQDFY [MFWFE R [OH\PN RXLUHUEFK [CSKBF FP QBUDC. 0CD RX RQDOMU NJULFBUQ\, QNTUQBRNUB EUSCHO
Q[OQOJOR NQDOMFB\ MCJOBN O[UMCBOMC new, BCD WBO ]BC [MFWFEC SUEUU RCZEC, WUS SOZUB [ODCPCB\QK Q
[UMROGO RPGHKLC.
25
-RBOSCBFWUQDOU NLCHUEFU RBOMOU JOH\VOU [MUFSNTUQBRO QBUDORXY OJaUDBOR, [O]BOSN
[MOGMCSSFQBX WCQBO QOPLCIB SCHUE\DFU RQ[OSOGCBUH\EXU QBUDORXU DHCQQX, DOBOMXU FGMCIB MOH\
OJUMBDF LHK LFECSFWUQDFY OJaUDBOR. # QHULNITUS PCJCREOS [MFSUMU LFECSFWUQDF_ DHCQQ Foo
N[CDORXRCUBQK R QBUDORX_ DHCQQ PFoo. 0OEQBMNDBOM RXLUHKUB [CSKB\ LHK Foo; LUQBMNDBOM
OQROJOZLCUB UU. %QHF RX EUPECDOSX Q O[UMCBOMCSF [MUOJMCPORCEFK, OJMCBFBUQ\ D QOOBRUBQBRNITUSN
MCPLUHN ]BO_ GHCRX. # LRNY QHORCY, `NED^FK operator Foo*() [OPROHKUB FQ[OH\PORCB\ DHCQQ PFoo RUPLU,
GLU LOHZUE FQ[OH\PORCB\QK Foo* EC[MFSUM, [MF RXPORU `NED^FF g().
class PFoo {
private:
Foo* f;
public:
PFoo() : f(new Foo) {}
~PFoo() { delete f; }
operator Foo*() { return f; }
}
void g(Foo*);
{
PFoo p;
g(p); // G<-<4$"* @3(&B/> operator Foo*() 0#% 57"';7$-'4$(/%
// H(/.*'1$"*)% p, $ -$ (/2 Foo
}
)JMCBFBU REFSCEFU, WBO ]BOB DHCQQ EU QORQUS JUPO[CQUE, [OQDOH\DN CLMUQ, ROPRMCTCUSX_ `NED^FU_
operator Foo*(), QBCEORFBQK EULU_QBRFBUH\EXS [OQHU NLCHUEFK RSUTCITUGO PFoo. 6X MCPJUMUSQK
Q ]BFS WNB\ [OPZU.
6X UTU EU MCP RQBMUBFSQK Q [OLOJEXSF `ODNQCSF. #QK QOH\ PCDHIWCUBQK R BOS, WBO QBUDORXU OJaUDBX
SOGNB [MFGOLFB\QK [MOQBO FP-PC BOGO, WBO FY EU [MFYOLFBQK NLCHKB\ RMNWENI. #QDOMU K [ODCZN RCS, DCD
OMGCEFPORCB\ CRBOSCBFWUQDOU NLCHUEFU LFECSFWUQDFY OJaUDBOR, EO ]BC SUBOLFDC OWUE\ QHOZEC F RMKL
HF [MFGOLEC LHK [ORQULEUREOGO [MFSUEUEFK.
4 QBUDORXY OJaUDBOR UQB\ UTU OLEO [MUFSNTUQBRO UQHF RCV DOS[FHKBOM [OLLUMZFRCUB ANSI-
QORSUQBFSNI OJMCJOBDN FQDHIWUEF_ (exception). 0OGLC RO RMUSK MCQDMNBDF QBUDC [MOFQYOLFB
FQDHIWUEFU, LUQBMNDBOMX QBUDORXY OJaUDBOR RXPXRCIBQK CRBOSCBFWUQDF. *HK LFECSFWUQDFY OJaUDBOR
]BOGO EU QHNWCUBQK, F RCVC DNWC SOZUB [MURMCBFB\QK R ECQBOKTF_ YCOQ. (FQDNK [ORBOMFB\QK, K QDCZN,
WBO SX RUMEUSQK D ]BO_ BUSU [OPLEUU.
Onacfu pecfeun u qyukuuu
)LEO FP PECWFBUH\EXY [MUFSNTUQBR C++ ECL . ROPSOZEOQB\ OGMCEFWUEFK OJHCQBF LU_QBRFK
QFSROHFWUQDFY FSUE. #[MOWUS, ]BO [CHDC O LRNY DOE^CY, [OQDOH\DN [MCRFHC O[MULUHUEFK OJHCQBF
LU_QBRFK FEOGLC LOROH\EO PC[NBCEEX. 0MOSU BOGO, R C++ [OKRFHCQ\ [UMUGMNPDC `NED^F_ F DCD UU
MCQVFMUEFU [UMUGMNPDC O[UMCBOMOR. 5MUL[OHCGCUBQK, WBO RX NZU PECDOSX Q CPCSF, [O]BOSN R QROUS
DMCBDOS OJPOMU K OGMCEFWNQ\ HFV\ EUDOBOMXSF EUBMFRFCH\EXSF OQOJUEEOQBKSF `NED^F_ F OJHCQBU_
LU_QBRFK.
Onacfu pecfeun
)JHCQB\ LU_QBRFK QOPLCUBQK QHULNITFSF DOEQBMND^FKSF:
DHCQQ;
QBMNDBNMC;
OJaULFEUEFU;
JHOD;
GHOJCH\EOU [MOQBMCEQBRO FSUE.
26
.FSROHFWUQDFU FSUEC, OJaKRHUEEXU R OJHCQBF LU_QBRFK, OBEOQKBQK BOH\DO D LCEEO_ OJHCQBF. )EF EU
OGMCEFWFRCIBQK [UMUWFQHUEFKSF F [MOQBXSF [UMUSUEEXSF. .BMNDBNMX, DHCQQX F `NED^FF BCDZU
SOGNB O[MULUHKB\QK R DOEDMUBEO_ OJHCQBF LU_QBRFK.
Knaccu
0HCQQ R C++ EUWBO JOH\VUU, WUS [MOQBCK QBMNDBNMC LCEEXY. 3BO CECHOG SOLNHK FP LMNGFY KPXDOR
[MOGMCSSFMORCEFK, QMULQBRO N[OMKLOWUEFK QFSROH\EXY FSUE.
class Foo {
public:
static int y; // 6#';$#,($% 5"7"2"(($%
static void GFn(); // 6#';$#,($% @3(&B/%
int x; // ="7"2"(($% &#$))$
Foo(); // I'()*73&*'7
void Fn(); // J3(&B/% &#$))$
typedef int (*IntFn)(); // A/5
enum Status { kOpen = 0, kClosed }; // :738'? */5
struct Bar { // G#'1"(($% )*73&*37$
int a;
int b;
static void BarFn();
}
private:
void Hn();
};
# ]BOS `MCGSUEBU [MFRULUEX EUDOBOMXU RCMFC^FF EC BUSN DHCQQOR. 5UMUSUEECK 3 GHOJCH\ECK
[UMUSUEECK, a GFn() GHOJCH\ECK `NED^FK, YOBK OJHCQB\ LU_QBRFK FY FSUE OGMCEFWFRCUBQK DHCQQOS
Foo. #O RQUY `NED^FKY DHCQQC Foo D EFS SOZEO OJMCTCB\QK [MOQBO [O FSUEF, EO PC UGO [MULUHCSF
EUOJYOLFSO FQ[OH\PORCB\ O[UMCBOM OJHCQBF LU_QBRFK :::
Foo::Foo()
{
GFn(); // 9< 31" ($C'0/2)% 4 ';#$)*/ 0"?)*4/% Foo
}
void f()
{
Foo::GFn(); // +"';C'0/2' -$0$*, ';#$)*, 0"?)*4/%
}
-ECHOGFWEO, O[MULUHUEFU BF[C IntFn, [UMUWFQHUEFU Status F LCZU RHOZUEENI QBMNDBNMN Bar BCDZU
SOZEO FQ[OH\PORCB\ JUP NDCPCEFK OJHCQBF LU_QBRFK R `NED^FKY DHCQQC Foo, EO R HIJOS LMNGOS SUQBU
]BN OJHCQB\ EUOJYOLFSO PCLCB\. *HK RHOZUEEXY BF[OR Q OBDMXBO_ RFLFSOQB\I QFEBCDQFQ NDCPCEFK
OJHCQBF LU_QBRFK SOZUB [MFEKB\ EUQDOH\DO NQBMCVCITF_ RFL, DCD RFLEO FP QHULNITUGO [MFSUMC LHK
QBMNDBNMX G$r:
Foo::Bar b;
Foo::Bar::BarFn();
5O ]BO_ [MFWFEU RHOZUEEXU QBMNDBNMX HFJO LUHCIBQK BMFRFCH\EXSF, HFJO LOQBN[ D EFS
OGMCEFWFRCUBQK.
1HUEX DHCQQC C, Foo F Fn(), FSUIB QSXQH HFV\ R DOEBUDQBU DOEDMUBEOGO ]DPUS[HKMC (instance) ]BOGO
DHCQQC. *HK OJMCTUEFK D EFS FQ[OH\PNIBQK O[UMCBOMX-QUHUDBOMX WHUEOR DHCQQC, . F ->. <FMODFU
SCQQX (F, DCD K RXKQEFH EC QOJQBRUEEOS GOM\DOS O[XBU, LCZU MCPMCJOBWFDF DOS[FHKBOMOR C++) [OWBF
EU PECIB O BOS, WBO Q [OSOT\I QUHUDBOMOR SOZEO RXPXRCB\ QBCBFWUQDFU `NED^FF DHCQQC F OJMCTCB\QK
27
D QBCBFWUQDFS [UMUSUEEXS DHCQQC. .HULNITF_ `MCGSUEB RUMUE, YOBK JULEXU WFBCBUHF RCVU_
[MOGMCSSX [MFLNB R BCDOU PCSUVCBUH\QBRO, WBO [OLOJEOU SOZEO [MOLUHXRCB\ BOH\DO R [OQHULEF_ LUE\
[UMUL NROH\EUEFUS:
Foo f;
f.Gfn(); // A' 1", .*' / Foo::GFn();
Cfpykfypu
.BMNDBNMC R C++ [OWBF WBO [OHEO^UEEX_ DHCQQ. .O QBMNDBNMO_ SOZEO LUHCB\ RQU, WBO SOZEO LUHCB\
Q DHCQQOS. $C[MFSUM, QBMNDBNMX SOGNB NWCQBRORCB\ R ECQHULORCEFF; R EFY SOZEO OJaKRHKB\ QUD^FF
public, private, protected F LCZU RFMBNCH\EXU `NED^FF. +US EU SUEUU, LHK QBMNDBNM LU_QBRNIB
EUQDOH\DO FEXU [MCRFHC: [O NSOHWCEFI RQU WHUEX QWFBCIBQK OBDMXBXSF (public), WBOJX GOBORXU
[MOGMCSSX EC . EU [MFYOLFHOQ\ [UMU[FQXRCB\ PCEORO [OL DCEOEX C++.
+UOMFK RUT\ YOMOVCK, EO LCRC_BU RUMEUSQK EC PUSHI. .BOFB HF LUSOEQBMFMORCB\ QROI DMNBFPEN F
OJaKRHKB\ QBMNDBNMN Q SEOZUQBRUEEXS ECQHULORCEFUS F RFMBNCH\EXSF `NED^FKSF? $C [MCDBFDU
QBMNDBNMX FQ[OH\PNIBQK RSUQBO DHCQQOR HFV\ [MF QOJHILUEFF QHULNITFY NQHORF_:
.BMNDBNMC EU QOLUMZFB RFMBNCH\EXY `NED^F_.
.BMNDBNMC EU KRHKUBQK [MOFPROLEO_ OB WUGO-HFJO, DMOSU MCPRU WBO LMNGO_ QBMNDBNMX.
.BMNDBNMC EU KRHKUBQK JCPORO_ LHK WUGO-HFJO, DMOSU MCPRU WBO LMNGO_ QBMNDBNMX.
$OMSCH\EXU [MOGMCSSFQBX C++ OJXWEO FQ[OH\PNIB QBMNDBNMX HFV\ LHK SCHUE\DFY NLOJEXY ECJOMOR
LCEEXY Q BMFRFCH\EXSF `NED^FKSF. # WCQBEOQBF, QBMNDBNMX WCQBO FQ[OH\PNIBQK R QFBNC^FKY, DOGLC
OJaUDB C++ LOHZUE JXB\ QORSUQBFS EC JFBOROS NMOREU Q REUVEU_ QBMNDBNMO_ LCEEXY (OQOJUEEO QO
QBMNDBNMCSF .). 5MF ]BOS SOZEO PC[MOQBO OJaKRHKB\ DOEQBMNDBOMX F EURFMBNCH\EXU `NED^FF (OQO-
JUEEO BMFRFCH\EXU RQBMOUEEXU), [OQDOH\DN LHK EFY EU QOPLCUBQK v-BCJHF^C, DOBOMCK SOGHC JX
ECMNVFB\ JFBORNI QORSUQBFSOQB\.
OLepuueuun
)JaULFEUEFK C++ [OWBF EU OBHFWCIBQK OB OJaULFEUEF_ .. )EF [OPROHKIB Q]DOEOSFB\ EUQDOH\DO JC_B
PC QWUB ECHOZUEFK MCPHFWEXY QBMNDBNM LCEEXY [ORUMY LMNG LMNGC. )JaULFEUEFK SOGNB QOLUMZCB\
EURFMBNCH\EXU `NED^FF, R BOS WFQHU DOEQBMNDBOMX F LUQBMNDBOMX, EO [MF ]BOS OEF LOHZEX
[OLWFEKB\QK LOROH\EO ZUQBDFS OGMCEFWUEFKS:
1HUEX OJaULFEUEFK EU SOGNB FSUB\ DOEQBMNDBOMOR (YOBK QCSO OJaULFEUEFU SOZUB).
)JaULFEUEFU EU SOZUB JXB\ [MOFPROLEXS OB WUGO-HFJO.
$FWBO EU SOZUB JXB\ [MOFPROLEXS OB OJaULFEUEFK.
*UQBMNDBOMX WHUEOR EU RXPXRCIBQK, YOBK LUQBMNDBOM QCSOGO OJaULFEUEFK, UQHF OE UQB\,
RXPXRCUBQK.
5OQDOH\DN OJaULFEUEFK EU NWCQBRNIB R FUMCMYFF ECQHULORCEFK, EUB QSXQHC OJaKRHKB\ R EFY
RFMBNCH\EXU `NED^FF FHF PCTFTUEEXU WHUEX. 1HUEX OJaULFEUEF_ MCPMUVCUBQK OJaKRHKB\ PCDMXBXSF
(private) FHF OBDMXBXSF (public). )JaULFEUEFK [MFGOLKBQK HFV\ BOGLC, DOGLC RCS LU_QBRFBUH\EO
ENZEO Q]DOEOSFB\ [CSKB\, DOGLC RX EU QOJFMCUBUQ\ LUHCB\ OJaULFEUEFU [MOFPROLEXS FHF JCPORXS, C
BCDZU RDHIWCB\ R EUGO RFMBNCH\EXU `NED^FF FHF DOEQBMNDBOMX. !ECWU GOROMK, [OH\PX OB EFY EU BCD
NZ SEOGO.
Enoku
#QU, WBO QBOFHO JX QDCPCB\ O JHODCY, NZU FPRUQBEO RCS FP . FHF FP [MULXLNTUGO O[FQCEFK QBUDORXY
OJaUDBOR.
Fnoanuuue npocfpaucfea ureu
,HOJCH\EXU [MOQBMCEQBRC FSUE C++ ECQBOH\DO QHOZEX, WBO R SOUS [MULQBCRHUEFF [MO^UQQ DOS[FHK^FF
GHOJCH\EXY DOEQBMND^F_ EC[OSFECUB SCGFWUQDF_ MFBNCH Q LXSOS JHCGOROEF_ F [UEFUS SCEBM. &
[OQBCMCIQ\ FPHOZFB\ ]BF [MCRFHC DCD SOZEO [MOTU. )JHCQB\ LU_QBRFK GHOJCH\EXY "(>%&
28
OGMCEFWFRCUBQK `C_HOS, R DOBOMOS OEF OJaKRHKIBQK. ,HOJCH\EXU >#6#,#**'# F B8*$C(( D BOSN ZU
[OLWFEKIBQK [MCRFHCS DOS[OEORDF LHK EUQDOH\DFY FQYOLEXY `C_HOR. (CQQSOBMFS QHULNITNI
QFBNC^FI:
// G @$?#" Foo.cpp
typedef int Symbol;
// G @$?#" Bar.cpp
typedef void (*Symbol)();
$FDCDOGO DOE`HFDBC EU ROPEFDEUB, UQHF BOH\DO [O SCPOYFQBQDFS QOOJMCZUEFKS RX EU RDHIWFBU OLFE
`C_H Q MCQVFMUEFUS .QMM R LMNGO_ LFMUDBFRO_ #include. .FSROHFWUQDOU FSK Symbol FPRUQBEO
DOS[FHKBOMN HFV\ R BUY FQYOLEXY `C_HCY, R DOBOMXY OEO RQBMUWCUBQK, [O]BOSN R MCPEXY FQYOLEXY
`C_HCY UGO SOZEO FQ[OH\PORCB\ [O-MCPEOSN. .HULNITF_ `MCGSUEB EURUMUE, [OQDOH\DN EC ]BOB MCP
QFSROHFWUQDOU FSK QOOBRUBQBRNUB [UMUSUEEO_, C EU BF[N. !SK [UMUSUEEO_ LOHZEO JXB\ NEFDCH\EXS
LHK RQUY `C_HOR, [UMULCRCUSXY DOS[OEORTFDN.
// G @$?#" Foo.cpp
int Symbol;
// G @$?#" Bar.cpp
void (*Symbol)();
%LFEQBRUEEOU FQDHIWUEFU FP ]BOGO [MCRFHC OBEOQFBQK D [UMUGMNPDU `NED^F_, O DOBOMO_ JNLUB
MCQQDCPCEO R QHULNITUS MCPLUHU. 0OEUWEO, DOE`HFDBX FSUE WCQBO ROPEFDCIB R HIJOS LOQBCBOWEO
JOH\VOS [MOUDBU, R DOBOMOS EUQDOH\DO [MOGMCSSFQBOR MCJOBCIB ECL MCPEXSF FQYOLEXSF `C_HCSF.
)LEO FP ROPSOZEXY MUVUEF_ FQ[OH\PORCEFU QBCBFWUQDFY WHUEOR; LMNGOU OJaKRHUEFU GHOJCH\EXY
[UMUSUEEXY F `NED^F_ QBCBFWUQDFSF. %QHF [UMUSUEECK FHF `NED^FK OJaKRHKUBQK QBCBFWUQDO_, OEC
O[MULUHUEC HFV\ R GMCEF^CY FQYOLEOGO `C_HC.
// G @$?#" Foo.cpp
static int Symbol;
// G @$?#" Bar.cpp
static void (*Symbol)();
4RFLUR DHIWUROU QHORO static, DOS[FHKBOM [MOQHULFB PC BUS, WBOJX DOS[OEORTFD EU [UMU[NBCH LRU
MCPEXU RUMQFF OLEOGO QFSROHFWUQDOGO FSUEF [MF NQHORFF WBO FQYOLEXU `C_HX EU DOS[FHFMNIBQK
RSUQBU; JNLNB QGUEUMFMORCEX LRU MCPEXU [UMUSUEEXU.
0 HIJOSN QFSROHFWUQDOSN FSUEF, OJaKRHUEEOSN R GHOJCH\EOS [MOQBMCEQBRU FSUE, SOZEO OJMCBFB\QK Q
[OSOT\I O[UMCBOMC :: JUP NDCPCEFK OJHCQBF LU_QBRFK:
::Fn(); // G<-4$*, 8#';$#,(3> @3(&B/> ) -$0$((<2 /2"("2
int x = ::i; // =7/)4'/*, x -($."(/" 8#';$#,('? 5"7"2"(('?
::SomeType y; // D)5'#,-'4$*, 8#';$#,(' ';E%4#"((<? */5
&REO PCLCEECK OJHCQB\ LU_QBRFK RQUGLC OBSUEKUB RQU QFSROHFWUQDFU FSUEC, O[MULUHUEEXU HODCH\EO
EC[MFSUM, RENBMF JHODC FHF DHCQQC.
Reperpyska
# C++ QNTUQBRNUB EUQDOH\DO Q[OQOJOR SEOGODMCBEOGO FQ[OH\PORCEFK FSUE `NED^F_. # WCQBEOQBF,
[MOQBMCEQBRC FSUE `NED^F_ `OMSFMNIBQK EC OQEORU DHCQQOR. )LEOFSUEEXU `NED^FF R DHCQQCY, EU
QRKPCEEXY LMNG Q LMNGOS, RX[OHEKIB QORUMVUEEO MCPEXU PCLCWF. 5UMUGMNPDC `NED^F_ MCPRFRCUB
RUHFDNI BMCLF^FI MCPLUHUEFK [MOQBMCEQBR FSUE `NED^F_ F [OPROHKUB SEOGODMCBEO FQ[OH\PORCB\
FSUEC `NED^F_ R GMCEF^CY OLEO_ OJHCQBF LU_QBRFK.
Apryreufu
*RU `NED^FF Q OLFECDORXSF FSUECSF QWFBCIBQK MCPEXSF, UQHF OEF OBHFWCIBQK [O DOHFWUQBRN,
[OMKLDN FHF BF[N CMGNSUEBOR.
void Fn();
29
void Fn(int);
void Fn(long); // 9'1(', ")#/ */5< long / int '*#/.$>*)% 7$-2"7'2
int Fn(int); // +"#,-% '*#/.$"*)% *'#,&' */5 4'-47$K$"2'8' -($."(/%
int Fn(char*); // 9'1(', '*#/.$>*)% $7832"(*<
void Fn(int, char*);
void Fn(char*, int); // 9'1(', $7832"(*< )#"03>* 4 0738'2 5'7%0&"
void Fn(char* s, int x, int y = 17); // 9'1(' *7/ $7832"(*$ 42")*' 043C
Fn(hello, 17); // LM/;&$ )'45$0$>* 04" )/8($*37<
5ODC CMGNSUEBX OBHFWCIBQK, DOS[FHKBOM EU ZCHNUBQK EC FPSUEUEFU ROPRMCTCUSOGO BF[C.
!EF^FCHFPC^FK [O NSOHWCEFI (BCDCK DCD 3=17) SOZUB [MFQNBQBRORCB\ [MF OJaKRHUEFF `NED^FF, YOBK
[OPLEUU OEC SOZUB QBCB\ [MFWFEO_ EUOLEOPECWEOQBF [MF RXPORU `NED^FF (DCD R [OQHULEU_ QBMODU
[MFSUMC).
Koucfaufuue qyukuuu
0OEQBCEBECK `NED^FK, CMGNSUEBX DOBOMO_ QOR[CLCIB Q CMGNSUEBCSF EUDOEQBCEBEO_ `NED^FF, BUS EU
SUEUU QWFBCUBQK LMNGO_ `NED^FU_. 0OS[FHKBOM RXPXRCUB DOEQBCEBENI FHF EUDOEQBCEBENI RUMQFI R
PCRFQFSOQBF OB BF[C [UMUSUEEO_, NDCPXRCITU_ FHF QQXHCITU_QK EC OJaUDB.
class Foo {
public:
void Fn();
void Fn() const; // :738$% @3(&B/%!
};
Foo* f = new Foo;
f->Fn(); // G<-<4$"*)% ("&'()*$(*($% 4"7)/%
const Foo* f1 = f;
f1->Fn(); // G<-<4$"*)% &'()*$(*($% 4"7)/%
Bupurocfu
# C++ QNTUQBRNUB [OLMOJECK (C [O SEUEFI EUDOBOMXY, LCZU QHFVDOS [OLMOJECK) QFQBUSC [MCRFH, [O
DOBOMXS SOZEO NPECB\, WBO RX RFLFBU [MKSO [UMUL QOJO_, C WBO RXVHO FP RCVUGO [OHK PMUEFK. 8CPORXU
[MCRFHC LHK OBDMXBXY PCTFTUEEXY F PCDMXBXY QFSROHFWUQDFY FSUE R DHCQQCY F QBMNDBNMCY ECQBOH\DO
[MOQBX, WBO K EU QBCEN FY [UMUQDCPXRCB\. $FZU [MFRULUEC DMCBDCK QROLDC ECFJOHUU DCRUMPEXY
RO[MOQOR, OBEOQKTFYQK D [OEKBFI RFLFSOQBF (visibility) R C++.
3akpufoe uacnepoeauue
5MF PCDMXBOS ECQHULORCEFF OB JCPOROGO DHCQQC RQU UGO PCTFTUEEXU F OBDMXBXU WHUEX QBCEORKBQK
PCDMXBXSF R [MOFPROLEOS DHCQQU; WHUEX PCDMXBOGO JCPOROGO DHCQQC EULOQBN[EX LHK [OH\PORCBUHU_
[MOFPROLEOGO DHCQQC. *OQBN[ D EFS ROPSOZUE HFV\ FP `NED^F_ JCPOROGO F [MOFPROLEOGO DHCQQC, C
BCDZU FP LMNPU_ [MOFPROLEOGO DHCQQC.
0MOSU BOGO, [MOFPROLEX_ DHCQQ EUH\PK [MUOJMCPORCB\ D OLEOSN FP UGO PCDMXBXY JCPORXY DHCQQOR FHF
ECLUKB\QK, WBO ]BO QLUHCUB DOS[FHKBOM.
class Mixin {
private:
int x;
protected:
int y;
public:
Mixin();
Void a();
};
30
class Foo : private Mixin {...};
class Bar : public Foo {...};
5UMUSUEECK C RFLEC HFV\ R `NED^FKY DHCQQC Mixin R DOEQBMNDBOMU F N(). 5UMUSUEECK N RFLEC
HFV\ R `NED^FKY DHCQQC Foo, DCD F `NED^FK Mixin::A(). #QU WHUEX Mixin EU RFLEX R DHCQQCY,
[MOFPROLEXY OB Foo (BCDFY DCD G$r R ]BOS `MCGSUEBU). #QU LMNP\K Foo RFLKB C F N(), C LMNP\K Bar
EUB.
RepeoLneneuue neuoe
>OBK O[FQCEECK QFBNC^FK ROPEFDCUB LOROH\EO MULDO, LO[NQDCUBQK [UMUOJaKRHUEFU RFMBNCH\EXY
`NED^F_ Q ^UH\I FPSUEUEFK FY CBMFJNBOR RFLFSOQBF [O OBEOVUEFI D JCPOROSN DHCQQN.
class Foo {
protected:
virtual void Fn();
};
class Bar : public Foo {
public:
virtual void Fn();
};
# DHCQQU Foo `NED^FK Fn() JXHC PCTFTUEEO_, EO R EOROS RCMFCEBU OEC OJaKRHUEC OBDMXBO_. *HK
[UMUSUEEXY DHCQQC FHF EURFMBNCH\EXY `NED^FF ]BO QLUHCB\ EUH\PK. 5UMUOJaKRHUEFU [UMUSUEEO_ FHF
EURFMBNCH\EO_ `NED^FF QDMXRCUB [MOBOBF[ FP JCPOROGO DHCQQC.
class Foo {
private:
int x;
public:
void Fn();
};
class Bar : public Foo {
private:
int x; // G*'7$% 5"7"2"(($% ) *"2 1" /2"("2
public:
void Fn(); // G*'7$% @3(&B/%
};
// G &#/"(*)&'? 57'87$22"
Bar *b = new Bar;
b->Fn(); // G<-<4$"* Bar::Fn()
Foo* f = b; // 9'1(', 5'*'23 .*' Foo '*&7<*<? ;$-'4<? &#$))
f->Fn(); // G<-<4$"* Foo::Fn()
.NTUQBRNIB LRU MCPEXU [UMUSUEEXU Q OLEFS HODCH\EXS FSUEUS C. # OJHCQBF LU_QBRFK Foo
QFSROHFWUQDOU FSK C OPECWCUB Foo::C. # OJHCQBF LU_QBRFK Bar QFSROHFWUQDOU FSK C OPECWCUB G$r::C.
0OEUWEO, LHK OBDMXBO_ FHF PCTFTUEEO_ [UMUSUEEO_ C ]BO RXPORUB EURUMOKBENI [NBCEF^N, EO LHK
PCDMXBO_ [UMUSUEEO_ [OLOJEO_ LRNQSXQHUEEOQBF EU JNLUB. 5MFSUM Fn() [ODCPXRCUB, DCDO_ YCOQ
ROPEFDCUB [MF QDMXBFF OBDMXBO_ FHF PCTFTUEEO_ `NED^FF DHCQQC. 5MF [O[XBDU QDMXB\ OBDMXBNI FHF
PCTFTUEENI `NED^FI YOMOVF_ DOS[FHKBOM C++ RXLCUB [MULN[MUZLUEFU.
Bupurocfu neperpyeuuux u eupfyanuuux qyukuu knacca
%QHF R JCPOROS DHCQQU `NED^FK OJaKRHUEC EURFMBNCH\EO_, [MURMCTCB\ UU R RFMBNCH\ENI R [MOFPROLEOS
DHCQQU EU MUDOSUELNUBQK. )EC [ORULUB QUJK EU BCD, DCD RFMBNCH\ECK `NED^FK, F JUPECLUZEO PC[NBCUB
WFBCBUHU_ RCVU_ [MOGMCSSX. $O EC QFBNC^FI SOZEO RPGHKENB\ F [OL LMNGFS NGHOS. 4LFRFBUH\EO, EO
`CDB DHIWUROU QHORO virtual OJKPCEO [MFQNBQBRORCB\ BOH\DO R JCPOROS DHCQQU. %QHF OEO
3.
[MO[NTUEO R [MOFPROLEOS DHCQQU, DOS[FHKBOM LOHZUE FEBUM[MUBFMORCB\ RUMQFI `NED^FF R
[MOFPROLEOS DHCQQU BCD, QHOREO OEC F BCS JXHC OJaKRHUEC RFMBNCH\EO_. & HIJHI ECPXRCB\ [OLOJENI
HOGFDN MCJOBX DOS[FHKBOMC DWIMNIS: Do what I mean, not what I say (*UHC_ BO, WBO K
[OLMCPNSURCI, C EU BO, WBO K GOROMI). 0CD [MCRFHO, R C++ ]BC HOGFDC ECWFQBO OBQNBQBRNUB, [O]BOSN UU
MULDFU [MOKRHUEFK (DCD R LCEEOS QHNWCU) QSOBMKBQK EUUQBUQBRUEEO. # QHULNITUS [MFSUMU LHK OJOFY
NDCPCBUHU_ JNLUB RXPRCEC `NED^FK Bar::Fn():
class Foo {
public:
virtual void Fn();
};
class Bar {
public:
void Fn(); // G)" 7$4(' )./*$"*)% 4/7*3$#,('?
};
Bar* b = new Bar;
b->Fn(); // G<-<4$"* Bar::Fn()
Foo* f = b;
f->Fn(); // A$&1" 4<-<4$"* Bar::Fn()
5OLOJEXU QFBNC^FF EUZUHCBUH\EX [O LRNS [MFWFECS. #O-[UMRXY, DOS[FHKBOM SOZUB EU[MCRFH\EO
FEBUM[MUBFMORCB\ FY, F BOGLC R [OQHULEU_ QBMODU JNLUB RXPRCEC `NED^FK Foo::Fn(). #O-RBOMXY, RCVF
DOHHUGF EF PC WBO EU MCPJUMNBQK, [OWUSN R OLEOS SUQBU `NED^FK Fn() RFMBNCH\ECK, C R LMNGOS EUB.
5OQHU JUQQOEEO_ EOWF OEF SOGNB NQBMOFB\ [OGMOS R DOEBOMU.
%QHF R [MOFPROLEOS DHCQQU QOPLCUBQK `NED^FK Q BUS ZU FSUEUS, EO Q LMNGO_ QFGECBNMO_, OEC QDMXRCUB
&.# QFGECBNMX JCPOROGO DHCQQC LHK LCEEO_ `NED^FF, EO BOH\DO R OJHCQBF LU_QBRFK [MOFPROLEOGO DHCQQC.
5OEKBEO? $UB? 1BO Z, RX EU OLFEODF.
class Foo {
public:
virtual void Fn();
virtual void Fn(char*);
};
class Bar {
public:
virtual void Fn(int); // 9'1(', (' (" 1"#$*"#,('
};
#UMOKBEO, SEOGFU EORFWDF-[MOGMCSSFQBX LO[OPLEC PCQFZFRCHFQ\ EC MCJOBU, [XBCKQ\ MCPOJMCB\QK R
[MOFQYOLKTUS. - [MOFQYOLFB QHULNITUU:
5MF [O[XBDU RXPRCB\ Fn() WUMUP G$r* LOQBN[EO_ JNLUB HFV\ OLEC QFGECBNMC, void Fn(int).
)JU RUMQFF JCPOROGO DHCQQC QDMXBX F EULOQBN[EX WUMUP Bar*.
5MF [MUOJMCPORCEFF Bar* R Foo* QBCEORKBQK LOQBN[EXSF OJU QFGECBNMX, OJaKRHUEEXU R Foo,
EO EU QFGECBNMC void Fn(int). 8OHUU BOGO, ]BO EU [UMUO[MULUHUEFU, [OQDOH\DN QFGECBNMC
Bar::Fn() OBHFWCUBQK OB RUMQFF JCPOROGO DHCQQC. *MNGFSF QHORCSF, DHIWUROU QHORO virtual
EFDCD EU RHFKUB EC MCJOBN ]BOGO `MCGSUEBC.
%QHF RCS DOGLC-EFJNL\ PCYOWUBQK QLUHCB\ EUWBO [OYOZUU, RQBCE\BU Q DMUQHC, SULHUEEO [MOGNHK_BUQ\
RODMNG LOSC, QLUHC_BU GHNJODF_ RLOY, QKL\BU PC DOS[\IBUM F [MFLNSC_BU WBO-EFJNL\ LMNGOU. %QHF NZ
[UMUGMNZCB\, BO [UMUGMNZC_BU RQU QFGECBNMX `NED^FF. $FDOGLC EU [UMUGMNZC_BU WCQB\ QFGECBNM F
EFDOGLC EU LOJCRHK_BU EORXU QFGECBNMX R [MOFPROLEX_ DHCQQ JUP [UMUO[MULUHUEFK RQUY QFGECBNM
`NED^FF JCPOROGO DHCQQC. %QHF ]BO [ODCZUBQK QHFVDOS QHOZEXS, PC[OSEFBU YOMOVUU [MCRFHO: DOGLC
[MF WBUEFF [MOGMCSSX ROPEFDCIB RO[MOQX, RUMOKBEO, RCVU MUVUEFU EUNLCWEOU.
32
pysun
'IJO_ DHCQQ SOZUB OJaKRFB\ WBO-EFJNL\ QROFS LMNGOS (friend). *MNP\K DOS[FHFMNIBQK OJXWEXS
OJMCPOS, PC FQDHIWUEFUS BOGO, WBO RQU PCTFTUEEXU F PCDMXBXU WHUEX LMNZUQBRUEEOGO DHCQQC RFLEX
BCD, QHOREO LMNG KRHKUBQK `NED^FU_ ]BOGO DHCQQC. *MNP\KSF SOZEO OJaKRHKB\ `NED^FF DCD
GHOJCH\EXU, BCD F WHUEX DHCQQOR. 0HCQQX BOZU SOGNB OJaKRHKB\QK LMNP\KSF LMNGFY DHCQQOR; R ]BOS
QHNWCU RO RQUY `NED^FKY DHCQQC-LMNGC RFLEX RQU WHUEX BOGO DHCQQC, LMNGOS DOBOMOGO OE KRHKUBQK.
class Foo;
class BarBar {
public:
int Fn(Foo*);
};
class Foo {
friend void GlobalFn(); // :731")*4"((<" 8#';$#,(<" @3(&B//
friend class Bar; // :731")*4"((<? &#$))
friend int BarBar::Fn(Foo*); // :731")*4"(($% @3(&B/% &#$))$
friend class DoesNotExist; // F2. +/1"
private:
int x;
struct ListNode {
ListNode* next;
void* datum;
ListNode() : next(NULL), datum(NULL) {}
} head;
protected:
int y;
public:
void G();
};
void GlobalFn()
{
Foo* f = new Foo;
f->x = 17; // O$-7"M$"*)% /---$ 0731")&/C '*('M"(/?
}
class Bar {
private:
Foo* f;
public:
Bar() : f(new Foo) {}
void WalkList();
};
void Bar::WalkList()
{
Foo::ListNode* n = f->head.next;
for (; n != NULL; n = n->next)
cout << n->datum << endl;
}
int BarBar::Fn(Foo* f)
{
return f->x;
}
33
*MNPU_ [MFEKBO OJaKRHKB\ QECWCHC, [UMUL WHUECSF DHCQQC F [UMUL DHIWURXSF QHORCSF public,
protected F private. 3BO OJaKQEKUBQK BUS, WBO EC LMNPU_ EU LU_QBRNIB OJXWEXU CBMFJNBX
RFLFSOQBF; EUWBO HFJO KRHKUBQK LMNGOS, HFJO EU KRHKUBQK. #UQ\ `MCGSUEB [MOGMCSSX [OQHU
O[MULUHUEFK DHCQQC Foo R[OHEU LO[NQBFS. *MNP\K FSUIB LOQBN[ DO RQUS WHUECS Foo, RDHIWCK
PCDMXBXU. # ]BOS [MFSUMU UQB\ OLEC LU_QBRFBUH\EO FEBUMUQECK QBMODC BC, R DOBOMO_ LMNGOS OJaKR-
HKUBQK EUQNTUQBRNITF_ DHCQQ DoesNotExist. 0CD EF QBMCEEO, OEC EU RXPORUB EF [MULN[MUZLUEFK, EF
OVFJDF DOS[FHKBOMC. )JaKRHUEFK LMNPU_ FGEOMFMNIBQK EC SOSUEB DOS[FHK^FF Foo. )EF
FQ[OH\PNIBQK HFV\ BOGLC, DOGLC JNLUB DOS[FHFMORCB\QK LMNG. *CZU DOGLC LMNGC EU QNTUQBRNUB,
DOS[FHKBOM OQBCUBQK R QWCQBHFROS EURULUEFF.
Tunu u onepafopu
+USX, MCQQSCBMFRCUSXU R ]BOS MCPLUHU, EC [UMRX_ RPGHKL EU DCZNBQK JHFPDFSF, OLECDO RQU OEF
RMCTCIBQK RODMNG OJTU_ DOE^U[^FF CJQBMCDBEXY BF[OR LCEEXY.
Koucfpykfopu
0OEQBMNDBOM SOZEO MCQQSCBMFRCB\ LROKDO DCD `NED^FI, FEF^FCHFPFMNITNI OJaUDB, FHF, Q
[OPF^F_ SCBUSCBFDF, DCD OBOJMCZUEFU CMGNSUEBOR DOEQBMNDBOMC EC LOSUE DHCQQC. & [MUL[OWFBCI
RBOMO_ [OLYOL, [OQDOH\DN OE [OSOGCUB MCPOJMCB\QK Q EUDOBOMXSF KPXDORXSF QMULQBRCSF (EC[MFSUM,
O[UMCBOMCSF [MUOJMCPORCEFK).
. DOEQBMNDBOMCSF QRKPCEX OWUE\ QHOZEXU [MCRFHC, EO DCZLX_ [MOGMCSSFQB C++ LOHZUE LOQDOECH\EO
PECB\ FY, FECWU SFEFSNS BMF EOWF R GOLN USN [MFLUBQK [MOROLFB\ PC OBHCLDO_.
Koucfpykfopu es apryreufoe
%QHF R RCVUS DHCQQU FSUUBQK DOEQBMNDBOM, DOBOMX_ RXPXRCUBQK JUP CMGNSUEBOR, OE FQ[OH\PNUBQK [O
NSOHWCEFI R BMUY QHULNITFY QHNWCKY.
class Foo {
public:
Foo();
};
class Bar : public Foo { // 1. P$-'4<? &#$))
public:
Bar();
};
class BarBar {
private:
Foo f; // 2. ="7"2"(($% &#$))$
};
Foo f; // 3. F'-0$((<? Q&-"25#%7 Foo
Foo* f1 = new Foo; // 3. A' 1", .*' / 57"0<03K$% )*7'&$
%QHF R Q[FQDU FEF^FCHFPC^FF WHUEOR (QS. QHULNITF_ MCPLUH) DOEQBMNDBOMC Bar EU NDCPCE DCDO_-
EFJNL\ LMNGO_ DOEQBMNDBOM Foo, BO [MF DCZLOS QOPLCEFF ]DPUS[HKMC G$8 JNLUB RXPXRCB\QK
DOEQBMNDBOM Foo JUP CMGNSUEBOR. -ECHOGFWEO, UQHF f OBQNBQBRNUB R Q[FQDU FEF^FCHFPC^FF WHUEOR
DOEQBMNDBOMC BarBar, JNLUB FQ[OH\PORCE DOEQBMNDBOM Foo JUP CMGNSUEBOR. $CDOEU^, [MF DCZLOS
QOPLCEFF ]DPUS[HKMC Foo JUP NDCPCEFK DOEQBMNDBOMC [O NSOHWCEFI FQ[OH\PNUBQK DOEQBMNDBOM JUP
CMGNSUEBOR.
Koucfpykfopu c apryreufaru
0OEQBMNDBOMX, DCD F RQU OQBCH\EXU `NED^FF, SOZEO [UMUGMNZCB\. #X SOZUBU OJaKRFB\ QBOH\DO
QFGECBNM DOEQBMNDBOMOR, QDOH\DO RCS [OBMUJNUBQK. %LFEQBRUEEOU ECQBOKTUU OBHFWFU SUZLN
QFGECBNMCSF DOEQBMNDBOMOR F OJXWEXY `NED^F_ PCDHIWCUBQK R BOS, WBO DOEQBMNDBOMX EU FSUIB
ROPRMCTCUSOGO PECWUEFK F EU SOGNB OJaKRHKB\QK DOEQBCEBEXSF. %QHF RX OJaKRFBU DCDFU-HFJO
34
DOEQBMNDBOMX Q CMGNSUEBCSF, EO EU OJaKRFBU DOEQBMNDBOMC JUP CMGNSUEBOR, BO DOS[FHKBOM EU [OPROHFB
DOEQBMNFMORCB\ OJaUDBX ]BOGO DHCQQC, LCZU R DCWUQBRU JCPOROGO LHK LMNGOGO DHCQQC, Q FQ[OH\PORCEFUS
DOEQBMNDBOMC JUP CMGNSUEBOR.
class Foo {
public:
Foo(char*);
};

Foo f; // +"#,-% ("* &'()*73&*'7$ ;"- $7832"(*'4!
class Bar : public Foo {
public:
Bar();
};
Bar::Bar()
{
// LM/;&$! +"* &'()*73&*'7$ Foo ;"- $7832"(*'4
}
Cnucku uuuuuanusauuu neuoe
1BOJX FPJCRFB\QK OB ]BO_ [MOJHUSX, R C++ ECYOLFBQK OWUMULEOU [MFSUEUEFU QFSROHN : LHK
QOPLCEFK Q[FQDOR FEF^FCHFPC^FF WHUEOR. +CD ECPXRCUBQK Q[FQOD Q[U^F`FDC^F_ DOEQBMNDBOMOR,
MCPLUHUEEXY PCEKBXSF F MCQ[OHOZUEEXY SUZLN QFGECBNMO_ DOEQBMNDBOMC F UGO BUHOS.
class Foo {
public:
Foo(char*);
};
class Bar : public Foo {
public:
Bar(char*);
};
class BarBar {
private:
Foo f;
int x;
public:
BarBar();
};
Bar::Bar(char* s) : Foo(s) {...}
BarBar::BarBar : f(Hello), x(17) {...}
# DOEQBMNDBOMU Bar Q[FQOD FEF^FCHFPC^FF WHUEOR FQ[OH\PNUBQK LHK FEF^FCHFPC^FF JCPOROGO DHCQQC
Foo. 0OS[FHKBOM RXJFMCUB FQ[OH\PNUSX_ DOEQBMNDBOM EC OQEORCEFF QFGECBNMX, O[MULUHKUSO_ [O
`CDBFWUQDFS CMGNSUEBCS. 5MF OBQNBQBRFF Q[FQDC FEF^FCHFPC^FF WHUEOR QDOEQBMNFMORCB\ Bar JXHO JX
EUROPSOZEO, [OQDOH\DN DOS[FHKBOM EU SOG JX O[MULUHFB\, DCDOU PECWUEFU LOHZEO [UMULCRCB\QK
DOEQBMNDBOMN JCPOROGO DHCQQC Foo. # DOEQBMNDBOMU BarBar Q[FQOD FEF^FCHFPC^FF WHUEOR
FQ[OH\PORCHQK LHK FEF^FCHFPC^FF (BO UQB\ RXPORC DOEQBMNDBOMOR) [UMUSUEEXY f F C. # QHULNITUS
RCMFCEBU DOEQBMNDBOM MCJOBCUB EU QBOH\ ]``UDBFREO (UQHF BOH\DO DOS[FHKBOM EU OBHFWCUBQK
QRUMYaUQBUQBRUEEXS FEBUHHUDBOS):
BarBar::BarBar() : f(Hello)
{
x = 17;
}
35
#O RBOMOS RCMFCEBU [UMUSUEECK Y QECWCHC FEF^FCHFPFMNUBQK PECWUEFUS 0 (QBCELCMBEOU BMUJORCEFU
C++) Q FQ[OH\PORCEFUS [O NSOHWCEFI DOEQBMNDBOMC int JUP CMGNSUEBOR, C PCBUS R BUHU DOEQBMNDBOMC
U_ [MFQRCFRCUBQK PECWUEFU /7. # [UMROS RCMFCEBU FSUUBQK RQUGO OLEC FEF^FCHFPC^FK F [OBOSN
]DOEOSFBQK OLFE-LRC SCVFEEXY BCDBC. # LCEEOS [MFSUMU ]BO EUQNTUQBRUEEO, [OQDOH\DN [UMUSUEECK
C ^UHCK, EO UQHF JX OEC OBEOQFHCQ\ D JOHUU QHOZEOSN DHCQQN Q DOEQBMNDBOMOS JUP CMGNSUEBOR F
[UMUGMNZUEEXS O[UMCBOMOS [MFQRCFRCEFK, BO MCPEF^C JXHC JX R[OHEU OTNBFSC.
.[FQDF FEF^FCHFPC^FF WHUEOR ENZEX BCS, GLU N JCPOROGO DHCQQC FHF [UMUSUEEO_ EUB DOEQBMNDBOMC JUP
CMGNSUEBOR (BOWEUU, UQB\ OLFE F JOHUU DOEQBMNDBOM Q CMGNSUEBCSF, EO EUB EF OLEOGO O[MULUHUEEOGO
[OH\PORCBUHUS DOEQBMNDBOMC JUP CMGNSUEBOR). .[FQDF FEF^FCHFPC^FF WHUEOR EU OJKPCBUH\EX R BUY
QFBNC^FKY, DOGLC RQU JCPORXU DHCQQX F [UMUSUEEXU DHCQQC HFJO EU FSUIB DOEQBMNDBOMOR, HFJO FSUIB
[OH\PORCBUH\QDF_ DOEQBMNDBOM JUP CMGNSUEBOR.
Ropnpok eusoea koucfpykfopoe
%QHF DHCQQ EU QOLUMZFB QOJQBRUEEXY DOEQBMNDBOMOR, OE FEF^FCHFPFMNUBQK BCD, QHOREO DOS[FHKBOM
QOPLCH DOEQBMNDBOM JUP CMGNSUEBOR PC RCQ. 3BOB DOEQBMNDBOM RXPXRCUB DOEQBMNDBOMX JUP CMGNSUEBOR
JCPORXY DHCQQOR F [UMUSUEEXY DHCQQC. 1UBDO O[MULUHUEEX_ [OMKLOD RXPORC DOEQBMNDBOMOR EU PCRFQFB
OB BOGO, FQ[OH\PNIBQK DOEQBMNDBOMX QBCELCMBEXU FHF [UMUGMNZUEEXU, Q CMGNSUEBCSF FHF JUP:
/. .ECWCHC RXPXRCIBQK DOEQBMNDBOMX JCPORXY DHCQQOR R [OMKLDU FY [UMUWFQHUEFK R Q[FQDU
ECQHULORCEFK (UTU OLFE Q[FQOD, R DOBOMOS [OQHU QFSROHC : [UMUWFQHKIBQK JCPORXU DHCQQX,
MCPLUHUEEXU PC[KBXSF).
2. "CBUS RXPXRCIBQK DOEQBMNDBOMX [UMUSUEEXY DHCQQC R [OMKLDU FY OJaKRHUEFK R OJaKRHUEFF
DHCQQC.
3. 5OQHU BOGO DCD JNLNB QDOEQBMNFMORCEX RQU JCPORXU DHCQQX F [UMUSUEEXU, RX[OHEKUBQK BUHO
RCVUGO DOEQBMNDBOMC.
)[FQCEEX_ [OMKLOD [MFSUEKUBQK MUDNMQFREO, BO UQB\ [UMRXS DOEQBMNFMNUBQK [UMRX_ JCPORX_ DHCQQ
[UMROGO JCPOROGO DHCQQC... F B. L. )E EU PCRFQFB OB [OMKLDC, NDCPCEEOGO R Q[FQDU FEF^FCHFPC^FF WHUEOR.
%QHF JX LUHO OJQBOKHO FECWU, LHK MCPEXY [UMUGMNZUEEXY DOEQBMNDBOMOR SOG JX FQ[OH\PORCB\QK
MCPEX_ [OMKLOD DOEQBMNFMORCEFK. +OGLC DOS[FHKBOMN JXHO JX BMNLEO GCMCEBFMORCB\, WBO LUQBMNDBOMX
JNLNB RXPXRCB\QK R [OMKLDU, OJMCBEOS [OMKLDN RXPORC DOEQBMNDBOMOR.
Koucfpykfopu konu
0OEQBMNDBOM DO[F_ (copy constructor) O[MULUHKUBQK Q[U^FCH\EO_ QFGECBNMO_:
class Foo {
public:
Foo(const Foo&);
};
Foo::Foo(const Foo& f)...
0OEQBMNDBOM DO[F_ [MULECPECWUE LHK QOPLCEFK DO[F_ OJaUDBOR. 3BC PCLCWC SOZUB ROPEFDENB\ R QCSXY
MCPEXY OJQBOKBUH\QBRCY.
void Fn(Foo f) {...}
void Gn(Foo& f) {...}
Foo f;
Foo f1(f);
Foo f2 = f; // I'()*73/7'4$(/", $ (" 57/)4$/4$(/"!
Fn(f); // G<-<4$"* &'()*73&*'7 &'5/? 0#% 5"7"0$./ 5' ($-($."(/>
const Foo f3;
Gn(f3); // I'()*73&*'7 &'5/? /)5'#,-3"*)%
// 0#% )'-0$(/% ("&'()*$(*('? &'5//
*CRC_BU REFSCBUH\EO MCQQSOBMFS ]BOB `MCGSUEB. .BMODC Foo f1(f); QOPLCUB EORX_ ]DPUS[HKM DHCQQC
Foo, [UMULCRCK LMNGO_ ]DPUS[HKM DHCQQC Foo R DCWUQBRU CMGNSUEBC. 3BO RQUGLC SOZEO QLUHCB\, UQHF
36
DHCQQ Foo EU QOLUMZFB WFQBO RFMBNCH\EXY `NED^F_. $U RCZEO, OJaKRFHF HF RX QRO_ QOJQBRUEEX_
DOEQBMNDBOM DO[F_; UQHF EUB, DOS[FHKBOM [OQBMOFB UGO PC RCQ. $U RCZEO, UQB\ HF R Foo LMNGFU
[OH\PORCBUH\QDFU DOEQBMNDBOMX; R OBHFWFU OB DOEQBMNDBOMOR JUP CMGNSUEBOR, DOEQBMNDBOM DO[F_
LOQBN[UE &.#7)+.
.BMODC Foo f2 = f RXGHKLFB DCD [MFQRCFRCEFU FP-PC [MFQNBQBRFK O[UMCBOMC =, EO EC QCSOS LUHU ]BO
CH\BUMECBFREX_ RCMFCEB RXPORC DOEQBMNDBOMC DO[F_. 1BOJX [OEKB\, WUS [MFQRCFRCEFU OBHFWCUBQK OB
FEF^FCHFPC^FF, Q[MOQFBU QUJK: 8XH HF OJaUDB QDOEQBMNFMORCE PCMCEUU FHF ZU UGO QOPLCEFU KRHKUBQK
WCQB\I DOSCELX? %QHF OJaUDB NZU QNTUQBRNUB, RX FSUUBU LUHO Q [MFQRCFRCEFUS. %QHF OE QOPLCUBQK EC
SUQBU, DCD R [CVUS [MFSUMU, FQ[OH\PNUBQK DOEQBMNDBOM DO[F_.
5MF RXPORU `NED^FF Fn() [MOFQYOLFB [UMULCWC [O PECWUEFI DO[FF Foo. 0OEQBMNDBOM DO[F_
FQ[OH\PNUBQK LHK QOPLCEFK RMUSUEEO_ DO[FF, QNTUQBRNITU_ HFV\ RO RMUSK RX[OHEUEFK Fn(). 5OQHU
]BOGO RXPXRCUBQK LUQBMNDBOM DO[FF, DOBOMX_ NEFWBOZCUB UU.
#XPOR `NED^FF Gn(), RUMOKBEO, OVFJOWUE, F YOMOVF_ DOS[FHKBOM [MOWFBCUB RCS QNMORNI EOBC^FI O
QBFHU [MOGMCSSFMORCEFK EC C++ WBO-EFJNL\ RMOLU:
.OPLCUBQK RMUSUEECK EUDOEQBCEBECK DO[FK [ONWFQ\ [MOGMCSSFMORCB\, BN[F^C! 5O DMC_EU_ SUMU,
QO ,*%3 DOS[FHKBOMX OJXWEO [OQBN[CIB FSUEEO BCD. 5MOJHUSC PCDHIWCUBQK R BOS, WBO CMGNSUEB
[UMULCUBQK [O QQXHDU, OLECDO `CDBFWUQDF_ CMGNSUEB KRHKUBQK DOEQBCEBEXS, C `OMSCH\EX_ EUB. #QU
FPSUEUEFK CMGNSUEBC RENBMF Gn() REOQKBQK R DO[FI, C EU R OMFGFECH.
# QOPLCRCUSOS DOS[FHKBOMOS DOEQBMNDBOMU DO[F_ [O NSOHWCEFI FQ[OH\PNUBQK QBMOGO O[MULUHUEECK
[OQHULORCBUH\EOQB\ RXPORC DOEQBMNDBOMOR DO[F_ JCPORXY DHCQQOR F [UMUSUEEXY DHCQQC.
/. 0OEQBMNDBOMX DO[F_ JCPORXY DHCQQOR RXPXRCIBQK R BOS [OMKLDU, R DOBOMOS OEF OJaKRHUEX R
Q[FQDU ECQHULORCEFK.
2. 0OEQBMNDBOMX DO[F_ [UMUSUEEXY RXPXRCIBQK R BOS [OMKLDU, R DOBOMOS OEF OJaKRHUEX R
OJaKRHUEFF DHCQQC.
)[FQCEEX_ [OMKLOD [MFSUEKUBQK MUDNMQFREO, BO UQB\ [UMRXS DO[FMNUBQK [UMRX_ JCPORX_ DHCQQ
[UMROGO JCPOROGO DHCQQC... F B. L. "RNWFB PECDOSO, EU [MCRLC HF? +OB ZU [OMKLOD, WBO F LHK HIJOGO
LMNGOGO DOEQBMNDBOMC.
. DOEQBMNDBOMCSF DO[F_, R OBHFWFU OB RQUY OQBCH\EXY, DOS[FHKBOM RULUB QUJK GOMLO F MUREFRO. %QHF
RX [UMUGMNPFBU DOEQBMNDBOM DO[F_ LHK EUDOBOMOGO DHCQQC, DOS[FHKBOM, `FGNMCH\EO RXMCZCKQ\,
NSXRCUB MNDF F OB[MCRHKUBQK LOSO_. 5MF OBQNBQBRFF KREOGO RXPORC DOEQBMNDBOMOR DO[F_ JCPORXY
DHCQQOR F [UMUSUEEXY DHCQQC R Q[FQDU FEF^FCHFPC^FF WHUEOR RCVUGO QOJQBRUEEOGO DOEQBMNDBOMC
DO[F_ DOS[FHKBOM JNLUB FQ[OH\PORCB\ $%*."68$"%6 /#9 +678,#*"%& LHK FEF^FCHFPC^FF JCPORXY
DHCQQOR F [UMUSUEEXY.
class Foo {...};
class Bar : public Foo {
private:
Foo f;
public:
Bar(const Bar&);
};
// G"7'%*(', 'M/;&$
Bar::Bar(const Bar& b)
{
// F*'5! +"* )5/)&$ /(/B/$#/-$B// .#"('4
// P303* /)5'#,-'4$(< &'()*73&*'7< ;"- $7832"(*'4
// ;$-'4'8' &#$))$ / 5"7"2"(('?
}
// G"7'%*(', 'M/;&/ ("*
Bar::Bar(const Bar& b) : Foo(b), f(b.f) {...}
37
0OS[FHKBOM OWUE\ QFH\EO OJFLFBQK EC [UMRX_ DOEQBMNDBOM DO[F_ BCD QFH\EO, WBO OE Q[NQBFB RCVU
[MOFPRULUEFU R SNQOMO[MOROL F LCZU EU QOOJTFB OJ ]BOS. *HK FEF^FCHFPC^FF JCPOROGO DHCQQC F
[UMUSUEEO_ JNLUB FQ[OH\PORCE DOEQBMNDBOM Foo JUP CMGNSUEBOR. # 99 QHNWCKY FP /00 ]BO QORQUS EU BO,
WUGO RX LOJFRCHFQ\; OJXWEO BMUJNUBQK, WBOJX JCPORXU DHCQQX F [UMUSUEEXU BOZU DO[FMORCHFQ\.
#UMOKBEO, RBOMO_ RCMFCEB [MCRFHUE. 8CPORX_ DHCQQ F [UMUSUEECK [MFQNBQBRNIB R Q[FQDU
FEF^FCHFPC^FF WHUEOR, [O]BOSN JNLNB RXPRCEX FY DOEQBMNDBOMX DO[F_ (DOS[FHKBOM [MUOJMCPNUB b D
BF[N Foo R RXMCZUEFF Foo(b)).
# EUDOBOMXY QFBNC^FKY RCQ FEBUMUQNUB FSUEEO [ORULUEFU DOS[FHKBOMC [O NSOHWCEFI. # DCWUQBRU
[MFSUMC MCQQSOBMFS QHULNITF_ JCPORX_ DHCQQ, DOBOMX_ [MFQRCFRCUB NEFDCH\EX_ QUMF_EX_ EOSUM
DCZLOSN [MOFPROLEOSN OJaUDBN.
class Serialized {
private:
static int NextSerialNumber;
int serialNumber;
public:
Serialized(const Serialized&);
Serialized();
int SerialNumber();
};
// G Serialized.cpp
int Serialized::NextSerialNumber = 0;
Serialized::Serialized() : serialNumber(NextSerialNumber++)
{
}
Serialized::Serialized(const Serialized&) : serialNumber(NextSerialNumber++)
{
}
int Serialized::SerialNumber()
{
return serialNumber;
}
$ac EU FEBUMUQNUB, DCDO_ DOEQBMNDBOM JUP CMGNSUEBOR FHF DO[F_ RXJUMUB DOS[FHKBOM RO RMUSK
DOS[FHK^FF [MOFPROLEOGO DHCQQC, [OQDOH\DN SX [UMUGMNPFHF OJC DOEQBMNDBOMC, F OEF LUHCIB OLEO F
BO ZU.
3akpufue u saueuuue koucfpykfopu
0OEQBMNDBOMX WCQBO OJaKRHKIBQK PCDMXBXSF F PCTFTUEEXSF, WBOJX [OH\PORCBUHF EU SOGHF QOPLCRCB\
]DPUS[HKMX DHCQQC. %QHF DOEQBMNDBOM OJaKRHUE PCDMXBXS; BOH\DO OJXWEXU F QBCBFWUQDFU `NED^FF
DHCQQC SOGNB QOPLCRCB\ QBUDORXU ]DPUS[HKMX DHCQQC FHF FQ[OH\PORCB\ UGO R O[UMCBOMU new ([O DMC_EU_
SUMU, Q LCEEXS DOEQBMNDBOMOS). %QHF DOEQBMNDBOM OJaKRHUE PCTFTUEEXS, [OH\PORCBUH\ SOZUB
QOPLCRCB\ ]DPUS[HKMX JCPOROGO DHCQQC, [OQDOH\DN DOEQBMNDBOM JCPOROGO DHCQQC SOZUB RXPXRCB\QK FP
DOEQBMNDBOMC [MOFPROLEOGO DHCQQC. 5NQB\ LHK ]BOGO [OBMUJNUBQK EUDOBOMOU ROOJMCZUEFU, EO QUSCEBFDC
FSUEEO BCDORC. 4 ]BO_ HOGFDF UQB\ OLFE EULOQBCBOD - OEC EU QORQUS ECLUZEC. %QHF DOEQBMNDBOM
PCTFTUE, HIJCK `NED^FK JCPOROGO FHF [MOFPROLEOGO DHCQQC (RDHIWCK QBCBFWUQDFU) SOZUB QOPLCB\
]DPUS[HKM JCPOROGO DHCQQC.
class Foo {
protected:
Foo();
};

38
class Bar : public Foo {
public:
Foo* Fn();
};
Foo Bar::Fn()
{
return new Foo; // O$;'*$"* 4'57"&/ 4)"2 4$M/2 3)/#/%2
}
#OPSOZEO, RX [OHCGCHF, WBO Foo CJQBMCDBEX_ JCPORX_ DHCQQ F UGO ]DPUS[HKMX QOPLCB\ EUROPSOZEO.
)DCPXRCUBQK, EFWUGO [OLOJEOGO! # QFQBUSU PCTFBX OBDMXRCUBQK PFKITCK LXMC. *MNP\K DHCQQOR Foo F
Bar BOZU SOGNB QOPLCRCB\ ]DPUS[HKMX Foo. %LFEQBRUEEX_ ZUHUPEX_ Q[OQOJ, DOBOMX_ QBO[MO^UEBEO
GCMCEBFMNUB EUROPSOZEOQB\ QOPLCEFK ]DPUS[HKMOR DHCQQC RDHIWUEFU R EUGO YOBK JX OLEO_ WFQBO
RFMBNCH\EO_ `NED^FF.
Auouuruue sksernnnpu
-EOEFSEXS ]DPUS[HKMOS (anonymous instance) ECPXRCUBQK OJaUDB, DOBOMX_... R[MOWUS, QU_WCQ NRFLFBU.
struct Point {
int X;
int Y;
Point(int x, int y) : X(x), Y(y) {}
};
double distance(Point p)
{
return sqrt(double(p.X) * double(p.X) + double(p.Y) * double(p.Y));
}
double d = distance(Point(17, 29));
-MGNSUEB `NED^FF distance() [MULQBCRHKUB QOJO_ CEOEFSEX_ ]DPUS[HKM. 6X EU QOPLCHF [UMUSUEEO_
LHK UGO YMCEUEFK. -EOEFSEX_ ]DPUS[HKM QNTUQBRNUB HFV\ RO RMUSK RXWFQHUEFK RXMCZUEFK, R DOBOMOS
OE RQBMUWCUBQK.
-EOEFSEXU ]DPUS[HKMX OJXWEO QRKPXRCIBQK Q [MOQBXSF QBMNDBNMCSF RMOLU Point, EO FY SOZEO
FQ[OH\PORCB\ LHK HIJOGO DHCQQC.
Huuuuanusauun rnoanuuux oLekfoe
# Q[U^F`FDC^FF KPXDC [OMKLOD DOEQBMNFMORCEFK GHOJCH\EXY OJaUDBOR RXGHKLFB LOROH\EO QHOZEO.
%QHF ZU NWUQB\ [MFWNLX DOSSUMWUQDFY DOS[FHKBOMOR C++, ]BOB [OMKLOD QBCEORFBQK F RORQU
EU[MULQDCPNUSXS. # QOOBRUBQBRFF QO Q[U^F`FDC^FU_ LOHZEX RXPXRCB\QK DOEQBMNDBOMX GHOJCH\EXY
OJaUDBOR, RDHIWCK DOEQBMNDBOMX QBCBFWUQDFY [UMUSUEEXY DHCQQOR F QBMNDBNM, OLECDO SEOGFU
DOS[FHKBOMX ]BOGO EU LUHCIB. %QHF RCS [ORUPHO F RCV DOS[FHKBOM QWFBCUB, WBO DOEQBMNDBOMX RCZEX
LHK GHOJCH\EXY [UMUSUEEXY, [OMKLOD DOEQBMNFMORCEFK GHOJCH\EXY OJaUDBOR PCRFQFB OB ROOJMCZUEFK
MCPMCJOBWFDC DOS[FHKBOMC. $FZU [UMUWFQHUEX EUDOBOMXU [MCRFHC, DOBOMXU BUOMUBFWUQDF LOHZEX
QOJHILCB\QK:
/. 5UMUL RX[OHEUEFUS DCDFY-HFJO O[UMC^F_ RQU GHOJCH\EXU [UMUSUEEXU FEF^FCHFPFMNIBQK
PECWUEFUS 0.
2. )JaUDBX, ECYOLKTFUQK R GHOJCH\EXY QBMNDBNMCY FHF SCQQFRCY, DOEQBMNFMNIBQK R [OMKLDU FY
[OKRHUEFK R QBMNDBNMU FHF SCQQFRU.
3. 0CZLX_ GHOJCH\EX_ OJaUDB DOEQBMNFMNUBQK LO UGO [UMROGO FQ[OH\PORCEFK R [MOGMCSSU.
0OS[FHKBOM QCS MUVCUB, QHULNUB HF RX[OHEFB\ FEF^FCHFPC^FI LO RXPORC `NED^FF main() FHF
OBHOZFB\ UU LO [UMROGO FQ[OH\PORCEFK OJaUDBC.
39
4. ,HOJCH\EXU OJaUDBX, ECYOLKTFUQK R OLEOS SOLNHU BMCEQHK^FF (OJXWEO `C_HU Q
MCQVFMUEFUS .QMM), FEF^FCHFPFMNIBQK R [OMKLDU FY [OKRHUEFK R ]BOS SOLNHU. # QOWUBCEFF Q
[MCRFHOS 3 ]BO OPECWCUB, WBO FEF^FCHFPC^FK SOZUB RX[OHEKB\QK [O SOLNHKS, [MF [UMROS
FQ[OH\PORCEFF DCZLOGO SOLNHK.
#OB F RQU. #EUVEU [MOQBCK [OQHULORCBUH\EOQB\ GHOJCH\EXY OJaKRHUEF_ EC QCSOS LUHU [OHEOQB\I
[OLWFEKUBQK RQUS DC[MFPCS MCPMCJOBWFDC DOS[FHKBOMC. )EC SOZUB [MFRUQBF D ENZEOSN MUPNH\BCBN FHF
QGOMUB\ QFEFS [HCSUEUS.
// G @$?#" file1.cpp
Foo foo;
Foo* f = &foo;
// G @$?#" file2.cpp
extern Foo* f;
Foo f1(*f); // D)5'#,-3"*)% &'()*73&*'7 &'5/?
%QHF JX RQU ]BO ECYOLFHOQ\ R OLEOS FQYOLEOS `C_HU, QFBNC^FK JXHC JX EOMSCH\EO_. .O QBMODO_ F''*
f = &foo; [MOJHUS EU ROPEFDCUB, [OQDOH\DN GHOJCH\EXU OJaUDBX OLEOGO FQYOLEOGO `C_HC PCRULOSO
(YU-YU) FEF^FCHFPFMNIBQK R [OMKLDU FY O[MULUHUEFK. *MNGFSF QHORCSF, DOGLC [MOGMCSSC LOJUMUBQK LO
]BO_ QBMODF, OJaUDB foo NZU JNLUB QDOEQBMNFMORCE. +US EU SUEUU, EFDBO EU GCMCEBFMNUB, WBO
GHOJCH\EXU OJaUDBX R `C_HU file/.cpp JNLNB FEF^FCHFPFMORCEX MCE\VU GHOJCH\EXY OJaUDBOR R `C_HU
file2.QMM. %QHF file2.cpp JNLUB OJMCJCBXRCB\QK [UMRXS, f ODCPXRCUBQK MCREXS 0 (NULL EC JOH\VFEQBRU
DOS[\IBUMOR), F [MF [O[XBDU [OHNWFB\ [O EUSN OJaUDB RCVC [MOGMCSSC GUMOFWUQDF NSMUB.
'NWVF_ RXYOL QLUHCB\ BCD, WBOJX [MOGMCSSC EU MCQQWFBXRCHC EC DOEDMUBEX_ [OMKLOD
FEF^FCHFPC^FF `C_HOR .QMM. *HK ]BOGO FQ[OH\PNUBQK QBCELCMBEX_ [MFUS R PCGOHOROWEOS `C_HU .h
O[MULUHKUBQK GHOJCH\EX_ OJaUDB QO QBCBFWUQDO_ [UMUSUEEO_, QOLUMZCTU_ DOHFWUQBRO
FEF^FCHFPFMORCEEXY `C_HOR .QMM. 5MF [UMUYOLU OB 0 D / RXPXRCUBQK `NED^FK, DOBOMCK FEF^FCHFPFMNUB
RQU GHOJCH\EXU OJaUDBX JFJHFOBUWEOGO `C_HC .QMM. 5MF [UMUYOLU OB / D 0 RQU OJaUDBX ]BOGO `C_HC
NEFWBOZCIBQK.
// G @$?#" Library.h
class Library {
private:
static int count;
static void OpenLibrary();
static void CloseLibrary();
public:
Library();
~Library();
};
static Library LibraryDummy;
inline Library::Library()
{
if (count++ == 0)
OpenLibrary();
}
inline Library::~Library()
{
if (--count == 0)
CloseLibrary();
}
// G Library.cpp
int Library::count = 0; // :"#$"*)% 5"7"0 4<5'#("(/"2 4<./)#"(/?
int aGlobal;
40
Foo* aGlobalFoo;
void Library::OpenLibrary()
{
aGlobal = 17;
aGlobalFoo = new Foo;
}
void Library::CloseLibrary()
{
aGlobal = 0;
delete aGlobalFoo;
aGlobalFoo = NULL;
}
0 ]BOSN ENZEO [MFRXDENB\. - [MOFQYOLFB QHULNITUU: `C_H .h DOS[FHFMNUBQK QO SEOZUQBROS LMNGFY
`C_HOR .QMM, OLFE FP DOBOMXY - Library.cpp. 5OMKLOD FEF^FCHFPC^FF GHOJCH\EXY OJaUDBOR,
RQBMUWCITFYQK R ]BFY `C_HCY, [MULQDCPCB\ EUROPSOZEO. +US EU SUEUU, DCZLX_ FP EFY JNLUB FSUB\
QROI QBCBFWUQDNI DO[FI LibraryDummy. 5MF DCZLO_ FEF^FCHFPC^FF `C_HC .QMM, R DOBOMX_ RDHIWUE
`C_H Library.h, DOEQBMNDBOM LibraryDummy NRUHFWFRCUB QWUBWFD. 5MF RXYOLU FP main() FHF [MF
RXPORU exit() `C_HX .QMM NEFWBOZCIB GHOJCH\EXU OJaUDBX F NSUE\VCIB QWUBWFD R LUQBMNDBOMU
LibraryDummy. 0OEQBMNDBOM F LUQBMNDBOM GCMCEBFMNIB, WBO OpenLibrary() F CloseLibrary()
JNLNB RXPRCEX MOREO OLFE MCP.
3BOB [MFUS [MF[FQXRCUBQK SEOGFS MCPEXS [MOGMCSSFQBCS, EO QCSX_ FPRUQBEX_ [MFSUM UGO
FQ[OH\PORCEFK RQBMUWCUBQK R JFJHFOBUDU iostream. +CS OE FEF^FCHFPFMNUB JOH\VFU QBMNDBNMX LCEEXY,
Q DOBOMXSF MCJOBCUB JFJHFOBUDC, MOREO OLFE MCP F HFV\ BOGLC, DOGLC ]BO BMUJNUBQK.
ecfpykfopu
*UQBMNDBOMX RXPXRCIBQK DCZLX_ MCP, DOGLC QBUDORX_ OJaUDB RXYOLFB FP OJHCQBF LU_QBRFK (RDHIWCK
CEOEFSEXU ]DPUS[HKMX F RMUSUEEXU OJaUDBX, QOPLCRCUSXU DOS[FHKBOMOS) FHF DOGLC LHK
LFECSFWUQDOGO OJaUDBC RXPXRCUBQK O[UMCBOM delete. 0 LUQBMNDBOMCS OBEOQFBQK MKL SCHOFPRUQBEXY
`CDBOR.
Ropnpok eusoea
*UQBMNDBOMX GCMCEBFMORCEEO RXPXRCIBQK R [OMKLDU, OJMCBEOS [OMKLDN RXPORC DOEQBMNDBOMOR. 3BO
OPECWCUB, WBO QECWCHC RXPXRCUBQK BUHO DOEQBMNDBOMC OJaUDBC, PCBUS LUQBMNDBOMX [UMUSUEEXY DHCQQC R
[OMKLDU, OJMCBEOS [OMKLDN FY [UMUWFQHUEFK R OJaKRHUEFF DHCQQC, F ECDOEU^ LUQBMNDBOMX JCPORXY
DHCQQOR, ECWFECK Q [OQHULEUGO R Q[FQDU ECQHULORCEFK F DOEWCK [UMRXS JCPORXS [UMROGO JCPOROGO F B.L.
Yuufoeuue rnoanuuux oLekfoe
%QHF OB MCPGOROMOR OJ FEF^FCHFPC^FF GHOJCH\EXY OJaUDBOR N RCQ PCDMNZFHCQ\ GOHORC, SOGN RCQ
OJMCLORCB\. %QHF MCPMCJOBWFD RCVUGO DOS[FHKBOMC Q[MCRFHQK QO QROU_ MCJOBO_, LUQBMNDBOMX
GHOJCH\EXY OJaUDBOR GCMCEBFMORCEEO RXPXRCIBQK R [OMKLDU, BOWEO OJMCBEOS [OMKLDN RXPORC
DOEQBMNDBOMOR.
,HOJCH\EXU OJaUDBX NEFWBOZCIBQK [MF RXYOLU FP OJHCQBF LU_QBRFK main() FHF [MF RXPORU exit().
Heeupfyanuuue pecfpykfopu
C++ RXJFMCUB RXPXRCUSX_ LUQBMNDBOM [O BF[N NDCPCBUHK EC OJaUDB. %QHF NDCPCBUH\ FSUUB BF[ base*
(NDCPCBUH\ EC JCPORX_ DHCQQ), ROPEFDENB [MOJHUSX, UQHF BOH\DO LUQBMNDBOM DHCQQC EU RFMBNCHUE.
class Foo {
public:
~Foo();
};

4.
class Bar : public Foo {
private:
int* numbers;
public:
Bar() : numbers(new int[17]) {...}
~Bar();
};
Bar* b = new Bar;
delete b; // G<-<4$"* Bar::~Bar()
Foo* f = new Bar;
delete f; // L?! G<-<4$"*)% Foo::Foo()!
5MF NLCHUEFF f SCQQFR, EC DOBOMX_ QQXHCUBQK [UMUSUEECK numbers, [MURMCTCUBQK R EUDOU [OLOJFU
'UBNWUGO ,OHHCEL^C, OJMUWUEEOGO EC RUWEXU QDFBCEFK R [CSKBF. 1BOJX FPJUZCB\ JULX, LOQBCBOWEO
OJaKRFB\ OJC LUQBMNDBOMC RFMBNCH\EXSF; R ]BOS QHNWCU EUPCRFQFSO OB BF[C NDCPCBUHK (DMOSU, DOEUWEO,
void*) NEFWBOZUEFU JNLUB ECWFECB\QK Q Bar: :~G$8().
*MNGCK, JOHUU DORCMECK [MOJHUSC Q EURFMBNCH\EXSF LUQBMNDBOMCSF ROPEFDCUB [MF OMGCEFPC^FF
EUQBCELCMBEOGO N[MCRHUEFK [CSKB\I. 0OS[FHKBOM QOOJTCUB RCVUSN [UMUGMNZUEEOSN O[UMCBOMN
MCPSUM NEFWBOZCUSOGO OJaUDBC QIM[MFP! *HK EURFMBNCH\EOGO LUQBMNDBOMC ]BOB MCPSUM SOZUB
ODCPCB\QK EURUMEXS. 5MULQBCR\BU QUJU NLFRHUEFU RCVU_ [MOGMCSSX, DOGLC U_ QOOJTCB, WBO OJaUDB
FSUUB MCPSUM 20 JC_B, YOBK EC QCSOS LUHU OE MCRUE 220 JC_BCS! (CPMCJOBWFDF DOS[FHKBOMOR C++ HIJKB
[OYRCQBCB\QK [OLOJEXSF [MOLUHDCSF PC DMNZDO_ [FRC [OQHU MCJOBX.
6OMCH\: LUQBMNDBOMX QHULNUB LUHCB\ RFMBNCH\EXSF. !QDHIWUEFU QOQBCRHKIB QFBNC^FF, DOGLC RCV
DHCQQ FHF QBMNDBNMC EU FSUUB [MOFPROLEXY DHCQQOR FHF N RCQ EC_LNBQK WMUPRXWC_EO RUQDFU [MFWFEX
[OQBN[FB\ FECWU.
Rpnro eusoe pecfpykfopoe
*UQBMNDBOM SOZEO RXPRCB\ F EC[MKSNI, EU [MFJUGCK D O[UMCBOMN delete, [OQDOH\DN ]BO BCDCK ZU
`NED^FK, DCD F RQU OQBCH\EXU. #[MOWUS, LO BOGO, DCD SX PC_SUSQK EUQBCELCMBEXS N[MCRHUEFUS
[CSKB\I, RMKL HF ]BO JNLUB FSUB\ DCDO_-EFJNL\ QSXQH.
class Foo {
public:
~Foo();
};
Foo* f = new Foo;
f->Foo::~Foo();
5OPLEUU SX ROQ[OH\PNUSQK ]BO_ ROPSOZEOQB\I, C [ODC QOYMCEFBU UU R QROU_ DOHHUD^FF C++.
Rpuceaueauue
5MFQRCFRCEFU OLEOGO OJaUDBC LMNGOSN R C++ LUHO QUM\UPEOU. #[MOWUS, R OJFHFF PC[NBCEEXY [MCRFH
UQB\ F [OHOZFBUH\ECK QBOMOEC JHCGOLCMK FS RX [OQBOKEEO OQBCUBUQ\ ECWUDN F NLUHKUBU JOH\VU
REFSCEFK [MOGMCSSU.
Cuufakcuc u ceraufuka npuceaueauun
*HK [MFQRCFRCEFK OLEOGO OJaUDBC LMNGOSN FQ[OH\PNUBQK O[UMCBOM =.
Foo f;
Foo f1;
f1 = f;
5MFQRCFRCEFU RX[OHEKUBQK R BMUB\U_ QBMODU. %QHF JX f F f1 JXHF ^UHXSF FHF WUS-EFJNL\ QBOH\ ZU
[MOQBXS, QSXQH ]BO_ QBMODF JXH JX [MULUH\EO KQUE: QOLUMZFSOU OJHCQBF [CSKBF, EC DOBOMNI
42
QQXHCUBQK f, DO[FMNUBQK R OJHCQB\ [CSKBF, EC DOBOMNI QQXHCUBQK f1. +OH\DO F RQUGO. $O UQHF Foo
OBEOQFBQK D EUBMFRFCH\EOSN DHCQQN, R C++ RQU PCSUBEO NQHOZEKUBQK. # [MFRULUEEOS [MFSUMU
DOS[FHKBOM [MULOQBCRHKUB O[UMCBOM = [O NSOHWCEFI, DOBOMX_ RXPXRCUBQK LHK RX[OHEUEFK
`CDBFWUQDOGO DO[FMORCEFK. 0CD F Q DOEQBMNDBOMCSF DO[F_, RX SOZUBU Q[ODO_EO QFLUB\ F QSOBMUB\, DCD
DOS[FHKBOM RDCHXRCUB PC RCQ, FHF EC[FQCB\ QRO_ QOJQBRUEEX_ O[UMCBOM =. +O, WBO LUHCUB RUMQFK [O
NSOHWCEFI, RCS SOZUB F EU [OEMCRFB\QK, OQOJUEEO R SOSUEB OQROJOZLUEFK [CSKBF LUQBMNDBOMOS
DHCQQC.
class String {
private:
char* s;
public:
String(char*);
~String();
void Dump(ostream& os);
};
String::String(char* str) : s(NULL)
{
if (str == NULL) { // NULL '-($.$"* 53)*3> )*7'&3
s = new char[1];
*s = \0;
}
else {
s = new char[strlen(str) + 1];
strcpy(s, str);
}
}
String::~String()
{
delete s;
}
void String::Dump(ostream& os)
{
os << \ << s << \;
}
String* s1 = new String(Hello);
String* s2 = new String(Goodbye);
s2 = s1;
delete s1; // =$2%*, ')4';'0/#$),, 47'0" 4)" ('72$#,('...
s2->Dump(); // L;#'2! R$-C$-C$!
delete s2; // ='2'8/*", 3;/4$>*! R$-C$-C$!
5O NSOHWCEFI DOS[FHKBOM DO[FMNUB QOLUMZFSOU s2->s [ORUMY QOLUMZFSOGO s1->s. 5MF ]BOS
DO[FMNUBQK PECWUEFU NDCPCBUHK, C EU QFSROHX, [O]BOSN [OQHU [MFQRCFRCEFK ROPEFDCIB LRU JOH\VFU
[MOJHUSX. *RC MCPEXY OJaUDBC QQXHCIBQK EC OLEN OJHCQB\ [CSKBF, F EFDBO EU QQXHCUBQK EC DO[FI
Goodbye, QOPLCEENI DOSCELO_ String* s2 = new String( "Goodbye");. *CH\VU JOH\VU; [MF
NLCHUEFF s1 LUQBMNDBOM OQROJOZLCUB OJHCQB\ [CSKBF, EC DOBOMNI QQXHCUBQK s1. )LECDO EC ]BN [CSKB\
[MOLOHZCUB QQXHCB\QK NDCPCBUH\ s2->s. 5O[XBDC RXRUQBF s2->s LCUB QORUMVUEEO JUPNSEXU
MUPNH\BCBX. 0OSULFK OVFJOD LOQBFGCUB DNH\SFEC^FF [MF [O[XBDU NLCHFB\ s2, [OQDOH\DN SUEULZUM
[CSKBF [O[XBCUBQK OQROJOLFB\ MCEUU OQROJOZLUEENI OJHCQB\. 1UGO BOH\DO EU JXRCUB R C++!
43
(CPNSUUBQK, BC ZU [MOJHUSC ROPEFDCUB F [MF QOPLCEFF DO[F_. 0OEQBMNDBOM DO[F_ [O NSOHWCEFI
DO[FMNUB NDCPCBUH\, C EU LCEEXU, EC DOBOMXU OE QQXHCUBQK. 5O ]BO_ [MFWFEU DOEQBMNDBOM DO[F_ F
O[UMCBOM = OJXWEO [UMUGMNZCIBQK OLEORMUSUEEO.
Rpuceaueauue u uuuuuanusauun
6X NZU OJQNZLCHF, WUS FEF^FCHFPC^FK OBHFWCUBQK OB [MFQRCFRCEFK, EO ]BC BUSC ECQBOH\DO RCZEC, WBO
K [ORBOMI UTU MCP. %QHF OJaUDB QHURC OB O[UMCBOMC = JXH QDOEQBMNFMORCE PCMCEUU, = OPECWCUB
[MFQRCFRCEFU. %QHF R ]BOS RXMCZUEFF OE DOEQBMNFMNUBQK R[UMRXU, MUW\ FLUB O DOEQBMNFMORCEFF F
DOEQBMNDBOMCY. # QHULNITUS [MFSUMU [UMRCK QBMODC Q QFSROHOS = RX[OHEKUB FEF^FCHFPC^FI F
RXPXRCUB DOEQBMNDBOM DO[F_. #BOMCK QBMODC RX[OHEKUB [MFQRCFRCEFU F RXPXRCUB O[UMCBOM =.
Foo f;
Foo f1 = f; // D(/B/$#/-$B/%; f1 "K" (" )3K")*43"*
f1 = f; // =7/)4$/4$(/": ';E"&* f1 31" )&'()*73/7'4$(
Rpuceaueauue no yronauuk
)[UMCBOM = [O NSOHWCEFI, DCD F DOEQBMNDBOM DO[F_ [O NSOHWCEFI, RULUB QUJK WUBDO O[MULUHUEEXS
OJMCPOS. 0CD F DOEQBMNDBOM DO[F_, DOBOMX_ MUDNMQFREO RXPXRCUB LMNGFU DOEQBMNDBOMX DO[F_,
O[UMCBOM = [O NSOHWCEFI EU OGMCEFWFRCUBQK [MOQBXS DO[FMORCEFUS JFBOR FP OLEOGO OJaUDBC R LMNGO_.
5OQHULORCBUH\EOQB\ UGO LU_QBRF_ RXGHKLFB BCD:
/. 5MFQRCFRCEFU LHK JCPORXY DHCQQOR RX[OHEKUBQK R [OMKLDU FY [UMUWFQHUEFK R Q[FQDU
ECQHULORCEFK. 5MF ]BOS FQ[OH\PNIBQK [UMUGMNZUEEXU O[UMCBOMX = JCPORXY DHCQQOR FHF R
QHNWCU FY OBQNBQBRFK O[UMCBOM = [O NSOHWCEFI.
2. 5MFQRCFRCEFU [UMUSUEEXY DHCQQC RX[OHEKUBQK R [OMKLDU FY [UMUWFQHUEFK R OJaKRHUEFF
DHCQQC. 5MF ]BOS FQ[OH\PNIBQK [UMUGMNZUEEXU O[UMCBOMX = JCPORXY DHCQQOR FHF R QHNWCU FY
OBQNBQBRFK O[UMCBOM = [O NSOHWCEFI.
3BF [MCRFHC [MFSUEKIBQK MUDNMQFREO. 0CD F R QHNWCU Q DOEQBMNDBOMCSF, QECWCHC RX[OHEKUBQK
[MFQRCFRCEFU LHK [UMROGO JCPOROGO DHCQQC [UMROGO JCPOROGO DHCQQC F B. L.
Reperpyska onepafopa =
5UMUGMNPDC O[UMCBOMC = [MCDBFWUQDF EU OBHFWCUBQK OB [UMUGMNPDF RQUY OQBCH\EXY O[UMCBOMOR. 5ODC ECQ
FEBUMUQNUB QFGECBNMC O[UMCBOMC =, DOBOMCK RXGHKLFB BCD: R& X::operator=(const X&).
class String {
private:
char* s;
public:
String(char*);
~String();
String(const String&); // G'-2'1(', *'1" 7"M$"* 57';#"23
String& operator=(const String&);
void Dump(ostream& os);
};
String::String(char* s) : s(NULL)
{
if (str == NULL) { // NULL '-($.$"* 53)*3> )*7'&3
s = new char[1];
*s = \0;
}
else {
s = new char[strlen(str) + 1];
strcpy(s, str);
44
}
}
String::~String()
{
delete s;
}
String::String(const String& s1) : s(NULL)
{
s = new char[strlen(s1.s) + 1];
strcpy(s, s1.s);
}
String& String::operator=(const String& s1)
{
if (this == &s1) return *this;
delete s; // H(/.*'1/*, 57"0<03K"" -($."(/"
s = new char[strlen(s1.s) + 1];
strcpy(s, s1.s);
return *this;
}
void String::Dump(ostream& os)
{
os << \ << s << \;
}
0OEQBMNDBOM DO[F_ F O[UMCBOM = RSUQBO [MOQBOGO DO[FMORCEFK CLMUQC BU[UM\ QOPLCIB DO[FI EORO_
QBMODF. *UQBMNDBOM QBCH JUPO[CQEXS, F SFMN EFWUGO EU NGMOZCUB.
$FZU [ODCPCE OJOJTUEEX_ RFL O[UMCBOMC =, DOBOMX_ QBOFB PCEUQBF R LOHGORMUSUEENI [CSKB\ (EU
DOS[\IBUMENI, C RCVN QOJQBRUEENI):
/. 4JULFBUQ\, WBO EU RX[OHEKUBQK [MFQRCFRCEFU RFLC x=x;. %QHF HURCK F [MCRCK WCQBF QQXHCIBQK
EC OLFE OJaUDB, LUHCB\ EFWUGO EU ECLO. %QHF EU [UMUYRCBFB\ ]BOB OQOJX_ QHNWC_, BO QHULNITF_
VCG NEFWBOZFB PECWUEFU LO BOGO, DCD OEO JNLUB QDO[FMORCEO.
2. 4LCHFBU [MULXLNTFU LCEEXU.
3. .DO[FMN_BU PECWUEFU.
4. #OPRMCBFBU NDCPCBUH\ *this.
)[UMCBOM = ROPRMCTCUB *this, WBOJX QBCHO ROPSOZEXS RHOZUEEOU [MFQRCFRCEFU RFLC $=b=). # C++,
DCD F R ., PECWUEFUS ]BOGO RXMCZUEFK KRHKUBQK [MFQRCFRCUSCK RUHFWFEC. #XMCZUEFU FEBUM[MUBFMNUBQK
Q[MCRC ECHURO, DCD $=(b=)).
- BU[UM\ [HOYFU EOROQBF. 0CD F R QHNWCU Q DOEQBMNDBOMCSF DO[F_, [MF [UMUGMNPDU O[UMCBOMC = C++
NSXRCUB MNDF F OB[MCRHKUBQK LOSO_. %QHF RX [UMUGMNPFHF O[UMCBOM =, BO EC RCQ HOZFBQK
OBRUBQBRUEEOQB\ PC RX[OHEUEFU [MFQRCFRCEFK LHK [UMUSUEEXY F JCPORXY DHCQQOR; [O NSOHWCEFI
JCPORXU DHCQQX F [UMUSUEEXU HUROQBOMOEEUGO OJaUDBC OQBCIBQK JUP FPSUEUEF_.
Rpuceaueauue pnn nepereuuux knacca
!EOGLC [UMUSUEEXU DHCQQC OBEOQKBQK D [MOQBU_VFS BF[CS LCEEXY (EC[MFSUM, int), F BOGLC
[MFQRCFRCEFU RX[OHEKUBQK Q [OSOT\I O[UMCBOMC =, [MULOQBCRHUEEOGO DOS[FHKBOMOS. !EOGLC
(EC[MFSUM, LHK DHCQQC String) FY [MFYOLFBQK DO[FMORCB\ RMNWENI. # OQBCH\EXY QHNWCKY [UMUSUEEXU
OBEOQKBQK D DCDOSN-EFJNL\ EUBMFRFCH\EOSN DHCQQN. 'NWVF_ RXYOL FP [OHOZUEFK [MFQROFB\ WBO-
EFJNL\ BCDFS [UMUSUEEXS. 5MF ]BOS DOS[FHKBOM O[MULUHKUB, QNTUQBRNUB HF LHK [UMUSUEEO_
[UMUGMNZUEEX_ O[UMCBOM = FHF OE LOHZUE FQ[OH\PORCB\ QRO_ QOJQBRUEEX_ RCMFCEB [O NSOHWCEFI.
class Foo {
45
public:
Foo& operator=(const Foo&);
};
class Bar {
public:
// L5"7$*'7 = (" 5"7"8731"(
};
class FooBar {
private:
Foo f;
Bar b;
public:
FooBar& operator=(const FooBar&);
};
FooBar& FooBar::operator=(const FooBar& fb)
{
if (this == &fb) return *this;
f = fb.f; // D)5'#,-3"*)% 5"7"8731"((<? '5"7$*'7 = &#$))$ Foo
f = fb.b; // D)5'#,-3"*)% '5"7$*'7 = 5' 32'#.$(/>
return *this;
}
5MFSUEKK ]BN SUBOLFDN, RX EU PCJOBFBUQ\ O BOS, QNTUQBRNUB HF LHK [UMUSUEEO_ [UMUGMNZUEEX_
O[UMCBOM =. )J ]BOS LOHZUE LNSCB\ DOS[FHKBOM.
Rpuceaueauue pnn asoeux knaccoe
5MFQRCFRCEFU LHK JCPORXY DHCQQOR QO[MKZUEO Q EUDOBOMXSF QFEBCDQFWUQDFSF NYFTMUEFKSF. %QHF RX
EFDOGLC FY EU RFLUHF, RUMOKBEO, EC [OFQD [MCRFH\EO_ DOSJFEC^FF N_LUB EUSCHO RMUSUEF. #XGHKLFB
OEC BCD:
class Foo {...}
class Bar : public Foo {
public:
Bar& operator=(const Bar&);
};
Bar& Bar::operator=(const Bar& b)
{
if (this == &b) return *this;
this->Foo::operator=(b); // S"8'-."8'?
return *this;
}
*MNGFU RCMFCEBX, DOBOMXU SOGNB [MFLBF R GOHORN (EC[MFSUM, *((Foo)this)=b;), EU MCJOBCIB
[ORUM\BU SEU EC QHORO. #QU OEF QOPLCIB RMUSUEEXU DO[FF. 5ODCPCEEX_ RCMFCEB MCJOBCUB, [OQDOH\DN
DOS[FHKBOM PECUB, DCD [MUOJMCPORCB\ Bar R Foo R CMGNSUEBU. )E MCJOBCUB EUPCRFQFSO OB BOGO,
[UMUGMNZCHF RX Foo::operator= FHF EUB. *CZU UQHF EU [UMUGMNZCHF, O[UMCBOM RQU MCREO
[MFQNBQBRNUB, F UGO SOZEO RXPRCB\ [O [OHEOSN FSUEF Foo::operator=.
pyrue curuafypu onepafopa =
)[UMCBOM = EU OGMCEFWUE OLEO_ QFGECBNMO_. %GO SOZEO [UMUGMNPFB\ BCD, WBOJX R [MCRO_ WCQBF
[MFQRCFRCEFK SOG QBOKB\ CMGNSUEB HIJOGO LMNGOGO BF[C. .FGECBNMC R& X::operator=(const R&)
RXLUHKUBQK EC OJTUS `OEU BUS, WBO DOS[FHKBOM [MULOQBCRHKUB UU RUMQFI [O NSOHWCEFI F FQ[OH\PNUB
]BN QFGECBNMN R QBCELCMBEOS CHGOMFBSU MUDNMQFREOGO [MFQRCFRCEFK.
46
class String {
// I$& 7$(,M"
public:
String& operator=(const String&); // +'72$#,(<? 4$7/$(*
String& operator=(char*); // ="7"8731"((<? 4$7/$(*
String& operator=(int); // G<-<4$"* atoi()
};
# [ODCPCEEOS `MCGSUEBU QOPLCUBQK EUQDOH\DO [UMUGMNZUEEXY RCMFCEBOR O[UMCBOMC = LHK MCPHFWEXY
BF[OR LCEEXY R [MCRO_ WCQBF RXMCZUEFK. #BOMO_ RCMFCEB [OPROHKUB FPJUZCB\ DOEQBMNFMORCEFK
RMUSUEEOGO OJaUDBC String FP char* HFV\ LHK BOGO, WBOJX [MFQROFB\ UGO OJaUDBN R HURO_ WCQBF.
+MUBF_ RCMFCEB RX[OHEKUB [MUOJMCPORCEFU LMNGOGO MOLC. +US EU SUEUU, HFV\ [UMRX_ RCMFCEB
[UMUGMNZCUB (BO UQB\ PCSUEKUB) RUMQFI O[UMCBOMC [O NSOHWCEFI.
Reperpyska onepafopoe
)LEC FP [MFKBEXY OQOJUEEOQBU_ C++ ROPSOZEOQB\ MCQVFMUEFK QSXQHC O[UMCBOMOR. 3BO N[MOTCUB
WBUEFU [MOGMCSSX, [OQDOH\DN RCS NZU EU [MFLUBQK FPOJMUBCB\ LNMC^DFU FSUEC `NED^F_ RMOLU Add BCS,
GLU PECD + FSUUB QORUMVUEEO OWURFLEX_ QSXQH. +US EU SUEUU, FP HFWEOGO O[XBC K PECI LRU [MOJHUSX,
QRKPCEEXU Q [UMUGMNZUEEXSF O[UMCBOMCSF. #O-[UMRXY, FY WMUPSUMEOU [MFSUEUEFU [MURMCTCUB
[MOGMCSSN R YCOQ. #O-RBOMXY, JOH\VFEQBRO [MOGMCSSFQBOR EFDOGLC FY EU FQ[OH\PNUB. 5MFRULUEEX_
EFZU Q[FQOD EU [MUBUELNUB EC [OHEOBN, OLECDO OE [OSOZUB [OLGOBORFB\ [OHU LHK LCH\EU_VUGO
FPHOZUEFK SCBUMFCHC.
4yukuuouanuuan qopra onepafopoe
)[UMCBOMX (EC[MFSUM, +) FQ[OH\PNIBQK R LRNY RCMFCEBCY: DCD OQOJCK QFEBCDQFWUQDCK `OMSC FHF DCD
`NED^FK. # C++ `NED^FOECH\ECK `OMSC RQUGLC [MULQBCRHKUB QOJO_ DHIWUROU QHORO operator, PC
DOBOMXS QHULNUB QFSROH O[UMCBOMC.
class Foo {...}
Foo x, y, z;
z = x + y; // D(@/&)($% (('72$#,($%) @'72$
z = operator+(x, y); // J3(&B/'($#,($% @'72$ (4("M(%% @3(&B/%)
z = x.operator+(y); // J3(&B/'($#,($% @'72$ (@3(&B/% &#$))$)
. DOE^U[BNCH\EO_ BOWDF PMUEFK BMF [OQHULEFU QBMODF ]DRFRCHUEBEX, YOBK EC [MCDBFDU, RUMOKBEO,
O[UMCBOM JNLUB O[MULUHUE HFJO R RFLU REUVEU_ `NED^FF, HFJO R RFLU `NED^FF DHCQQC, EO EU R OJOFY
RCMFCEBCY QMCPN. *HK JFECMEXY O[UMCBOMOR PECD O[UMCBOMC NDCPXRCUBQK SUZLN LRNY CMGNSUEBOR R
FE`FDQEO_ `OMSU. # `OMSU REUVEU_ `NED^FF OJC CMGNSUEBC [UMULCIBQK GHOJCH\EO_ `NED^FF. #
`OMSU `NED^FF DHCQQC OJaUDB, DOBOMOSN [MFECLHUZFB RXPXRCUSX_ O[UMCBOM, NDCPXRCUBQK QHURC, C
CMGNSUEB Q[MCRC OB PECDC O[UMCBOMC. 4ECMEXU O[UMCBOMX (BCDFU DCD ! F ~) BOZU SOGNB
[UMUGMNZCB\QK. :OMSC REUVEU_ `NED^FF RXPXRCUBQK Q OLEFS CMGNSUEBOS, C `OMSC `NED^FF DHCQQC
RXPXRCUBQK JUP CMGNSUEBOR (O[UMC^FK RX[OHEKUBQK Q OJaUDBOS, ECYOLKTFSQK QHURC OB O[UMCBOMC . FHF
->).
$U MCPMUVCUBQK [UMUGMNZCB\ RQBMOUEEXU O[UMCBOMX (EC[MFSUM, O[UMCBOM ^UHOWFQHUEEOGO QHOZUEFK).
1BOJX OJUQ[UWFB\ RX[OHEUEFU ]BOGO NQHORFK, DOS[FHKBOM BMUJNUB, WBOJX YOBK JX OLFE CMGNSUEB
DCZLOGO [UMUGMNZUEEOGO O[UMCBOMC OBEOQFHQK D [OH\PORCBUH\QDOSN BF[N (OJXWEO D DHCQQN). #XJOM
OGMCEFWUE O[UMCBOMCSF, NZU O[MULUHUEEXSF R C++. #O RMUSK LOHGFY EOWEXY OBHCLOD SEU WCQBO YOBU-
HOQ\ QOPLCB\ O[UMCBOM Q FSUEUS #$%^&, EO C++ EC ]BOB QWUB EUNSOHFS.
5UMUGMNZUEEXU O[UMCBOMX ECQHULNIB [MFOMFBUBX F CBMFJNBX GMN[[FMORDF OB RQBMOUEEXY O[UMCBOMOR,
[O]BOSN RX EU SOZUBU, EC[MFSUM, FPSUEFB\ QBCELCMBEX_ [OMKLOD GMN[[FMORDF QHURC EC[MCRO LHK
O[UMCBOMC +. $U QNTUQBRNUB OGMCEFWUEF_ EC BF[ PECWUEFK, ROPRMCTCUSOGO [UMUGMNZUEEXS O[UMCBOMOS,
F OLFE O[UMCBOM SOZEO [UMUGMNZCB\ [MOFPROH\EOU WFQHO MCP [MF NQHORFF, WBO QFGECBNMX OQBCIBQK
NEFDCH\EXSF.
47
Reperpyska onepafopoe e qopre eueuuux qyukuu
1BOJX [UMUGMNPFB\ O[UMCBOM R `OMSU REUVEU_ `NED^FF, EUOJYOLFSO O[MULUHFB\ GHOJCH\ENI
`NED^FI.
class String {
friend String& operator+(const String&, const String&);
private:
char* s;
public:
// I'()*73&*'7< / *.0.
}
String& operator+(const String& s1, const String& s2)
{
char* s = new char[strlen(s1.s) + strlen(s2.s) + 1];
strcat(s, s1.s, s2.s);
String newStr(s);
delete s;
return newStr;
}
String s1 = Hello;
String s2 = Goodbye;
String s3 = s1 + s2;
5UMUGMNZUEECK `NED^FK RXGHKLFB BCD ZU, DCD F HIJCK GHOJCH\ECK `NED^FK (UQHF EU QWFBCB\ QBMCEEOGO
FSUEF). !SUEEO LHK BCDFY QHNWCUR F JXHF [MFLNSCEX LMNP\K. %QHF JX SX EU OJaKRFHF `NED^FI
operator+ LMNGOS, BO OEC EU FSUHC JX LOQBN[C D [UMUSUEEO_ s, F SX ODCPCHFQ\ JX [UMUL RXJOMOS: BO
HF MCPMUVFB\ RQUS EC QRUBU LOQBN[ D char*, BO HF [UMU_BF D SUEUU ]``UDBFREO_ MUCHFPC^FF, [MF DOBO-
MO_ QBMODC DO[FMNUBQK [MF DCZLOS OJMCTUEFF D EU_. . DOE^U[BNCH\EO_ BOWDF PMUEFK operator+
KRHKUBQK WCQB\I JFJHFOBUDF String, [O]BOSN EUB EFWUGO QBMCVEOGO R BOS, WBOJX OJaKRFB\ ]BN
`NED^FI LMNGOS F RMNWFB\ U_ DHIWF D RENBMUEEUSN NQBMO_QBRN String.
#EUVEFSF `NED^FKSF SOGNB [UMUGMNZCB\QK HIJXU O[UMCBOMX, DMOSU O[UMCBOMOR [MUOJMCPORCEFK, =,
[], () F -> RQU ]BF O[UMCBOMX LOHZEX [UMUGMNZCB\QK BOH\DO `NED^FKSF DHCQQC.
Reperpyska onepafopoe e qopre qyukuu knacca
.FEBCDQFQ EC[OSFECUB OJXWENI [UMUGMNPDN `NED^F_ DHCQQC, MCPRU WBO DOHFWUQBRO CMGNSUEBOR
NSUE\VCUBQK EC / [O QMCREUEFI Q `OMSO_ REUVEU_ `NED^FF.
class String {
private:
char* s;
public:
// I'()*73&*'7< / *.0.
String& operator+(const String&) const;
};
String& String::operator+(const String& s1) const
{
char* s2 = new char[strlen(s1.s) + strlen(s) + 1];
strcat(s2, s1, s);
String newStr(s2);
delete s2;
return newStr;
}
48
String s1 = Hello;
String s2 = Goodbye;
String s3 = s1 + s2;
'IJO_ O[UMCBOM SOZUB JXB\ [UMUGMNZUE R `OMSU `NED^FF DHCQQC. %QHF O[UMCBOM SOZUB [UMUGMNZCB\QK
DCD REUVEU_ `NED^FU_, BCD F `NED^FU_ DHCQQC, DCDNI FP LRNY `OMS RXJMCB\? )BRUB: FQ[OH\PN_BU
[UMUGMNPDN R `OMSU `NED^FF DHCQQC, UQHF BOH\DO N RCQ EU EC_LUBQK RUQDFY [MFWFE LHK [UMUGMNPDF
REUVEU_ `NED^FU_. !P ]BFY [MFWFE ECFJOHUU MCQ[MOQBMCEUEX QHULNITFU:
/. 5UMRX_ CMGNSUEB OBEOQFBQK D JCPOROSN BF[N (EC[MFSUM, int FHF double).
2. +F[ [UMROGO CMGNSUEBC O[MULUHUE R DOSSUMWUQDO_ JFJHFOBUDU, DOBOMNI EUZUHCBUH\EO
SOLF`F^FMORCB\.
0OS[FHKBOM FTUB [UMUGMNPDN R `OMSU `NED^F_ DHCQQC, [MOQSCBMFRCK HURNI WCQB\ JFECMEXY
O[UMCBOMOR F ULFEQBRUEEX_ CMGNSUEB NECMEXY. %QHF RCV BF[ NDCPXRCUBQK Q[MCRC F RX YOBFBU
ROQ[OH\PORCB\QK [UMUGMNPDO_ R `OMSU `NED^FF DHCQQC, RCS EU [ORUPHO. .CSX_ MCQ[MOQBMCEUEEX_
[MFSUM [UMUGMNPDF R `OMSU REUVEU_ `NED^FF O[UMCBOM << R JFJHFOBUDU ostream.
ostream& operator<<(ostream& os, const String& s)
{
os << str.s; // =7"05'#$8$"*)%, .*' 0$(($% @3(&B/% %4#%"*)% 0738'2
return os;
}
5UMUGMNPDC LOHZEC OQNTUQBRHKB\QK R `OMSU REUVEU_ `NED^FF, [OQDOH\DN RCV BF[, String, ECYOLFBQK
Q[MCRC UQHF, DOEUWEO, RX EU YOBFBU PCHUPB\ R GOBORXU PCGOHORDF iostream.h F RDHIWFB\ R DHCQQ
ostream [UMUGMNPDN R `OMSU `NED^FF DHCQQC LHK QROUGO DHCQQC String. $CRUMEOU, RQU-BCDF EU YOBFBU.
5MFSUWCEFU: [MULXLNTF_ [MFSUM SOZUB EU MCJOBCB\ R RCVUS DOS[FHKBOMU, UQHF `NED^FF strlen F
strcat, DCD ]BO WCQBO JXRCUB, [O EULOQSOBMN MCPMCJOBWFDOR [OHNWCIB char* RSUQBO const char*.
#X SOZUBU MUVFB\, WBO FGMC EU QBOFB QRUW, F OJaKRFB\ `NED^FI EUDOEQBCEBEO_, EO ]BO RXGHKLFB
QHFVDOS ZUQBODO. 'NWVU FPJCRFB\QK OB DOEQBCEBEOQBF [OQMULQBROS [MUOJMCPORCEFK BF[OR, UQHF RX
CJQOHIBEO NRUMUEX, WBO JFJHFOBUWECK `NED^FK EU SOLF`F^FMNUB QROF CMGNSUEBX, F GOBORX QSFMFB\QK
Q [MULN[MUZLUEFKSF DOS[FHKBOMC.
String& String::operator+(const String& s1) const
{
char* s2 = new char[strlen((char*)s1.s) + strlen(s) + 1];
strcat(s2, (char*)s1.s, s);
String newStr(s2);
delete s2;
return newStr;
}
#FLFBU, WBO [MOFQYOLFB, UQHF DBO-BO PCJXRCUB O DOEQBCEBEOQBF?
Onepafopu npeopasoeauun
)[UMCBOM [MUOJMCPORCEFK OQOJX_ QHNWC_. %QHF DOEQBMNDBOM [MULQBCRHKUB QOJO_ OBOJMCZUEFU
CMGNSUEBOR EC LOSUE RCVUGO DHCQQC, BO O[UMCBOM [MUOJMCPORCEFK LUHCUB [MKSO [MOBFRO[OHOZEOU: [O
]DPUS[HKMN RCVUGO DHCQQC OE QOPLCUB LMNGO_ BF[ LCEEXY.
class String {
private:
char* s;
public:
operator long(); // D)5'#,-3"* atol 0#% 57"';7$-'4$(/% & */53 long
};
String::operator long()
49
{
// G"7'%*(', -0"), )#"03"* 57'4"7/*,, .*' )*7'&$
// 57"0)*$4#%"* )';'? ./)#', 57/($0#"1$K"" & 0/$5$-'(3 0#/((<C B"#<C
return atoll(s);
}
String s(1234);
long x = s; // G<-<4$"*)% @3(&B/% operator long()
)[UMCBOMX [MUOJMCPORCEFK LOHZEX JXB\ `NED^FKSF DHCQQC. 0CD RFLEO FP [ODCPCEEOGO `MCGSUEBC,
O[UMCBOMX [MUOJMCPORCEFK YOMOVF BUS, WBO DOS[FHKBOM OJXWEO QCS SOZUB O[MULUHFB\, DOGLC OEF
LOHZEX RXPXRCB\QK. %QHF USN [OECLOJFBQK LHFEEOU ^UHOU, OE FTUB O[UMCBOM long(). %QHF USN
[OECLOJFBQK OJaUDB Foo, OE FTUB R DHCQQU Foo HFJO DOEQBMNDBOM Q CMGNSUEBOS String, HFJO
operator Foo(). #OPEFDCUB FEBUMUQEX_ RO[MOQ: UQHF O[UMCBOM [MUOJMCPORCEFK LUHCUB `CDBFWUQDF BO
ZU, WBO F DOEQBMNDBOM, [OWUSN JX EU OJO_BFQ\ WUS-EFJNL\ OLEFS? 5MUFSNTUQBRO DOEQBMNDBOMOR
QOQBOFB R BOS, WBO OEF OJUQ[UWFRCIB FEDC[QNHK^FI MUPNH\BFMNITUGO DHCQQC. 1BOJX QDOEQBMNFMORCB\
OJaUDB LMNGOGO DHCQQC, O[UMCBOM [MUOJMCPORCEFK LOHZUE OWUE\ SEOGO PECB\ O EUS. #OB [OWUSN LHK
[UMUYOLC OB OLEOGO BF[C D LMNGOSN OJXWEO FQ[OH\PNIBQK DOEQBMNDBOMX. - UQHF OQNTUQBRHKUBQK
[UMUYOL D JCPOROSN BF[N RMOLU int? #MKL HF RX JNLUBU BMUJORCB\, WBOJX DOS[FHKBOM QOPLCRCH LHK int
EORXU DOEQBMNDBOMX, DOBOMXU PECIB O QNTUQBRORCEFF RCVFY [OH\PORCBUH\QDFY BF[OR. - UQHF F JNLUBU,
BO EU MFQDEUBU [MFPECB\QK R ]BOS RQHNY. +OH\DO O[UMCBOM [MUOJMCPORCEFK SOZUB CRBOSCBFWUQDF
[UMU_BF D JCPOROSN BF[N. *CZU UQHF MUPNH\BFMNITF_ BF[ EU KRHKUBQK JCPORXS, OE SOZUB JXB\ WCQB\I
GOBORO_ JFJHFOBUDF, DOBOMNI EUZUHCBUH\EO SOLF`F^FMORCB\. ! QEORC O[UMCBOM [MUOJMCPORCEFK
Q[MCRHKUBQK Q PCLCWU_.
)[UMCBOMX [MUOJMCPORCEFK SOZEO OJaKRHKB\ LHK HIJXY BF[OR LCEEXY. )EF RXPXRCIBQK JUP
CMGNSUEBOR, C BF[ ROPRMCTCUSOGO PECWUEFK O[MULUHKUBQK [O FSUEF O[UMCBOMC. )[UMCBOMX
[MUOJMCPORCEFK, DCD F RQU OQBCH\EXU O[UMCBOMX, JXRCIB DOEQBCEBEXSF FHF EUDOEQBCEBEXSF. 1CQBO
O[MULUHKUBQK DCD DOEQBCEBECK, BCD F EUDOEQBCEBECK RUMQFF OLEOGO O[UMCBOMC. 0CD [MCRFHO, DOEQBCEBECK
RUMQFK MCJOBCUB JOHUU ]``UDBFREO, [OQDOH\DN EUDOEQBCEBECK RUMQFK OJXWEO RX[OHEKUB DO[FMORCEFU
LCEEXY.
class String {
private:
char* s;
public:
operator const char*() const { return s; }
operator char*():
};
String::operator char*()
{
char* newStr = new char[strlen(s) + 1];
strcpy(newStr, s);
return newStr;
}
0HFUEBQDF_ DOL, FQ[OH\PNITF_ EUDOEQBCEBENI RUMQFI, LOHZUE RPKB\ EC QUJK OBRUBQBRUEEOQB\ PC
NLCHUEFU LNJHFDCBC.
Ropnpok noucka u ueopuosuauocfu
%QHF RO RMUSK OJMCJOBDF [MOGMCSSX DOS[FHKBOM C++ ECYOLFB O[UMCBOM, OE RX[OHEKUB O[FQCEEXU
EFZU LU_QBRFK R NDCPCEEOS [OMKLDU, WBOJX MUVFB\, DCD UGO DOS[FHFMORCB\. )[FQCEFU OBEOQFBQK D
JFECMEOSN O[UMCBOMN, EO BC ZU QCSCK HOGFDC FQ[OH\PNUBQK F LHK NECMEXY O[UMCBOMOR:
/. %QHF OJC CMGNSUEBC OBEOQKBQK D JCPORXS BF[CS, FQ[OH\PNUBQK RQBMOUEEX_ O[UMCBOM.
50
2. %QHF QHURC NDCPCE [OH\PORCBUH\QDF_ BF[, DOS[FHKBOM FTUB [UMU[MNZUEEX_ O[UMCBOM R `OMSU
`NED^FF LCEEOGO DHCQQC, [OLYOLKTU_ LHK RQU_ QFGECBNMX [OLRXMCZUEFK O[UMCBOMC. %QHF BCDO_
O[UMCBOM JNLUB EC_LUE, OE FQ[OH\PNUBQK [MF DOS[FHK^FF.
3. %QHF RQU OQBCH\EXU RCMFCEBX FQ[MOJORCEX, DOS[FHKBOM FTUB [UMUGMNPDN R `OMSU REUVEU_
`NED^FF.
$UOLEOPECWEOQB\ SOZUB ROPEFDENB\ HFV\ R BOS QHNWCU, UQHF OEC [MFQNBQBRNUB R HUROQBOMOEEUS DHCQQU
FHF R GHOJCH\EOS [MOQBMCEQBRU, F EFDOGLC FP-PC QOR[CLUEFK [UMUGMNZUEEXY O[UMCBOMOR R `OMSU
`NED^FF DHCQQC F REUVEU_ `NED^FF. 5MF ECHFWFF EUOLEOPECWEOQBF QOOJTUEFU OJ OVFJDU RXLCUBQK
HFV\ [OQHU RCVU_ [O[XBDF MUCH\EO FQ[OH\PORCB\ O[UMCBOM. +CD DOS[FHKBOM RENVCUB HOZEOU WNRQBRO
JUPO[CQEOQBF F ZLUB, [ODC RX NBMCBFBU JLFBUH\EOQB\, WBOJX OGMUB\ RCQ LNJFEO_ [O GOHORU.
Bupfyanuuue onepafopu
)[UMCBOMX DHCQQOR SOZEO OJaKRHKB\ RFMBNCH\EXSF, DCD F RQU OQBCH\EXU `NED^FF DHCQQOR.
0OS[FHKBOM LFECSFWUQDF OJMCJCBXRCUB [UMUGMNZUEEX_ HUROQBOMOEEF_ O[UMCBOM, DCD F HIJNI LMNGNI
`NED^FI DHCQQC. +CDCK ROPSOZEOQB\ OQOJUEEO [OHUPEC R QFBNC^FKY, DOGLC RX [XBCUBUQ\ QOPLCB\
QUSU_QBRO DHCQQOR, EO OBDMXRCUBU REUVEUSN SFMN HFV\ FY OJTF_ JCPORX_ DHCQQ. . BOWDF PMUEFK
QFEBCDQFQC RQU RXGHKLFB [MOQBO, EO HOGFDC [MOGMCSSX SOZUB QBCB\ LOROH\EO PC[NBCEEO_. #FMBNCH\EXU
O[UMCBOMX KRHKIBQK OLEO_ FP RCZEU_VFY BUS WCQBF 3, [O]BOSN QU_WCQ SX EU JNLUS RLCRCB\QK R
[OLMOJEOQBF.
Onepafop ->
)[UMCBOM -> PCEFSCUB OQOJOU SUQBO QMULF O[UMCBOMOR. *HK ECWCHC MCQQSOBMFS UGO JCPORX_ QFEBCDQFQ.
class Pointer {
private:
Foo* f;
public:
Pointer(Foo* foo) : f(foo) {}
Foo* operator->() const { return f; }
};
Pointer p(new Foo);
p->MemberOfFoo();
# [MFRULUEEOS `MCGSUEBU 7 FQ[OH\PNUBQK LHK DOQRUEEOGO RXPORC `NED^FF DHCQQC Foo. 0OS[FHKBOM
FEBUM[MUBFMNUB HIJO_ NDCPCBUH\ EC QBMNDBNMN FHF DHCQQ (*-[UMUSUEECK) DCD JCPORX_ BF[ >, C LHK RQUY
JCPORXY BF[OR NDCPCBUHU_ QNTUQBRNUB RQBMOUEEX_ O[UMCBOM ->. #QBMUBFR ->, DOS[FHKBOM QSOBMFB EC
HUROQBOMOEEUU RXMCZUEFU; UQHF OEO [MULQBCRHKUB QOJO_ NDCPCBUH\ [C QBMNDBNMN FHF NDCPCBUH\ EC DHCQQ,
LHK OJMCTUEFK D WHUECS FQ[OH\PNUBQK RQBMOUEEX_ O[UMCBOM ->. %QHF HUROQBOMOEEUU RXMCZUEFU
[MULQBCRHKUB QOJO_ [OH\PORCBUH\QDF_ BF[, ]BOB BF[ LOHZUE [UMUGMNPFB\ O[UMCBOM ->. 5UMUGMNZUEEX_
RCMFCEB LOHZUE ROPRMCTCB\ HFJO NDCPCBUH\ EC QBMNDBNMN/DHCQQ, HFJO DCDO_-EFJNL\ LMNGO_
[OH\PORCBUH\QDF_ BF[, DOBOMX_ BCDZU [UMUGMNZCUB O[UMCBOM ->. %QHF ROPRMCTCUSOU PECWUEFU
OBEOQFBQK D [OH\PORCBUH\QDOSN BF[N, DOS[FHKBOM PCSUEKUB HUROQBOMOEEUU RXMCZUEFU ROPRMCTCUSXS
PECWUEFUS O[UMCBOMC -> (R ECVUS [MFSUMU Foo*) F [MOLOHZCUB QROF [O[XBDF LO BUY [OM, [ODC EU
LOJUMUBQK LO RQBMOUEEOGO NDCPCBUHK. +CDFS OJMCPOS, QHULNITUU LRNYVCGOROU DOQRUEEOU OJMCTUEFU
BCDZU JNLUB MCJOBCB\.
class Pointer2 {
private:
Pointer p;
public:
Pointer(Foo* foo) : p(foo) {}
Pointer operator->() const { return p; }
};
Pointer2 p(new Foo);
p->MemberOfFoo();
5.
"LUQ\ O[UMCBOM -> RXPXRCUBQK BMFZLX:
/. Pointer2::operator-> ROPRMCTCUB Pointer.
2. "CBUS Pointer::operator-> ROPRMCTCUB Foo.
3. 0OS[FHKBOM FEBUM[MUBFMNUB Foo* DCD JCPORX_ BF[ F RXPXRCUB UGO `NED^FI.
# OBHFWFU OB RQUY OQBCH\EXY O[UMCBOMOR, RX EU SOZUBU DOEBMOHFMORCB\ ROPRMCTCUSOU PECWUEFU FHF
[MOQBO OJMCBFB\QK D EUSN [OQHU RXYOLC FP O[UMCBOMEO_ `NED^FF. )EO FQ[OH\PNUBQK FQDHIWFBUH\EO
QCSFS DOS[FHKBOMOS. 0OE^U[^FK OJaUDBC, [UMUOLUBOGO NDCPCBUHUS, FSUUB `NELCSUEBCH\EOU PECWUEFU
LHK RQU_ DEFGF.
Onepafop []
)[UMCBOM [] SOZUB JXB\ [UMUGMNZUE, WBOJX [OHNWCB\ ULFEQBRUEEX_ CMGNSUEB [MOFPROH\EOGO BF[C F
ROPRMCTCB\ [MOFPROH\EX_ BF[ R DCWUQBRU QROUGO PECWUEFK.
class String {
private:
char* s;
public:
String(char*);
char operator[](int n) const; // n-? )/24'#
};
char String::operator[](int n)
{
// T0"), 0'#1($ 4<5'#(%*,)% 57'4"7&$ 0/$5$-'($
return s[n];
}
5OQDOH\DN O[UMCBOM [] SOZUB RXPXRCB\QK HFV\ Q OLEFS CMGNSUEBOS, LHK FSFBC^FF SEOGOSUMEXY
SCQQFROR WCQBO [MFSUEKIB CEOEFSEXU ]DPUS[HKMX.
struct Index3 {
int X, Y, Z;
Index3(int x, int y, int z) : X(x), Y(y), Z(z) {}
};
class Array3D { // A7"C2"7(<? 2$))/4 ';E"&*'4 String
private:
// +$)*'%K$% )*73&*37$ 0$((<C
public:
String& operator[](const Index3&);
};
String s = anArray[Index3(17, 29, 31)];
>OBK O[UMCBOM [] RXPXRCUBQK HFV\ Q OLEFS CMGNSUEBOS, ]BOB NSUMUEEO EUNDHIZF_ QFEBCDQFQ
[OPROHKUB QOPLCB\ [MOFPROH\EOU DOHFWUQBRO [QURLOCMGNSUEBOR.
Onepafop ()
$CRUMEOU, RX F EU [OLOPMURCHF, WBO ]BOB O[UMCBOM BOZU SOZEO [UMUGMNPFB\. %QHF N RCQ WCQBO ROPEFDCUB
EU[MUOLOHFSOU ZUHCEFU [MURMCBFB\ OJaUDB R `NED^FI, ROPSOZEO, RCVC [QFYFDC EUQBCJFH\EC F RCS
QBOFB QUM\UPEO [OLNSCB\ ECL QSUEO_ MOLC PCEKBF_. +US EU SUEUU, C++ Q [OEFSCEFUS OBEUQUBQK D RCVFS
[MOJHUSCS. 'UROQBOMOEEUU RXMCZUEFU O[UMCBOMC () [MULQBCRHKUB QOJO_ OJaUDB, DOBOMX_ LOHZUE
FEBUM[MUBFMORCB\QK DCD RXPXRCUSCK `NED^FK. -MGNSUEBX O[UMCBOMC [MULQBCRHKIB QOJO_ `OMSCH\EXU
CMGNSUEBX, [UMULCRCUSXU OJaUDBN-`NED^FF [MF RXPORU.

52
class Function {
public:
int operator()(char*);
};
int Function::operator()(char* s)
{
cout << \ << s << \;
}
Function fn;
int x = fn(Hello); // G<4'0/* 4 cout )*7'&3 Hello
)[UMCBOM () SOZUB ROPRMCTCB\ HIJO_ BF[ F [MFEFSCB\ HIJXU CMGNSUEBX. 5MF ]BOS OE [OLWFEKUBQK
BUS ZU [MCRFHCS, WBO F HIJCK LMNGCK `NED^FK. )[UMCBOM () [UMUGMNZCUBQK BOH\DO R `OMSU `NED^FF
DHCQQC.
Onepafop new
!POJMUBCK EORX_ KPXD, [MFYOLFBQK FPOJMUBCB\ QOJQBRUEEXU [MCRFHC. )LEO FP EORXY [MCRFH C++
GHCQFB, WBO FSK O[UMCBOMC EU OJKPCEO QOQBOKB\ FP OLEFY QHNZUJEXY QFSROHOR. !QDHIWUEFU QOQBCRHKIB
O[UMCBOMX new F delete. )[UMCBOM new RXPXRCUBQK RQKDF_ MCP, DOGLC DOS[FHKBOM QWFBCUB, WBO ECQBCHO
RMUSK RXLUHFB\ FP DNWF [CSKB\ LHK EOROGO OJaUDBC. !Q[OH\PNUSX_ PLUQ\ BUMSFE %/0#$" OBEOQFBQK D
HIJXS LFECSFWUQDFS LCEEXS, RDHIWCK int, char* F B.L., C EU BOH\DO D ]DPUS[HKMCS RCVFY DHCQQOR.
)[UMCBOM new [O NSOHWCEFI FSUUB QHULNITF_ FEBUM`U_Q:
void* operator new(size_t bytes);
%LFEQBRUEEX_ CMGNSUEB DOHFWUQBRO RXLUHKUSXY JC_B, ROPRMCTCUSOU PECWUEFU CLMUQ RXLUHUEEO_
OJHCQBF. )[UMCBOM new EFDOGLC EU LOHZUE ROPRMCTCB\ NULL; RSUQBO ]BOGO [MF EUYRCBDU [CSKBF
FEF^FFMNUBQK FQDHIWUEFU (QS. GHCRN 4). (UCHFPC^FK O[UMCBOMC new [O NSOHWCEFI FPSUEKUBQK OB
[MOQBOGO RXPORC `NED^FF mall') FHF call') LO EUQBCELCMBEXY QMULQBR N[MCRHUEFK [CSKB\I,
[MFHCGCUSXY D DOS[FHKBOMN.
)[UMCBOM new SOZUB [UMUGMNZCB\QK DCD R `OMSU REUVEU_ `NED^FF, BCD F R `OMSU `NED^FF DHCQQC. 5MF
[UMUGMNPDU R `OMSU `NED^FF DHCQQC OE ECQHULNUBQK, [O]BOSN RXLUHUEFU [CSKBF R [MOFPROLEXY DHCQQCY
JNLUB OQNTUQBRHKB\QK BCD ZU, DCD F R JCPOROS DHCQQU, [UMUGMNPFRVUS O[UMCBOM new.
class Foo {
public:
void* operator new(size_t bytes);
};
void* Foo::operator new(size_t bytes)
{
if (bytes < MAXBYTES)
// +")*$(0$7*('" 4<0"#"(/" 5$2%*/ 0#% ;#'&'4 2$#'8' 7$-2"7$
else return ::operator new(bytes);
}
(CPNSUUBQK, RQUOJTCK [UMUGMNPDC GHOJCH\EOGO O[UMCBOMC new PCBMNLEFB QOPLCEFU [UMUEOQFSOGO DOLC,
[O]BOSN OJXWEO [MUL[OWBFBUH\EXS RCMFCEBOS KRHKUBQK [UMUGMNPDC R `OMSU `NED^FF DHCQQC. )EC
FSUUB LO[OHEFBUH\EXU [MUFSNTUQBRC: FP [UMUGMNZUEEO_ `NED^FF SOZEO RXPRCB\ O[UMCBOM new [O
NSOHWCEFI, DCD ]BO LUHCUBQK R [MULXLNTUS `MCGSUEBU. )[UMCBOM new BCDZU SOZUB [UMUGMNZCB\QK LHK
LMNGFY QFGECBNM. >OBK LO[OHEFBUH\EXU QFGECBNMX EU JNLNB RXPXRCB\QK DOS[FHKBOMOS CRBOSCBFWUQDF,
OEF ODCPXRCIB JOH\VNI [OSOT\ [MF MUCHFPC^FF EUQBCELCMBEOGO N[MCRHUEFK [CSKB\I, R DOBOMO_
SOZEO RXPRCB\ DOEDMUBENI RUMQFI O[UMCBOMC new.
class Pool { // +")*$(0$7*(<? 53# 5$2%*/
public:
virtual void* Allocate(size_t bytes);
53
};
void* operator new(size_t bytes, Pool* p)
{
return p->Allocate(bytes);
}
extern Pool* DefaultPool;
Foo* f = new(DefaultPool) Foo;
*O[OHEFBUH\EXU CMGNSUEBX NDCPXRCIBQK SUZLN DHIWURXS QHOROS new F [UMUL FSUEUS DHCQQC Foo;
OEF [UMULCIBQK [UMUGMNZUEEOSN O[UMCBOMN [OQHU MCPSUMC JHODC, [MULOQBCRHUEEOGO DOS[FHKBOMOS.
Onepafop delete
)[UMCBOM delete OJXWEO [UMUGMNZCUBQK RSUQBU Q O[UMCBOMOS new LHK RX[OHEUEFK EUQBCELCMBEXY
O[UMC^F_ N[MCRHUEFK [CSKB\I. .NTUQBRNIB LRC FEBUM`U_QC, CRBOSCBFWUQDF RXPXRCUSXU
DOS[FHKBOMOS [MF NLCHUEFF OJaUDBC:
1. void operator delete(void* address);
2. void operator delete(void* address, size_t bytes);
5UMRCK RUMQFK [MOQBO [UMULCUB RCS CLMUQ OQROJOZLCUSOGO JHODC; WBOJX O[MULUHFB\ UGO MCPSUM, RCS
[MFLUBQK QCSOQBOKBUH\EO PCGHKENB\ R YMNQBCH\EX_ VCM. #BOMCK RUMQFK RMOLU JX [UMULCUB MCPSUM
OQROJOZLCUSOGO JHODC, EO... OE SOZUB JXB\ SUE\VU FQBFEEOGO MCPSUMC! 5MOJHUSX ROPEFDCIB R
QHULNITFY QFBNC^FKY:
class Foo {
private:
int x;
public:
~Foo(); // +"4/7*3$#,(<? 0")*73&*'7
};
class Bar : public Foo {
private:
int y;
public:
~Bar();
};
Bar* b = new Bar;
delete b; // =7$4/#,(<? 7$-2"7
Foo* f = new Bar;
delete f; // O$-2"7 Foo, $ (" Bar
0OS[FHKBOM O[MULUHKUB MCPSUM EC OQEORCEFF RXPXRCUSOGO LUQBMNDBOMC. %QHF EURFMBNCH\EX_
LUQBMNDBOM RXPXRCUBQK LHK NDCPCBUHK EC JCPORX_ DHCQQ, FQ[OH\PNUBQK MCPSUM JCPOROGO DHCQQC.
5MCRFH\EX_ MCPSUM JNLUB [UMULCRCB\QK [MF QOJHILUEFF HIJOGO FP BMUY NQHORF_:
/. *UQBMNDBOM KRHKUBQK RFMBNCH\EXS.
2. 4DCPCBUH\ QQXHCUBQK EC ECQBOKTF_ BF[ OJaUDBC.
3. +F[, EC DOBOMX_ QQXHCUBQK NDCPCBUH\, FSUUB BOB ZU MCPSUM, WBO F ECQBOKTF_ BF[.
5OQHULEUU NQHORFU QOJHILCUBQK HFV\ R BOS QHNWCU, UQHF R [MOFPROLEOS DHCQQU EU LOJCRHKUBQK EF
OLEO_ EORO_ [UMUSUEEO_, C JCPORX_ F [MOFPROLEX_ DHCQQX OLEORMUSUEEO HFJO QOLUMZCB, HFJO EU
QOLUMZCB RFMBNCH\EXY `NED^F_ (F DCD QHULQBRFU, NDCPCBUHU_ v-BCJHF^X). $U[OEKBEO? +OGLC PC[OSEFBU
[MOQBOU [MCRFHO OJaKRHK_BU RCVF LUQBMNDBOMX RFMBNCH\EXSF.
)[UMCBOM delete, DCD F O[UMCBOM new, SOZEO [UMUGMNZCB\ DCD R `OMSU `NED^FF DHCQQC, BCD F R `OMSU
REUVEU_ `NED^FF. %QHF O[UMCBOM [UMUGMNZCUBQK `NED^FU_ DHCQQC, OE ECQHULNUBQK. # OBHFWFU OB
54
O[UMCBOMC new, LHK O[UMCBOMC delete EUH\PK QOPLCRCB\ LO[OHEFBUH\EXU QFGECBNMX. *RC RCMFCEBC,
[MFRULUEEXU RXVU, ]BO RQU, WBO N RCQ UQB\.
Lanouu u
esonacuocfu
funoe
>OBK QBCELCMBX VCJHOEOR O[NJHFDORCEX NZU LCREO, OEF RQU UTU MCQ[MOQBMCEUEX EULOQBCBOWEO
VFMODO. 0OEUWEO, BMNLEO FQ[OH\PORCB\ EUWBO, EU [OLLUMZFRCUSOU RCVFS DOS[FHKBOMOS, ECRUMEOU,
]BO [UMRCK [MFWFEC, [O DOBOMO_ JOH\VFEQBRO [MOGMCSSFQBOR C++ EU NSUUB MCJOBCB\ Q VCJHOECSF. 0
QWCQB\I, QU_WCQ RQU OQEOREXU DOS[FHKBOMX NZU ROVHF R LRCL^CBX_ RUD, BCD WBO ]BC [MOJHUSC NZU
OB[CHC. )QBCUBQK HFV\ [OEKB\, WBO BCDOU VCJHOE, DCD OJO_BF RQU QFEBCDQFWUQDFU HORNVDF, EO [MUZLU
RQUGO LHK WUGO OE RQU-BCDF ENZUE. 3BC GHCRC EU OGMCEFWFRCUBQK OJPOMOS QFEBCDQFQC. # EU_ BCDZU
MCQQSCBMFRCIBQK OQEORX JUPO[CQEOQBF BF[OR R C++, [MFWUS OQOJOU REFSCEFU NLUHKUBQK VCJHOECS.
-fo fakoe uanouu u saer ouu uyuu?
!EBUM`U_Q [MOQBOGO DHCQQC-DOHHUD^FF (EC [MFSUMU QRKPCEEOGO Q[FQDC) RXGHKLFB BCD:
class ListNode {
private:
ListNode* next;
void* data;
public:
ListNode(void* d, ListNode* n = NULL) : next(n), data(d) {}
~ListNode() { delete next; }
void* Data() { return data; }
ListNode* Next() { return next; }
};
"CSUBFHF WBO-EFJNL\ OQOJUEEOU?
Rponeru
5MUZLU RQUGO, R GHCPC JMOQCIBQK RQU ]BF void*. ! RX, F K [MUDMCQEO PECUS, WBO EC QCSOS LUHU PC EFSF
DMOUBQK EUWBO QORUMVUEEO FEOU. ,LU-BO R DHFUEBQDOS DOLU [MFLUBQK QLUHCB\ WBO-EFJNL\ [OLOJEOU:
for (ListNode* n = listHead; n != NULL; n = n->Next())
f((Foo*)n->Data());
!ECWU GOROMK, RCS [MFLUBQK [OQBOKEEO [MFROLFB\ void* D DOEDMUBEOSN BF[N $O DCD NJULFB\QK R BOS,
WBO [OHNWUEEX_ NDCPCBUH\ LU_QBRFBUH\EO FSUUB BF[ Foo*? "LUQ\ [MFLUBQK MCQQWFBXRCB\ BOH\DO EC
QUJK, [OBOSN WBO DOS[FHKBOM QO QHORCSF $CLUIQ\, BX PECUV\, WBO LUHCUV\ NSXRCUB MNDF. *O[NQBFS,
RX NRUMUEX, WBO RCVU FQ[OH\PORCEFU DHCQQC ECLUZEO [O OBEOVUEFI D BF[CS. $O SOZEO HF
GCMCEBFMORCB\, WBO LMNGO_ [MOGMCSSFQB EU RXDFEUB DCDNI-EFJNL\ GHN[OQB\ F EU PCEUQUB R DOHHUD^FI
OJaUDB LMNGOGO BF[C? %QHF RX QRKBO RUMFBU R ]BO, K MUDOSUELNI LUMZCB\QK [OLCH\VU OB MFQDORCEEXY
FERUQBF^F_ F RHOZFB\ LUE\GF R [MCRFBUH\QBRUEEXU JNSCGF, RMKL HF RCS [ORUPUB R ]BO_ ZFPEF.
3
56
#BOMCK [MOJHUSC PCDHIWCUBQK R BOS, WBO ]HUSUEBX Q[FQDC EU PECIB, EC DCDO_ BF[ OEF NDCPXRCIB.
5MUL[OHOZFS, RCS YOWUBQK, WBOJX LUQBMNDBOM Q[FQDC NLCHKH EU BOH\DO QCSF NPHX, EO F LCEEXU, EC
DOBOMXU OEF QQXHCIBQK. $UH\PK [UMULCB\ O[UMCBOMN delete NDCPCBUH\ void* F ECLUKB\QK, WBO OE QCS
RXJUMUB ENZEX_ LUQBMNDBOM.
Oxopuue peueuun
)LEO FP ROPSOZEXY MUVUEF_ [OBMUJORCB\, WBOJX RQU OJaUDBX RCVU_ DOHHUD^FF [MOFQYOLFHF OB
OJTUGO [MULDC. # ]BOS QHNWCU void* SOZEO JNLUB PCSUEFB\ NDCPCBUHUS EC JCPORX_ DHCQQ, QOPLCRCK YOBK
JX RFLFSOQB\ [OMKLDC. %QHF LUQBMNDBOM JCPOROGO DHCQQC KRHKUBQK RFMBNCH\EXS, [O DMC_EU_ SUMU SX
QSOZUS [UMU[FQCB\ LUQBMNDBOM ListNode BCD, WBOJX [MF QCSONJF_QBRU OE NEFWBOZCH F QOLUMZFSOU
Q[FQDC. $O UQHF ]BOB JCPORX_ DHCQQ FSUUB [MOFPROLEXU DHCQQX, RX ECRUMEKDC RUMEUBUQ\ D
EUOJYOLFSOQBF RX[OHEUEFK EUECLUZEXY O[UMC^F_ [MFRULUEFK D ]BFS [MOFPROLEXS BF[CS.
*MNGOU OJYOLEOU MUVUEFU QOPLCB\ Q[FQOD, MCQQWFBCEEX_ EC DOEDMUBEX_ BF[. .DCZUS, LHK RULUEFK
Q[FQDC OJaUDBOR DHCQQC Foo QOPLCUBQK DHCQQ-DOHHUD^FK ListOfFoos. # ]BOS QHNWCU RCS EU [MFLUBQK
RX[OHEKB\ [MFRULUEFK BF[OR, UQHF Foo EU FSUUB [MOFPROLEXY DHCQQOR. $O QBOFB HF [HOLFB\ DHCQQX-
LRO_EFDF, DOBOMXU OBHFWCIBQK BOH\DO BF[CSF, Q DOBOMXSF OEF MCJOBCIB? 0OEUWEO, RXMUPCEFU F
RQBCRDC R BUDQBORXY MULCDBOMCY PCSUWCBUH\ECK RUT\, C Q^UECMFF OJMCJOBDF BUDQBOR [OSOGCIB
JXQBMO MCPSEOZFB\ DOL. $O UQHF RCS [OBMUJNUBQK FPSUEFB\ [MULQBCRHUEFU RQUY ]BFY Q[FQDOR, LUHO
EUFPJUZEO DOEWFBQK SCQVBCJEO_ GOHOREO_ JOH\I.
# [MOVHOS [OLOJEXU [MOJHUSX WCQBO MUVCHFQ\ Q [OSOT\I SCDMOQOR #define:
#define ListNode(Type) \
class ListNode##Type { \
private: \
ListNode##Type* next; \
Type* data; \
public: \
ListNode##Type(Type* d, ListNode* n = NULL) : next(n), data(d) {} \
~ListNode() { delete next; } \
void* Data() { return data; } \
ListNode* Next() { return next; } \
};
%QHF RX EUWCKEEO PCJNLUBU [OQBCRFB\ PECD \, DOS[FHKBOM MCPMCPFBQK GMOSDFSF EUGOLNITFSF RO[HKSF,
EO [MF LOHZEO_ OQBOMOZEOQBF ]BC SUBOLFDC MCJOBCUB. .FSROHX ## OPECWCIB DOEDCBUEC^FI.
0OEQBMND^FK QBCEORFBQK UTU NMOLHFRUU, EO Q ]BFS [MFYOLFBQK SFMFB\QK RX LOHZEX OJUQ[UWFB\
NEFDCH\EOQB\ FSUE BF[OR DOHHUD^F_. +CDCK SUBOLFDC OJHCLCUB SEOGOWFQHUEEXSF EULOQBCBDCSF. %QHF
`NED^FF DHCQQC EU KRHKIBQK [OLQBCRHKUSXSF (inline), RCS [MFLUBQK QOPLCRCB\ LHK EFY LO[OHEFBUH\EXU
SCDMOQX F QHULFB\, WBOJX OEF JXHF MUCHFPORCEX R OLEOS SOLNHU DOS[FHK^FF. 4 EUDOBOMXY
DOS[FHKBOMOR ROPEFDCIB [MOJHUSX QO QHFVDOS LHFEEXSF SCDMOQCSF. *FMUDBFRX #define EU SOGNB
JXB\ RHOZUEEXSF, [O]BOSN MUDNMQFREXU, JUPO[CQEXU [O OBEOVUEFI D BF[CS QBMNDBNMX LCEEXY
OB[CLCIB. >NZU RQUGO, WBO [MF OJECMNZUEFF OVFJDF R SCDMOQU OBHCLWFD QDHCLXRCUB MNDF F QOOJTCUB,
WBO 7)#-"% R SCDMOQU LO[NTUEC OVFJDC, EO EU NDCPXRCUB DOEDMUBEOGO EOSUMC QBMODF.
Lanouu ycoeepueucfeoeauuue rakpocu
$C Q^UEN RXYOLFB SUYCEFPS VCJHOEOR NQORUMVUEQBRORCEEX_ SCDMO[MO^UQQOM LHK LFMUDBFR
#define. <CJHOEX [MULQBCRHKIB QOJO_ EFWBO FEOU, DCD SCDMOQX JUP RQUY [UMUWFQHUEEXY
OGMCEFWUEF_. )EF SOGNB JXB\ RHOZUEEXSF. #CS EU [MFLUBQK JUQ[ODOFB\QK O LNJHFMORCEFF FY
`NED^F_. 8OH\VFEQBRO OBHCLWFDOR C++ [MF ROPEFDEORUEFF OVFJDF [MCRFH\EO NDCPXRCUB QBMODN
VCJHOEC. (CPSUM VCJHOEC EU RXPORUB EFDCDFY [MOJHUS. $CDOEU^, RCS EU [MFLUBQK NMOLORCB\ QROI
[MUDMCQENI [MOGMCSSN PCDOMIWDCSF RMOLU \ F ##.
57
Cuufakcuc uanouoe
%QHF RX QOJFMCUBUQ\ FQ[OH\PORCB\ VCJHOEX, [MFRXDC_BU D BOSN, WBO R RCVU_ MUWF JNLUB WCQBO PRNWCB\
BUMSFE >+6+,#"6(9%&+**'3 (parameterized). <CJHOEX FQ[OH\PNIBQK LHK QOPLCEFK [CMCSUBMFPORCEEXY
BF[OR (OJXWEO DHCQQOR) F [CMCSUBMFPORCEEXY `NED^F_.
Raparefpusoeauuue funu
5CMCSUBMFPORCEEX_ BF[ REUVEU [MULQBCRHKUB QOJO_ OJXWEOU OJaKRHUEFU DHCQQC, DOBOMOSN
[MULVUQBRNUB SCGFWUQDOU PCDHFECEFU template <c1ass Type>, GLU Type RXJMCEEOU RCSF
QFSROHFWUQDOU FSK (OQBCH\EXU ]HUSUEBX PCLCIBQK ZUQBDO). #QILN, GLU QFSROHFWUQDOU FSK Type (FHF
LMNGOU FSK) RQBMUWCUBQK R OJaKRHUEFF DHCQQC OEO FEBUM[MUBFMNUBQK DCD SCDMOQ, RSUQBO DOBOMOGO [MF
FQ[OH\PORCEFF DHCQQC [OLQBCRHKUBQK DOEDMUBEX_ BF[. 0HCQQ ListNode, [UMU[FQCEEX_ DCD
[CMCSUBMFPORCEEX_ BF[, RXGHKLFB QHULNITFS OJMCPOS:
template <class Type>
class ListNode {
private:
ListNode<Type>* next;
Type* data;
public:
ListNode(Type* d, ListNode<Type>* n = NULL) : next(n), data(d) {}
~ListNode() { delete next; }
Type* Data() { return data; }
ListNode<Type>* Next() { return next; }
};
ListNode<Foo> list = new ListNode<Foo> (new Foo);
Foo* f = list->Data(); // G'-47$K$"* 57$4/#,(<? */5
# BUHU OJaKRHUEFK DHCQQC `OMSCH\EX_ [CMCSUBM VCJHOEC MUPUMRFMNUB SUQBO, EC DOBOMOU [MF
FQ[OH\PORCEFF DHCQQC [OLQBCRHKUBQK `CDBFWUQDF_ [CMCSUBM. 5MF ]BOS DOS[FHKBOM JNDRCH\EO
GUEUMFMNUB [MCRFH\EX_, JUPO[CQEX_ [O OBEOVUEFI D BF[CS DOL.
Raparefpusoeauuue qyukuuu
5CMCSUBMFPORCEEXU `NED^FF OJaKRHKIBQK BOWEO BCD ZU [UMUL FY OJaKRHUEFKSF NDCPXRCUBQK
`OMSNHC template.... .FEBCDQFQ VCJHOEC LOHZUE [ORBOMKB\QK DCD [MF OJaKRHUEFF, BCD F [MF
O[MULUHUEFF `NED^FF. 5OSEFBU, VCJHOEX EC QCSOS LUHU KRHKIBQK SCDMOQCSF, [O]BOSN OEF LOHZEX
ECYOLFB\QK R `C_HCY .h. %QHF O[MULUHUEFU JNLUB ECYOLFB\QK R `C_HU .QMM, [MOGMCSSC MCJOBCB\ EU JNLUB
(UQHF BOH\DO ]BO EU #)(*."&#**'3 `C_H .QMM, R DOBOMOS RXPXRCUBQK LCEECK `NED^FK).
// L;E%4#"(/" @3(&B//
template <class Type>
Type* fn(Type* t);
// L57"0"#"(/" "" 7"$#/-$B//
template <class Type>
Type* fn(Type* t) {
// A"#' @3(&B//, 4 &'*'7'2 /2% Type
// /)5'#,-3"*)% 4 &$.")*4" 5$7$2"*7$ 2$&7')$
}
Foo* f = fn<Foo>(new Foo);
)[MULUHUEFU GUEUMFMNUBQK DOS[FHKBOMOS [MF EUOJYOLFSOQBF, BO UQB\ [MF RXPORU `NED^FF. $C ]BOB MCP
[CMCSUBMFPORCEO FSK `NED^FF, C EU FSK DHCQQC.
58
Raparefpusoeauuue qyukuuu knaccoe
5CMCSUBMFPORCEEXU `NED^FF DHCQQOR O[MULUHKIBQK BCD ZU (MCPRU WBO RCS [OECLOJFBQK JOH\VU
NGHORXY QDOJOD < F >). *CRC_BU SOLF`F^FMNUS DHCQQ ListNode BCD, WBOJX UGO `NED^FF EU
O[MULUHKHFQ\ [MF OJaKRHUEFF DHCQQC.
template <class Type>
class ListNode {
private:
ListNode<Type*> next;
Type* data;
public:
ListNode(Type* d, ListNode<Type>* n = NULL);
~ListNode();
Type* Data();
ListNode<Type>* Next();
};
template <class Type>
ListNode<Type>::ListNode(Type* d, ListNode<Type>* n = NULL)
: next(n), data(d)
{
}
template <class Type>
ListNode<Type>::~ListNode()
{
delete next;
}
template <class Type>
Type* ListNode<Type>::Data()
{
return data;
}
template <class Type>
ListNode<Type>* ListNode<Type>::Next()
{
return next;
}
5OSEFBU: RQU ]BO LOHZEO ECYOLFB\QK R `C_HU .h. !QDHIWUEFU QOQBCRHKIB QFBNC^FF, DOGLC `NED^FF
DHCQQC RXPXRCIBQK BOH\DO FP `C_HC .QMM, R DOBOMOS OEF O[MULUHKIBQK. # ]BOS QHNWCU O[MULUHUEFK
`NED^F_ DHCQQC LOHZEX [MULVUQBRORCB\ FY [UMROSN FQ[OH\PORCEFI.
Repepaa naparefpa
6EOGOWFQHUEEXU QFSROHX < F > RXPXRCIB FPMKLENI [NBCEF^N, [OQDOH\DN C++ EU RQUGLC
[OQHULORCBUHUE. #OOJTU GOROMK, <A37"> QHULNUB NDCPXRCB\ RUPLU, DMOSU BMUY SUQB R OJaKRHUEFKY
DHCQQOR FHF O[MULUHUEFKY FY `NED^F_:
/. "C DHIWURXS QHOROS class R QCSOS ECWCHU.
2. 5MF NDCPCEFF FSUEF DOEQBMNDBOMC.
3. 5MF NDCPCEFF FSUEF LUQBMNDBOMC.
-MGNSUEBX DOEQBMNDBOMOR F LUQBMNDBOMOR LOHZEX JXB\ [CMCSUBMFPORCEEXSF, DCD F RQU FQ[OH\PORCEFK
FSUEF DHCQQC PC FQDHIWUEFUS BMUY NDCPCEEXY QHNWCUR. 5MF HIJOS FQ[OH\PORCEFF [CMCSUBMFPORCEEOGO
59
BF[C FHF `NED^FF EUOJYOLFSO NDCPXRCB\ [CMCSUBM. 8XHO JX ECSEOGO [MOTU, UQHF JX C++ [MOQBO
BMUJORCH [MFQNBQBRFK [CMCSUBMC RO RQUY QHNWCKY, EO ]BO ZU C++... #LOJCROD SOZEO Q]DOEOSFB\
EUQDOH\DO QFSROHOR R FQYOLEOS BUDQBU [MOGMCSSX. # BMUY NDCPCEEXY QFBNC^FKY DOS[FHKBOM SOZUB
QLUHCB\ MCPNSEXU [MUL[OHOZUEFK [O [OROLN OBQNBQBRNITFY QFSROHOR.
Lanouu c ueckonukuru naparefparu
+F[ SOZUB FSUB\ JOHUU OLEOGO [CMCSUBMC, YOBK BCDFU QFBNC^FF RQBMUWCIBQK LOROH\EO MULDO. 4RFLUR
BCDO_ DHCQQ, K OJXWEO PCBURCI Q CRBOMOS LOHGNI JUQULN O [MFE^F[CY [OQBMOUEFK [MOGMCSS. +US EU
SUEUU, FEOGLC FQ[OH\PORCEFU SEOGOCMGNSUEBEXY VCJHOEOR JXRCUB O[MCRLCEEXS. .FEBCDQFQ RXGHKLFB
CECHOGFWEO, MCPRU WBO RSUQBO <c1ass Type> FQ[OH\PNUBQK Q[FQOD BF[C <c1ass Type1, class
Type2>. $CDOEU^, [CMCSUBM EU OJKPCE JXB\ DHCQQOS. )E SOZUB JXB\ QBMNDBNMO_ FHF UTU WUS-EFJNL\,
YOBK FSUEEO DHCQQX [MOWEO NLUMZFRCIB RULNTFU [OPF^FF EC MXEDU [CMCSUBMOR.
ono enoeuuue naparefpusoeauuue funu!
4RX, BCDCK ROPSOZEOQB\ QNTUQBRNUB, EO [OZCHN_QBC, [OH\PN_BUQ\ UI Q SCDQFSCH\EO_ OQBOMOZEOQB\I.
#HOZUEEXU VCJHOEX EU BOH\DO [HOYO WFBCIBQK, EO F GUEUMFMNIB OGMOSEOU DOHFWUQBRO DOLC [MF
MCQVFMUEFF. 5OSEFBU, WBO [MF FQ[OH\PORCEFF VCJHOEC QCSOGO RUMYEUGO NMOREK JNLNB MCQVFMUEX &.#
VCJHOEX.
template <class Type>
class B {...};
template <class Type>
class A {
B<A<Type>>* member; // U3*,!
};
5OQSOBMFBU EC ]BOB OSUMPFBUH\EX_ QFEBCDQFWUQDF_ SNQOM. 5MF RHOZUEFF [CMCSUBMFPORCEEXY BF[OR
RQUGLC [MOFQYOLFB EUWBO [OLOJEOU. 5OPLEUU SX [OGOROMFS O BOS, DCD [UMULUHCB\ ]BOB `MCGSUEB; C [ODC
FPJUGC_BU RHOZUEEXY [CMCSUBMFPORCEEXY BF[OR, DCD WNSX.
Hacnepoeauue
5CMCSUBMFPORCEEXU DHCQQX SOGNB JXB\ [MOFPROLEXSF OB LMNGFY DHCQQOR, [CMCSUBMFPORCEEXY FHF EUB.
0MOSU BOGO, [CMCSUBMFPORCEEX_ DHCQQ SOZUB RXQBN[CB\ R DCWUQBRU JCPOROGO; R ]BOS QHNWCU
[MOFPROLEX_ DHCQQ BCDZU JNLUB [CMCSUBMFPORCEEXS Q BUS ZU `OMSCBOS CMGNSUEBOR, WBO F R JCPOROS
DHCQQU. # [MOFPROLEOS DHCQQU SOGNB LOJCRHKB\QK EORXU [CMCSUBMX, EO MUPNH\BCB EC[OSFECUB
QOMUREORCEFK [O [OROLN BOGO, DBO NSUQBFB R OLEO_ QBMODU JOH\VU APL-DOLC. *MNGFSF QHORCSF, EU
LUHC_BU ]BOGO. !P RQUY [UMUWFQHUEEXY SNBC^F_ WCTU RQUGO RQBMUWCUBQK ECQHULORCEFU
[CMCSUBMFPORCEEOGO BF[C OB EU[CMCSUBMFPORCEEOGO. 6X MCQQSOBMFS ]BO F LMNGFU QOWUBCEFK [MOQBXY F
[CMCSUBMFPORCEEXY BF[OR R QHULNITUS MCPLUHU.
Koruuauuu npocfux u naparefpusoeauuux funoe
5MUL[OHOZFS, N RCQ FSUUBQK [CMCSUBMFPORCEEX_ DHCQQ, MUCHFPC^FK RQUY `NED^F_ DOBOMOGO PCEFSCUB
/000 QBMOD. 5MF DCZLOS UGO FQ[OH\PORCEFF LHK EOROGO BF[C DOS[FHKBOM MCLOQBEO RX[HURXRCUB
OWUMULEXU /000 QBMOD MCQVFMUEEOGO DOLC. *CZU [MF EXEUVEFY ^UECY EC [CSKB\ ]BO QHFVDOS RXQODCK
^UEC PC JUPO[CQEOQB\ BF[C.
*O[NQBFS, RX [MOLCUBU JFJHFOBUDN DHCQQOR F EU YOBFBU [OQBCRHKB\ FQYOLEX_ BUDQB, C BOH\DO
FEBUM`U_QX. %QHF JFJHFOBUDC QOLUMZFB [CMCSUBMFPORCEEXU `NED^FF, OEF LOHZEX ECYOLFB\QK R
OBDMXBOS LHK RQUGO SFMC `C_HU .h. )JFLEO.
*O[NQBFS, DBO-BO [UMULCUB RCS PCSUWCBUH\EX_, EO EUJUPO[CQEX_ [O OBEOVUEFI D BF[CS DHCQQ FHF
JFJHFOBUDN DHCQQOR. 6OZUB JXB\, OE JXH EC[FQCE EC DOS[FHKBOMU, DOBOMX_ EU [OLLUMZFRCUB VCJHOEX,
FHF CRBOM [MOQBO EU RUMFB R VCJHOEX. #CS YOWUBQK [OL[MCRFB\ DOL F QLUHCB\ UGO JUPO[CQEXS Q
[OSOT\I VCJHOEOR. $O YOBFBU HF RX [UMULUHXRCB\ RQU [OLMKL, RDHIWCB\ RUQ\ DOL MUCHFPC^FF R `C_HX
.h F LOJCRHKB\ R OJaKRHUEFK DHCQQC [CMCSUBMX F QFSROHX <>?
60
#O RQUY O[FQCEEXY QFBNC^FKY QBOFB FQ[OH\PORCB\ [CMCSUBMFPORCEEX_ BF[ R QOWUBCEFF Q [MOQBXS,
EU[CMCSUBMFPORCEEXS BF[OS. 0OGLC ]BO JNLUB QLUHCEO, R 99 QHNWCKY FP /00 [CMCSUBMFPORCEEX_ BF[
PCROMCWFRCUB [MOQBO_ BF[ R QFS[CBFWENI, SKGDNI F JUPO[CQENI [O OBEOVUEFI D BF[CS OJOHOWDN.
5MF ]BOS [MOQBO_ DHCQQ EU FPSUEKUBQK [MOQBO [CMCSUBMFPORCEEX_ DHCQQ [OSUTCUBQK SUZLN EU-
JUPO[CQEXS DHCQQOS F [OH\PORCBUHUS. *HK BCDFY QFBNC^F_ QNTUQBRNUB MKL QBCELCMBEXY [MFUSOR F
SEOGOWFQHUEEXU FLFOSX, OQEORCEEXU EC ]BO_ FLUU.
Heesonacuue funu e ofkpufux asoeux knaccax
$U LUHC_BU ]BOGO. .UM\UPEO. %QHF RX [O[XBCUBUQ\ RRUQBF JUPO[CQEOQB\ BF[OR R [MOFPROLEOS DHCQQU Q
OBDMXBXS ECQHULORCEFUS, DHFUEB [OHNWFB [OHEX_ LOQBN[ DO RQUS EUJUPO[CQEXS QMULQBRCS JCPOROGO
DHCQQC. .NTUQBRNIB EURUMOKBEO FPOJMUBCBUH\EXU MUVUEFK ]BO_ [MOJHUSX (OQOJUEEO Q [MFSUEUEFUS
SUBOLOR, DOBOMXU JNLNB MCQQSOBMUEX R QHULNITFY GHCRCY), EO R HIJOS QHNWCU N RCQ RX_LUB WBO-BO
RMOLU [OLRUQEOGO SOQBC FP JNBXHOWEXY [MOJOD: GUEFCH\ECK MCJOBC [MF [HOYOS SCBUMFCHU.
Heesonacuue funu e sakpufux asoeux knaccax
#OB ]BO NZU JOH\VU [OYOZU EC FQBFEN. .CSX_ [MOQBO_ Q[OQOJ OJUQ[UWFB\ JUPO[CQEOQB\ BF[OR
QLUHCB\ EUECLUZEX_ DHCQQ PCDMXBXS JCPORXS DHCQQOS JUPO[CQEOGO VCJHOEC.
class UnsafeNode { // ListNode /- 57"0<03K"8' 57/2"7$
private:
UnsafeNode* next;
void* data;
public:
UnsafeNode(void* d, UnsafeNode* n);
virtual ~UnsafeNode();
UnsafeNode* Next();
void* Data();
};
template <class Type>
class SafeNode : private UnsafeNode {
public:
SafeNode(Type* d, SafeNode* n) : UnsafeNode(d, n) {}
virtual ~SafeNode() { delete (Type*)Data(); }
SafeNode* Next() { return (SafeNode*)UnsafeNode::Next(); }
Type* Data() { return (Type*)UnsafeNode::Data(); }
6X LOJFHFQ\ WUGO YOBUHF JCPORX_ DHCQQ EULOQBN[UE LHK DHFUEBOR [MOFPROLEOGO VCJHOEC.
5MFRULUEEX_ [MFSUM LUSOEQBMFMNUB UTU OLFE [MFUS, QRKPCEEX_ Q [MOQBMCEQBRCSF FSUE C++. $UB
EUOJYOLFSOQBF QOPLCRCB\ R [MOFPROLEOS DHCQQU EORXU FSUEC LHK `NED^F_ Next() F Data() BOH\DO
[OBOSN, WBO OEF OBHFWCIBQK BF[OS ROPRMCTCUSOGO PECWUEFK; [OQDOH\DN EF OLEC FP ]BFY `NED^F_ EU
KRHKUBQK RFMBNCH\EO_, [MOFPROLECK RUMQFK QDMXRCUB JCPORNI OB DHFUEBOR. $UDOBOMXU DOS[FHKBOMX
[MF [O[XBDU QDMXBFK WHUEOR JCPORXY DHCQQOR NDOMFPEUEEO GMOPKB [CH\^US, EO LHK PCDMXBOGO
ECQHULORCEFK ]BO [MULN[MUZLUEFU CJQOHIBEO JUPOJFLEO. 5OQHU RQUY OGOMWUEF_, LOQBCRHKUSXY RCS
DOS[FHKBOMOS, JXRCUB [MFKBEO OB[HCBFB\ USN BO_ ZU SOEUBO_.
)LFE FP EULOQBCBDOR PCDMXBOGO ECQHULORCEFK EUOJYOLFSOQB\ LNJHFMORCEFK RQUY `NED^F_ JCPOROGO
DHCQQC, DOBOMXU SOGNB JUPO[CQEO FQ[OH\PORCB\QK DHFUEBCSF. #[MOWUS, ]BO [MOFQYOLFB EU BCD NZ WCQBO
F R HIJOS QHNWCU EU KRHKUBQK QHFVDOS RXQODO_ ^UEO_ PC LO[OHEFBUH\ENI JUPO[CQEOQB\. 5MFSUMOS
SOZUB [OQHNZFB\ ECVC MUCHFPC^FK `NED^F_ Next() F Data(), PC FQDHIWUEFUS BOGO, WBO FEBUM`U_Q
FLUEBFWUE FEBUM`U_QN PCDMXBOGO JCPOROGO DHCQQC.
Heesonacuue funu e nepereuuux knacca
.HULNITFS Q[OQOJOS OJaULFEUEFK LRNY DHCQQOR KRHKUBQK LUHUGFMORCEFU: RX QOPLCUBU ]DPUS[HKM
EUJUPO[CQEOGO DHCQQC R DCWUQBRU [UMUSUEEO_ [CMCSUBMFPORCEEOGO DHCQQC F [OMNWCUBU USN RQI
6.
EUOJYOLFSNI MCJOBN. *HK OJUQ[UWUEFK JUPO[CQEOQBF BF[OR ]BC [UMUSUEECK DHCQQC LUHCUBQK EURFLFSO_
LHK [OH\PORCBUHK. !EOGLC ]BC PCLCWC EU MUVCUBQK BCD [MOQBO; QUSCEBFDC OJOHOWDF EUMULDO OBHFWCUBQK
OB QUSCEBFDF [UMUSUEEO_.
(CQQSOBMFS PECDOSX_ [MFSUM QO QRKPCEEXS Q[FQDOS UnsafeNode. #SUQBO PCDMXBOGO ECQHULORCEFK
SafeNode OB ]BOGO DHCQQC SOZEO QLUHCB\ UnsafeNode [UMUSUEEO_ DHCQQC SafeNode. )LECDO [O
FSUITUSNQK SafeNode RCS EU NLCQBQK [OHNWFB\ QHULNITF_ SafeNode R Q[FQDU! 5O[MOJN_BU QCSF.
0CZLX_ UnsafeNode QQXHCUBQK EC LMNGO_ UnsafeNode, C EU EC SafeNode. #OPSOZEOU MUVUEFU
FQ[OH\PORCB\ MCPENI QUSCEBFDN LHK OJOHOWDF F QOLUMZFSOGO.
// G SafeList.h
class UnsafeNode; // =7"04$7/*"#,('" ';E%4#"(/"
template <class Type>
class SafeList { // P"-'5$)($% ';'#'.&$ 0#% UnsafeNode
private:
UnsafeNode* head;
public:
SafeList() : head(NULL) {}
~SafeList();
UnsafeNode* Cursor(); // :#% /*"7$B/?
Type* Next(UnsafeNode*&); // ="7"C'0 & )#"03>K"23 Q#"2"(*3
void DeleteAt(UnsafeNode*&); // H0$#"(/" Q#"2"(*$ 4 5'-/B// &37)'7$
void InsertFirst(Type*); // G)*$4&$ 4 ($.$#' )5/)&$
void InsertBefore(UnsafeNode*&); // G)*$4&$ 5"7"0 5'-/B/"? &37)'7$
void InsertAfter(UnsafeNode*&); // G)*$4&$ 5')#" 5'-/B// &37)'7$
};

// G SafeList.cpp
class UnsafeNode { // ListNode /- 57"0<03K"8' 57/2"7$
private:
UnsafeNode* next;
void* data;
public:
UnsafeNode(void* d, UnsafeNode* n);
virtual ~UnsafeNode();
UnsafeNode* Next();
void* Data();
};
)JaUDB SafeList [MULQBCRHKUB RUQ\ Q[FQOD, C EU OBLUH\EX_ ]HUSUEB. 8OH\VFEQBRO O[UMC^F_ (BCDFU
DCD InsertFirst) OBEOQKBQK D Q[FQDN R ^UHOS, C EU D OBLUH\EOSN ]HUSUEBN. *HK O[UMC^F_,
RX[OHEKUSXY Q OLEFS ]HUSUEBOS, ECS [OBMUJNUBQK EORCK [CMCLFGSC DNMQOM (SCMDUM [OPF^FF).
1BOJX [UMUSUTCB\QK [O Q[FQDN, RX PC[MCVFRCUBU N EUGO [OPF^FI DNMQOMC. 1BOJX [UMU_BF D
QHULNITUSN ]HUSUEBN, RX [UMULCUBU QQXHDN EC NDCPCBUH\ EC DNMQOM, DOBOMCK OJEORHKUBQK OJaUDBOS
SafeList. 1BOJX RX[OHEFB\ O[UMC^FI Q O[MULUHUEEO_ [OPF^FU_ Q[FQDC, RX [UMULCUBU DNMQOM,
O[MULUHKITF_ ]BN [OPF^FI. )JMCBFBU REFSCEFU: DHFUEBN EU ENZEO PECB\ OJ UnsafeNode EFWUGO,
DMOSU QCSOGO `CDBC UGO QNTUQBRORCEFK [MULRCMFBUH\EOGO OJaKRHUEFK ODCPXRCUBQK R[OHEU
LOQBCBOWEO. 0OE^U[^FK DNMQOMC JNLUB [OLMOJEO MCQQSOBMUEC R QHULNITFY GHCRCY. - [ODC RX LOHZEX
[OEKB\, WBO JUPO[CQECK OJOHOWDC EU QROLFBQK D EUQDOH\DFS [CMCSUBMCS F QFSROHCS <>, MCPJMOQCEEXS
[O [MOGMCSSU, SX [UMUO[MULUHKUS QUSCEBFDN QBMNDBNMX LCEEXY. +CDCK QFBNC^FK BF[FWEC LHK
EUECLUZEXY, MUDNMQFREXY QBMNDBNM LCEEXY F WCQBO RQBMUWCUBQK R LMNGFY DOEBUDQBCY.
Hcknkeuun
%QHF RCVF [MOGMCSSX RQUGLC MCJOBCIB JUP SCHU_VFY [MOJHUS, SOZUBU QSUHO [MO[NQBFB\ ]BN GHCRN. -
UQHF EUB LCRC_BU [OGOROMFS O BOS, DCD OJMCJCBXRCB\ FQDHIWUEFK.
8CPORX_ [MFE^F[, EC DOBOMOS OQEORCEC OJMCJOBDC FQDHIWUEF_, ROQQBCEORHUEFU QOQBOKEFK F RXJOM
CH\BUMECBFREXY LU_QBRF_ R QHNWCU OVFJDF. 5MUL[OHOZFS, R RCVU_ [MOGMCSSU FSUUBQK EUDF_ JHOD F
RX EU NRUMUEX, WBO OE LOMCJOBCUB LO DOE^C. 5MF RX[OHEUEFF JHODC SOZUB ROPEFDENB\ EUYRCBDC [CSKBF,
FHF ECWENBQK [MOJHUSX Q DOSSNEFDC^FKSF, FHF EUYOMOVF_ DHFUEBQDF_ OJaUDB [UMULCQB EURUMEX_
[CMCSUBM. (CPRU EU YOBUHOQ\ JX EC[FQCB\ [MOGMCSSN R BCDOS RFLU:
if (;#'& ;30"* 7$;'*$*,) {
;#'&;
}
else {
)0"#$*, .*'-*' 0738'";
}
!ECWU GOROMK, RX PCGHKLXRCUBU R YMNQBCH\EX_ VCM. %QHF R EUS RFLUE `MCGSUEB [MOGMCSSX, DOBOMX_
GOMFB QFEFS [HCSUEUS, RX FPSUEKUBU JNLNTUU F OJYOLFBU ]BOB `MCGSUEB. $U QBOFB Q PCBCUEEXS
LXYCEFUS OZFLCB\ [OKRHUEFK BCDFY KPXDOR [MOGMCSSFMORCEFK R JHFZC_VUS JNLNTUS, EO EC RBOMOS
SUQBU QBOFB OJMCJOBDC FQDHIWUEF_. . [OSOT\I FQDHIWUEF_ RX LO[MCVFRCUBU [OLOPMFBUH\EX_
JHOD. %QHF R EUS OJECMNZFBQK OVFJDC, DOS[FHKBOM [OSOZUB ROQQBCEORFB\ QOQBOKEFU [UMUL
RX[OHEUEFUS JHODC F [MOLOHZFB\ MCJOBN.
Opaofka ucknkeuu e cfaupapfe ANSI
>OMOVCK EOROQB\: LHK OJMCJOBDF FQDHIWUEF_ QNTUQBRNUB QBCELCMB ANSI FHF, DCD ]BO RQUGLC JXRCUB
R C++, [MULHOZUEEX_ QBCELCMB. !EBUMUQEO, [OWUSN N ECQ BCD SEOGO [MULHOZUEEXY QBCELCMBOR F EF
OLEOGO MUCH\EOGO? .DOMUU RQUGO, LUHO R BOS, WBO ECVC ]DOEOSFDC EU SOZUB RSUQBFB\ RQUY JUPMCJOBEXY
WHUEOR DOSFBUBOR QBCELCMBFPC^FF. 'NWVU OQBCRFB\ FS PCEFSCBUH\EOU [OZFPEUEEOU YOJJF, [ODC SX
JNLUS RX[OHEKB\ QROI MCJOBN. #[MOWUS, K OBRHUDQK.
5HOYCK EOROQB\: QBCELCMBECK OJMCJOBDC FQDHIWUEF_ RQU UTU EU [OLLUMZFRCUBQK SEOGFSF
DOS[FHKBOMCSF C++. >OMOVCK EOROQB\: RQU JOH\VU F JOH\VU DOS[FHKBOMOR RXYOLFB EC [UMULORXU
[OPF^FF. 5HOYCK EOROQB\: OQBCHOQ\ EUSCHO QBCMOGO DOLC, [MULECPECWUEEOGO LHK QBCMXY DOS[FHKBOMOR.
4RX.
*CRC_BU QECWCHC [OGOROMFS O BOS, DCD RQU )%2D*% [MOFQYOLFB\, C NZU [OBOS PC_SUSQK BUSF
RCMFC^FKSF, DOBOMXU RQBMUWCIBQK R MUCH\EOS SFMU.
Cuufakcuc uuuuuupoeauun ucknkeuu
.HULNITCK `NED^FK VHU[EUB RCQ [O MNDCS, UQHF RXPRCB\ UU Q EURUMEXS [CMCSUBMOS. #SUQBO HFEU_DF
OEC ROQ[OH\PNUBQK QUD^FU_ throw. # ]BO_ `NED^FF SOGNB [MOFPO_BF LRU OVFJDF, [MULQBCRHUEEXU
DOEQBCEBCSF [UMUWFQHUEFK Gotcha.
enum Gotcha { kTooLow, kTooHigh };
void fn(int x) throw(Gotcha) {
4
64
if (x < 0)
throw kTooLow; // J3(&B/% -$4"7M$"*)% -0"),
if (x > 1000)
throw kTooHigh; // D#/ -0"),
// F0"#$*, .*'-*' ')2<)#"(('"
}
# [UMRO_ QBMODU O[MULUHKUBQK BF[ FQDHIWUEFK. !QDHIWUEFK SOGNB FSUB\ HIJO_ BF[: ^UHOU,
[UMUWFQHUEFU, QBMNDBNMC F LCZU DHCQQ. #O RBOMO_ QBMODU OJaKRHKUBQK FEBUM`U_Q `NED^FF Q EORXS
[MFLCBDOS .>#C(B($+C(#3 (.$2F-#*(3, DOBOMX_ O[MULUHKUB, DCDFU FQDHIWUEFK SOGNB JXB\
[OHNWUEX OB `NED^FF RXPXRCITU_ QBOMOEO_. # LCEEOS [MFSUMU FEF^FFMNUBQK FQDHIWUEFU
ULFEQBRUEEOGO BF[C Gotcha. # WUBRUMBO_ F VUQBO_ QBMODU [ODCPCEO, DCD FEF^FFMNIBQK FQDHIWUEFK,
DOBOMXU LOHZEX JXB\ ]DPUS[HKMCSF OLEOGO FP BF[OR, NDCPCEEOGO R Q[U^F`FDC^FF FQDHIWUEF_ LCEEO_
`NED^FF. .[U^F`FDC^FF FQDHIWUEF_ LOHZEX [OLWFEKB\QK QHULNITFS [MCRFHCS.
OLneneuun u onpepeneuun
.[U^F`FDC^FK FQDHIWUEF_ R OJaKRHUEFF `NED^FF LOHZEC BOWEO QOR[CLCB\ QO Q[U^F`FDC^FU_ R UU
O[MULUHUEFF.
void Fn() throw(int); // L;E%4#"(/"
// 60"-*' 4 @$?#" .cpp
void Fn() throw(int) {
// O"$#/-$B/%
}
%QHF O[MULUHUEFU JNLUB OBHFWCB\QK OB OJaKRHUEFK, DOS[FHKBOM QDMUQBFB MNDF EC GMNLF F OBDCZUBQK
DOS[FHFMORCB\ O[MULUHUEFU.
4yukuuu es cneuuqukauuu ucknkeuu
%QHF `NED^FK EU FSUUB Q[U^F`FDC^FF FQDHIWUEF_, OEC SOZUB FEF^FFMORCB\ HIJXU FQDHIWUEFK.
$C[MFSUM, QHULNITCK `NED^FK SOZUB FEF^FFMORCB\ WBO NGOLEO F DOGLC NGOLEO.
void fn(); // 9'1"* /(/B//7'4$*, /)&#>."(/% #>;'8' */5$
4yukuuu, ue uuuuuupykue ucknkeuu
%QHF Q[FQOD BF[OR R Q[U^F`FDC^FF [NQB, `NED^FK EU SOZUB FEF^FFMORCB\ EFDCDFU FQDHIWUEFK.
(CPNSUUBQK, [MF YOMOVUS QBFHU [MOGMCSSFMORCEFK ]BN `OMSN QHULNUB FQ[OH\PORCB\ RQILN, GLU RX
YOBFBU PCRUMFB\ RXPXRCITNI QBOMOEN R OBQNBQBRFF FEF^FFMNUSXY FQDHIWUEF_.
void fn() throw(); // +" /(/B//73"* /)&#>."(/?
4yukuuu, uuuuuupykue ucknkeuun ueckonukux funoe
# QDOJDCY SOZEO NDCPCB\ [MOFPROH\EOU DOHFWUQBRO BF[OR FQDHIWUEF_, MCPLUHFR FY PC[KBXSF.
void fn() throw(int, Exception_Struct, char*);
Repepaa ucknkeuu
%QHF PC QFGECBNMO_ `NED^FF EU NDCPCE EF OLFE BF[ FQDHIWUEFK, `NED^FK EU GUEUMFMNUB EORXU
FQDHIWUEFK, EO SOZUB [UMULCRCB\ LCH\VU FQDHIWUEFK, [OHNWUEEXU OB RXPXRCUSXY UI `NED^F_.
void fn() throw;
Hcknkeuun u curuafypu qyukuu
.[U^F`FDC^FK FQDHIWUEF_ EU QWFBCUBQK WCQB\I QFGECBNMX `NED^FF. *MNGFSF QHORCSF, EUH\PK FSUB\
LRU `NED^FF Q QOR[CLCITFS FEBUM`U_QOS PC FQDHIWUEFUS (EUWCKEEX_ DCHCSJNM!) Q[U^F`FDC^FF
FQDHIWUEF_. *RU QHULNITFU `NED^FF EU SOGNB QOQNTUQBRORCB\ R [MOGMCSSU:
65
void f1(int) throw();
void f1(int) throw(Exception); // ='4*'7%>K$%)% )/8($*37$!
Cneuuqukauun ucknkeuu pnn eupfyanuuux qyukuu
# GHCRU 2 SX GOROMFHF (BOWEUU, K GOROMFH, C RX QHNVCHF) OJ OBHFWFKY SUZLN [UMUGMNPDO_ (overloading)
F [UMUO[MULUHUEFUS (overriding). %QHF RFMBNCH\ECK `NED^FK R [MOFPROLEOS DHCQQU OJaKRHKUBQK Q EORO_
QFGECBNMO_, OBQNBQBRNITU_ R JCPOROS DHCQQU, ]BC `NED^FK QDMXRCUB RQU OLEOFSUEEXU `NED^FF
JCPOROGO DHCQQC (UQHF RX R WUS-BO EU NRUMUEX, RUMEFBUQ\ D QOOBRUBQBRNITUSN MCPLUHN; ]BO RCZEO
[OEFSCB\). -ECHOGFWEX_ [MFE^F[ LU_QBRNUB F LHK Q[U^F`FDC^F_ FQDHIWUEF_.
class Foo {
public:
virtual Fn() throw(int);
};
class Bar : public Foo {
public:
virtual Fn() throw(char*); // L)*'7'1('!
};
0OS[FHKBOM DOQO [OQSOBMFB EC RCQ, EO OBDOS[FHFMNUB. # MUPNH\BCBU BOB, DBO FSUUB LUHO Q Foo*, JNLUB
OZFLCB\ FQDHIWUEFK BF[C int, EU PECK, WBO EC QCSOS LUHU OE FSUUB LUHO Q OJaUDBOS G$r,
FEF^FFMNITFS EUWBO QORUMVUEEO FEOU.
6OMCH\ KQEC: EU FPSUEK_BU Q[U^F`FDC^FI FQDHIWUEF_ RFMBNCH\EO_ `NED^FF R [MOFPROLEXY DHCQQCY.
+OH\DO BCD RCS NLCQBQK QOYMCEFB\ DOEBMCDB SUZLN DHFUEBCSF F JCPORXS DHCQQOS, QOGHCQEO DOBOMOSN
LOHZEX FEF^FFMORCB\QK BOH\DO FQDHIWUEFK O[MULUHUEEOGO BF[C.
Henpepycrofpeuuue ucknkeuun
%QHF FEF^FFMORCEEOU FQDHIWUEFU OBQNBQBRNUB R Q[U^F`FDC^FF FQDHIWUEF_ REUVEU_ `NED^FF,
[MOGMCSSC [UMU`OMSCBFMNUB RCV ZUQBDF_ LFQD. <NBDC. $C QCSOS LUHU OEC RXPXRCUB `NED^FI Q
FSUEUS unexpected(). 5O NSOHWCEFI PCBUS RXPXRCUBQK `NED^FK terminate(), O DOBOMO_ JNLUB
MCQQDCPCEO EFZU, EO RX SOZUBU QLUHCB\ BCD, WBOJX RXPXRCHCQ\ RCVC QOJQBRUEECK `NED^FK.
.OOBRUBQBRNITFU FEBUM`U_QX FP PCGOHOROWEOGO `C_HC except.h RXGHKLKB BCD:
typedef void (*unexpected_function)();
unexpected_function set_unexpected(unexpected_function excpected_func);
# QBMODU typedef... OJaKRHKUBQK FEBUM`U_Q D RCVU_ `NED^FF. :NED^FK set_unexpected()
[OHNWCUB `NED^FI ]BOGO BF[C F OMGCEFPNUB UU RXPOR RSUQBO `NED^FF [O NSOHWCEFI. :NED^FK
set_unexpected() ROPRMCTCUB BUDNTF_ OJMCJOBWFD EU[MULNQSOBMUEEXY FQDHIWUEF_. 3BO [OPROHKUB
RMUSUEEO NQBCEORFB\ QRO_ OJMCJOBWFD BCDFY FQDHIWUEF_, C [OBOS ROQQBCEORFB\ [MUZEF_. #
QHULNITUS `MCGSUEBU [ODCPCEO, DCD FQ[OH\PNUBQK ]BOB [MFUS.
unexpected_function my_handler(void) {
// L;7$;'*$*, ("'1/0$(('" /)&#>."(/"
}
{ // 6'*'4/2)% )0"#$*, (".*' )*7$M('" / 3)*$($4#/4$"2 )4'? ';7$;'*./&
unexpected_function old_handler = set_unexpected(my_handler);
// :"#$"2 )*7$M('" / 4'-47$K$"2 )*$7<? ';7$;'*./&
set_unexpected(old_handler);
}
:NED^FK-OJMCJOBWFD EU SOZUB EOMSCH\EO ROPRMCTCB\ N[MCRHUEFU RXPXRCITU_ [MOGMCSSU, UQHF R EU_
RQBMUWCUBQK O[UMCBOM return FHF [MF RXYOLU FP OJHCQBF LU_QBRFK `NED^FF MUPNH\BCBX JNLNB
EUO[MULUHUEEXSF. +US EU SUEUU, FP `NED^FF SOZEO PC[NQBFB\ FQDHIWUEFU F [MOLOHZFB\ [OFQD
[UMUYRCBWFDC, [OLYOLKTUGO LHK EOROGO FQDHIWUEFK.
66
Cuufakcuc nepexeafa ucknkeuu
1BOJX [UMUYRCBFB\ FQDHIWUEFU, [OQBCR\BU [UMUL JHODOS DHIWUROU QHORO try F [OSUQBFBU [OQHU EUGO
OLEN FHF EUQDOH\DO QUD^F_ catch, DOBOMXU ECPXRCIBQK OJMCJOBWFDCSF (handlers).
try {
// J7$82"(*, &'*'7<? 2'1"* /(/B//7'4$*, /)&#>."(/%
}
catch (Exception_Type t) {
// G'))*$('4#"(/" 5')#" /)&#>."(/% */5$ Exception_Type
}
catch (...) {
// G'))*$('4#"(/" 5')#" /)&#>."(/? 4)"C ')*$#,(<C */5'4
}
0CZLX_ OJMCJOBWFD, PC FQDHIWUEFUS (O[KB\ EUWCKEEX_ DCHCSJNM) OJMCJOBWFDC Q SEOGOBOWFUS,
QOOBRUBQBRNUB OLEOSN DOEDMUBEOSN BF[N OVFJOD. %QHF FP `MCGSUEBC, ECPXRCUSOGO try-JHODOS,
FEF^FFMNUBQK FQDHIWUEFU, DOS[FHKBOM [MOQSCBMFRCUB Q[FQOD OJMCJOBWFDOR R [OMKLDU FY
[UMUWFQHUEFK F FTUB OJMCJOBWFD, [OLYOLKTF_ [O BF[N PC[NTUEEOGO FQDHIWUEFK. 6EOGOBOWFU
QOOBRUBQBRNUB FQDHIWUEFKS HIJOGO BF[C; UQHF BCDO_ OJMCJOBWFD [MFQNBQBRNUB, OE LOHZUE ECYOLFB\QK
[OQHULEFS R Q[FQDU.
#ENBMF OJMCJOBWFDC RX SOZUBU [MUL[MFEFSCB\ HIJXU LU_QBRFK LHK RXYOLC FP QFBNC^FF. .RULUEFK OJ
FQDHIWUEFF SOZEO [OHNWFB\ FP CMGNSUEBC catch DMOSU OJMCJOBWFDC Q SEOGOBOWFUS, DOBOMX_
[OEKBFK EU FSUUB, WBO OE LOHZUE [UMUYRCBXRCB\.
Bunonueuue nporparru nocne ucknkeuun
%QHF RX[OHEUEFU try-JHODC OJYOLFBQK JUP FQDHIWUEF_, [MOGMCSSC JHCGO[OHNWEO FGEOMFMNUB RQU
OJMCJOBWFDF F [MOLOHZCUB MCJOBN Q [UMROGO RXMCZUEFK PC [OQHULEFS OJMCJOBWFDOS. %QHF ZU
FQDHIWUEFU RQU ZU [MOFPOVHO, OEO JNLUB ULFEQBRUEEXS FP RQUGO Q[FQDC, F [OQHU UGO OJMCJOBDF
RX[OHEUEFU [MOGMCSSX [MOLOHZFBQK PC [OQHULEFS OJMCJOBWFDOS Q[FQDC. .NTUQBRNIB LRC FQDHIWUEFK
([OQHULEF_ EUWCKEEX_ DCHCSJNM): OJMCJOBWFD SOZUB QOLUMZCB\ RXPOR DMCSOH\EOGO goto FHF
PC[NQBFB\ FQDHIWUEFU. %QHF OJMCJOBWFD FEF^FFMNUB FQDHIWUEFU, OE SOZUB [MOLOHZFB\
MCQ[MOQBMCEUEFU BOGO ZU FQDHIWUEFK FHF QOPLCB\ EOROU.
catch(int exception) {
// F0"#$*, .*'-*', $ -$*"2
throw(Help!); // D(/B//73"*)% /)&#>."(/" */5$ char*
}
!EF^FFMORCEFU FQDHIWUEFK FP OJMCJOBWFDC EUSULHUEEO PCRUMVCUB RX[OHEUEFU RSUTCITU_ `NED^FF
FHF JHODC.
Ecnu ucknkeuue ue nepexeaeuo
%QHF LHK FQDHIWUEFK EU EC_LUBQK EF OLEOGO OJMCJOBWFDC, [O NSOHWCEFI RXPXRCUBQK GHOJCH\ECK
`NED^FK terminate(). 0CD RX LNSCUBU, WBO OEC LUHCUB? 5O NSOHWCEFI terminate() R DOEUWEOS
QWUBU RXPXRCUB JFJHFOBUWENI `NED^FI abort(), F LUHO DOEWCUBQK CRCMF_EXS PCRUMVUEFUS RQU_
[MOGMCSSX. #X SOZUBU RSUVCB\QK F NQBCEORFB\ QOJQBRUEENI `NED^FI PCRUMVUEFK Q [OSOT\I
JFJHFOBUWEO_ `NED^FF set_terminate(). .OOBRUBQBRNITF_ `MCGSUEB `C_HC except.h RXGHKLFB BCD:
typedef void (*terminate_function)();
termination_function set_terminate(terminate_function t_func);
# QBMODU typedef... OJaKRHKUBQK FEBUM`U_Q D RCVU_ `NED^FF PCRUMVUEFK. :NED^FK
set_terminate() NQBCECRHFRCUB `NED^FI PCRUMVUEFK, DOBOMNI RSUQBO `NED^FF abort() RXPXRCUB
`NED^FK terminate(). :NED^FK set_terminate() ROPRMCTCUB BUDNTNI `NED^FI PCRUMVUEFK,
DOBOMNI [OPLEUU SOZEO ROQQBCEORFB\ [ORBOMEXS RXPOROS set_terminate().
67
#CVC `NED^FK PCRUMVUEFK %/49+*+ PCRUMVFB\ [MOGMCSSN F EU SOZUB FEF^FFMORCB\ LMNGFU
FQDHIWUEFK. )EC SOZUB RX[OHEFB\ EUOJYOLFSXU [OLGOBORFBUH\EXU LU_QBRFK, EO EFDOGLC EU
ROPRMCTCUB N[MCRHUEFU RXPXRCITU_ [MOGMCSSU.
Bnoeuuan opaofka ucknkeuu
*C, RHOZUEFU JHODOR try/catch MCPMUVCUBQK, YOBK [OH\PORCB\QK ]BO_ ROPSOZEOQB\I QHULNUB DCD
SOZEO MUZU, UQHF BOH\DO RX YOBFBU QOYMCEFB\ LMNZUQDFU OBEOVUEFK Q [UMQOECHOS QO[MOROZLUEFK
RCVU_ [MOGMCSSX.
{
try {
try {
try {
// +"($0"1(<? @7$82"(*
}
catch(...) {
}
}
catch(...) {
}
}
catch(...) {
}
}
.OPLCRCB\ [OLOJENI SUVCEFEN [MFYOLFBQK LOROH\EO MULDO, EO FEOGLC ROPEFDCUB EUOJYOLFSOQB\ R
MCPLUHUEFF QBUDORXY OJaUDBOR [O MCPEXS OJHCQBKS LU_QBRFK.
Bueuuue ucknkeuun ue nepexeafueakfcn!
#X SOZUBU [UMUYRCBFB\ HIJOU FQDHIWUEFU, FEF^FFMORCEEOU [OQMULQBROS throw. +US EU SUEUU,
QNTUQBRNIB F LMNGFU FQDHIWUEFK, DOBOMXU EU NLCUBQK [UMUYRCBFB\ [UMUEOQFSXSF Q[OQOJCSF.
$C[MFSUM, UQHF [OH\PORCBUH\ [MFSUEKUB LHK PCRUMVUEFK [MOGMCSSX DOSJFEC^FI DHCRFV Q [MCRXS
Ctrl, EUB GCMCEBFF, WBO O[UMC^FOEECK QFQBUSC QGUEUMFMNUB FQDHIWUEFU, DOBOMOU SOZUB JXB\
[UMUYRCWUEO RCVFSF OJMCJOBWFDCSF. #OOJTU GOROMK, OJMCJOBDC FQDHIWUEF_ OBEOQFBQK BOH\DO D
FQDHIWUEFKS, QGUEUMFMORCEEXS [MOGMCSSO_; RQU OQBCH\EOU EU[UMUEOQFSO.
Koucfpykfopu u pecfpykfopu
)LEO FP [MFE^F[FCH\EXY LOQBOFEQBR QBCELCMBEO_ QYUSX OJMCJOBDF FQDHIWUEF_ 6+.$68"$+ ."#$+
(unwinding the stack). 5MF PC[NQDU FQDHIWUEFK CRBOSCBFWUQDF RXPXRCIBQK LUQBMNDBOMX RQUY QBUDORXY
OJaUDBOR SUZLN throw F catch.
void fn() throw(int) {
Foo aFoo;
// S*'-*' (" *$&!
throw(bad_news);
}
0OGLC ROPEFDCUB FQDHIWUEFU, LO [UMULCWF QBUDC QOOBRUBQBRNITUSN OJMCJOBWFDN JNLUB RXPRCE
LUQBMNDBOM aFoo. +OB ZU [MFE^F[ LU_QBRNUB F LHK try-JHODC RXPXRCITU_ QBOMOEX.
{
try {
Bar b;
fn(); // G<-<4$"* /)&#>."(/"
}
68
catch(int exception) {
// ="7"0 *"2, &$& 2< 5'5$0"2 )>0$, ;30"* 4<-4$( 0")*73&*'7 b
}
}
#OOJTU GOROMK, GCMCEBFMNUBQK RXPOR LUQBMNDBOMOR RQUY QBUDORXY OJaUDBOR, QDOEQBMNFMORCEEXY Q
ECWCHC RX[OHEUEFK try-JHODC. 3BO SOZUB [MFGOLFB\QK LHK PCDMXBFK OBDMXBXY `C_HOR,
[MULOBRMCTUEFK NBUWDF [CSKBF FHF LHK LMNGFY ^UHU_. +US EU SUEUU, LUHO EU OJYOLFBQK JUP EUDOBOMXY
EICEQOR.
Yuufoaerue oLekfu
,CMCEBFMNUBQK RXPOR LUQBMNDBOMOR RQUY QBUDORXY OJaUDBOR, QDOEQBMNFMORCEEXY Q ECWCHC RX[OHEUEFK
try-JHODC, EO F BOH\DO. $C[MFSUM, LO[NQBFS, WBO D SOSUEBN ROPEFDEORUEFK FQDHIWUEFK JXH
QDOEQBMNFMORCE SCQQFR. *UQBMNDBOMX RXPXRCIBQK HFV\ LHK BUY OJaUDBOR SCQQFRC, DOBOMXU JXHF
QDOEQBMNFMORCEX LO ROPEFDEORUEFK FQDHIWUEFK.
*FECSFWUQDFU OJaUDBX (BO UQB\ QOPLCEEXU [OQMULQBROS O[UMCBOMC new) QORQUS LMNGOU LUHO. #CS
[MFLUBQK QCSOQBOKBUH\EO QHULFB\ PC EFSF. %QHF R DNWU MCPSUTCIBQK OJaUDBX, DOBOMXU LOHZEX
NEFWBOZCB\QK R MUPNH\BCBU FQDHIWUEFK, OJXWEO LHK EFY QOPLCUBQK OJOHOWDC R RFLU RQ[OSOGCBUH\EOGO
QBUDOROGO OJaUDBC.
class TempFoo {
private:
Foo* f;
public:
TempFoo(Foo* aFoo) : f(aFoo) {}
~TempFoo() { delete f; }
};
try {
TempFoo tf(new Foo);
// / *.0.
}
catch(...) {
// Foo 3(/.*'1$"*)% 0")*73&*'7'2 tf
}
Hcknkeuun eo epern koucfpyupoeauun
(CQQSOBMFS QHULNITF_ [MO^UQQ DOEQBMNFMORCEFK:
class Foo {...}
class Bar : public Foo {
private:
A a;
B b;
public:
Bar();
};
Bar::Bar()
{
X x;
throw(bad_news);
Y y;
}
69
%QHF RO RMUSK DOEQBMNFMORCEFK OJaUDBC [MOFPO_LUB FQDHIWUEFU, LUQBMNDBOMX JNLNB RXPRCEX LHK BUY
DOS[OEUEBOR (JCPORXY DHCQQOR F [UMUSUEEXY), DOEQBMNDBOMX DOBOMXY JXHF RX[OHEUEX D SOSUEBN
ROPEFDEORUEFK FQDHIWUEFK. 0OEQBMNFMORCEFU G$r D ]BOSN SOSUEBN UTU EU PCRUMVUEO. +US EU SUEUU,
DOEQBMNDBOMX JCPORXY DHCQQOR (Foo) F [UMUSUEEXY ($ F b) NZU OBMCJOBCHF, [O]BOSN FY LUQBMNDBOMX
JNLNB RXPRCEX LO [UMULCWF FQDHIWUEFK OJMCJOBWFDN. 5O BUS ZU [MFWFECS JNLUB RXPRCE LUQBMNDBOM
HODCH\EO_ [UMUSUEEO_ x. *UQBMNDBOM N EU RXPXRCUBQK, [OQDOH\DN [UMUSUEECK UTU EU QDOEQBMNFMORCEC.
*UQBMNDBOM Bar BOZU EU RXPXRCUBQK, [OQDOH\DN DOEQBMNFMORCEFU OJaUDBC EU PCRUMVFHOQ\ D SOSUEBN
FEF^FFMORCEFK FQDHIWUEFK.
5MUL[OHOZFS, DOEQBMNDBOM b FEF^FFMNUB FQDHIWUEFU. # ]BOS QHNWCU RXPXRCIBQK LUQBMNDBOMX Foo F
$, EO EU LUQBMNDBOMX b, Bar F 3.
)LEF F BU ZU [MFE^F[X LU_QBRNIB DCD LHK QBUDORXY, BCD F LHK LFECSFWUQDFY OJaUDBOR. %QHF
FQDHIWUEFU ROPEFDCUB [MF DOEQBMNFMORCEFF LFECSFWUQDOGO OJaUDBC, RXPXRCIBQK BOWEO BU ZU
LUQBMNDBOMX, WBO F LHK QBUDORXY OJaUDBOR.
Ropnpok eusoea pecfpykfopoe
,CMCEBFMNUBQK, WBO [OMKLOD RXPORC LUQBMNDBOMOR JNLUB OJMCBEXS [OMKLDN RXPORC DOEQBMNDBOMOR. 3BO
OBEOQFBQK DCD D HODCH\EXS [UMUSUEEXS, BCD F D [UMUSUEEXS F JCPORXS DHCQQCS OJaUDBOR.
Hecfaupapfuan opaofka ucknkeuu
6EOGFU JFJHFOBUDF F EUDOBOMXU DOS[FHKBOMX OJMCJCBXRCIB FQDHIWUEFK EUQBCELCMBEXS OJMCPOS.
8OH\VFEQBRO FSFBFMNUB [CMCLFGSN try/catch Q [OSOT\I SCDMOQOR, EO EU OMGCEFPNUB [MCRFH\EO_
MCQDMNBDF QBUDC PC QWUB RXPORC LUQBMNDBOMOR DOEQBMNFMORCEEXY OJaUDBOR. $UDOBOMXU MUCHFPC^FF
OMFUEBFMORCEX EC DOEDMUBEXU BF[X DOS[\IBUMOR F O[UMC^FOEEXY QFQBUS.
0 QOZCHUEFI, SEOGFU DOS[FHKBOMX [MUBUELNIB EC QBCELCMBENI OJMCJOBDN FQDHIWUEF_, EO EU RO RQUS
QHULNIB DCEOEFWUQDFS [MCRFHCS. $C QROUS GOM\DOS O[XBU K NPECH, WBO OJMCJOBDN FQDHIWUEF_
ZUHCBUH\EO BUQBFMORCB\, UQHF RX LUHCUBU EUWBO YOB\ QDOH\DO-EFJNL\ EUQBCELCMBEOU (LCZU UQHF OEO
LOHZEO JXB\ QBCELCMBEXS). %QHF RX ODCZUBUQ\ R [OLOJEO_ QFBNC^FF, ODCZFBU NQHNGN RQUS ECS:
EC_SFBU MCPMCJOBWFDC BCDOGO DOS[FHKBOMC KDOJX LHK QUM\UPEOGO [MOUDBC F PCQBCR\BU UGO [FQCB\ F
OBHCZFRCB\ DOL OJMCJOBDF FQDHIWUEF_ LHK UGO QOJQBRUEEOGO DOS[FHKBOMC R BUWUEFU JHFZC_VFY [KBF
HUB. - UTU HNWVU, PCQBCR\BU UGO [UMUEUQBF R QRO_ DOS[FHKBOM DOL, FLUCH\EO MCJOBCITF_ EC LMNGOS
DOS[FHKBOMU.
%QHF [O DCDO_-HFJO [MFWFEU RCS [MFLUBQK PCEFSCB\QK EUQBCELCMBEO_ OJMCJOBDO_ FQDHIWUEF_, JOH\VU
RQUGO [MOJHUS RXPORUB OQROJOZLUEFU [CSKBF OB LFECSFWUQDFY OJaUDBOR, DOBOMXU JXHF QOPLCEX LO
ROPEFDEORUEFK FQDHIWUEFK F REUPC[EO QBCHF EULOQBN[EXSF [UMUSUEEXS. !SUEEO LHK ]BO_ ^UHF
FQ[OH\PNUBQK 99% OJMCJOBDF FQDHIWUEF_ R MUCH\EO_ ZFPEF, LC UTU FPMULDC BMUJNUBQK PCDMXB\
OBDMXBXU `C_HX. #X SOZUBU HFJO QOPLCB\ YFBMONSEXU QBMNDBNMX LCEEXY, DOBOMXU [UMUSUTCIB EORXU
LFECSFWUQDFU OJaUDBX EC RUMY QBUDC F, QHULORCBUH\EO, QOYMCEKIB FY LOQBN[EOQB\, HFJO
ROQ[OH\PORCB\QK SUBOLFDO_ QJOMDF SNQOMC, O[FQCEEO_ R [OQHULEU_ WCQBF DEFGF. )JC [OLYOLC RXGHKLKB
R MCREO_ QBU[UEF OBBCHDFRCITU, BCD WBO RXJFMC_BU QCSF.
Ycnoeuue oosuaeuun
# ]BO_ DEFGU K EU FQ[OH\PNI DHIWURXU QHORC throw F catch, C RQBCRHKI OJTFU DOSSUEBCMFF R BUY
SUQBCY, GLU SOZUB ROPEFDENB\ FQDHIWUEFU. +CDO_ [OLYOL N[MOTCUB MCJOBN Q [MOGMCSSO_, UQHF RCV
DOS[FHKBOM EU [OLLUMZFRCUB QBCELCMBENI OJMCJOBDN FQDHIWUEF_. %QHF RX NRFLFBU WBO-EFJNL\ RMOLU
QHULNITUGO `MCGSUEBC F MCQ[OHCGCUBU QBCELCMBEO_ OJMCJOBDO_ FQDHIWUEF_, SXQHUEEO [MURMCBFBU
DOSSUEBCMF_ R JHOD throw:
f()
{
if (pool->Allocate(size) == NULL)
// /)&#>."(/" ("C4$*&$ 5$2%*/
}
Koceeuuue
opaeuun
0OGLC NDCPCBUH\ EC QCSOS LUHU EU KRHKUBQK NDCPCBUHUS? 0OGLC RX
[MOGMCSSFMNUBU EC .++ F MCJOBCUBU Q NSEXSF NDCPCBUHKSF. )LEC FP
QCSXY JOGCBXY (F QCSXY EULOO^UEUEEXY) DOE^U[^F_ .++ BO, WBO
OJaUDB SOZUB RX[OHEKB\ `NED^FF NDCPCBUHK. # ]BO_ WCQBF [OLMOJEO
MCQQSCBMFRCIBQK MCPHFWEXU Q[OQOJX, [OPROHKITFU ]BO QLUHCB\, C PCOLEO
F [MFSUMX [MCDBFWUQDOGO [MFSUEUEFK O[FQCEEXY FLFOS. 3BC WCQB\ EU
QJOMEFD MU^U[BOR, C QDOMUU ECJOM EORXY FEQBMNSUEBOR LHK RCVU_
SCQBUMQDO_. (NDF [MFHOZFB\ RQU MCREO [MFLUBQK, EO Q YOMOVFSF
FEQBMNSUEBCSF MCJOBC [O_LUB GOMCPLO HUGWU.
2
-acfu
Yruue ykasafenu
"CJNL\BU RQU, WBO RCS FPRUQBEO O . F [MFSFBFREXY O[UMCBOMCY ->, F RPGHKEFBU EC [MOJHUSN [OL EORXS
NGHOS. (CQQSOBMFS QHULNITF_ `MCGSUEB:
class Foo {
public:
void MemberOfFoo();
};
Foo* aFoo = new Foo;
aFoo->MemberOfFoo();
5MULQBCR\BU, WBO RQBMOUEEX_ O[UMCBOM -> [MFSUEKUBQK D RQBMOUEEOSN DHCQQN NDCPCBUHK CLMUQN,
YMCEKTUSNQK R aFoo. C++ [MULOQBCRHKUB BCDO_ O[UMCBOM LHK HIJOGO OJaUDBC, FSUITUGO BF[ NDCPCBUHK
EC QBMNDBNMN, NDCPCBUHK EC DHCQQ FHF NDCPCBUHK EC OJaULFEUEFU. #QBMOUEEXU O[UMCBOMX ->
OQNTUQBRHKIB LOQBN[ D WHUECS, NDCPCEEXS Q[MCRC (R LCEEOS [MFSUMU MemberOfFoo()). :CDBFWUQDF
RX QQXHCUBUQ\ EC WHUEC OJaUDBC (Foo) Q [OSOT\I LMNGOGO OJaUDBC F UGO O[UMCBOMC ->. +O, WBO LMNGO_
OJaUDB KRHKUBQK NDCPCBUHUS RQUGO HFV\ WCQBEX_ QHNWC_; RSUQBO EUGO SOG JX FQ[OH\PORCB\QK RCV
QOJQBRUEEX_ DHCQQ Q EC[FQCEEXS RCSF EUQBCELCMBEXS O[UMCBOMOS ->.
!SUEEO BCD QHULNUB [OLYOLFB\ D O[UMCBOMN -> R C++, [OQDOH\DN OE, DCD F RQU OQBCH\EXU O[UMCBOMX
(DMOSU O[UMCBOMC .), SOZUB [UMUGMNZCB\QK. .FEBCDQFQ JXH R OJTFY WUMBCY OJMFQORCE R GHCRU 2, OLECDO
UGO [OQHULQBRFK LHK [MOGMCSSFMORCEFK OGMOSEX, F FY OJQNZLUEFU PC_SUB ]BN F EUQDOH\DO QHULNITFY
GHCR.
Fnynue ykasafenu
# C++ [MULNQSOBMUEO EUSCHO RQBMOUEEXY BF[OR LCEEXY EC[MFSUM, int, double F NDCPCBUHF.
8OH\VFEQBRO ]BFY RQBMOUEEXY BF[OR NLCUBQK OBEOQFBUH\EO HUGDO N[CDORCB\ R MCPMCJOBCEEXU RCSF
DHCQQX. $C[MFSUM, UQHF [MOQBO_ BF[ int EULOQBCBOWEO YOMOV LHK RCQ, SOZEO QOPLCB\ QORSUQBFSX_
DHCQQ Integer, DOBOMX_ RXGHKLFB [MFSUMEO BCD:
class Integer {
private:
int value;
public:
Integer() : value(0) {}
Integer(int v) : value(v) {}
operator int() { return value; }
Integer operator+(Integer i) { return Integer(value + i.value); }
Integer operator+=(Integer i) { value += i.value; return *this; }
// D *.0. 0#% ')*$#,(<C $7/@2"*/.")&/C '5"7$*'7'4
};
int f(int);
f(Integer(17)); // O$;'*$"* ;#$8'0$7% '5"7$*'73 int()
5
74
0OEQBMNDBOMX [OPROHKIB QOPLCRCB\ ]DPUS[HKMX Integer FP EFWUGO, [O QNTUQBRNITUSN int FHF
LMNGOSN ]DPUS[HKMN Integer. #OPSOZEO, QBOFB QOPLCB\ LO[OHEFBUH\EXU DOEQBMNDBOMX LHK [CMCSUBMC
char* (Q [MUOJMCPORCEFUS atoi()) F LMNGFY WFQHORXY BF[OR. +CD DCD Integer FEOGLC [MFLUBQK
FQ[OH\PORCB\ RSUQBO int (EC[MFSUM, [MF RXPORU `NED^FF Q CMGNSUEBOS int), SX [MULNQSOBMUHF
O[UMCBOM int() LHK RX[OHEUEFK CRBOSCBFWUQDFY [MUOJMCPORCEF_. .DNWECK WUMULC MCPEXY O[UMCBOMOR
ROQ[MOFPROLFB RQI QUSCEBFDN ^UHOWFQHUEEO_ CMF`SUBFDF. 4MC! )BEXEU RSUQBO int SOZEO [ORQILN
FQ[OH\PORCB\ Integer. 6X QOPLCHF EORX_ DHCQQ, DOBOMX_ [OHEOQB\I PCSUEKUB [MFSFBFREX_ int.
#X[U_BU WCVDN DO`U.
4ZU RUMENHFQ\? 5MUL[OHOZFS, R QROUS QBMUSHUEFF D CJQBMCDBEXS BF[CS LCEEXY R C++ ([OHFBFWUQDF
[MCRFH\EX_ BUMSFE LHK DHCQQOR-OJOHOWUD) RX MUVFHF, WBO *-NDCPCBUHF RCQ NZU EU NQBMCFRCIB, F RX
YOBFBU Q[MKBCB\ FY R QROFY DHCQQCY (EU Q[MCVFRC_BU [OWUSN; K ZU QDCPCH, WBO ]BO JXHC RCVC FLUK!).
*CRC_BU [MOLUHCUS SXQHUEEX_ ]DQ[UMFSUEB F [OQSOBMFS, WBO LHK ]BOGO ENZEO. !BCD, [UMRCK [O[XBDC.
class PFoo {
private:
Foo* foo;
public:
PFoo() : foo(NULL) {}
PFoo(Foo* f) : foo(f) {}
operator Foo*() { return foo; }
PFoo operator+(ptr_diff offset) { return PFoo(foo + offset); }
PFoo operator+=(ptr_diff offset) { foo += offset; return *this; }
ptr_diff operator-(PFoo pf) { return foo - pf.foo; }
// D *.0. 0#% 4)"C ')*$#,(<C $7/@2"*/.")&/C '5"7$B/? ) 3&$-$*"#%2/
};
4MC! 4 RCQ [OKRFHQK EORX_ DHCQQ, QORSUQBFSX_ Q Foo*! . CMF`SUBFWUQDFSF O[UMCBOMCSF LUHO OJQBOFB
EUQDOH\DO QHOZEUU. $C[MFSUM, RCS ECRUMEKDC [MFVHOQ\ LODO[CB\QK R Q[MCROWEFDU, WBOJX NPECB\, WBO
ptr_diff KRHKUBQK [UMUEOQFSXS Q[OQOJOS O[FQCEFK MCPEOQBF SUZLN LRNSK CLMUQCSF [CSKBF. #QU ]BO
RXGHKLFB PCENLEO, [OQDOH\DN DHCQQ OMFUEBFMORCE EC Foo, EO PCBO BU[UM\ RX SOZUBU RQILN
FQ[OH\PORCB\ PFoo RSUQBO Foo*... $O BCD HF ]BO? 5OLOZLFBU SFENBDN F OQBCR\BU RBOMNI WCVDN DO`U.
$CV RCMFCEB EU MCJOBCUB.
PFoo pf(new Foo*);
pf->MemberOfFoo(); // +"4"7('
((Foo*)pf)->MemberOfFoo(); // O$;'*$"*, (' 4<8#%0/* L9VOTDAVWX+L!
)[UMCBOM Foo*() [OPROHFB [UMULCRCB\ PFoo R DCWUQBRU CMGNSUEBC `NED^FKS, DOBOMXU LOHZEX
[OHNWCB\ Foo*. +CDZU ROQ[MOFPROLKBQK RQU CMF`SUBFWUQDFU O[UMC^FF Q NDCPCBUHKSF, EO WCQB\
QUSCEBFDF RQU ZU BUMKUBQK, [OQDOH\DN O[UMCBOM -> EU MCJOBCUB R [MUZEUS RFLU. & ECPXRCI BCDFU
NDCPCBUHF GHN[XSF, BCD DCD OEF OWUE\ ECFREX F RULNB QUJK QORQUS EU BCD, DCD LOHZEX QUJK RUQBF
ECQBOKTFU NDCPCBUHF.
!BCD, [OWUSN EC[FQCB\ OJOHOWDN LHK NDCPCBUHU_ QHOZEUU, WUS LHK LMNGFY JCPORXY BF[OR?
/. 0OS[FHKBOM QOPLCUB OBLUH\EX_ BF[ NDCPCBUHK LHK DCZLOGO BF[C QBMNDBNMX, DHCQQC FHF
OJaULFEUEFK. 1BOJX QOPLCB\ OJOHOWDF LHK RQUY NDCPCBUHU_, RCS [MFLUBQK LNSCB\, DCD QLUHCB\
]BO LHK RQUY ROPSOZEXY BF[OR NDCPCBUHU_. )[FQCEEX_ RXVU DHCQQ PFoo MCJOBCUB HFV\ LHK
DHCQQC Foo F [MOFPROLEXY OB EUGO.
2. 5MFYOLFBQK NWFBXRCB\ F LMNGFU, RPCFSOQRKPCEEXU BF[X LCEEXY (EC[MFSUM, size_t F
ptr_diff). %QHF SX YOBFS [OHEOQB\I N[CDORCB\ NDCPCBUHF R ECV DHCQQ, [MFLUBQK QOPLCRCB\
]DRFRCHUEBX F LHK ]BFY BF[OR.
3. #QK QNB\ RQBMOUEEXY NDCPCBUHU_ OJMCTUEFU D WHUECS OJaUDBC Q FQ[OH\PORCEFUS O[UMCBOMC
->. *HK ROQ[MOFPRULUEFK ]BO_ QUSCEBFDF O[UMCBOMC [MUOJMCPORCEFK ODCPXRCUBQK EULOQBCBOWEO.
75
Yruue ykasafenu kak upuora
#OPEFDCITFU [MOJHUSX QBOFB MCPJFMCB\ [OQHULORCBUH\EO. *O CMF`SUBFWUQDFY O[UMC^F_ Q
NDCPCBUHKSF SX LOJUMUSQK [OPZU, [O]BOSN [ODC JNLUS [OH\PORCB\QK ptr_diff.
Onepafop ->
+U[UM\ RX PECUBU, [OWUSN O[UMCBOM -> JXH QLUHCE [UMUGMNZCUSXS. # [OHEOS QOOBRUBQBRFF Q
QFEBCDQFQOS, O[FQCEEXS R GHCRU 2, PFoo BU[UM\ OJPCROLFBQK QOJQBRUEEXS O[UMCBOMOS ->. )[UMCBOMC
[MUOJMCPORCEFK YRCBCUB LHK RXPORC REUVEFY `NED^F_. 5MFRULUEEX_ EFZU RXPOR `NED^FF f()
MCJOBCUB, [OBOSN WBO N DOS[FHKBOMC YRCBCUB NSC [OFQDCB\ O[UMCBOM [MUOJMCPORCEFK, QOOBRUBQBRNITF_
QFGECBNMU `NED^FF, F R LCEEOS QHNWCU O[UMCBOM Foo*() [MUDMCQEO [OLYOLFB.
class PFoo {
private:
Foo* foo;
public:
PFoo() : foo(NULL) {}
PFoo(Foo* f) : foo(f) {}
operator Foo*() { return foo; }
Foo* operator->() { return foo; }
};
void f(Foo*);
PFoo pf(new Foo);
f(pf); // O$;'*$"* ;#$8'0$7% @3(&B// operator Foo*()
pf->MemberOfFoo(); // O$;'*$"* ;#$8'0$7% @3(&B// operator->()
5MFWFEC, [O DOBOMO_ MCJOBCUB pf->MemberOfFoo(), SUEUU OWURFLEC. # HURO_ WCQBF O[UMCBOMC ->
NDCPCE [OH\PORCBUH\QDF_ BF[, [O]BOSN DOS[FHKBOM FTUB [UMUGMNZUEENI RUMQFI O[UMCBOMC ->. )E
ECYOLFB UU, RXWFQHKUB F PCSUEKUB pf ROPRMCTCUSXS PECWUEFUS, DOBOMOU [MURMCTCUBQK R EOROU
HUROQBOMOEEUU RXMCZUEFU O[UMCBOMC ->. 3BOB [MO^UQQ MUDNMQFREO [MOLOHZCUBQK LO BUY [OM, [ODC
HUROQBOMOEEUU RXMCZUEFU EU [MUOJMCPNUBQK D JCPOROSN BF[N. %QHF BCDFS JCPORXS BF[OS KRHKUBQK
NDCPCBUH\ EC QBMNDBNMN, NDCPCBUH\ EC DHCQQ FHF NDCPCBUH\ EC OJaULFEUEFU, DOS[FHKBOM OJMCTCUBQK D
NDCPCEEOSN WHUEN. %QHF ]BO WBO-BO FEOU (EC[MFSUM, int), DOS[FHKBOM PHOMCLEO YOYOWUB F RXLCUB
QOOJTUEFU OJ OVFJDU. # EUS OE O^UEFRCUB RCV FEBUHHUDB F [UMQ[UDBFRX JNLNTU_ MCJOBX EC
OQEORCEFF BOGO `CDBC, WBO RX [XBCUBUQ\ OJMCBFB\QK D WHUEN WUGO-BO, ROOJTU EU FSUITUGO WHUEOR. #
HIJOS QHNWCU [OFQD PCDCEWFRCUBQK [MF LOQBFZUEFF JCPOROGO BF[C. *HK QCSXY HIJO[XBEXY QOOJTCI,
WBO JOH\VFEQBRO DOS[FHKBOMOR, DOBOMXSF K [OH\PORCHQK, EU OBQHUZFRCUB FQBFEEO_ MUDNMQFF RFLC:
PFoo operator->() { return *this; }
"LUQ\ O[UMCBOM -> [OH\PORCBUH\QDOGO BF[C ROPRMCTCUB ]DPUS[HKM ]BOGO BF[C R DCWUQBRU QROUGO
PECWUEFK. 0OS[FHKBOMX C++ OJXWEO [MUL[OWFBCIB [OSNWFB\ RCQ R JUQDOEUWEOS ^FDHU.
!BCD, N ECQ [OKRFHQK DHCQQ-NDCPCBUH\, DOBOMX_ SOZEO FQ[OH\PORCB\ RUPLU, GLU FQ[OH\PNIBQK NDCPCBUHF
Foo*: R DCWUQBRU CMGNSUEBOR `NED^F_, QHURC OB O[UMCBOMC -> FHF [MF O[MULUHUEFF LO[OHEFBUH\EO_
QUSCEBFDF CMF`SUBFWUQDFY O[UMC^F_ Q NDCPCBUHKSF RQILN, GLU Foo* NWCQBRNUB R QHOZUEFF FHF
RXWFBCEFF.
Raparefpusoeauuue yruue ykasafenu
)LFE FP OWURFLEXY [OLYOLOR D QOPLCEFI NEFRUMQCH\EXY NSEXY NDCPCBUHU_ FQ[OH\PORCEFU
VCJHOEOR.
template <class Type>
class SP {
private:
Type* pointer;
public:
76
SP() : pointer(NULL) {}
SP(Type* p) : pointer(p) {}
operator Type*() { return pointer; }
Type* operator->() { return pointer; }
};
void f(Foo*);
Ptr<Foo> pf(new Foo);
f(pf); // O$;'*$"* ;#$8'0$7% @3(&B// operator Type*()
pf->MemberOfFoo(); // O$;'*$"* ;#$8'0$7% @3(&B// operator->()
3BOB VCJHOE [OLO_LUB LHK HIJOGO DHCQQC, EU BOH\DO LHK DHCQQC Foo. 5UMUL RCSF OLEC FP JCPORXY
`OMS NSEXY NDCPCBUHU_. )EC FQ[OH\PNUBQK LOQBCBOWEO VFMODO F LCZU SOZUB [MUOJMCPORCB\ NDCPCBUH\
EC [MOFPROLEX_ DHCQQ D NDCPCBUHI EC JCPORX_ DHCQQ [MF NQHORFF, WBO RX [OH\PNUBUQ\ YOMOVFS
DOS[FHKBOMOS.

>OMOVF_ DOS[FHKBOM C++ [MCRFH\EO OJMCJCBXRCUB BCDFU QFBNC^FF, MNDOROLQBRNKQ\ QHULNITU_
HOGFDO_:
/. .NTUQBRNUB HF DOEQBMNDBOM P<Foo>, DOBOMX_ [OHNWCUB O<G$r>? $UB. 5MOLOHZCUS [OFQDF.
2. .NTUQBRNUB HF R O<G$r> O[UMCBOMECK `NED^FK operator P<Foo>()? $UB. !TUS LCH\VU.
3. .NTUQBRNUB HF [OH\PORCBUH\QDOU [MUOJMCPORCEFU OB O<G$r> D BF[N, DOBOMX_ [OLYOLFB [OL
QFGECBNMN DCDOGO-HFJO DOEQBMNDBOMC P<Foo>? *C! )[UMCBOMECK `NED^FK operator Bar*()
[MURMCTCUB O<G$r> R Bar*, DOBOMX_ SOZUB JXB\ [MUOJMCPORCE DOS[FHKBOMOS R Foo*.
:CDBFWUQDF RXMCZUEFU RXWFQHKUBQK DCD Ptr<Foo>pf2(Foo*(pb.operator Bar*())), GLU
[MUOJMCPORCEFU Bar* R Foo* RX[OHEKUBQK BCD ZU, DCD LHK HIJOGO LMNGOGO RQBMOUEEOGO
NDCPCBUHK.
0CD K NZU GOROMFH, RQU )%2D*% MCJOBCB\ FSUEEO BCD, EO NWBFBU EUDOBOMXU DOS[FHKBOMX
OJMCJCBXRCIB ]BN QFBNC^FI EU[MCRFH\EO. *CZU R YOMOVFY DOS[FHKBOMCY MUPNH\BCB RHOZUEFK
[OLQBCRHKUSO_ (inline) O[UMCBOMEO_ `NED^FF operator Bar*() RO RQBMOUEEX_ P<Foo>(Foo*)
SOZUB JXB\ QORQUS EU BUS, EC DOBOMX_ RX MCQQWFBXRCHF; SEOGFU DOS[FHKBOMX QOPLCIB RXEUQUEEXU (C
QHULORCBUH\EO, SUEUU ]``UDBFREXU) DO[FF RQBMOUEEXY `NED^F_ DHCQQOR RSUQBO BOGO, WBOJX
GUEUMFMORCB\ RHOZUEEX_ DOL [OLQBCRHKUSO_ `NED^FF. 6OMCH\: BCDO_ VCJHOE )%2D#* LUHCB\ BO, WBO
RX YOBFBU, EO N DOS[FHKBOMC EC ]BOB QWUB SOZUB JXB\ LMNGOU SEUEFU.
Hepapxun yruux ykasafene
#SUQBO FQ[OH\PORCEFK VCJHOEOR SOZEO [OLLUMZFRCB\ [CMCHHUH\EXU FUMCMYFF NDCPCBUHU_ F OJaUDBOR,
EC DOBOMXU OEF NDCPXRCIB. *UHCB\ ]BO QHULNUB HFV\ R BOS QHNWCU, UQHF RCV DOS[FHKBOM EU
[OLLUMZFRCUB VCJHOEX FHF [HOYO EC[FQCE.
class PVoid { // T$2"(%"* void*
protected:
void* addr;
public:
PVoid() : addr(NULL) {}
PVoid(void* a) : addr(a) {}
operator void*() { return addr; }
};
class Foo : public PVoid {
public:
PFoo() : PVoid() {}
PFoo(Foo* p) : PVoid(p) {}
operator Foo*() { return (Foo*)addr; }
Foo* operator->() { return (Foo*)addr; }
77
};
class Pbar : public PFoo {
public:
PBar() : PFoo() {}
PBar(Bar* p) : PFoo(p) {}
operator Bar*() { return (Bar*)addr; }
Bar* operator->() { return (Bar*)addr; }
};
pBar pb(new Bar);
pFoo pf(pb); // O$;'*$"*, 5'*'23 .*' PBar %4#%"*)% 57'/-4'0(<2 '* PFoo
pf->MemberOfFoo(); // O$;'*$"* ;#$8'0$7% PFoo::operator->
3BOB RCMFCEB JNLUB MCJOBCB\, UQHF RCQ EU OGOMWCIB SEOGOWFQHUEEXU DO[FMORCEFK/RQBCRDF BUDQBC F (R
PCRFQFSOQBF OB DOS[FHKBOMC) [MULN[MUZLUEFK O BOS, WBO OG$r::operator->() QDMXRCUB
PFoo::operator->(). 0OEUWEO, BCDOU MUVUEFU EU ECQBOH\DO ]HUGCEBEO, DCD RQBMOUEEXU BF[X
NDCPCBUHU_ VCJHOEC Ptr.
Apuqrefueckue onepauuu c ykasafennru
$FZU [ODCPCE [MFSUM CMF`SUBFWUQDFY O[UMCBOMOR, OJUQ[UWFRCITFY MCJOBN O[UMC^F_
QHOZUEFK/RXWFBCEFK LHK NSEXY NDCPCBUHU_. *HK [OHEO_, CJQOHIBEO QORSUQBFSO_ MUCHFPC^FF D EFS
QHULNUB LOJCRFB\ O[UMCBOMX ++ F --.
template <class Type>
class Ptr {
private:
Type* pointer;
public:
Ptr() : pointer(NULL) {}
Ptr(Type* p) : pointer(p) {}
operator Type*() { return pointer; }
ptr_diff operator-(Ptr<Type> p) { return pointer p.pointer; }
ptr_diff operator-(void* v) { return ((void*)pointer) v; }
Ptr<Type> operator-(long index) { return Ptr<Type>(pointer index); }
Ptr<Type> operator-=(long index) { pointer -= index; return *this; }
Ptr<Type> operator+(long index) { return Ptr<Type>(pointer + index); }
Ptr<Type> operator+=(long index) { pointer += index; return *this; }
};
#CZEO [OEFSCB\, WUS ptr_diff OBHFWCUBQK OB ^UHOGO FELUDQC. 5MF RXWFBCEFF OLEOGO CLMUQC FP
LMNGOGO MUPNH\BCBOS KRHKUBQK QSUTUEFU, DCD [MCRFHO, RXMCZUEEOU R JC_BCY. # QHNWCU [MFJCRHUEFK
^UHOGO D NDCPCBUHI CLMUQ FPSUEKUBQK EC MCPSUM OJaUDBC, NSEOZUEEX_ EC ^UHOU. 5OSEFBU: R C++, DCD F
R ., NDCPCBUH\ QQXHCUBQK EU EC OLFE OJaUDB, C EC BUOMUBFWUQDF_ SCQQFR OJaUDBOR. !ELUDQX R O[FQCEEXY
RXVU [UMUGMNZUEEXY O[UMCBOMCY [MULQBCRHKIB QOJO_ FELUDQX ]BOGO BUOMUBFWUQDOGO SCQQFRC, C EU
DOHFWUQBRC JC_B.
5OQHU RQUGO QDCPCEEOGO K JX EU QORUBORCH [NQDCB\QK EC ]BF YHO[OBX LHK NSEXY NDCPCBUHU_ EU FP-PC
HUEF, C [OBOSN, WBO R ]BOS QHNWCU RX OJMUDCUBU QUJK EC MUVUEFK, DOBOMXU EU RQUGLC ZUHCBUH\EX. %QHF
LCB\ [OH\PORCBUHI ROPSOZEOQB\ QDHCLXRCB\ F RXWFBCB\ NDCPCBUHF, RCS EUFPJUZEO [MFLUBQK
[OLLUMZFRCB\ FLUI, WBO NDCPCBUH\ RQUGLC FELUDQFMNUB ROOJMCZCUSX_ SCQQFR. 0CD RXKQEFBQK R
QHULNITFY GHCRCY, SEOGFU RCMFCEBX [MFSUEUEFK NSEXY NDCPCBUHU_ EU LOHZEX FHF LCZU EU SOGNB
[MCRFH\EO MCJOBCB\ Q [CMCLFGSO_ SCQQFRC.
78
Bo fo oxopufcn yruu ykasafenu?
)JaUDB DHCQQC, EU QOLUMZCTUGO RFMBNCH\EXY `NED^F_, PCEFSCUB QBOH\DO SUQBC, QDOH\DO EUOJYOLFSO
LHK YMCEUEFK RQUY UGO [UMUSUEEXY. # MCQQSOBMUEEXY RXVU NSEXY NDCPCBUHKY FQ[OH\PNUBQK RQUGO OLEC
[UMUSUEECK *-NDCPCBUH\; BO UQB\ MCPSUM NSEOGO NDCPCBUHK R BOWEOQBF QOR[CLCUB Q MCPSUMOS
RQBMOUEEOGO NDCPCBUHK. >OMOVF_ DOS[FHKBOM C++ LOHZUE Q[U^FCH\EXS OJMCPOS OJMCJCBXRCB\
BMFRFCH\EXU [OLQBCRHKUSXU `NED^FF, R BOS WFQHU F ECYOLKTFUQK R VCJHOEU NSEOGO NDCPCBUHK.
template <class Type>
class Ptr {
private:
Type* pointer;
public:
Ptr() : pointer(NULL) {}
Ptr(Type* p) : pointer(p) {}
operator Type*() { return pointer; }
Type* operator->() { return pointer; }
};
# WCQBEOQBF, FQ[OH\PORCEFU O[UMCBOMC -> FP ]BOGO VCJHOEC EU LOHZEO BMUJORCB\ EFDCDFY
LO[OHEFBUH\EXY RXWFQHUEF_ [O QMCREUEFI QO RQBMOUEEXSF NDCPCBUHKSF. 0CD RQUGLC, OJMCTC_BU
OQOJOU REFSCEFU EC QHORC ?%6%@(3 F )%2D*%. # YOMOVU_ MUCHFPC^FF O[FQCEEXU RXVU NSEXU
NDCPCBUHF EU BMUJNIB EFDCDFY LO[OHEFBUH\EXY MCQYOLOR. 5O DMC_EU_ SUMU, YNZU [ODC EU QBCHO.
Rpureueuun
4SEXU NDCPCBUHF QNTUQBRC EC MULDOQB\ [OHUPEXU, F SX [MORULUS EUSCHO RMUSUEF, FPNWCK FY
[MFSUEUEFU EC [MCDBFDU. *HK [MOQBXY NSEXY NDCPCBUHU_, MCQQSCBMFRCUSXY R ]BO_ GHCRU, ECYOLKBQK
QBOH\ ZU [MOQBXU, EO SOTEXU [MFSUEUEFK.
Pasureuoeauue suaeuun NULL
(CQQSOBMFS OLEN FP RCMFC^F_ EC BUSN NSEXY NDCPCBUHU_:
template <class Type>
class SPN {
private:
Type* pointer;
public:
SPN() : pointer(NULL) {}
SPN(Type* p) : pointer(p) {}
operator Type*() { return pointer; }
Type* operator->()
{
if (pointer == NULL) {
cerr << Dereferencing NULL! << endl;
pointer = new Type;
}
return pointer;
}
5MF [O[XBDU RXPRCB\ O[UMCBOM -> LHK NDCPCBUHK pointer, MCREOGO NULL, R [OBOD stderr RXROLFBQK
QOOJTUEFU OJ OVFJDU, [OQHU WUGO QOPLCUBQK `FDBFREX_ OJaUDB F NSEX_ NDCPCBUH\ [UMUROLFBQK EC EUGO,
WBOJX [MOGMCSSC SOGHC YMOSCB\ LCH\VU.
79
.NTUQBRNUB QBOH\DO MCPEXY MUVUEF_, QDOH\DO EC_LUBQK [MOGMCSSFQBOR, LOQBCBOWEO GHN[XY LHK
[O[XBOD MCPXSUEORCEFK PECWUEFK NULL. #OB HFV\ EUQDOH\DO FP EFY.
Hcnonusoeauue #indef
%QHF RCQ MCPLMCZCIB LO[OHEFBUH\EXU RXWFQHUEFK, QRKPCEEXU Q ]BO_ HOGFDO_, [MOTU RQUGO ODMNZFB\
if-JHOD LFMUDBFRCSF #ifdef, WBOJX DOL OJMCJOBDF OVFJOD GUEUMFMORCHQK BOH\DO R OBHCLOWEXY
RUMQFKY [MOGMCSSX. 5MF DOS[FHK^FF MCJOWU_ RUMQFF [UMUGMNZUEEX_ O[UMCBOM -> QEORC QMCREFRCUBQK
[O JXQBMOLU_QBRFI QO RQBMOUEEXS NDCPCBUHUS.
Huuuuupoeauue ucknkeuu
#XLCWC QOOJTUEF_ OJ OVFJDCY SOZUB RXPRCB\ [MOJHUSX R EUDOBOMXY GMC`FWUQDFY [MOGMCSSCY.
#SUQBO ]BOGO SOZEO FEF^FFMORCB\ FQDHIWUEFU:
template <class Type>
class Ptr {
private:
Type* pointer;
public:
enum ErrorType { DereferenceNil };

Ptr() : pointer(NULL) {}
Ptr(Type* p) : pointer(p) {}
operator Type*() { return pointer; }
Type* operator->() throw(ErrorType)
{
if (pointer == NULL) throw DereferenceNil;
return pointer;
}
};
($C [MCDBFDU ErrorType PCSUEKUBQK GHOJCH\EXS BF[OS, FQ[OH\PNUSXS LHK MCPHFWEXY RFLOR OVFJOD;
[MFRULUEEX_ `MCGSUEB HFV\ LUSOEQBMFMNUB OJTF_ [MFE^F[.) 3BO MUVUEFU SOZUB OJaULFEKB\QK Q
LMNGFSF. $C[MFSUM, [MOGMCSSC SOZUB FQ[OH\PORCB\ `FDBFREX_ OJaUDB R OBHCLOWEOS RCMFCEBU F
FEF^FFMORCB\ FQDHIWUEFU R MCJOWU_ RUMQFF.
Cfykau
%TU OLFE RCMFCEB YMCEFB\ R QBCBFWUQDO_ [UMUSUEEO_ Q[U^FCH\EX_ OJaUDB, DOBOMX_ K ECPXRCI
QBNDCWOS (screamer). .BNDCW ZLUB, [ODC DBO-EFJNL\ EU [O[XBCUBQK RX[OHEFB\ MCPXSUEORCEFU
PECWUEFK NULL.
template <class Type>
class AHHH {
private:
Type* pointer;
static type* screamer;
public:
AHHH() : pointer(NULL) {}
AHHH(Type* p) : pointer(p) {}
Operator Type*() { return pointer; }
Type* operator->()
{
if (p == NULL) return screamer;
return pointer;
80
}
};
$N F WBO BCDOGO? Q[MOQFBU RX. 5MUL[OHOZFS, screamer EC QCSOS LUHU EU [MFECLHUZFB D BF[N
Type* C OBEOQFBQK D [MOFPROLEOSN DHCQQN, RQU `NED^FF DOBOMOGO ([MUL[OHOZFBUH\EO RFMBNCH\EXU)
RXROLKB QOOJTUEFK OJ OVFJDCY R [OBOD )"rr [UMUL RXPOROS QROFY [MOBOBF[OR JCPOROGO DHCQQC. +U[UM\
RX EU BOH\DO NLUMZFBU QROI [MOGMCSSN EC [HCRN, EO F QSOZUBU QHULFB\ PC [O[XBDCSF RXPORC `NED^F_
`FDBFREOGO OJaUDBC.
Ofnapka u fpaccupoeka
4SEXU NDCPCBUHF BCDZU SOGNB FQ[OH\PORCB\QK LHK ECJHILUEFK PC OJaUDBCSF, EC DOBOMXU OEF
NDCPXRCIB. 5OQDOH\DN RQU OJMCTUEFK D OJaUDBN RX[OHEKIBQK WUMUP O[UMCBOMENI `NED^FI operator
Type*() FHF operator->(), N RCQ [OKRHKIBQK LRU DOEBMOH\EXU BOWDF LHK ECJHILUEFK PC
[MOFQYOLKTFS RO RMUSK MCJOBX [MOGMCSSX. #OPSOZEOQBF OBHCLDF JUPGMCEFWEX, K [MFRULN HFV\ OLFE
FP [MFSUMOR.
Ycfauoeka foek npepueauun
.CSOU [MOQBOU [MFSUEUEFU N[OSKENBXY DOEBMOH\EXY BOWUD QLUHCB\ ]BF `NED^FF RXEUQUEEXSF (out-
of-line) R OBHCLOWEO_ RUMQFF F MCQQBCRFB\ BOWDF [MUMXRCEFK R FY MUCHFPC^FF.
template <class Type>
class PTracer {
private:
Type* pointer;
public:
PTracer() : pointer(NULL) {}
PTracer(Type* p) : pointer(p) {}
operator Type*();
Type* operator->();
};
template <class Type>
#ifdef DEBUGGING
inline
#endif
PTracer<Type>::operator Type*()
{
return pointer; // T0"), 3)*$($4#/4$"*)% *'.&$ 57"7<4$(/%
}
template <class Type>
#ifdef DEBUGGING
inline
#endif
Type* PTracer<Type>::operator->()
{
return pointer; // T0"), 3)*$($4#/4$"*)% *'.&$ 57"7<4$(/%
}
. EU[CMCSUBMFPORCEEXSF RUMQFKSF NDCPCBUHU_ ]BO QLUHCB\ EUQDOH\DO [MOTU, [OQDOH\DN EU RQU QMULX
MCPMCJOBDF [OPROHKIB NQBCECRHFRCB\ BOWDF [MUMXRCEFK R [CMCSUBMFPORCEEXY `NED^FKY.
Tpaccupoeka
)[UMCBOM [MUOJMCPORCEFK F O[UMCBOM -> SOGNB RXROLFB\ LFCGEOQBFWUQDNI FE`OMSC^FI R [OBOD cout
FHF cerr, R PCRFQFSOQBF OB QFBNC^FF.
8.
Bepeuue cfafucfuku knacca
+CDZU EUQHOZEO OMGCEFPORCB\ ECDO[HUEFU QBCBFQBFDF OJ FQ[OH\PORCEFF O[UMCBOMOR Type* F -> R
QBCBFWUQDFY [UMUSUEEXY [CMCSUBMFPORCEEOGO DHCQQC.
template <class Type>
class SPCS {
private:
Type* pointer;
static int conversions;
static int members;
public:
SPCS() : pointer(NULL) {}
SPCS(Type* p) : pointer(p) {}
operator Type*() { conversions++; return pointer; }
Type* operator->() { members++; return pointer; }
int Conversions() { return conversions; }
int Members() { return members; }
};
,HOJCH\EXU [UMUSUEEXU LOHZEX JXB\ GLU-BO O[MULUHUEX. )JXWEO ]BO LUHCUBQK R `C_HU Foo.cpp:
// G @$?#" Foo.cpp
int Ptr<Foo>::conversions = 0;
int Ptr<Foo>::members = 0;
(CPNSUUBQK, RX SOZUBU ROQ[OH\PORCB\QK LFMUDBFRCSF #ifdef, WBOJX ]BO OBEOQFHOQ\ BOH\DO D
OBHCLOWEO_ RUMQFF.
Bepeuue cfafucfuku oLekfa
6X [OLOVHF D JOHUU QHOZEO_ BUSU. #OPSOZEO, UU QHULNUB OBHOZFB\ LO PECDOSQBRC Q RULNTFSF
NDCPCBUHKSF (master pointers), OLECDO NSEXU NDCPCBUHF BCDZU SOGNB RUQBF QBCBFQBFDN [O OBLUH\EXS
OJaUDBCS, C EU [O DHCQQN R ^UHOS. "CLCWC EU QROLFBQK D BOSN, WBOJX QLUHCB\ BOH\DO WBO [ODCPCEEXU
[UMUSUEEXU EUQBCBFWUQDFSF (BO UQB\ [O OLEOSN ]DPUS[HKMN [UMUSUEEXY EC NDCPCBUH\), [OQDOH\DN SX
([ODC) EU SOZUS OJUQ[UWFB\ OLEOPECWEOU QOOBRUBQBRFU SUZLN NDCPCBUHKSF F OJaUDBCSF. #SUQBO ]BOGO
QBCBFQBFDN [MFLUBQK YMCEFB\ R QCSFY OJaUDBCY. $FZU [MFRULUE [OHUPEX_ RQ[OSOGCBUH\EX_ DHCQQ,
DOBOMX_ SOZEO QOPLCB\ EC OQEORU SEOZUQBRUEEOGO ECQHULORCEFK DCD [MOFPROLEX_ OB DHCQQC
NDCPXRCUSOGO OJaUDBC F OB DHCQQC NSEOGO NDCPCBUHK, PECITUGO O UGO QRO_QBRCY. )JaKRHKK NDCPCBUH\
LMNGOS, RX [MULOQBCRHKUBU USN LOQBN[ D PCTFTUEEXS WHUECS DHCQQOR, [MOFPROLEXY OB Counter.
class Counter {
protected:
Counter() : conversions(0), members(0) {}
Counter(const Counter&) : conversions(0), members(0) {}
Counter& operator=(const Counter&) { return *this; }
public:
int conversions;
int members;
int Conversions() { return conversions; }
int Members() { return members; }
};
template <class Type>
class SPOP {
private:
Type* pointer;
82
public:
SPOS() : pointer(NULL) {}
SPOP(Type* f) : pointer(f) {}
operator Type*() { pointer->conversions++; return pointer; }
Type* operator->() { pointer->members++; return pointer; }
};
$C ]BN BUSN QNTUQBRNUB MKL RCMFC^F_, Q EUDOBOMXSF FP EFY SX [OPECDOSFSQK [MF FPNWUEFF RULNTFY
NDCPCBUHU_.
Ksuupoeauue
!EOGLC EUH\PK LCZU ECQBCFRCB\, WBOJX OJaUDB `FPFWUQDF ECYOLFHQK R [CSKBF RQU RMUSK, [ODC D EUSN
ENZUE LOQBN[. # QHULNITUS [MFSUMU [MUL[OHCGCUBQK, WBO `NED^FK ReadObject() NSUUB FQ[OH\PORCB\
LCEEXU O SUQBOECYOZLUEFF OJaUDBC EC LFQDU, WBOJX QOPLCB\ ]DPUS[HKM F PCEUQBF UGO CLMUQ R NDCPCBUH\
pointer. %QHF [MF RXPORU O[UMCBOMOR OJaUDB OBQNBQBRNUB R [CSKBF, OE CRBOSCBFWUQDF QWFBXRCUBQK Q
LFQDC.
typedef unsigned long DiskAddress; // T$2"(/*, (31(<2/ 0$((<2/
template <class Type>
class CP {
private:
DiskAddress record_number;
Type* pointer;
void ReadObject(); // F./*<4$"* ';E"&* ) 0/)&$
public:
CP(DiskAddress da) : pointer(NULL), record_number(da) {}
CP(Type* f) : pointer(f), record_number(f->RecordNumber()) {}
operator Type*()
{
if (pointer == NULL) this->ReadObject();
return pointer;
}
Type* operator->()
{
if (pointer == NULL) this->ReadObject();
return pointer;
}
};
5OLMOJEO GOROMFB\ O D]VFMORCEFF [MUZLURMUSUEEO, [OQDOH\DN [MFYOLFBQK NWFBXRCB\ SEOZUQBRO
[MOJHUS, D DOBOMXS SX UTU EU GOBORX. %QHF RX YOBFBU GCMCEBFMORCB\, WBO WFBCUBQK HFV\ OLEC DO[FK
OJaUDBC EUPCRFQFSO OB BOGO, QDOH\DO MCPHFWEXY OJaUDBOR EC EUU QQXHCUBQK, FHF WBOJX OJaUDB
NEFWBOZCHQK QMCPN [OQHU PCRUMVUEFK MCJOBX O[UMCBOMOR, RCS [MFLUBQK [OLOZLCB\ QHULNITFY GHCR,
[OQRKTUEEXY RULNTFS NDCPCBUHKS F N[MCRHUEFI [CSKB\I. +US EU SUEUU, R [MOQBXY QFBNC^FKY Q OLEFS
QWFBXRCEFUS, R DOBOMXY SOZUB QNTUQBRORCB\ EUQDOH\DO DO[F_ OJaUDBC, BCDCK SUBOLFDC LOQBCBOWEO
YOMOVO MCJOBCUB F Q [MOQBXSF NSEXSF NDCPCBUHKSF.
0]VFMNITFU NDCPCBUHF FQ[OH\PNIB OLFE MCQ[MOQBMCEUEEX_ [MFUS OEF ]DOEOSKB EUQDOH\DO JFB PC
QWUB OJaULFEUEFK LFQDOROGO CLMUQC F CLMUQC [CSKBF R OLEO_ [UMUSUEEO_ DHCQQC. 5MF ]BOS
FQ[OH\PNIBQK LRC N[MOTCITFY [MUL[OHOZUEFK:
/. (CPSUM CLMUQC [CSKBF EU JOHUU WUS EC OLFE JFB [MURXVCUB MCPSUM LFQDOROGO CLMUQC.
2. .MULQBRC N[MCRHUEFK [CSKB\I, FQ[OH\PNUSXU O[UMCBOMOS new, EFDOGLC EU ROPRMCTCIB
EUWUBEX_ CLMUQ.
83
%QHF OJC [MUL[OHOZUEFK RUMEX, LHK YMCEUEFK OJOFY CLMUQOR SOZEO FQ[OH\PORCB\ OLEN [UMUSUEENI
DHCQQC. %QHF SHCLVF_ JFB NQBCEORHUE (BO UQB\ UQHF CLMUQ WUBEX_), OQBCH\EXU 3/ JFB O[MULUHKIB
LFQDORX_ CLMUQ. 0OGLC SHCLVF_ JFB QJMOVUE, RQU 32 JFBC O[MULUHKIB CLMUQ [CSKBF. %QHF RCS
[OBMUJNUBQK EU BOH\DO QWFBXRCEFU, EO F PC[FQ\, OJaUDBN HNWVU PECB\ QRO_ QOJQBRUEEX_ LFQDORX_
CLMUQ, [OQDOH\DN CLMUQ, YMCEKTF_QK R NDCPCBUHU, [MF QWFBXRCEFF [OMBFBQK.
"C LXSORO_ PCRUQO_ D]VFMNITFY NDCPCBUHU_ [MKWUBQK FEBUMUQECK DOE^U[^FK: NSEXU NDCPCBUHF SOGNB
FQ[OH\PORCB\QK DCD OJTUU QMULQBRO LHK LOQBN[C D OJaUDBCS *#9+&(.(,% %" "%7%, 7)# *+?%)(".4 %/0#$"
( .8L#."&8#" 2( %* &%%/L#. 4GHNJHKKQ\ R LZNEGHF C++, SX JNLUS MCQQSCBMFRCB\ ]BN DOE^U[^FI [OL
MCPEXSF NGHCSF, [ODC OEC EU [MURMCBFBQK R OLFE FP [MFE^F[OR *CO, O DOBOMXY K N[OSFECH RO
RQBN[FBUH\EO_ GHCRU.
Bepyue
ykasafenu u
peckpunfopu
5OQHU QORQUS EU[MOLOHZFBUH\EOGO PECDOSQBRC Q NSEXSF NDCPCBUHKSF SX NQ[UHF ECBDENB\QK EC ^UHX_
MKL `NELCSUEBCH\EXY [MOJHUS. 6EOGFU FP EFY QRKPCEX Q BUS `CDBOS, WBO EC OLFE OJaUDB SOZUB
QQXHCB\QK HIJOU DOHFWUQBRO NSEXY NDCPCBUHU_. 0CD R ]BOS QHNWCU NPECB\, DOGLC SOZEO NLCHFB\
OJaUDB? 0BO RULUB QBCBFQBFDN FQ[OH\PORCEFK OJaUDBC F OJMCTCUBQK D EU_ [MF EUOJYOLFSOQBF (UQHF RCS
RLMNG [OECLOJFBQK BCDCK ROPSOZEOQB\)? 0BO QOPLCUB OJaUDB? 1BO OPECWCUB [MFQRCFRCEFU OLEOGO NSEOGO
NDCPCBUHK LMNGOSN? "CFGMCUB HF ECDOEU^ R ]BOS QUPOEU ECVC HIJFSCK DOSCELC FHF OEC QEORC MCPOJ\UB
ECVF QUML^C? $FZU RX EC_LUBU OBRUBX EC ]BF F SEOGFU LMNGFU FEBMFGNITFU RO[MOQX.
Ceraufuka eepyux ykasafene
5MF MCJOBU Q NSEXSF NDCPCBUHKSF FSUUBQK OLFE RCZEX_ WCQBEX_ QHNWC_ DOGLC LRC NSEXY NDCPCBUHK
EU LOHZEX OLEORMUSUEEO QQXHCB\QK EC OLFE OJaUDB. 6UZLN NDCPCBUHUS F OJaUDBOS, EC DOBOMX_ OE
QQXHCUBQK, QNTUQBRNUB OLEOPECWEOU QOOBRUBQBRFU (PC FQDHIWUEFUS OQOJOGO QHNWCK NSEXY NDCPCBUHU_,
QQXHCITFYQK EC NULL). %QHF R [MOGMCSSEOS LFPC_EU LU_QBRNUB BCDOU OGMCEFWUEFU, GOROMKB, WBO
MUCHFPNUBQK QUSCEBFDC &#)8L(? 8$+9+"#2#3 (master pointers).
0OEUWEO, SOZEO [MOQBO OJaKRFB\ WUMUP SUQBENI GCPUBN, WBO NDCPCBUHF LOHZEX FQ[OH\PORCB\QK BCDFS F
BOH\DO BCDFS OJMCPOS. - SOZEO PCTFBFB\ RCVFY [OH\PORCBUHU_ OB QCSFY QUJK F [OLDMU[FB\
QUSCEBFWUQDFU [MCRFHC KPXDORXSF QMULQBRCSF C++. %QHF RX SNLMO RXJUMUBU RBOMO_ RCMFCEB, [MFLUBQK
NWUQB\ QHULNITUU:
/. 4DCPXRCUSXU OJaUDBX LOHZEX QOPLCRCB\QK NDCPCBUHKSF R DOEQBMNDBOMCY.
2. *UQBMNDBOM NDCPCBUHK LOHZUE NLCHKB\ NDCPXRCUSX_ OJaUDB.
3. 0OEQBMNDBOM DO[F_ LOHZUE QOPLCRCB\ BOWENI DO[FI NDCPXRCUSOGO OJaUDBC.
4. )[UMCBOM [MFQRCFRCEFK operator= LOHZUE NLCHKB\ BUDNTF_ NDCPXRCUSX_ OJaUDB,
ECYOLKTF_QK QHURC OB EUGO, F PCSUEKB\ UGO DO[FU_ NDCPXRCUSOGO OJaUDBC Q[MCRC.
0MOSU BOGO, JXHO JX 6+98,*% QLUHCB\ UTU LRU RUTF:
5. )GMCEFWFB\ LOQBN[ D DOEQBMNDBOMCS DHCQQC NDCPXRCUSOGO OJaUDBC.
6. .OPLCRCB\ NDCPCBUHF Q [OSOT\I >6%(9&%)4L(? B8*$C(3 (factory functions).
)JU MUDOSUELC^FF JNLNB [OLMOJEO MCQQSOBMUEX R [OQHULNITFY MCPLUHCY. 5MOBOBF[ RULNTUGO
NDCPCBUHK, DOBOMX_ SX QOJFMCUSQK RO[HOBFB\, RXGHKLFB BCD:
template <class Type>
class MP {
private:
Type* t;
public:
6
86
MP(); // F'-0$"* 3&$-<4$"2<? ';E"&*
MP(const MP<Type>&); // I'5/73"* 3&$-<4$"2<? ';E"&*
~MP(); // H0$#%"* 3&$-<4$"2<? ';E"&*
MP<Type>& operator=(const MP<Type>&); // H0$#%"* #"4')*'7'((/? ';E"&*,
// &'5/73"* 57$4')*'7'((/?
Type* operator->() const;
};
Koucfpyupoeauue
5MUL[OHOZFS, RX MCPMUVFHF [OH\PORCBUHKS QOPLCRCB\ QOJQBRUEEXU NDCPXRCUSXU OJaUDBX F [UMULCRCB\
FY RULNTFS NDCPCBUHKS RO RMUSK DOEQBMNFMORCEFK.
template <class Type>
class MP {
private:
Type* t;
public:
MP() : t(NULL) {}
MP(Type* pointer) : t(pointer) {}
~MP() { delete t; }
// D *.0.
};
Foo* foo = new Foo;
MP<Foo> mp1(foo);
MP<Foo> mp2(foo); // L;#'2!
$CQDOH\DO [MOTU JXHC JX ZFPE\ JUP BCDFY [OH\PORCBUHU_! 0OGLC mp1 NLCHKUBQK, [MO[CLCUB F foo. #
FBOGU mp2 ECWFECUB NDCPXRCB\ EUFPRUQBEO DNLC. "CWUS DOSN-EFJNL\ [OBMUJNUBQK RXBROMKB\ BCDOU?
Q[MOQFBU RX. 0CD GOROMFHOQ\ R OLEOS MUDHCSEOS MOHFDU: "CWUS Q[MCVFRCB\ "CWUS? %QHF RX
OQBCRFBU BCDNI LXMN, SOZUBU EU QOSEURCB\QK: DBO-EFJNL\ DOGLC-EFJNL\ FPOJMUBUB L\KROH\QDF_ [HCE,
FQ[OH\PNUB UU F OJRFEFB RO RQUY QSUMBEXY GMUYCY RCVN [MOGMCSSN.
5OH\PORCBUH\ [MKSO-BCDF DMFWFB: *UMZFBU SUEK, [ODC K EU ECBROMFH JUL. *HK ]BOGO QNTUQBRNUB
ECLUZEX_ Q[OQOJ: OBOJMCB\ N EUGO DHIWF OB DOEQBMNDBOMOR DHCQQC NDCPXRCUSOGO OJaUDBC.
class Foo {
friend class MP<Foo>;
protected:
Foo(); // A"5"7, 0')*35 & &'()*73&*'73 /2""* *'#,&' MP<Foo>
public:
// L)*$4M$%)% .$)*, /(*"7@"?)$
};
template <class Type>
class MP {
private:
Type* t;
public:
MP() : t(new Type) {}
// D *.0.
};
AGa, NZU HNWVU. 5MF QOPLCEFF NDCPCBUHK UGO DOEQBMNDBOM BCDZU DOEQBMNFMNUB F NDCPXRCUSX_ OJaUDB.
)JaKRHKK NDCPCBUH\ LMNGOS, SX SOZUS QLUHCB\ DOEQBMNDBOMX Foo PCDMXBXSF FHF PCTFTUEEXSF F
87
QOYMCEFB\ LOQBN[ D EFS FP DOEQBMNDBOMOR NDCPCBUHK. +U[UM\ DHFUEB EFDCD EU QSOZUB LOJMCB\QK LO Foo,
DMOSU DCD WUMUP MP<Foo>. 6X UTU EUOLEODMCBEO RUMEUSQK D RO[MOQN O BOS, DCD, DOGLC F GLU QOPLCRCB\
NDCPXRCUSXU OJaUDBX, C [ODC LCRC_BU EUSEOGO OBRHUWUSQK.
%QHF DOEQBMNDBOMX Foo RXPXRCIBQK Q CMGNSUEBCSF, QNTUQBRNIB LRU CH\BUMECBFRX:
/. #SUQBO BOGO WBOJX [OH\PORCB\QK NEFRUMQCH\EXS VCJHOEOS RULNTUGO NDCPCBUHK, QOPLC_BU LHK
Foo EUQBCELCMBEX_ DHCQQ RULNTUGO NDCPCBUHK MPFoo. *HK DCZLOGO DOEQBMNDBOMC Foo QOPLC_BU
DOEQBMNDBOM MPFoo Q BOWEO BCDO_ ZU QFGECBNMO_ F [UMULC_BU UGO CMGNSUEBX DOEQBMNDBOMN Foo.
2. #OQ[OH\PN_BUQ\ JUPCMGNSUEBEXS DOEQBMNDBOMOS LHK QOPLCEFK OJaUDBC F [MULOQBCR\BU
OBLUH\ENI `NED^FI FEF^FCHFPC^FF, DOBOMCK SOZUB RXPXRCB\QK DHFUEBOS [OQHU
DOEQBMNFMORCEFK.
#BOMO_ RCMFCEB RXGHKLFB BCD:
class Foo {
friend class MP<Foo>;
protected:
Foo(); // V0/()*4"((<? &'()*73&*'7
public:
Initialized(int, char*);
// L)*$4M$%)% .$)*, /(*"7@"?)$
};
MP<Foo> mpf;
mpf->Initialize(17, Hello); // T$4"7M/*, &'()*73/7'4$(/"
+CDOU MUVUEFU RXGHKLFB LOROH\EO EUNDHIZU, EO OEO [OPROHKUB MCJOBCB\ Q NEFRUMQCH\EXS VCJHOEOS
RULNTUGO NDCPCBUHK. .NTUQBRNIB F LMNGFU [MFWFEX LHK FQ[OH\PORCEFK FEF^FCHFPFMNITFY `NED^F_, O
DOBOMXY JNLUB MCQQDCPCEO R QHULNITFY GHCRCY. 'IJO_ FP ]BFY RCMFCEBOR R[OHEU [MFUSHUS LHK
MUVUEFK ECVFY BUDNTFY PCLCW.
Yuufoeuue
$UB EFWUGO [MOTU: R LUQBMNDBOMU RULNTUGO NDCPCBUHK NLCHKUBQK F NDCPXRCUSX_ OJaUDB.
template <class Type>
class MP {
private:
Type* t;
public:
~MP() { delete t; }
};
Konupoeauue
)_! )[KB\ ]BF [MODHKBXU [OH\PORCBUHF...
MP<Foo> mpf1; // F'-0$"* Foo, ($ &'*'7<? ))<#$"*)% 3&$-$*"#,
MP<Foo> mpf2 = mpf1; // +"30$.$!
5NQB\ PECD MCRUEQBRC EU RROLFB RCQ R PCJHNZLUEFU PLUQ\ [MOFQYOLFB DOEQBMNFMORCEFU, F ]BC QBMODC
]DRFRCHUEBEC QBMODU MP<Foo> mpf2(mpfl);. %QHF EU [UMUGMNPFB\ DOEQBMNDBOM DO[F_ F MCPMUVFB\
DOS[FHKBOMN C++ REUQBF QROI HU[BN, SX [OHNWFS LRC RULNTFY NDCPCBUHK, DOBOMXU QQXHCIBQK EC OLFE
F BOB ZU OJaUDB Foo. 5O NSOHWCEFI DOEQBMNDBOM DO[F_, GUEUMFMNUSX_ DOS[FHKBOMOS, MCLOQBEO DO[F-
MNUB QOLUMZCTF_QK R [UMUSUEEO_ CLMUQ FP QBCMOGO NDCPCBUHK R EORX_. 5MOJHUSC MUVCUBQK
OBEOQFBUH\EO [MOQBO.
template <class Type>
class MP {
88
private:
Type* t;
public:
MP(); // +'72$#,(<?
MP(const MP<Type>& mp) : t(*(mp.t)) {} // I'()*73&*'7 &'5/?
};
3BOB DOEQBMNDBOM DO[F_ QOPLCUB LNJHFDCB NDCPXRCUSOGO OJaUDBC, FQ[OH\PNK LHK ]BOGO DOEQBMNDBOM
DO[F_ NDCPXRCUSOGO OJaUDBC. 5OHNWCUBQK EU OWUE\ ]``UDBFREO, EO MCJOBCUB. # EUDOBOMXY QFBNC^FKY, Q
DOBOMXSF SX QBOHDEUSQK [OPZU, HNWVU ROOJTU PC[MUBFB\ DO[FMORCEFU. 5MOTU RQUGO LHK ]BOGO
OJaKRFB\ DOEQBMNDBOM DO[F_ PCDMXBXS F EU ECPECWCB\ USN EFDCDFY LU_QBRF_.
template <class Type>
class MP {
private:
Type* t;
MP(const MP<Type>&) : t(NULL) {} // +/&'80$ (" ;30"* 4<-<4$*,)%
public:
MP();
};
+US QCSXS SX [MULOBRMCTCUS EU[MULECSUMUEEOU DO[FMORCEFU R QFBNC^FKY RMOLU QHULNITU_:
void f(MP<Foo>);
MP<Foo> mpf;
f(mpf); // F'-0$"*)% 47"2"(($% &'5/%
*HK [MULOBRMCTUEFK DO[FMORCEFK BCDZU SOZEO ROQ[OH\PORCB\QK LUQDMF[BOMCSF, O DOBOMXY JNLUB
MCQQDCPCEO EFZU.
Rpuceaueauue
-CCCC! 3BF PHORMULEXU [OH\PORCBUHF DOGLC-EFJNL\ NGOSOEKBQK?!
MP<Foo> mpf1;
MP<Foo> mpf2;
mpf2 = mpf1; // +"*, *'#,&' (" Q*'...
# [MFRULUEEOS `MCGSUEBU ROPEFDCIB QMCPN LRU [MOJHUSX. #O-[UMRXY, NDCPXRCUSX_ OJaUDB, QOPLCEEX_
DOEQBMNDBOMOS mpf2, EFDOGLC EU NLCHKUBQK. )E [MURMCTCUBQK R 'UBNWUGO ,OHHCEL^C, OJMUWUEEOGO EC
RUWEXU QDFBCEFK R ODUCEU [CSKBF. #O-RBOMXY, O[UMCBOM =, FQ[OH\PNUSX_ DOS[FHKBOMOS [O NSOHWCEFI,
DO[FMNUB CLMUQ, ECYOLKTF_QK R t, FP OLEOGO NDCPCBUHK R LMNGO_, WBO [MFROLFB D [OKRHUEFI LRNY
RULNTFY NDCPCBUHU_, QQXHCITFYQK EC OLFE OJaUDB. # FQ[MCRHUEEOS RCMFCEBU [UMUGMNZUEEX_ O[UMCBOM
= NLCHKUB OJaUDB, EC DOBOMX_ QQXHCUBQK HUROQBOMOEEF_ NDCPCBUH\, F PCSUEKUB UGO DO[FU_ OJaUDBC, EC
DOBOMX_ QQXHCUBQK [MCROQBOMOEEF_ NDCPCBUH\.
template <class Type>
class MP {
private:
Type* t;
public:
MP(); // +'72$#,(<? &'()*73&*'7
MP<Type>& operator=(const MP<Type>& mp)
{
if (&mp != this) {
delete t;
t = new Type(*(mp.t));
89
}
return *this;
}
};
(CPNSUUBQK, UQHF RX ROOJTU EU YOBFBU [OLLUMZFRCB\ [MFQRCFRCEFU, LOQBCBOWEO OJaKRFB\ O[UMCBOM =
PCDMXBXS.
Rpofofun uanoua eepyero ykasafenn
$FZU [MFRULUE DOEUWEX_ MUPNH\BCB ECVFY NQFHF_. 5OLQBCRHKUSXU `NED^FF [UMUSUQBFHFQ\ EC
[MFRXWEOU SUQBO [OQHU OJaKRHUEFK DHCQQC. 5CMCSUBM, DHCQQ NDCPXRCUSOGO OJaUDBC, LOHZUE
NLORHUBROMKB\ QHULNITFS BMUJORCEFKS:
/. )E LOHZUE FSUB\ JUPCMGNSUEBEX_ DOEQBMNDBOM.
2. )E LOHZUE HFJO [UMUGMNZCB\ DOEQBMNDBOM DO[F_, HFJO [MULOQBCRHUEEX_ DOS[FHKBOMOS
DOEQBMNDBOM DO[F_ [O NSOHWCEFI LOHZUE [OLYOLFB\ LHK FQ[OH\PORCEFK R VCJHOEU RULNTUGO
NDCPCBUHK.
%QHF YOBK JX OLEO FP ]BFY BMUJORCEF_ EU RX[OHEKUBQK, [MFLUBQK REUQBF FPSUEUEFK R DHCQQ
NDCPXRCUSOGO OJaUDBC FHF RULNTUGO NDCPCBUHK, FHF R OJC DHCQQC QMCPN. 5OSEFBU: R MUCHFPC^FF
DOEQBMNDBOMC DO[F_ F O[UMCBOMC [MFQRCFRCEFK RULNTUGO NDCPCBUHK JNLUB FQ[OH\PORCB\QK DOEQBMNDBOM
DO[F_ NDCPXRCUSOGO OJaUDBC (BO UQB\ [CMCSUBMC VCJHOEC).
template <class Type>
class MP {
private:
Type* t;
public:
MP(); // F'-0$"* 3&$-<4$"2<? ';E"&*
MP(const MP<Type>&); // I'5/73"* 3&$-<4$"2<? ';E"&*
~MP(); // H0$#%"* 3&$-<4$"2<? ';E"&*
MP<Type>& operator=(const MP<Type>&);
Type* operator->() const;
};
template <class Type>
inline MP<Type>::MP() : t(new Type)
{}
template <class Type>
inline MP<Type>::MP(const MP<Type>& mp) : t(new Type(*(mp.t)))
{}
template <class Type>
inline MP<Type>::~MP()
{
delete t;
}
template <class Type>
inline MP<Type>& MP<Type>::operator=(const MP<Type>& mp)
{
if (this != &mp) {
delete t;
t = new Type(*(mp.t));
}
return *this;
90
}
template <class Type>
inline Type* MP<Type>::operator->() const
{
return t;
}
eckpunfopu e C++
!BCD, [OQHU EUJOH\VOGO [OLOGMURC NSEXU NDCPCBUHF [MURMCBFHFQ\ R RULNTFU. +U[UM\ R ECVUS RCMURU
[OKRHKUBQK UTU OLFE FEGMULFUEB LUQDMF[BOMX (handles) C++. $U [NBC_BU ]BOB BUMSFE Q
LUQDMF[BOMCSF, FQ[OH\PNUSXSF R O[UMC^FOEEXY QFQBUSCY Macintosh F Windows. $UDOBOMOU QYOLQBRO
QNTUQBRNUB, EO FLFOSC LUQDMF[BOMOR C++ FSUUB QOJQBRUEENI NEFDCH\ENI QUSCEBFDN F ECJOM [MCRFH.
)QEORECK FLUK PCDHIWCUBQK R BOS, WBOJX FQ[OH\PORCB\ NSEXU NDCPCBUHF LHK QQXHOD EC RULNTFU
NDCPCBUHF. 3BF LO[OHEFBUH\EXU NDCPCBUHF F ECPXRCIBQK LUQDMF[BOMCSF. )QEORC, EC DOBOMO_ SX JNLUS
QBMOFB\ DHCQQ LUQDMF[BOMOR, R [UMROS [MFJHFZUEFF RXGHKLFB BCD:
template <class Type>
class H {
private:
MP<Type>& ptr; // F)<#&$ ($ 4"03K/? 3&$-$*"#,
public:
H() : ptr(*(new MP<Type>)) {} // F2. +/1"
H(MP<Type>& mp) : ptr(mp) {}
MP<Type>& operator->() const { return ptr; }
};
8UPCMGNSUEBEX_ DOEQBMNDBOM + QOPLCUB EORX_ RULNTF_ NDCPCBUH\. 3BOB RULNTF_ NDCPCBUH\, R QROI
OWUMUL\, QOPLCUB NDCPXRCUSX_ OJaUDB. .NTUQBRNUB RBOMO_ DOEQBMNDBOM, DOBOMX_ [OHNWCUB RULNTF_
NDCPCBUH\ F FEF^FCHFPFMNUB FS [UMUSUEENI ptr. 0OEQBMNDBOM DO[F_ F O[UMCBOM = [O NSOHWCEFI
GOLKBQK, [OQDOH\DN HIJOSN RULNTUSN NDCPCBUHI SOZUB QOOBRUBQBRORCB\ EUQDOH\DO LUQDMF[BOMOR.
(CJOBC O[UMCBOMC -> OQEORCEC EC MUDNMQFREOS CHGOMFBSU, FQ[OH\PNUSOS DOS[FHKBOMOS: O[UMCBOM ->
LUQDMF[BOMC ROPRMCTCUB RULNTF_ NDCPCBUH\; PCBUS O[UMCBOM -> RULNTUGO NDCPCBUHK ROPRMCTCUB
NDCPCBUH\ Type* DOBOMX_ KRHKUBQK OLEFS FP JCPORXY BF[OR DOS[FHKBOMC.
5MFRULUEEOU MUVUEFU EU ECPORUV\ FPKTEXS RHOZUEEXU VCJHOEX [OMOZLCIB [NBCEF^N, D BOSN ZU
QORUMVUEEO EUKQEO, DOGLC F DCD NLCHKB\ RULNTFU NDCPCBUHF. 0MOSU BOGO, QHULNUB HF MCPMUVFB\
[OH\PORCBUHI EC[MKSNI QOPLCRCB\ F NEFWBOZCB\ RULNTFU NDCPCBUHF FHF ZU PCDHIWFB\ FY RENBMF
LUQDMF[BOMOR BCD, DCD SX PCDHIWFHF NDCPXRCUSXU OJaUDBX RENBMF RULNTFY NDCPCBUHU_? $UNZUHF SX
BMNLFHFQ\ ECL MUVUEFUS ]BFY [MOJHUS LHK NDCPXRCUSXY OJaUDBOR HFV\ PCBUS, WBOJX QBOHDENB\QK Q
EFSF QEORC LHK RULNTFY NDCPCBUHU_? +UM[UEFU R QROU RMUSK SX EC_LUS OBRUB EC ]BF F SEOGFU
LMNGFU RO[MOQX.
-fo e nonyaefcn?
6X ECWEUS Q [MOQBOGO [MFSUMC RULNTFY NDCPCBUHU_ F NQORUMVUEQBRNUS UGO LO NMOREK, DOBOMX_
NLORHUBROMFH JX F JOHUU BMUJORCBUH\ENI CNLFBOMFI. $C ]BO_ QBCLFF UTU BMNLEO [OEKB\ RQI [OH\PN
LUQDMF[BOMOR, EO R QHULNITFY GHCRCY OEF JNLNB FGMCB\ OWUE\ RCZENI MOH\.
Ropcef oLekfoe
*O[NQBFS, RX YOBFBU QHULFB\ PC DOHFWUQBROS QOPLCEEXY FHF ECYOLKTFYQK R [CSKBF OJaUDBOR
EUDOBOMOGO DHCQQC. )LEO FP ROPSOZEXY MUVUEF_ YMCEFB\ ]BF QRULUEFK R QBCBFWUQDFY [UMUSUEEXY
QCSOGO DHCQQC.
class CountedStuff {
private:
9.
static int current;
public:
CountedStuff() { current++; }
CountedStuff(const CuntedStuff&) { current++; }
CountedStuff& operator=(const CountedStuff&)
{} // +" 2"(%*, )."*./& 0#% 57/)4$/4$(/%
~CountedStuff() { current--; }
};
. ]BFS [MFSUMOS UTU SOZEO [OROPFB\QK F NHNWVFB\ UGO, EO DCD JX RX EF QBCMCHFQ\, [MFLUBQK
FPSUEKB\ DOL ^UHUROGO DHCQQC YOBK JX LHK BOGO, WBOJX PCQBCRFB\ UGO ECQHULORCB\ OB ECVUGO DHCQQC.
+U[UM\ [MUL[OHOZFS, WBO NDCPXRCUSX_ OJaUDB RYOLFB R DOSSUMWUQDNI JFJHFOBUDN. )JFLEO, LC?
'IJXU FPSUEUEFK EUZUHCBUH\EX, C QDOMUU RQUGO, [MOQBO EUROPSOZEX. $O ROB EC Q^UEN RXYOLFB DHCQQ
RULNTUGO NDCPCBUHK.
template <class Type>
class CMP {
private:
static int current;
Type* ptr;
public:
CMP() : ptr(new Type) { current++; }
CMP(const CMP<Type>& cmp) : ptr(new Type(*(mp.t))) { current++; }
CMP<Type>& operator=(const CMP<Type>& cmp)
{
if (this != &cmp) {
delete ptr;
ptr = new Type(*(cmp.ptr));
}
return *this;
}
~CMP() { delete ptr; current--; }
Type* operator->() const { return ptr; }
Static int Current() { return current; }
};
+U[UM\ RULNTF_ NDCPCBUH\ RX[OHEKUB RQU [OLQWUBX PC RCQ. )E EU BMUJNUB REUQUEFK FPSUEUEF_ R DHCQQ
NDCPXRCUSOGO OJaUDBC. 3BOB VCJHOE SOZUB FQ[OH\PORCB\QK LHK 2F/%7% DHCQQC [MF NQHORFF, WBO RCS
NLCQBQK RBFQENB\ RULNTFU NDCPCBUHF SUZLN DHFUEBOS F NDCPXRCUSXS OJaUDBOS. *CZU UQHF RX EU
ROPMCZCUBU [MOBFR SOLF`FDC^FF FQYOLEOGO DHCQQC NDCPXRCUSOGO OJaUDBC, OJUQ[UWFB\ BCDO_ NMORUE\
SOLNH\EOQBF JUP RULNTFY NDCPCBUHU_ JXHO JX DMC_EU QHOZEO (EC[MFSUM, UQHF JX RX [O[XBCHFQ\
LU_QBRORCB\ WUMUP JCPORX_ DHCQQ, BO R MUPNH\BCBU [OHNWFHF JX OLEN QBCBFWUQDNI [UMUSUEENI current
EC RQU [MOFPROLEXU DHCQQX).
3BOB [MFSUM BMFRFCHUE, EO LCZU OE LUSOEQBMFMNUB RCZEX_ [MFE^F[ [MOGMCSSFMORCEFK EC C++,
Q[MCRULHFROQB\ DOBOMOGO QO RMUSUEUS QBCEORFBQK OWURFLEO_: [OH\PN_BUQ\ NSEXSF NDCPCBUHKSF, LCZU
UQHF QECWCHC DCZUBQK, WBO OEF EU ENZEX. %QHF [MOGMCSSC EC[FQCEC LHK NSEXY NDCPCBUHU_, RQU
FPSUEUEFK REOQKBQK HUGDO F JXQBMO. %QHF ZU RCS [MFLUBQK [UMULUHXRCB\ GOBORNI [MOGMCSSN F
PCSUEKB\ RQU O[UMCBOMX * NSEXSF NDCPCBUHKSF, [MFGOBOR\BUQ\ D EOWEXS JLUEFKS.
# GHCRU /4 RCMFC^FF EC BUSN [OLQWUBC JNLNB FQ[OH\PORCEX LHK MUCHFPC^FF [MOQBO_, EO R BO ZU RMUSK
SOTEO_ QYUSX N[MCRHUEFK [CSKB\I QJOMDF SNQOMC Q [OLQWUBOS QQXHOD.
92
Ykasafenu fonuko pnn feuun
5MUL[OHOZFS, RX YOBFBU QLUHCB\ BCD, WBOJX EUDOBOMX_ OJaUDB EFDOGLC EU OJEORHKHQK (FHF, [O DMC_EU_
SUMU, EU OJEORHKHQK OJXWEXSF DHFUEBCSF). 3BC PCLCWC HUGDO MUVCUBQK Q [OSOT\I RULNTFY NDCPCBUHU_
LOQBCBOWEO QLUHCB\ O[UMCBOMENI `NED^FI operator->() DOEQBCEBEO_ `NED^FU_ DHCQQC.
template <class Type>
class ROMP {
private:
Type* t;
public:
ROMP(); // F'-0$"* 3&$-<4$"2<? ';E"&*
ROMP(const ROMP<Type>&); // I'5/73"* 3&$-<4$"2<? ';E"&*
~ROMP(); // H0$#%"* 3&$-<4$"2<? ';E"&*
ROMP<Type>& operator=(const ROMP<Type>&);
const Type* operator->() const;
};
4DCPXRCUSX_ OJaUDB PC[UMB BCD ECLUZEO, WBO LO EUGO EU LOJUMUBQK LCZU ;(4. # [MFE^F[U, BO ZU QCSOU
SOZEO JXHO QLUHCB\ Q [OSOT\I JOHUU [MOQBXY NSEXY NDCPCBUHU_, EO RULNTFU NDCPCBUHF OJUQ[UWFRCIB
QBO[MO^UEBENI PCTFBN, BCD DCD DHFUEB EFDOGLC EU [OHNWCUB [MKSOGO LOQBN[C D NDCPXRCUSOSN OJaUDBN.
Ykasafenu pnn feuun/sanucu
#O SEOGFY QFBNC^FKY QNTUQBRNUB O[BFSCH\EOU [MULQBCRHUEFU OJaUDBC, DOBOMOU LU_QBRFBUH\EO HFV\
LHK O[UMC^F_ WBUEFK. %QHF DHFUEB YOWUB FPSUEFB\ OJaUDB, [MULQBCRHUEFU [MFYOLFBQK FPSUEKB\.
3BO JXHO JX HUGDO QLUHCB\ [MF ECHFWFF LRNY [UMUGMNZUEEXY RUMQF_ O[UMCBOMC ->, OLEC FP DOBOMXY
ROPRMCTCUB Foo*, C LMNGCK const Foo*. 0 QOZCHUEFI, MCPEXU ROPRMCTCUSXU BF[X EU OJUQ[UWFRCIB
NEFDCH\EOQBF QFGECBNM, [O]BOSN [MF [O[XBDU OJaKRFB\ LRC O[UMCBOMC -> DOS[FHKBOM OB LNVF
[OQSUUBQK. 5MOGMCSSFQBN [MFLUBQK PCMCEUU RXPRCB\ `NED^FI, DOBOMCK OQNTUQBRHKUB [UMUYOL OB OLEOGO
[MULQBCRHUEFK D LMNGOSN.
)LEO FP ROPSOZEXY [MFSUEUEF_ ]BO_ QYUSX MCQ[MULUHUEEXU OJaUDBX. %QHF DO[FF OJaUDBC EU
OJEORHKIBQK HODCH\EXSF DHFUEBCSF, OEF SOGNB JXB\ MCPJMOQCEX [O RQU_ QUBF. .ORQUS LMNGOU LUHO
DOOMLFEC^FK OJEORHUEF_ EUQDOH\DFY ]DPUS[HKMOR. 6OZEO NQBCEORFB\ [MCRFHO, QOGHCQEO DOBOMOSN
LO[NQDCUBQK QNTUQBRORCEFU HIJOGO DOHFWUQBRC DO[F_ BOH\DO LHK WBUEFK, EO HFV\ OLEC GHCRECK DO[FK.
1BOJX OJEORFB\ OJaUDB, EUOJYOLFSO [MULRCMFBUH\EO [OHNWFB\ GHCRENI DO[FI N UU BUDNTUGO
RHCLUH\^C. 0OEUWEO, [MFYOLFBQK NWFBXRCB\ SEOGFU EICEQX (R WCQBEOQBF, [MO^ULNMN QSUEX RHCLUH\^C
GHCREO_ DO[FF), OLECDO [MCRFH\EOU [MFSUEUEFU RULNTFY NDCPCBUHU_ [OPROHKUB MUCHFPORCB\ ]BN
DOE^U[^FI EC NLFRHUEFU [MOQBO F EUPCSUBEO LHK DHFUEBOR.
Fpauu u ppyrue
ryppue ykasafenu
%QHF [UMUHOZFB\ ]BN GHCRN EC SNPXDN, OEC JX ECPXRCHCQ\ #CMFC^FF EC BUSN NSEXY NDCPCBUHU_. #
LRNY [MULXLNTFY GHCRCY K [MULQBCRFH JCPORXU DOE^U[^FF NSEOGO NDCPCBUHK DHCQQC, PCSUEKITUGO
RQBMOUEEXU *-NDCPCBUHF, F RULNTUGO NDCPCBUHK, LHK DOBOMOGO QNTUQBRNUB OLEOPECWEOU QOOBRUBQBRFU
Q NDCPXRCUSXS OJaUDBOS. # ]BO_ GHCRU SX [MOLOHZFS ]BN BUSN F LOJCRFS R SUHOLFI UTU EUQDOH\DO
GCMSOEFWEXY EOB.
Hufepqecuue ykasafenu
$CRUMEOU, RX QWFBCHF, WBO FEBUM`U_Q DHCQQC [OHEOQB\I O[MULUHKUBQK OJaKRHUEFUS DHCQQC, EO R
LU_QBRFBUH\EOQBF HIJO_ DHCQQ SOZUB FSUB\ EUQDOH\DO MCPEXY FEBUM`U_QOR R PCRFQFSOQBF OB DHFUEBC.
0HCQQ F UGO LMNP\K RFLKB OLFE FEBUM`U_Q, RDHIWCITF_ RQUY WHUEOR DHCQQC F RQUY PCTFTUEEXY
F OBDMXBXY WHUEOR UGO JCPORXY DHCQQOR.
5MOFPROLEXU DHCQQX RFLKB BOH\DO PCTFTUEEXY F OBDMXBXY WHUEOR DHCQQC F UGO JCPORXY
DHCQQOR.
#QU OQBCH\EXU DHFUEBX RFLKB BOH\DO OBDMXBXY WHUEOR DHCQQC F UGO JCPORXY DHCQQOR.
%QHF NDCPCBUH\ EC OJaUDB [MUOJMCPNUBQK D NDCPCBUHI EC UGO JCPORX_ DHCQQ, FEBUM`U_Q
OGMCEFWFRCUBQK BOH\DO OBDMXBXSF WHUECSF JCPOROGO DHCQQC.
)BDMXBXU, PCDMXBXU F PCTFTUEEXU WHUEX; OBDMXBOU F PCDMXBOU ECQHULORCEFU; [OHFSOM`FPS F LMNZJC
RQU ]BO HFV\ GMNJXU QFEBCDQFWUQDFU [MFJHFZUEFK JOHUU OJTU_ DOE^U[^FF LFPC_EC: OLFE OJaUDB
SOZUB FSUB\ SEOGO Q[U^FCHFPFMORCEEXY FEBUM`U_QOR.
ynupoeauue uufepqeca
*CRC_BU [OQSOBMFS, SOZEO HF OJOJTFB\ ]BN DOE^U[^FI Q [OSOT\I UTU JOHUU NSEXY (ECPORUS FY
SNLMXSF) NDCPCBUHU_ (smarter pointers). *HK ECWCHC ECS [MFLUBQK EC EUDOBOMOU RMUSK [ODFENB\
QROUGO QBCMOGO LMNGC, O[UMCBOM ->. )LEO FP OGMCEFWUEF_ O[UMCBOMC - -- -> >> > PCDHIWCUBQK R QHULNITUS:
WBOJX FQ[OH\PORCB\ NDCPCBUH\, DHFUEB BCDZU LOHZUE PECB\ RQU OJ FEBUM`U_QU NDCPXRCUSOGO OJaUDBC.
class Foo {
// D(*"7@"?)($% .$)*,, &'*'73> ;< 4$2 C'*"#'), )57%*$*, 5'0$#,M"
};
Ptr<Foo> pf(new Foo);
>SSS. 1BOJX DHFUEB SOG [OH\PORCB\QK NDCPCBUHUS, ECS [MFLUBQK MCQQDCPCB\ USN RQU WBO BOH\DO SOZEO
OJ NDCPXRCUSOS OJaUDBU Foo. $U YOBUHOQ\ JX. $FZU [ODCPCE CH\BUMECBFREX_ RCMFCEB. +UM[UEFU RQU
EU BCD QBMCVEO, DCD DCZUBQK EC [UMRX_ RPGHKL.
class Foo {
friend class Pfoo;
protected:
Foo();
public:
7
94
void DoSomething();
void DoSomethingElse();
};
class PFoo {
private:
Foo* foo;
public:
PFoo() : foo(new Foo) {}
PFoo(const PFoo& pf) : foo(new Foo(*(pf.foo))) {}
~PFoo() { delete Foo; }
PFoo& operator=(const PFoo& pf)
{
if (this != &pf) {
delete foo;
foo = new Foo(*(pf.foo));
}
return *this;
}
void DoSomething() { foo->DoSomething(); }
void DoSomethingElse() { foo->DoSomethingElse(); }
};
5MOFPOVHO QHULNITUU: SX ROQ[OH\PORCHFQ\ NLOJEXSF QMULQBRCSF DO[FMORCEFK/RQBCRDF BUDQBC RCVU_
QMULX [MOGMCSSFMORCEFK F [MOLNJHFMORCHF R NDCPCBUHU FEBUM`U_Q NDCPXRCUSOGO OJaUDBC. 1BOJX EU
HUEFB\QK F EU RPRCHFRCB\ RQI BKZUHNI MCJOBN [O LUHUGFMORCEFI EC O[UMCBOM - -- -> >> >, SX MUVFBUH\EO
MUCHFPORCHF RQU `NED^FF DHCQQC BCD, WBO DCZLCK FP EFY [UMUEC[MCRHKUB RXPOR `NED^FF-[MOBOBF[N
NDCPXRCUSOGO OJaUDBC. 4DCPCBUHF, ROQ[MOFPROLKTFU FEBUM`U_Q NDCPXRCUSOGO OJaUDBC, ECPXRCIBQK
(*"#6B#3.*',( 8$+9+"#24,( (interface pointers).
Mackupoeka ykasueaeroro oLekfa
5OECWCHN DCZUBQK, WBO MUCH\EO SX EFWUGO EU LOJFHFQ\. 1BOJX [OLQBCRHKUSXU `NED^FF MCJOBCHF,
FEBUM`U_Q DHCQQC Foo RQU MCREO LOHZUE ECYOLFB\QK R `C_HU .h [UMUL OJaKRHUEFUS DHCQQC PFoo. +US EU
SUEUU, QSFMFRVFQ\ Q EUJOH\VFSF LO[OHEFBUH\EXSF RXWFQHUEFKSF LHK ECVFY NDCPCBUHU_, SX
[OHNWCUS JXQBMX_ F OTNBFSX_ MUPNH\BCB.
class Foo1; // G)", .*' &#/"(* 4/0/* / -($"* ' Foo
class PFoo1 {
private:
Foo1* foo;
public:
PFoo1();
PFoo1(const PFoo1& pf);
~PFoo();
PFoo1& operator=(const PFoo1& pf);

void DoSomething();
void DoSomethingElse();
};
class Foo1 {
friend class PFoo1;
protected:
Foo1();
95
public:
void DoSomething();
void DoSomethingElse();
};

PFoo1::PFoo1() : foo(new Foo1)
{}

PFoo1::PFoo(const PFoo1& pf) : foo(new Foo1(*(pf.foo)))
{}

PFoo1::~PFoo()
{
delete foo;
}

PFoo1& PFoo1::operator=(const PFoo1& pf)
{
if (this != &pf) {
delete foo;
foo = new Foo1(*(pf.foo));
}
return *this;
}

void PFoo1::DoSomething()
{
foo->DoSomething();
}

void PFoo1::DoSomethingElse()
{
foo->DoSomethingElse();
}

Foo1::Foo1()
{
}

void Foo1::DoSomething()
{
cout << Foo::DoSomething() << endl;
}

void Foo1::DoSomethingElse()
{
cout << Foo::DoSomethingElse() << endl;
}
96
#FLFBU, WBO PLUQ\ [MOFQYOLFB? *HK DHFUEBC DHCQQ Foo [UMUQBCUB QNTUQBRORCB\. *HK RQUY [MCDBFWUQDFY
^UHU_ NDCPCBUH\ ."+2 QCSFS OJaUDBOS. . BCDFS ZU NQ[UYOS SX SOGHF RQU [UMUFSUEORCB\, NJMCB\ O
[UMUL NDCPCBUHUS F PCSUEFB\ FSK Foo WUS-EF6NL\ JOHUU PCDMXBXS F PCGCLOWEXS. %LFEQBRUEEOU, WBO
GOROMFB O QNTUQBRORCEFF RBOMOGO DHCQQC, [MULRCMFBUH\EOU OJaKRHUEFU class Foo;.
;UEC RQUGO [MOFQYOLKTUGO RXPOR EU [OLQBCRHKUSXY (noninline) `NED^F_ R DCZLO_ `NED^FF DHCQQC
NDCPCBUHK. *HK EUDOBOMXY EUSEOGOWFQHUEEXY [MFHOZUEF_ F DHCQQOR LCZU ]BC SCHCK ^UEC SOZUB QBCB\
EU[MFUSHUSO_. # BCDFY QHNWCKY QNTUQBRNIB LRU CH\BUMECBFRX LHK [ORXVUEFK QDOMOQBF:
FQ[OH\PORCEFU NSEXY NDCPCBUHU_ EC JCPU O[UMCBOMC -> F FQ[OH\PORCEFU FEBUM`U_QEXY NDCPCBUHU_ Q
PCEUQUEFUS OJaKRHUEFK DHCQQC NDCPXRCUSOGO OJaUDBC R `C_H .h F OBDCPOS OB RQUY [MUFSNTUQBR
FEDC[QNHK^FF. 0CD RX NJULFBUQ\ R OQBCRVU_QK WCQBF ]BO_ GHCRX, RBOMO_ RCMFCEB RQU ZU FSUUB
EUDOBOMXU LOQBOFEQBRC.
Hsreueuue uufepqeca
)LEO FP [MUFSNTUQBR FEBUM`U_QEXY NDCPCBUHU_ R BOS, WBO OEF `CDBFWUQDF [OPROHKIB FPSUEFB\
FEBUM`U_Q NDCPXRCUSOGO OJaUDBC JUP REUQUEFK FPSUEUEF_ R UGO DHCQQ. !EBUM`U_Q, [MULQBCRHUEEX_
FEBUM`U_QEXS NDCPCBUHUS, ECYOLFBQK [OHEOQB\I R RCVUS MCQ[OMKZUEFF; RX SOZUBU FQDHIWFB\ FP EUGO
EUDOBOMXU `NED^FF NDCPXRCUSOGO OJaUDBC, FPSUEFB\ QFGECBNMX, LOJCRFB\ RCVF QOJQBRUEEXU LO[OHEF-
BUH\EXU `NED^FF F [MOQBO YOMOVO [MORUQBF RMUSK, PCEORO FPOJMUBCK NDCPXRCUSX_ OJaUDB.
Fpauu
6EOGFU JFJHFOBUDF DHCQQOR (OQOJUEEO QRKPCEEXU Q GMC`FWUQDFS FEBUM`U_QOS [OH\PORCBUHK) QOLUMZCB
JOH\VFU DHCQQX FP LUQKBDOR, C BO F QOBUE `NED^F_. #FPNCH\ECK WCQB\ ]DMCEC R EFY ECPXRCUBQK [O-
MCPEOSN &()%,, %$*%, FHF >+*#2;F. $FZU [ODCPCE BF[FWEX_ ECJMOQOD DHCQQC, DOBOMX_ [MULQBCRHKUB
]BO OBOJMCZCUSOU EUWBO, DCD JX OEO EF ECPXRCHOQ\.
class View { // +$ 57$&*/&" ;30"* 57'/-4'0(<2 '* 0738'8' &#$))$
protected:
// S$)*,, 57"0($-($."(($% *'#,&' 0#% 57'/-4'0(<C &#$))'4 4/0$
public:
// J3(&B// &'()*73/7'4$(/% / /(/B/$#/-$B//
// J3(&B// 3(/.*'1"(/% / 0"$&*/4/-$B//
// L;K/" @3(&B// ';E"&*$
// L;7$;'*&$ )';<*/?
// J3(&B// '*';7$1"(/%
// 6"'2"*7/% (80" )7$;'*$#$ 2<M,?)
// H57$4#"(/" /"7$7C/"? 4/0'4
};
0CZLX_ [OLMCPLUH SOZUB ECQWFBXRCB\ LO EUQDOH\DFY LUQKBDOR `NED^F_. (CPJFMCB\QK R ]BFY `NED^FKY
RQU MCREO WBO JHNZLCB\ R PUMDCH\EOS HCJFMFEBU; DNLC JX RX EF [ORUMENHFQ\, RFLEUIBQK
JUQWFQHUEEXU OBMCZUEFK OLEOGO F BOGO ZU DHCQQC. 0OEUWEO, BCDO_ DHCQQ SOZEO JXHO JX OMGCEFPORCB\ F
JOHUU MCPNSEO EC[MFSUM, RXLUHFB\ DCZLOU QUSU_QBRO FEBUM`U_QOR R QOJQBRUEEX_ JCPORX_ DHCQQ F
PCBUS OJaULFEFB\ ]BF DHCQQX Q [OSOT\I SEOZUQBRUEEOGO ECQHULORCEFK. !HF [OQBMOFB\ DOS[HUDQ FP
OJaUDBOR, QORSUQBECK MCJOBC DOBOMXY OQEORCEC EC RPCFSEOS LUHUGFMORCEFF. #QU ]BF RCMFCEBX
OJHCLCIB QROFSF EULOQBCBDCSF.
5OH\PORCBUHF LOHZEX [OSEFB\, DCD OJaULFEKIBQK RQU `MCGSUEBX DCZLOGO QOQBCREOGO DHCQQC.
#X NRUMUEX, WBO LU_QBRFBUH\EO YOBFBU ]BOGO?
0OGLC `MCGSUEBX OJaULFEKIBQK R OJTF_ DHCQQ, OB DOBOMOGO PCBUS QOPLCIBQK [MOFPROLEXU
DHCQQX, [MOJHUSC ROPEFDCUB PCEORO EC LMNGOS NMOREU FUMCMYFF DHCQQOR.
$UHUGDO PCQBCRFB\ OLFE JCPORX_ DHCQQ [MCRFH\EO MCJOBCB\ Q LMNGFS, DOGLC ]BF LRC DHCQQC EU
FSUIB EFWUGO OJTUGO LO FY OJaULFEUEFK R DOEBUDQBU EUDOBOMOGO QOQBCREOGO DHCQQC.
5MOUDBFMORCEFU JOH\VFY DOS[HUDQOR RPCFSOLU_QBRNITFY OJaUDBOR PCEKBFU EU LHK
QHCJOEUMREXY.
97
6OZEO HF MCPJFB\ BCDO_ DHCQQ EC QOQBCRHKITFU, EU [MFJUGCK D QHOZEOQBKS QOPLCEFK [MOFPROLEXY
DHCQQOR FHF LUHUGFMORCEFK? 0OEUWEO SOZEO, UQHF ROQ[OH\PORCB\QK BUYEOHOGFU_ SNLMXY NDCPCBUHU_.
*OQBCBOWEO QOPLCB\ LHK OLEOGO OJaUDBC EUQDOH\DO NDCPCBUHU_, DCZLX_ FP DOBOMXY OBRUWCUB PC
EUDOBOMX_ CQ[UDB LUKBUH\EOQBF ]BOGO OJaUDBC.
class ViewEvents {
private:
View* view;
public:
// J3(&B//, '*(')%K/")% & ';7$;'*&" )';<*/?
};

class ViewDrawing {
private:
View* view;
public:
// J3(&B//, '*(')%K/")% & 87$@/.")&'23 4<4'03
};
// D *.0.
0CZLX_ FP ]BFY SNLMXY NDCPCBUHU_ ROQ[MOFPROLFB FEBUM`U_Q D EUDOBOMOSN [OLSEOZUQBRN `NED^F_
DHCQQC View F [UMUEC[MCRHKUB RXPORX `NED^FKS-[MOBOBF[CS OJaUDBC RFLC. .CS OJaUDB RFLC SOZUB
JXB\ NQBMOUE DCD NGOLEO: EC OQEORU OLFEOWEOGO F SEOZUQBRUEEOGO ECQHULORCEFK, LUHUGFMORCEFK R
DOS[HUDQU OJaUDBOR FHF R `OMSU OLEOGO GFGCEBQDOGO DOEGHOSUMCBC; DHFUEBOR ]BO ROHEORCB\ EU LOHZEO.
& ECPXRCI BCDFU FEBUM`U_QEXU NDCPCBUHF, OGMCEFWFRCITFU DHFUEBC [OLSEOZUQBROS [OHEOGO
FEBUM`U_QC, 76+*4,( (facets).
3BC JCPORCK FLUK NDOMUEFHCQ\ DCD SFEFSNS R OLEO_ DOSSUMWUQDO_ BUYEOHOGFF DOS[OEUEBEO_
SOLUHF OJaUDBC (.)6, Component Object Model) DOS[CEFF Microsoft, DOBOMCK ECPXRCUB ]BF NDCPCBUHF
(*"#6B#3.+,(. )LFE FP SUHDFY MCPMCJOBWFDOR, DOS[CEFK Quasar Knowledge Systems, [MULHOZFHC
CECHOGFWENI FLUI LHK OJaUDBOR SmallTalk F ECPRCHC BCDFU NDCPCBUHF $%,>2#$.+,( (suites). 0CD JX OEF
EF ECPXRCHFQ\, ]BO_ FLUU QNZLUEO QBCB\ OLEO_ FP RCZEU_VFY FLFOS LFPC_EC OJaUDBEO-
OMFUEBFMORCEEOGO [MOGMCSSFMORCEFK JNLNTUGO, [OQDOH\DN OEC OJHCLCUB [ORXVUEEO_ GFJDOQB\I F
SOLNH\EOQB\I [O QMCREUEFI Q `NED^FOECH\EXS LUHUEFUS EC OQEORU ECQHULORCEFK F LUHUGFMORCEFK.
5MF RQU_ [MOQBOBU DOE^U[^FF OEC JNLUB [MCRFH\EO MCJOBCB\ HFV\ R BOS QHNWCU, UQHF [OPCJOBFB\QK O
SEOGOWFQHUEEXY BUYEFWUQDFY LUBCHKY. *CRC_BU MCQQSOBMFS FY OLEN PC LMNGO_, EU ZCHUK RMUSUEF.
Rpeopasoeauue ykasueaeroro oLekfa e rpauu
!BCD, RX YOBFBU [OHNWFB\ GMCE\ [O FSUITUSNQK NDCPXRCUSOSN OJaUDBN. *HK ]BOGO QNTUQBRNUB SEOGO
Q[OQOJOR, OLECDO ECFJOHUU QOOBRUBQBRNITF_ QBFHI C++ PCDHIWCUBQK R FQ[OH\PORCEFF O[UMCBOMOR
[MUOJMCPORCEFK.
class View {
public:
operator ViewEvents() { return new ViewEvents(this); }
operator ViewDrawing() { return new ViewDrawing(this); }
};
*MNGO_ RCMFCEB MCPMUVFB\ [OH\PORCBUHI EC[MKSNI FQ[OH\PORCB\ DOEQBMNDBOMX DHCQQC GMCEF:
ViewEvents ve(aView);
)J FY LOQBOFEQBRCY F EULOQBCBDCY SOZEO Q[OMFB\ LOHGO, EO HFWEO K [MUL[OWFBCI [UMRX_ Q[OQOJ [O
[MFWFECS, O DOBOMXY SX RQDOMU [OGOROMFS. .NTUQBRNUB UTU OLFE Q[OQOJ, DOBOMX_ BOZU PCQHNZFRCUB
N[OSFECEFK [MFQROFB\ DCZLOSN BF[N GMCEF NEFDCH\EX_ FLUEBF`FDCBOM F PCBUS QOPLCB\ ULFENI,
SEOGO^UHURNI `NED^FI GUEUMC^FF GMCEU_ LHK RQUY DHCQQOR. +CDCK `NED^FK [OHNWCUB FLUEBF`FDCBOM
BF[C GMCEF R DCWUQBRU CMGNSUEBC F ROPRMCTCUB GMCE\, UQHF OEC [OLLUMZFRCUBQK OJaUDBOS, F NULL - R
98
[MOBFREOS QHNWCU. +U FP RCQ, DOSN [MFYOLFHOQ\ [OH\PORCB\QK BUYEOHOGFKSF .)6 F OLE DOS[CEFF
Microsoft, NPECIB PECDOSNI `NED^FI QueryInterface, [OLLUMZFRCUSNI RQUSF OJaUDBCSF.
Kpucfannu
%QHF N RCQ FSUUBQK OLEC GMCE\ F RX YOBFBU [OHNWFB\ LMNGNI GMCE\ BOGO ZU OJaUDBC, ECFJOHUU
[MKSOHFEU_EX_ [OLYOL BCDZU PCDHIWCUBQK RO RDHIWUEFF O[UMCBOMOR [MUOJMCPORCEFK R GMCE\.
4[MOTUEEX_ [OLYOL RXGHKLFB BCD:
class ViewEvents {
private:
View* view;
public:
operator ViewDrawing() { return ViewDrawing(*view); }
// D *.0. 0#% 0738/C 87$("?
};
# ]BOS SCHUE\DOS .++-FPSU MCJOBC [OMNWCUBQK O[UMCBOMEO_ `NED^FF operator ViewDrawing()
^UHUROGO RFLC. 5MF SCHOS DOHFWUQBRU GMCEU_ BCDOU MUVUEFU R[OHEU [MFUSHUSO. . MOQBOS DOHFWUQBRC
GMCEU_ WFQHO O[UMCBOMOR [MUOJMCPORCEFK ROPMCQBCUB R DRCLMCBFWEO_ PCRFQFSOQBF, [OQDOH\DN DCZLCK
GMCE\ LOHZEC [MUOJMCPORXRCB\ DO RQUS OQBCH\EXS. .HULNITCK SOLF`FDC^FK ROPRMCTCUB PCLCWN D
[OMKLDN n, GLU n DOHFWUQBRO GMCEU_. 5MOLOHZCK QROI OBDMORUEEO QHCJNI SUBC`OMN, K ECPXRCI
OJaUDB, DOBOMX_ QOJFMCUB F RXLCUB GMCEF, $6(."+22%, (gemstone).
class View;
class ViewEvents;
class ViewDrawing;
class ViewGemstone {
private:
View* view;
public:
ViewGemstone(View* v) : view(v) {}
bool operator!() { return view == NULL; }
operator ViewEvents();
operator ViewDrawing();
// D *.0.
};

class ViewEvents {
friend class ViewGemstone;
private:
View* view;
ViewEvents(View* v) : view(v) {}
public:
bool operator!() { return view == NULL; }
operator ViewGemstone();
};

class ViewDrawing {
friend class ViewGemstone;
private:
View* view;
ViewDrawing(View* v) : view(v) {}
99
public:
bool operator!() { return view == NULL; }
operator ViewGemstone();
};
4 ECQ UQB\ OLFE OJaUDB, DMFQBCHH, DOBOMX_ NSUUB GUEUMFMORCB\ RQU GMCEF; DCZLCK GMCE\, R QROI
OWUMUL\, PECUB, DCD EC_BF DMFQBCHH. 0MFQBCHH KRHKUBQK ULFEQBRUEEXS OJaUDBOS, DOBOMX_ SOZUB
QOPLCRCB\ GMCEF, BCD DCD [OQHULEFU FSUIB PCDMXBXU DOEQBMNDBOMX F LMNZCB Q DMFQBCHHOS. 0OE^U[^FK
DMFQBCHHC WMUPRXWC_EO GFJDC OE SOZUB JXB\ QCSOQBOKBUH\EXS OJaUDBOS, CJQBMCDBEXS JCPORXS
DHCQQOS OJaUDBC F LCZU OLEO_ FP GMCEU_.
. [UMROGO RPGHKLC DCZUBQK, WBO BCDOU MUVUEFU QOPLCUB FPHFVEFU EUNLOJQBRC LHK [OH\PORCBUHK,
DOBOMOSN [MFYOLFBQK RX[OHEKB\ LRC [OQHULORCBUH\EXY [MUOJMCPORCEFK BF[C. $CRUMEOU, DOSN-EFJNL\
PCYOWUBQK QLUHCB\ DHCQQ ViewGemstone JCPORXS LHK RQUY OQBCH\EXY. +CDO_ RCMFCEB ROPSOZUE, EO
BOGLC FQWUPENB EUDOBOMXU RCZEXU [MUFSNTUQBRC. 5MFRULUEECK RXVU SOLUH\ KRHKUBQK CJQOHIBEO
[HOQDO_; SUZLN GMCEKSF EU QNTUQBRNUB OBEOVUEF_ ECQHULORCEFK. 8HCGOLCMK ]BOSN ROPEFDCUB OGMOSECK
QBU[UE\ QROJOLX R MUCHFPC^FF LHK [OLLUMZCEFK ]BFY FEBUM`U_QOR SOZEO FQ[OH\PORCB\
ECQHULORCEFU, LUHUGFMORCEFU F CGMUGFMORCEFU (REULMUEEXU [UMUSUEEXU DHCQQC). #QU ]BO Q HFYRO_
ODN[CUB OLEO HFVEUU [MUOJMCPORCEFU BF[C.
Bapuauuu ua fery rpaue
,MCEF SOZEO MUCHFPORCB\ EUQDOH\DFSF Q[OQOJCSF. # QORODN[EOQBF OEF OJMCPNIB ECLSEOZUQBRO BUY
ROPSOZEOQBU_, DOBOMXU R C++ [OLLUMZFRCIBQK Q [OSOT\I ECQHULORCEFK F [UMUSUEEXY DHCQQC.
Fpauu ruoecfea nopqyukuu
.CSCK [MOQBCK `OMSC GMCEF BC, DOBOMCK [MULOQBCRHKUB FEBUM`U_Q D [OLSEOZUQBRN `NED^F_
NDCPXRCUSOGO OJaUDBC.
// G @$?#" Pointee.h
class Pointee;
class Facet {
friend class PointeeGemstone;
private:
Pointee* pointee;
Facet(Pointee* p) : pointee(p) {}
public:
void Fn1();
int Fn2();
void Fn17();
};

class PointeeGemstone {
private:
Pointee* pointee;
public:
PointeeGemstone(Pointee* p) : pointee(p) {}
Operator Facet();
};

// G @$?#" Pointee.cpp
class Pointee {
public:
void Fn1();
.00
int Fn2();
void Fn3();
char Fn4();
// D *.0.
void Fn17();
};
"LUQ\ GMCE\ [MOQBO OBJMCQXRCUB RQU `NED^FF, DOBOMXU EU RYOLKB R UU DOS[UBUE^FI. 0HFUEB FSUUB LUHO
Q OJaUDBOS, DOBOMX_ ECSEOGO HUGWU RQUGO NDCPXRCUSOGO OJaUDBC, EO PC DNHFQCSF RQU MCREO [MKWUBQK
[OHEX_ OJaUDB.
Fpauu nepereuuue knacca
,MCE\ SOZUB [MULQBCRHKB\ QOJO_ FEBUM`U_QEX_ NDCPCBUH\ EC [UMUSUEENI DHCQQC. 3BO [OPROHKUB
SEOGODMCBEO FQ[OH\PORCB\ GMCE\ R MCPHFWEXY DMFQBCHHCY FHF LHK OMGCEFPC^FF FEBUM`U_QC D
OBLUH\EOSN ]DPUS[HKMN. %QHF NDCPXRCUSX_ OJaUDB FSUUB [UMUSUEENI DHCQQC Bar, GMCE\ SOZUB
[MULQBCRHKB\ QOJO_ [MOQBO_ FEBUM`U_QEX_ NDCPCBUH\ EC Bar.
// G @$?#" Pointee.h
class BarFacet {
private:
Bar* bar;
public:
BarFacet(Bar* b) : bar(b) {}
// D(*"7@"?)< & @3(&B/%2 &#$))$ Bar
};

class PointeeGemstone {
private:
Pointee* p;
public:
operator BarFacet();
// D *.0.
};

// G @$?#" Pointee.cpp
class Pointee {
friend class PointeeGemstone;
private:
Bar bar; // G("07"(($% 5"7"2"(($% &#$))$ Pointee
public:
// D *.0.
};

PointeeGemstone::operator BarFacet()
{
return BarFacet(&p->Bar); // 67$(, 5"7"2"(('?
}
#QU [MUDMCQEO MCJOBCUB, UQHF RCS YRCBCUB OBEOQFBUH\EO [MOQBXY [MCRFH QOGHCQORCEEOQBF C++.
#UMOKBEO, R JOHUU OJTUS QHNWCU QBOFB ROQ[OH\PORCB\QK [MFUSCSF, O[FQCEEXSF LCHUU, R MCPLUHU
)JUQ[UWUEFU QOGHCQORCEEOQBF. # WCQBEOQBF, OLEC FP [MOJHUS BCDOGO N[MOTUEEOGO [OLYOLC
.0.
PCDHIWCUBQK R BOS, WBO RX SOZUBU [UMU_BF OB DMFQBCHHC D GMCEF BarFacet, EO EU QSOZUBU RX[OHEFB\
OJMCBEOU [MUOJMCPORCEFU [O FE`OMSC^FF, LOQBN[EO_ R GMCEF.
Fpauu asoeue knaccu
,MCEF BCDZU SOGNB FQ[OH\PORCB\QK LHK QOPLCEFK ]DRFRCHUEBC RQBMOUEEOGO [MUOJMCPORCEFK BF[C OB
[MOFPROLEOGO DHCQQC D JCPOROSN.
// G @$?#" Pointee.h
class FooFacet {
private:
Foo* foo;
public:
FooFacet(Foo* f) : foo(f) {}
// D(*"7@"?)< & @3(&B/%2 &#$))$ foo
};

class PointeeGemstone {
private:
Pointee* p;
public:
operator FooFacet();
// D *.0.
};

// G @$?#" Pointee.cpp
class Pointee : public Foo {
friend class PointeeGemstone;
public:
// D *.0.
};

PointeeGemstone::operator FooFacet()
{
return FooFacet(p); // I'25/#%*'7 57"';7$-3"* p & Foo*
}
0CD F R QHNWCU Q GMCEKSF-[UMUSUEEXSF, ]BO SOZUB [OPROHFB\ RCS SEOGODMCBEO FQ[OH\PORCB\ OLEF F BU
ZU GMCEF Foo LHK JCPORXY DHCQQOR, [UMUSUEEXY FHF OBLUH\EXY OJaUDBOR, YOBK LHK OJUQ[UWUEFK JOHUU
QBMOGFY [MCRFH QOGHCQORCEEOQBF, O[FQCEEXY EFZU, [OBMUJNUBQK JOHUU NPDCK Q[U^FCHFPC^FK. $C[MFSUM,
[MF BCDOS [OLYOLU RX QSOZUBU RX[OHEFB\ [MUOJMCPORCEFU OB DMFQBCHHC D GMCEF FooFacet, EO EU
QSOZUBU QEORC RUMENB\QK D DMFQBCHHN.
Fpauu penerafu
#O RQUY BMUY O[FQCEEXY RCMFCEBCY (GMCEF R DCWUQBRU [OLSEOZUQBRC FEBUM`U_QOR, [UMUSUEEXY DHCQQC F
JCPORXY DHCQQOR) [OLMCPNSURCUBQK OJaULFEUEFU EUQDOH\DFY OJaUDBOR R OLFE. #OPSOZEO F LMNGOU
MUVUEFU FQ[OH\PORCB\ QUB\ RPCFSOLU_QBRNITFY OJaUDBOR F FSUB\ OLEN GMCE\ LHK DCZLOGO OJaUDBC R
QUBF. .FBNC^FK OWUE\ [OYOZC EC RCMFCEB Q GMCEKSF-[UMUSUEEXSF, YOBK CLMUQ, EC DOBOMX_ NDCPXRCUB
GMCE\, EU REULMKUBQK `FPFWUQDF R NDCPXRCUSX_ OJaUDB DCD [UMUSUEECK DHCQQC.
// G @$?#" Pointee.h
class BarFacet {
private:
Bar* bar;
.02
public:
BarFacet(Bar* b) : bar(b) {}
// D(*"7@"?)< & @3(&B/%2 &#$))$ Bar
};

class PointeeGemstone {
private:
Pointee* p;
public:
operator BarFacet();
// D *.0.
};

// G @$?#" Pointee.cpp
class Pointee {
friend class PointeeGemstone;
private:
Bar* bar; // H1" (" 4("07"(($% 5"7"2"(($% &#$))$
public:
// D *.0.
};

PointeeGemstone::operator BarFacet()
{
return BarFacet(&p->Bar);
}
+CDOU MUVUEFU QBMCLCUB EULOQBCBOWEO_ QOGHCQORCEEOQB\I, DCD F MUVUEFU Q GMCEKSF-[UMUSUEEXSF.
Koruuauuu u eapuauuu
%QHF EC RCQ ECDCBFB OQOJUEEO BROMWUQDOU ECQBMOUEFU, SOZEO QOPLCB\ GMCEF, R DOBOMXY FQ[OH\PNIBQK
DOSJFEC^FF ]BFY WUBXMUY [OLYOLOR. $C[MFSUM, OLEC GMCE\ SOZUB RDHIWCB\ [OLSEOZUQBRO
FEBUM`U_QEXY `NED^F_ NDCPXRCUSOGO OJaUDBC; OLEN FEBUM`U_QENI `NED^FI, LUHUGFMNITNI
[UMUSUEEO_ DHCQQC; LMNGNI, LUHUGFMNITNI JCPOROSN DHCQQN; F BMUB\I, MCJOBCITNI Q LUHUGCBOS
NDCPXRCUSOGO OJaUDBC. $C 0C[FBOHF_QDOS YOHSU BCDCK QFBNC^FK JXHC R[UMRXU [MULQBCRHUEC R -DBU O
#QUQBOMOEEUS 5MFSUEUEFF !LFOS C++ OB /995 GOLC.
Hukancynnuun ykasueaeroro oLekfa
(CP RQK ]BC JNMECK LUKBUH\EOQB\ QDOE^UEBMFMORCEC RODMNG OJaUDBC View, BO DCD NJMCB\ UGO [OLCH\VU OB
GHCP VFMODO_ [NJHFDF? .OJQBRUEEO, ]BO QWFBCHOQ\ OLEFS FP LOQBOFEQBR FEBUM`U_QEXY NDCPCBUHU_, EU
[MCRLC HF? %TU MCP [OQSOBMFBU EC DMFQBCHH RFLC. +CD HF NZ EUOJYOLFSO [OH\PORCBUHI RFLUB\
NDCPXRCUSX_ OJaUDB [MF FQ[OH\PORCEFF ]BO_ QBMCBUGFF? # LU_QBRFBUH\EOQBF USN YRCBFB ROPSOZEOQBF
QOPLCRCB\ DMFQBCHHX, DOBOMXU, R QROI OWUMUL\, JNLNB FQ[OH\PORCB\QK LHK [OHNWUEFK EUOJYOLFSXY
GMCEU_. 0OGLC ]BO JNLUB QLUHCEO, GMCEF F DMFQBCHHX SOZEO [OSUQBFB\ R `C_H .h F QDMXB\ NDCPXRCUSX_
OJaUDB R `C_HU .QMM.
+CDO_ RCMFCEB OQOJUEEO YOMOVO MCJOBCUB R QOWUBCEFF Q LMNGFSF FLFOSCSF. . [UMUYOLEXSF BF[CSF
NDCPXRCUSXU OJaUDBX SOZEO SUEKB\ RO RMUSK RX[OHEUEFK [MOGMCSSX. ,OSOSOM`EXU FUMCMYFF
DHCQQOR [OPROHKIB FQ[OH\PORCB\ OLFE ECJOM GMCEU_ LHK OMGCEFPC^FF FEBUM`U_QC D LUMUR\KS QUSU_QBR
[MOFPROLEXY FHF [UMUDOS[OEORCEEXY (recomposed) DHCQQOR NDCPXRCUSXY OJaUDBOR. #ULNTFU
NDCPCBUHF [OSOGCIB QOJHIQBF EUDOBOMXU FP [MCRFH QOGHCQORCEEOQBF, O DOBOMXY JNLUB MCQQDCPCEO
[OPZU.
.03
Rpoeepka rpaue
*CRC_BU UTU EUSEOGO MCQVFMFS ]BN FLFOSN F [MUL[OHOZFS, WBO EUDOBOMCK GMCE\ SOZUB
[OLLUMZFRCB\QK FHF EU [OLLUMZFRCB\QK OJaUDBOS. ) BOS, [OWUSN F DCD ]BO SOZUB [MOFPO_BF, SX
[OGOROMFS RO RMUSK FPNWUEFK [UMUYOLEXY BF[OR LCHUU R ]BO_ GHCRU, C [ODC OBRUBFS EC RO[MOQ: DCD
DHFUEB SOZUB O[MULUHFB\, [OLLUMZFRCUBQK HF EUDOBOMX_ OJaUDB EUDOBOMO_ GMCE\I? (UVUEFU
[OQBMOUEO EC LMNGOS .++-FPSU [UMUGMNPDU O[UMCBOMC !.
class ViewEvents {
private:
View* view;
public:
ViewEvents(View* v) : view(v) {}
bool operator!() { return view == NULL; }
// D *.0.
};

// G &#/"(*)&'2 &'0"
ViewEvents ve(aViewGemstone);
if (!ve) {
cerr << G/0 (" ';7$;$*<4$"* )';<*/?! << endl;
throw interface_error;
}
5MUL[OHCGCUBQK, WBO aViewGemstone OBEOQFBQK D DMFQBCHHCS RFLC, O DOBOMXY GOROMFHOQ\ RXVU, F
QOLUMZFB O[UMCBOMENI `NED^FI operator ViewEvents(). 0HIWURCK QBMODC ViewEvents
ve(aViewGenistone) MCJOBCUB R LRC ]BC[C: QECWCHC RXPXRCUBQK O[UMCBOMECK `NED^FK operator
ViewEvents(), RX[OHEKITCK [MUOJMCPORCEFU, C PCBUS ve DOEQBMNFMNUBQK Q [OSOT\I DOEQBMNDBOMC
DO[F_ ViewEvents. %QHF DMFQBCHH RFLC MUVCUB, WBO LCEEX_ RFL EU OJMCJCBXRCUB QOJXBF_, OE SOZUB
QDOEQBMNFMORCB\ ]DPUS[HKM ViewEvents Q view, MCREXS NULL. "CBUS O[UMCBOM ! [MORUMKUB
ROPRMCTUEENI GMCE\. :NED^FF GMCEF BCDZU SOGNB [MORUMKB\ ECHFWFU OJaUDBC [UMUL BUS, DCD [XBCB\QK
WBO-BO LUHUGFMORCB\ USN.
Void ViewEvents::DoSomething()
{
if (!*this) // *' ")*, if (view == NULL)
// D(/B//7'4$*, /)&#>."(/"
view->DoSomething();
}
Oecneeuue cornacoeauuocfu
# OLEFY OBEOVUEFKY C++ EU[MOEF^CUS, DCD GMCEFBECK QDCHC, R LMNGFY LXMKR, DCD MUVUBO. )LEC FP
BCDFY LXM EUQOGHCQORCEEX_ [OLYOL D [MUOJMCPORCEFI BF[OR. #X SOZUBU [OHNWFB\ CLMUQ
[UMUSUEEO_ DHCQQC, EO [O ]BOSN CLMUQN EUH\PK JUPO[CQEO [UMU_BF D OJaUDBN, DOBOMOSN [MFECLHUZFB
[UMUSUEECK. 4 DOS[FHKBOMC YRCBCUB NSC LHK CRBOSCBFWUQDOGO [MFRULUEFK NDCPCBUHK EC [MOFPROLEX_
DHCQQ D NDCPCBUHI EC JCPORX_, EO RUMENB\QK D NDCPCBUHI EC [MOFPROLEX_ DHCQQ OE NZU EU QSOZUB.
5MFLUBQK RX[OHEKB\ EUJUPO[CQEOU KREOU [MUOJMCPORCEFU, [OH\PNITUUQK LNMEO_ QHCRO_. 8OH\VFEQBRO
[MOGMCSSFQBOR F [MOUDBFMORTFDOR HFV\ FQ[NQDCUB GHNJODF_ RPLOY, OJXWEO [MFJUMUGCUSX_ LHK
QN[MNZUQDFY QQOM, F ZFRUB Q ]BFSF EUQOOBRUBQBRFKSF. )LECDO JHCGOLCMK FLFOSU GMCEU_ OBDMXRCUBQK
NEFDCH\ECK ROPSOZEOQB\ FQ[MCRFB\ ]BOB CQ[UDB C++. .NTUQBRNIB BMF QRO_QBRC, DOBOMXU R QO-
RODN[EOQBF OJUQ[UWFRCIB OBQNBQBRNITNI R C++ QBU[UE\ QOGHCQORCEEOQBF. # QHULNITUS O[FQCEFF
RXMCZUEFU $=>b OPECWCUB, WBO GMCEF BF[C - QOLUMZCB O[UMCBOM [MUOJMCPORCEFK, LCITF_ GMCE\ BF[C B;
C F b KRHKIBQK DOEDMUBEXSF ]DPUS[HKMCSF BF[OR - F # QOOBRUBQBRUEEO. >OBK ]BF [MCRFHC OBEOQKBQK D
Q[U^F`FDU C++ F GMCEU_, OEF BCDZU KRHKIBQK WCQB\I QBCELCMBEO_ LFQ^F[HFEX [MOUDBFMORCEFK,
FQ[OH\PNUSO_ R BUYEOHOGFF .)6 DOS[CEFF Microsoft:
.04
/. !(,,#"6(-*%.";. %QHF C=>b, BO b=>C. 5OQHULQBRFK: GMCE\ [UMUSUEECK DHCQQC LOHZEC NSUB\
ROQQBCECRHFRCB\ RSUTCITF_ OJaUDB, FP DOBOMOGO OEC [OHNWUEC, C GMCE\ JCPORX_ DHCQQ
LOHZEC NSUB\ JUPO[CQEO ROPRMCTCB\QK D [MCRFH\EOSN [MOFPROLEOSN DHCQQN.
2. Q6+*9("(&*%.";. %QHF C=>b, C=>Q F b=>c2, BO Q F Q2 LOHZEX JXB\ ]DRFRCHUEBEX; BOWEUU, OEF
LOHZEX JXB\ GMCEKSF OLEOGO OJaUDBC, OJUQ[UWFRCITFSF FLUEBFWEXU ECJOMX `NED^FOECH\EXY
QMULQBR. 5MF ]BOS `FPFWUQDF OEF SOGNB JXB\ MCPEXSF GMCEKSF.
3. K."%3-(&%."; 76+*#3. 5ODC GMCE\ QNTUQBRNUB, OEC LOHZEC MCJOBCB\ DOMMUDBEO. !ECWU GOROMK,
[MF NLCHUEFF NDCPXRCUSOGO OJaUDBC RQU QQXHCITFUQK EC EUGO GMCEF [OQHU RX[OHEUEFK
O[UMCBOMC ! ECWFECIB ROPRMCTCB\ false F FEF^FFMORCB\ FQDHIWUEFK [MF RXPORU `NED^F_. 3BO
[OHOZUEFU SOZEO JXHO JX Q`OMSNHFMORCB\ F JOHUU QBMOGO NDCPXRCUSX_ OJaUDB EU LOHZUE
NEFWBOZCB\QK LO BUY [OM, [ODC LHK EUGO QNTUQBRNUB YOBK JX OLEC GMCE\. # WCQBEOQBF, ]BO
[MCRFHO FQ[OH\PNUBQK R BUYEOHOGFF .)6.
5UMRXU LRC [MCRFHC RX[OHEFB\ EUQHOZEO, YOBK PC ]BO EUMULDO [MFYOLFBQK MCQ[HCWFRCB\QK OJaUSOS F
JXQBMOLU_QBRFUS. 5OQFLFBU [CMN RUWUMOR, ECJU_BU ZFROB ZFMEO_ [F^^U_, F RX ECRUMEKDC QCSF
[MFLNSCUBU, DCD OJUQ[UWFB\ RX[OHEUEFU ]BFY LRNY [MCRFH. $UDOBOMXU MUDOSUELC^FF [MFRULUEX EFZU.
4QBO_WFROQB\ GMCEU_ QORQUS LMNGOU LUHO; SX DOEQBCBFMNUS [MOJHUSN QU_WCQ, EO OBDHCLXRCUS
MUVUEFU LO QHULNITFY GHCR.
Currefpuuocfu
.CSX_ [MOQBO_ Q[OQOJ RX[OHEFB\ ]BO BMUJORCEFU RDHIWFB\ R DHCQQ GMCEF LRU [UMUSUEEXU. # OLEO_
YMCEFB\ CLMUQ QOQBCREOGO OJaUDBC, FQ[OH\PNUSOGO GMCE\I, C R LMNGO_ CLMUQ DMFQBCHHC FHF FQYOLEOGO
NDCPXRCUSOGO OJaUDBC.
class BarFacet {
private:
Bar* bar;
PointeeGemstone* gemstone;
public:
BarFacet(Bar* b, PointeeGemstone* agg) : bar(b), gemstone(agg) {}
operator PointeeGemstone() { return *gemstone; }
// D(*"7@"?)< & @3(&B/%2 Bar
};
$CHFWFU OJMCBEOGO NDCPCBUHK OJUQ[UWFRCUB QFSSUBMFWEOQB\; [O DMFQBCHHN SOZEO .[OHNWFB\ GMCE\, C [O
GMCEF DMFQBCHH. )QEORECK [MOJHUSC QOQBOFB R BOS, WBO BarFacet EU GOLFBQK LHK [ORBOMEOGO
FQ[OH\PORCEFK, UQHF #CG KRHKUBQK DOS[OEUEBOS MCPHFWEXY DMFQBCHHOR; LHK DCZLOGO FQ[OH\PORCEFK
[MFYOLFBQK QOPLCRCB\ OBLUH\ENI GMCE\.
Tpausufueuocfu
$C QCSOS LUHU QOJHILUEFU ]BOGO [MFE^F[C PCRFQFB OB LFQ^F[HFEX [MOUDBFMORCEFK. +MCEPFBFREOQB\
ECMNVCUBQK R QFBNC^FKY EC[OLOJFU QHULNITU_:
class Foo {
private:
Blob* blob;
Bar* bar;
};

class Bar {
private:
Blob* another_blob;
};
.05
%QHF OJMCBFB\QK D DHCQQN Foo Q PC[MOQOS EC [OHNWUEFU Glob, OE RUMEUB RCS BO, EC WBO QQXHCUBQK UGO
QOJQBRUEECK [UMUSUEECK. %QHF PC[MOQFB\ Bar, C PCBUS N Bar PC[MOQFB\ Blob, RX [OHNWFBU LMNGO_
OJaUDB BOB, EC DOBOMX_ QQXHCUBQK Bar.
+CDCK QFBNC^FK OJXWEO RQBMUWCUBQK [MF SEOZUQBRUEEOS ECQHULORCEFF F SEOGODMCBEOS (YOBK F
DOQRUEEOS) ECQHULORCEFF OB OLEOGO JCPOROGO DHCQQC. %QHF [UMUMCJOBCB\ [MFRULUEEX_ RXVU `MCGSUEB,
BN ZU [MOJHUSN SOZEO HUGDO ROQQOPLCB\ Q [MFSUEUEFUS ECQHULORCEFK:
class Blob { ... };
class Foo : public Blob { ... };
class Bar : public Foo, public Blob { ... };
# ]BOS `MCGSUEBU PCHOZUEC EUOLEOPECWEOQB\. 5MF [MUOJMCPORCEFF BF[C Bar* R Blob* EU[OEKBEO,
DCDO_ ZU Blob FSUUBQK R RFLN: EU[OQMULQBRUEEO JCPORX_ LHK Bar FHF BOB, OB DOBOMOGO [MOFQYOLFB
Foo? *CZU UQHF RCS NLCQBQK Q[MCRFB\QK Q EUOLEOPECWEOQB\I, BMCEPFBFREOQB\ RQU MCREO ECMNVCUBQK.
0CD ZU FPJUZCB\ [OLOJEXY [MOJHUS? & SOG JX [NQBFB\QK R PCSXQHORCBXU OJaKQEUEFK, EO RQU QROLFBQK
D OLEOSN: QHULFBU PC QOJO_. $U ECQHULN_BU %"$6'"% OB OLEOGO DHCQQC EUQDOH\DO MCP R FUMCMYFWUQDOS
LUMURU EUDOBOMOGO DHCQQC (Q PCDMXBXS ECQHULORCEFUS [MOJHUS OJXWEO EU ROPEFDCUB, [OQDOH\DN EUH\PK
RX[OHEFB\ [MUOJMCPORCEFU D BF[N PCDMXBOGO JCPOROGO DHCQQC). $U REULMK_BU ]DPUS[HKMX OLEOGO DHCQQC
R DCWUQBRU [UMUSUEEXY JOHUU WUS OLEOGO DOS[OEUEBC, C UQHF NZ RX ]BO QLUHCHF EU [MULOQBCRHK_BU
FEBUM`U_QX JOHUU WUS D OLEOSN FP EFY.
Ycfoueocfu rpaue
# ]BCHOEEOS C++ ]BC [MOJHUSC ROPEFDCUB, EC[MFSUM, [MF [OHNWUEFF CLMUQC [UMUSUEEO_ FHF JCPOROGO
DHCQQC F [OQHULNITUS NLCHUEFF RSUTCITUGO OJaUDBC. 4DCPCBUH\ EC [UMUSUEENI FHF JCPORX_ DHCQQ
[MURMCTCUBQK R SNQOM. 5MOJHUSC OJUQ[UWUEFK QOGHCQORCEEOQBF R BCDO_ EUMCPJUMFYU EU MUVCUBQK PC
OJULOS R BUWUEFU OLEOGO LEK. 4QFHUEECK `OMSNHFMORDC (NDCPXRCUSXU OJaUDBX LOHZEX QNTUQBRORCB\
LO BUY [OM, [ODC LHK EFY QNTUQBRNIB GMCEF) OBDHCLXRCUBQK LO BO_ WCQBF DEFGF, DOBOMCK [OQRKTUEC
N[MCRHUEFI [CSKB\I. .HCJCK `OMSNHFMORDC HUGDO OJUQ[UWFRCUBQK Q [OSOT\I RULNTFY NDCPCBUHU_.
%QHF GMCE\ MCJOBCUB Q OJaUDBOS WUMUP RULNTF_ NDCPCBUH\, BO N RULNTUGO NDCPCBUHK SOZEO Q[MOQFB\: -
NDCPXRCUV\ HF BX QU_WCQ EC QNTUQBRNITF_ OJaUDB? %QHF OBRUB JNLUB OBMF^CBUH\EXS, O[UMCBOM !
ROPRMCTCUB true, F `NED^FF ECWFECIB FEF^FFMORCB\ FQDHIWUEFK. 5MCRLC, OQBCUBQK LMNGCK [MOJHUSC
DOGLC F DCD NLCHKB\ RULNTFU NDCPCBUHF. %U BCDZU HNWVU MCQQSCBMFRCB\ [MF OJQNZLUEFF MCPHFWEXY
QBMCBUGF_ N[MCRHUEFK [CSKB\I.
Fpauu u eepyue ykasafenu
0OE^U[^FF GMCEU_ F DMFQBCHHOR YOMOVO QOWUBCIBQK Q DOE^U[^FU_ RULNTFY NDCPCBUHU_. .NTUQBRNIB
LRC OQEOREXY [OLYOLC.
Bepyu ykasafenu e cepepuue
+MCLF^FOEEX_ RULNTF_ NDCPCBUH\ (RUMOKBEO, Q FQ[OH\PORCEFUS O[UMCBOMC ->) RQBCRHKUBQK SUZLN
NDCPXRCUSXS OJaUDBOS F GMCE\I. # ]BOS QHNWCU GMCEF [MURMCTCIBQK R MCPEORFLEOQB\ LUQDMF[BOMOR,
DOQRUEEO OJMCTCITFYQK D WHUECS NDCPXRCUSOGO OJaUDBC WUMUP RULNTF_ NDCPCBUH\. #ULNTF_ NDCPCBUH\
LOHZUE NSUB\ YOBK JX GUEUMFMORCB\ DMFQBCHH, DOBOMX_ PCBUS JNLUB FQ[OH\PORCB\QK DHFUEBCSF LHK
GUEUMC^FF LMNGFY GMCEU_. %QHF RUQ\ LOQBN[ D OJaUDBN OQNTUQBRHKUBQK WUMUP GMCEF, [OLNSC_BU O BOS,
WBOJX QLUHCB\ O[UMCBOM -> RULNTUGO NDCPCBUHK PCDMXBXS, C GMCEF OJaKRFB\ LMNP\KSF.
Rpeepaeuue kpucfanna e eepyu ykasafenu
0MFQBCHHN [MFQRCFRCIBQK `NED^FF RULNTUGO NDCPCBUHK. "CBUS DMFQBCHH GUEUMFMNUB GMCEF F
[OLLUMZFRCUB QUSCEBFDN RULNTUGO NDCPCBUHK LHK DOEQBMNFMORCEFK F NEFWBOZUEFK. ,MCEF [OHNWCIB
LOQBN[ D NDCPXRCUSOSN OJaUDBN -#6#9 $6(."+22. 1BOJX RCS JXHO NLOJEUU, SOZEO [MULOQBCRFB\
PCDMXBX_ O[UMCBOM -> R DMFQBCHHU F QLUHCB\ GMCEF LMNP\KSF DMFQBCHHC. ,MCEF `CDBFWUQDF
[MURMCTCIBQK R LUQDMF[BOMX F [OHNWCIB LOQBN[ D NDCPXRCUSOSN OJaUDBN DOQRUEEO, WUMUP DMFQBCHH.
.06
Repexopuue funu
)QEORECK FLUK [UMUYOLEOGO BF[C (malleable type) - DHCQQ, ]DPUS[HKMX DOBOMOGO DCD JX FPSUEKIB QRO_
BF[ RO RMUSK RX[OHEUEFK [MOGMCSSX. 0OEUWEO, `OMSCH\EO # C++ BCDOGO [MOFQYOLFB\ EU SOZUB
FECWU RCS [MFVHOQ\ JX RQUM\UP F ECLOHGO [OLMNZFB\QK Q OBHCLWFDOS. +US EU SUEUU, WNLUQC
QORMUSUEEXY NDCPCBUHU_ [OPROHKIB LOJFB\QK [OWBF BOGO ZU ]``UDBC.
Ronuropquue ykasueaerue oLekfu
# JCPOROS RCMFCEBU RULNTUGO NDCPCBUHK [MFQNBQBRNUB [UMUSUEECK Q BF[OS Pointee*. $o DBO QDCPCH,
WBO OJaUDB, EC DOBOMX_ OEC QQXHCUBQK, LOHZUE JXB\ ECQBOKTFS Pointee, C EU DCDFS-EFJNL\ DHCQQOS,
[MOFPROLEXS OB Pointee?
// G @$?#" Foo.h
class Foo {
protected:
Foo();
public:
// S#"(< Foo
};

class Pfoo { // G"03K/? 3&$-$*"#,
private:
Foo* foo;
public:
PFoo();
Foo* operator->() const { return foo; }
// L)*$#,(<" .#"(<, C$7$&*"7(<" 0#% 4"03K/C 3&$-$*"#"?
};

// G @$?#" Foo.cpp
class DerivedFromFoo : public Foo {
private:
// T$&7<*<" .#"(< 57'/-4'0('8' &#$))$
public:
DerivedFromFoo(); // J3(&B/% '*&7<*$%, (' )57%*$(($% 4 @$?#" .cpp
// ="7"'57"0"#"(/% @3(&B/? &#$))$ Foo
};

PFoo::PFoo() : foo(new DrivedFromFoo)
{
}
'ORDOQB\ MND F EFDCDOGO SOVUEEFWUQBRC! #ULNTF_ NDCPCBUH\ [OLQNENH RSUQBO Foo EUWBO QORUMVUEEO
FEOU, C DHFUEBX EFWUGO EU PCSUWCIB. -GC! +U[UM\ RX [OEFSCUBU, [OWUSN DOEQBMNDBOM Foo OJaKRHKHQK
PCTFTUEEXS, C EU PCDMXBXS! 0HCQQ PFoo NZU SOZEO EU OJaKRHKB\ LMNGOS; LOQBN[ D DOEQBMNDBOMCS
Foo ENZUE BOH\DO DOEQBMNDBOMN DerivedFromFoo.
# WCQBF 3 SX [OGOROMFS O BOS, DCDOU ECQHULORCEFU ENZEO, WBOJX ]BC QYUSC MCJOBCHC (C FSUEEO, WBOJX
RQU DHCQQX, [MOFPROLEXU OB Foo, FSUHF BOB ZU OBDMXBX_ FEBUM`U_Q, WBO F QCS Foo). - [ODC [MOLOHZFS
FPNWUEFU NDCPCBUHU_ F RQUGO, WBO Q EFSF QRKPCEO.
.07
Buop funa ykasueaeroro oLekfa eo epern koucfpyupoeauun
%QHF ECV RULNTF_ NDCPCBUH\ SOZUB QOPLCB\ OJaUDB [MOFPROLEOGO DHCQQC RO RMUSK DOEQBMNFMORCEFK,
[OWUSN JX EU MCPMUVFB\ USN QROJOLEO RXJMCB\ ENZEX_ BF[ FP EUQDOH\DFY [MOFPROLEXY DHCQQOR?
// G @$?#" Foo.cpp
class DeirvedFromFoo : public Foo { ... };
class AlsoDerivedFromFoo : public Foo { ... };
PFoo::PFoo(bool x) : foo(x ? new DerivedFromFoo : new AlsoDerivedFromFoo) {}
#OOJTU GOROMK, FEBUM`U_QEX_ NDCPCBUH\ SOZUB RXJMCB\ HIJO_ [MOFPROLEX_ DHCQQ EC OQEORCEFF
QRULUEF_, LOQBN[EXY RO RMUSK DOEQBMNFMORCEFK. 0HFUEB OJ ]BOS EFWUGO EU PECUB, [OQDOH\DN RQU
[MOFQYOLKTUU QDMXRCUBQK PC FEBUM`U_QEXS NDCPCBUHUS.
Hsreueuue ykasueaeroro oLekfa eo epern eunonueuun nporparru
5MF ZUHCEFF FEBUM`U_QEX_ NDCPCBUH\ SOZUB QSUEFB\ NDCPXRCUSX_ OJaUDB [MKSO RO RMUSK
RX[OHEUEFK [MOGMCSSX.
class Foo;
class PFoo {
private:
Foo* foo;
public:
PFoo();
void DoSomething(bool x);
// :738/" @3(&B// &#$))$
};

void PFoo::DoSomething(bool x)
{
if (x) {
delete foo;
foo = new DerivedFromFoo;
}
Foo->DoSomething();
}
5MFSUM NZU RQBMUWCHQK R [MULXLNTU_ GHCRU: [MF [O[XBDU EUDOEQBCEBEOGO OJMCTUEFK D NDCPXRCUSOSN
OJaUDBN NDCPCBUH\ RXJFMCH LMNGNI `OMSN ]BOGO OJaUDBC. +CDO_ [OLYOL MCJOBCUB R[OHEU EOMSCH\EO,
UQHF EU LUHCB\ GHN[OQBU_ (EC[MFSUM, [OHNWCB\ CLMUQC WHUEOR NDCPXRCUSOGO OJaUDBC).
Rocpepuuku
!EBUM`U_QEXU NDCPCBUHF BCDZU [OSOGCIB QDMXB\ BOB `CDB, WBO NDCPXRCUSX_ OJaUDB ECYOLFBQK GLU-BO R
DFJUM[MOQBMCEQBRU, C EU QFLFB R [CSKBF [O QOQULQBRN. # MCQ[MULUHUEEXY OJaUDBEXY QFQBUSCY BCDOU
[MOFQYOLFB Q[HOV\ F MKLOS. 5UMRCK ^UH\ [MOUDBFMORTFDC LUMZCB\ DHFUEBQDFU OJaUDBX R
JHCZUEEOS EURULUEFF; OEF EU PECIB F PECB\ EU YOBKB, GLU ECYOLFBQK NDCPXRCUSX_ OJaUDB EC
MCQQBOKEFF [HURDC FHF GLU-BO EC DMCI PUSHF. )JaUDB, DOBOMX_ PCSUEKUB LMNGO_, NLCHUEEX_ OJaUDB,
ECPXRCUBQK >%.6#)*($%, (proxy). $C ]BN BUSN BOZU QNTUQBRNUB EUSCHO RCMFC^F_, EO QCSCK [MOQBCK FP
EFY HODCH\EOU FQ[OH\PORCEFU FEBUM`U_QEOGO OJaUDBC FHF GMCEF. "CBUS HODCH\EX_ [OQMULEFD SOZUB
ROQ[OH\PORCB\QK LFQBCE^FOEEXSF RXPORCSF FHF LMNGFS SUYCEFPSOS OB[MCRDF QOOJTUEF_,
[OLYOLKTFS LHK RPCFSOLU_QBRFK Q OMFGFECHOS.
3BC DOE^U[^FK MCQ[MOQBMCEKUBQK F EC QFBNC^FF, R DOBOMXY NLCHUEEX_ OJaUDB ROOJTU EU KRHKUBQK
OJaUDBOS. 3BO SOZUB JXB\ ^UHOU [MFHOZUEFU, PCRUMENBOU [OQMULEFDOS R OJaUDBEO-OMFUEBFMORCEENI
OJOHOWDN, FHF, LO[NQBFS, QOLUMZFSOU JCPX LCEEXY Q JFJHFOBUWEXSF `NED^FKSF DHCQQC.
.08
# QCSO_ FLUU REULMUEFK EU OJaUDBEO-OMFUEBFMORCEEOGO DOLC R OJaUDBX .++ EUB EFWUGO EOROGO FHF
OMFGFECH\EOGO. $CQ R [UMRNI OWUMUL\ FEBUMUQNUB NMORUE\ FEDC[QNHK^FF. 1BO LOHZUE PECB\ DHFUEB O
MUCH\EO_ QFBNC^FF? 4SEXU NDCPCBUHF EC OQEORU O[UMCBOMOR -> [OLYOLKB [HOYO. 0HFUEB LOHZUE PECB\
FEBUM`U_Q NDCPXRCUSOGO OJaUDBC; QHULORCBUH\EO, OE LOHZUE PECB\, QNTUQBRNUB HF NDCPXRCUSX_ OJaUDB,
DCD NQBMOUE UGO FEBUM`U_Q F B. L. !EBUM`U_QEXU NDCPCBUHF, R BOS WFQHU GMCEF JOHUU NLCWEX_
RCMFCEB. %QHF RCVC [MOGMCSSC EC[FQCEC Q [MFSUEUEFUS FEBUM`U_QEXY NDCPCBUHU_, RCS JNLUB ECSEOGO
[MOTU RQBCRFB\ EORX_ DOL, R DOBOMOS EUDOBOMXU FP ]BFY NDCPCBUHU_ MUCHFPNIBQK R RFLU [OQMULEFDOR.
5MOTU, YOBK F EU QORQUS EUPCSUBEO LHK DHFUEBC [ODC. 5OSEFBU JCPORNI `OMSN FEBUM`U_QEOGO
NDCPCBUHK Q OJKPCBUH\EXS [MULRCMFBUH\EXS OJaKRHUEFUS?
class Pointee; // =7"04$7/*"#,('" ';E%4#"(/"
class Interface {
private:
Pointee* pointee;
public:
// J3(&B// &#$))$
};
5MOJHUSC DMOUBQK R [UMUSUEEO_ pointee. 0HFUEB LOHZUE PECB\, WBO NDCPCBUH\ QQXHCUBQK EC *#-"%,
LCZU UQHF OE [OEKBFK EU FSUUB, EC WBO FSUEEO. # WCQBF 3 SX [O[MOJNUS NQBMCEFB\ LCZU ]BO
OGMCEFWUEFU, C [ODC JNLUS QWFBCB\ UGO LOQCLEO_ SUHOW\I.
# MUPNH\BCBU SX [MFYOLFS D DHCQQFWUQDOSN DOS[MOSFQQN: [OEFZUEFU JXQBMOLU_QBRFK FEBUM`U_QEXY
NDCPCBUHU_ (Q RXEUQUEEXSF (outline) `NED^FKSF) PC ROPSOZEOQB\ DCMLFECH\EXY FPSUEUEF_ MUCHFPC^FF
JUP SOLF`FDC^FF DHFUEBQDOGO DOLC. # JOH\VFEQBRU [MOUDBOR F DHCQQOR MCQYOLX Q HFYRO_
DOS[UEQFMNIBQK NQDOMUEFUS ^FDHC MCPMCJOBDF.
4yukfopu
$C[OQHULOD SX [OPECDOSFSQK Q OLEO_ LFDORFEDO_ C++, DOBOMCK ECPXRCUBQK B8*$"%6%, (functor).
:NEDBOMX FGMCIB LHK `NED^F_ BN ZU MOH\, WBO F FEBUM`U_QEXU NDCPCBUHF LHK OJaUDBOR. )LEC FP
[MOJHUS, RUWEO SNWFRVFY [MOGMCSSFQBOR EC . BO, WBO RQU `NED^FF ECYOLKBQK R GHOJCH\EOS
[MOQBMCEQBRU FSUE, BO UQB\ RXPRCEECK `NED^FK FSUUB LOQBN[ BOH\DO D LCEEXS, YMCEKTFSQK R UU
CMGNSUEBCY, F GHOJCH\EXS [UMUSUEEXS. %QHF [UMULCB\ CLMUQ `NED^FF UTU DOSN-BO, BO [MF RXPORU
`NED^FF [O CLMUQN OEC EU JNLUB [OSEFB\, DCD RXGHKLUH ODMNZCITF_ SFM RO RMUSK [OHNWUEFK UU
CLMUQC.
# BCDFY KPXDCY, DCD 5CQDCH\, ]BC [MOJHUSC FPKTEO MUVCUBQK [OHNWUEFUS 9+,'$+*(4 (closure) EC
SOSUEB [OHNWUEFK CLMUQC `NED^FF.
procedure p(n: integer);
var
procedure fn;
begin
do_something(n);
end;
begin
callback(@fn);
end;
# DCWUQBRU CMGNSUEBC [MO^ULNMC )$llbackfn [OHNWCUB CLMUQ LMNGO_ [MO^ULNMX. # LCEEOS [MFSUMU U_
[UMULCUBQK CLMUQ fn. 5MF RXPORU fn FP callbackfn [UMRCK (,##" )%."8> $ >#6#,#**',,
*+?%)(&@(,.4 & ."#$# & ,%,#*" >%28-#*(4 +)6#.+. # ECVUS [MFSUMU fn PECUB PECWUEFU [UMUSUEEO_ n
EC SOSUEB RXPORC )$llbackfn.
"CSXDCEFK WMUPRXWC_EO [OHUPEX LHK OJMCJOBDF OJMCBEXY RXPOROR (callback), [OQDOH\DN `NED^FK
OJMCBEOGO RXPORC DOU-WBO PECUB O BOS, [OWUSN OEC JXHC RXPRCEC. # . RHOZUEEXY `NED^F_ EU
QNTUQBRNUB, C QHULORCBUH\EO, PCSXDCEFK EUROPSOZEX FY SUQBO PCEFSCIB `NEDBOMX.
.09
class Fn {
private:
int number;
public:
f(int n) : number(n) {}
void operator() () { do_something(number); }
};

void callbackfn(Fn);

void p(int n)
{
callbackfn(Fn(n));
}

void callbackfn(Fn fn)
{
// S*'-*' 0"#$"2
fn(); // G<-4$*, @3(&B/> fn ) 5'2'K,> @3(&B// operator()
}
#UQ\ QUDMUB DMOUBQK R LRNY RXMCZUEFKY. :NED^FK callbackfn(Fn(n)) [UMULCUB `NED^FF CEOEFSEX_
]DPUS[HKM DHCQQC Fn. -MGNSUEB UGO DOEQBMNDBOMC QOLUMZFB FE`OMSC^FI, RDHIWCUSNI R
[QURLOPCSXDCEFU, DOBOMOU [OLLUMZFRCUBQK [UMUSUEEXSF DHCQQC Fn. #XMCZUEFU fn(); SOZUB
[ODCPCB\QK OJXWEXS RXPOROS `NED^FF, EO EC QCSOS LUHU R EUS RXPXRCUBQK O[UMCBOMECK `NED^FK
operator() DHCQQC Fn. # QROI OWUMUL\, ]BC `NED^FK RXPXRCUB GHOJCH\ENI `NED^FI do_something Q
FQ[OH\PORCEFUS LCEEXY PCSXDCEFK. ! DOSN [OQHU ]BOGO ENZUE 5CQDCH\?
)[UMCBOMECK `NED^FK operator() SOZUB RXPXRCB\QK Q [MOFPROH\EXS ECJOMOS CMGNSUEBOR. 1BOJX
LOJCRFB\ EORXU CMGNSUEBX, NDCZFBU FY RO RBOMXY QDOJDCY R OJaKRHUEFF DHCQQC. +CDZU MCPMUVCUBQK
SEOGODMCBECK [UMUGMNPDC O[UMCBOMC () Q MCPEXSF QFGECBNMCSF. $FZU [MFRULUE BOB ZU [MFSUM, R
DOBOMOS OLEC FP RUMQF_ O[UMCBOMEO_ `NED^FF operator() RXPXRCUBQK Q CMGNSUEBOS.
class Fn {
private:
int number;
public:
f(int n) : number(n) {}
void operator() () { do_something(number); }
void operator() (char* s)
{
do_something(number);
cout << S*'-*' 0"#$> ) << s << endl;
}
};

void callbackfn(Fn);

void p(int n)
{
callbackfn(Fn(n));
}
..0

void callbackfn(Fn fn)
{
// S*'-*' 0"#$"2
fn(callbackfn);
}
3BC SCHUE\DCK FLFOSC RXGHKLFB LOROH\EO FPKTEO, OLECDO BOGO ZU ]``UDBC SOZEO LOJFB\QK F JUP
O[UMCBOMC ().
class Fn {
private:
int number;
public:
f(int n) : number(n) {}
void do_something() () { ::do_something(number); }
void do_something() (char* s)
{
do_something(number);
cout << S*'-*' 0"#$> ) << s << endl;
}
};

void callbackfn(Fn);

void p(int n)
{
callbackfn(Fn(n));
}

void callbackfn(Fn fn)
{
// S*'-*' 0"#$"2
fn.do_something(callbackfn);
}
0CD RFLFBU, Q BCDFS ZU NQ[UYOS SOZEO ROQ[OH\PORCB\QK FSUEUS HIJO_ `NED^FF DHCQQC. %LFEQBRUEECK
[MFWFEC LHK FQ[OH\PORCEFK O[UMCBOMC () R BOS, WBO OE [MULUH\EO KQEO RXMCZCUB RCVF ECSUMUEFK.
%QHF DHCQQ QNTUQBRNUB HFV\ LHK BOGO, WBOJX OJQHNZFRCB\ OJMCBEXU RXPORX [OLOJEOGO MOLC,
[OH\PN_BUQ\ O[UMCBOMOS (); R [MOBFREOS QHNWCU [OH\PN_BUQ\ OJXWEXSF `NED^FKSF DHCQQC.
Konnekuuu,
kypcopu u
ufepafopu
5MOJHUSC [MOUDBFMORCEFK F MUCHFPC^FF DHCQQOR-DOHHUD^F_ (QORODN[EOQBU_ OJaUDBOR, ECYOLKTFYQK
[OL N[MCRHUEFUS LMNGOGO OJaUDBC) QBCMC, DCD QCSO OJaUDBEO-OMFUEBFMORCEEOU [MOGMCSSFMORCEFU. $UB
QSXQHC [ORBOMKB\ PLUQ\ RQU, WBO SOZEO [MOWFBCB\ R LMNGFY DEFGCY O RQUROPSOZEXY DOHHUD^FKY
FPSUEKUSXY, QUMFCHFPNUSXY, FELUDQFMNUSXY F B. L. %QHF RCS ENZEC FE`OMSC^FK O QBMNDBNMCY LCEEXY
F QO[NBQBRNITFY BMCEQ`OMSC^FKY, ECWEFBU Q FPNWUEFK DHCQQOR-DOHHUD^F_ SmallTalk F PCBUS
[UMUYOLFBU D DOSSUMWUQDFS JFJHFOBUDCS DHCQQOR C++, MUDHCSO_ DOBOMXY PCJFBX RQU ZNMECHX [O
[MOGMCSSEOSN OJUQ[UWUEFI. & ZU QOJFMCIQ\ QOQMULOBOWFB\ RCVU REFSCEFU EC BUY .++-FPSCY,
JHCGOLCMK DOBOMXS DOHHUD^FF NDHCLXRCIBQK R SFQBFWUQDOU NWUEFU [MOGMCSSFMORCEFK EC C++
EUPCRFQFSO OB FQ[OH\PNUSXY QBMNDBNM LCEEXY F FUMCMYF_ DHCQQOR.
# ECWCHU ]BO_ GHCRX MCQQSCBMFRCIBQK FELUDQFMNUSXU DOHHUD^FF BO UQB\ BU, R DOBOMXY EUDOBOMX_
OJaUDB FQ[OH\PNUBQK R DCWUQBRU FELUDQC LHK [OHNWUEFK LMNGOGO OJaUDBC, QDMXBOGO GHNJODO R EULMCY
DOHHUD^FF. 6X ROQ[OH\PNUSQK O[UMCBOMOS [], WBOJX DOHHUD^FK RXGHKLUHC DCD CJQBMCDBEX_ SCQQFR.
*UHO LCZU EU R BOS, WBO [MOGMCSSC OB ]BOGO OJXWEO QBCEORFBQK JOHUU [OEKBEO_ R ]BOS [OLYOLU PC-
LU_QBRORCEX SEOGFU FLFOSX, FQ[OH\PNUSXU LHK DOHHUD^F_. 5OQHU PECDOSQBRC Q DNMQOMCSF F FY
QOJMCB\KSF FBUMCBOMCSF SX [UMU_LUS D FPOTMUEEXS DOHHUD^FKS, SOLF`F^FMNUSXS R [MO^UQQU
[UMUJOMC.
Maccueu u onepafop []
)[UMCBOM [] WMUPRXWC_EO GFJOD F NEFRUMQCHUE. 0 QOZCHUEFI, JOH\VFEQBRO [MOGMCSSFQBOR C++ OJ
]BOS F EU [OLOPMURCUB.
Rpoeepka rpauuu u npuceaueauue
$FZU [MFRULUE [MOQBO_ [MFSUM [UMUGMNPDF O[UMCBOMC [] SCQQFR, DOBOMX_ [MF OJMCTUEFF D
]HUSUEBN [MORUMKUB, [MFECLHUZFB HF FELUDQ GMCEF^CS SCQQFRC, F R HIJXY QFBNC^FKY RULUB QUJK JOHUU
FHF SUEUU MCPNSEO (FHF [O DMC_EU_ SUMU JUPO[CQEO).
class ArrayOfFoo {
private:
int entries;
Foo** contents; // G"&*'7 Foo*
static Foo* dummy; // :#% /(0"&)'4, 4<C'0%K/C -$ 87$(/B< 2$))/4$
public:
ArrayOfFoo() : entries(0), contents(NULL) {};
ArrayOfFoo(int size) : entries(size), contents(new Foo*[size]) {};
~ArrayOfFoo() { delete contents; }
Foo*& operator[](int index)
8
..2
{
return (index < 0 || index >= entries) ? dummy : contents[index];
}
};

// 60"-*' 4 @$?#" .cpp
Foo* ArrayOfFoo::dummy = NULL;
)[UMCBOM [] ROPRMCTCUB Foo*&, QQXHDN EC CLMUQ Foo. 3BC FLFOSC WCQBO RQBMUWCUBQK [MF MCJOBU Q
DOHHUD^FKSF, F OLEC FP [MFWFE R BOS, WBO ROPRMCTCUSOU PECWUEFU SOZUB FQ[OH\PORCB\QK DCD R
HURO_, BCD F R [MCRO_ WCQBF RXMCZUEFK [MFQRCFRCEFK.
Foo* foo = array[17];
array[29] = foo; // O$;'*$"* 2'1(' 57/)4$/4$*, 5' &'(&7"*('23 /(0"&)3
%QHF JX O[UMCBOM [] ROPRMCTCH [MOQBO Foo*, BO QOLUMZFSOU ]HUSUEBC SCQQFRC DO[FMORCHOQ\ JX, C
DO[FK ROPRMCTCHCQ\ RXPXRCITU_ QBOMOEU. #OPRMCTCK Foo*&, SX [OPROHKUS RXPXRCITU_ QBOMOEU
FPSUEFB\ QOLUMZFSOU ]HUSUEBC, C EU BOH\DO [MOWFBCB\ YMCEKTUUQK R EUS PECWUEFU. *HK FELUDQC,
RXYOLKTUGO PC GMCEF^X SCQQFRC, ROPRMCTCUBQK CLMUQ `FDQFMORCEEO_ [UMUSUEEO_ DHCQQC, PECWUEFU
DOBOMO_ EC QCSOS LUHU ECQ EU OWUE\ FEBUMUQNUB. 5O DMC_EU_ SUMU, RCVC [MOGMCSSC QSOZUB YMOSCB\
LCH\VU (ROPSOZEO, [MF [MCRFH\EO MCQQBCRHUEEXY #ifdef R OBHCLOWEOS MUZFSU), C EU FPRHUDCB\ FP
[CSKBF EOSUM BUHU`OEC RCVU_ BUBNVDF FHF LMNGNI QHNWC_ENI FE`OMSC^FI.
%QHF RX OJUQ[ODOUEX ECDHCLEXSF MCQYOLCSF BCDOGO RCMFCEBC [O QMCREUEFI Q OJXWEXSF SCQQFRCSF
C/C++, PCDHIWFBU RQU LO[OHEFBUH\EXU RXWFQHUEFK F [UMUSUEEXU SUZLN LFMUDBFRCSF #ifdef. #
OLEOS RCMFCEBU DOS[FHK^FF RCV SCQQFR JNLUB CJQOHIBEO JUPO[CQEXS, C R LMNGOS JNLUB FSUB\ BU ZU
MCPSUM F JXQBMOLU_QBRFU, WBO F OJXWEX_ SCQQFR.
Onepafop [] c ueuenuru apryreufaru
)[UMCBOM [] [UMUGMNZCUBQK LHK CMGNSUEBOR HIJOGO BF[C, C EU BOH\DO LHK ^UHXY. +OGLC O[UMCBOM []
SOZEO FQ[OH\PORCB\ LHK [MULQBCRHUEFK QHORCMK DOHHUD^FF, R DOBOMO_ OLFE DHIWURO_ OJaUDB
OLEOPECWEO FLUEBF`F^FMNUB LMNGO_. $FZU [MFRULUE ECJMOQOD CQQO^FCBFREOGO DHCQQC, R DOBOMOS
YMCEKBQK [CMX QBMODORXY OJaUDBOR String, [MF ]BOS [UMRCK QBMODC DCZLO_ [CMX KRHKUBQK FELUDQOS
RBOMO_.
class Association {
// =7'53)&$"2 5'07';(')*/ 7"$#/-$B//
public:
const String& operator[](const String& key);
};

// G &#/"(*)&'? 57'87$22"
String str = assotiation[another_string];
+CDO_ RCMFCEB RXGHKLFB ECSEOGO ]HUGCEBEUU F HNWVU RXMCZCUB ECSUMUEFK MCPMCJOBWFDC, EUZUHF
FEBUM`U_Q, [OQBMOUEEX_ BOH\DO EC `NED^FKY DHCQQC:
String str = assotiation.LookUp(another_string);
Hrufauun ruororepuux raccueoe
# HIJOS RCMFCEBU [UMUGMNPDF O[UMCBOM [] RXPXRCUBQK Q OLEFS CMGNSUEBOS [MOFPROH\EOGO BF[C.
$C[MFSUM, DOS[FHKBOM HFV\ [OQSUUBQK ECL QHULNITU_ [O[XBDO_ QOPLCEFK SEOGOSUMEOGO SCQQFRC,
[OBOSN WBO R EU_ O[UMCBOM [] FSUUB EUQDOH\DO CMGNSUEBOR:
class WontWork {
public:
Foo& operator[](int x, int y); // R$-C$-C$
..3
};
0OS[FHKBOMX OJOZCIB [OLOJEXU QFBNC^FF RMOLU JX RQU RXGHKLFB R[OHEU HOGFWEO, EO DCD-BO
RX[CHO FP Q[U^F`FDC^FF KPXDC. 3BO LCUB FS ROPSOZEOQB\ [OMCPSKB\QK F RXRCHFB\ RQU BNSCEEXU
QOOJTUEFK OJ OVFJDCY, DOBOMXU OEF [MFJUMUGHF EC WUMEX_ LUE\. $O DOGLC QOOJTUEFK [UMUQBCENB
QX[CB\QK, ECQBN[CUB RCV WUMUL QSUKB\QK, [OQDOH\DN QNTUQBRNUB [MOQBO_ OJYOLEO_ [NB\.
struct Index {
int x;

int y;
Index(int ex, int why) : x(ex), y(why) {}
bool operator==(const Index& i) { return x == i.x && y == i.y; }
};

class WorksFine {
public:
Foo& operator[](Index i);
};

array[Index(17, 29)].MemberOfFoo(); // O$;'*$"*
Index [MULQBCRHKUB QOJO_ QBMNDBNMN Q BMFRFCH\EXS DOEQBMNDBOMOS. 5MFWFEC [UMUGMNPDF O[UMCBOMC ==
QBCEUB KQEC [OPZU. #XMCZUEFU Index(17,29) QOPLCUB CEOEFSEX_ ]DPUS[HKM, DOBOMX_ N[CDORXRCUB
LRC FPSUMUEFK SCQQFRC R OLFE CMGNSUEB. 5MCRLC PLOMORO? 5OHNWC_, DOS[FHKBOM!
Muoecfeeuuue neperpysku onepafopa []
)[UMCBOM [] SOZUB FSUB\ F EUQDOH\DO RCMFCEBOR [UMUGMNPDF LHK LCEEOGO DHCQQC [MF NQHORFF, WBO
QFGECBNMX OQBCIBQK NEFDCH\EXSF. $C[MFSUM, OLEC RUMQFK SOZUB [OHNWCB\ CMGNSUEB BF[C int, C LMNGCK
CMGNSUEB char*, DOBOMX_ [MUOJMCPNUBQK D int `NED^FU_ atoi(). .DOMUU RQUGO, RCVC DOHHUD^FK
SOZUB FELUDQFMORCB\QK EUQDOH\DFSF Q[OQOJCSF.
class StringArray {
public:
const String& operator[](int index);
int operator[](const String&);
};

String str = array[17]; // ="74$% @'72$
int index = array[String(Hello)]; // G*'7$% @'72$
5UMRX_ O[UMCBOM [] MUCHFPNUB QUSCEBFDN SCQQFRC: [O ^UHOSN FELUDQN ROPRMCTCUBQK PECWUEFU ]HUSUEBC
Q ]BFS FELUDQOS. #BOMO_ O[UMCBOM OJUQ[UWFRCUB OJMCBENI ROPSOZEOQB\: [O PECWUEFI ECYOLFBQK
QOOBRUBQBRNITF_ FELUDQ SCQQFRC. # ]BO_ QYUSU FQ[OH\PNUBQK [CMC LO[NTUEF_ (EC[MFSUM, NEFDCH\EOU
^UHOU, DOBOMOU ROPRMCTCUBQK R DCWUQBRU FELUDQC EUQNTUQBRNITUGO PECWUEFK), EO R ^UHOS FLUK R[OHEU
[OEKBEC.
Bupfyanuuu onepafop []
)[UMCBOM [], DCD F HIJO_ LMNGO_ O[UMCBOM FHF `NED^FI, SOZEO OJaKRFB\ RFMBNCH\EXS F
[UMUO[MULUHFB\ R [MOFPROLEXY DHCQQCY. # EUDOBOMOS JCPOROS DHCQQU O[MULUHKUBQK CJQBMCDBEX_
FEBUM`U_Q, C RQU [OLMOJEOQBF MUCHFPC^FF [MULOQBCRHKIBQK R [MOFPROLEXY DHCQQCY. +CDCK QYUSC
YOMOVO QOWUBCUBQK Q GOSOSOM`EXSF FUMCMYFKSF DHCQQOR, O[FQCEEXSF R WCQBF 3.
..4
Kypcopu
# [MULXLNTUS MCPLUHU SX GOROMFHF O [MFQRCFRCEFF ]HUSUEBCS SCQQFRC. *HK SCQQFRC Foo* RQU
[MUDMCQEO MCJOBCHO, EO [O[XBDC [MFQROFB\ WBO-EFJNL\ ]HUSUEBN QBMODORO_ CQQO^FC^FF DOEWCUBQK
EUNLCWU_.
association[String(Hello)] = String(Good looking);
*UHO R BOS, WBO HURCK WCQB\ EU KRHKUBQK EF HUROQBOMOEEFS RXMCZUEFUS (lvalue), EF DHCQQOS Q
[UMUGMNZUEEXS O[UMCBOMOS =. # ]BOS QHNWCU SOZEO QDOEQBMNFMORCB\ CMGNSUEB Q FQ[OH\PORCEFUS
FEBUM`U_QC RQBCRDF R DOHHUD^FI EC JCPU `NED^F_ DHCQQC, [OQDOH\DN ]BO RQU-BCDF EU *+."%4L(3
SCQQFR, C EUWBO PCGMFSFMORCEEOU [OL EUGO Q [OSOT\I O[UMCBOMC []. 6EOGFU DHCQQX, [UMUGMNZCITFU
O[UMCBOM [], Q BOWDF PMUEFK QUSCEBFDF 4&24F".4 SCQQFRCSF, EO FQ[OH\PNIB YFBMONSEXU QBMNDBNMX
LCEEXY LHK O[BFSFPC^FF. *CRC_BU MCQQSOBMFS DOEDMUBEX_ [MFSUM (MCPMUZUEEXU SCQQFRX), C PCBUS
RUMEUSQK D JOHUU OJTFS DOHHUD^FKS (BCDFS DCD CQQO^FC^FF).
Rpocfo knacc paspeeuuoro raccuea
(CPMUZUEEX_ SCQQFR OBEOQFBQK D WFQHN OQEOREXY QBMNDBNM LCEEXY. )E [MULQBCRHKUB QOJO_ SCBMF^N, N
DOBOMO_ JOH\VFEQBRO KWUUD R HIJO_ SOSUEB RMUSUEF OQBCUBQK [NQBXS. #OPSOZEO, RX [MFECLHUZFBU D
WFQHN QWCQBHFRWFDOR Q 256 GFGCJC_BCSF [CSKBF EC DOS[\IBUMU, EO JOH\VFEQBRN FP ECQ [MOQBO EU
YRCBFB SUQBC LHK YMCEUEFK RQUY KWUUD SCBMF^X /000Y/000Y/000. *C F EU YOWUBQK RXLUHKB\ [CSKB\ [OL
SFHHFCML KWUUD, UQHF R HIJO_ SOSUEB FP EFY FQ[OH\PNUBQK EU JOHUU /000. $UQOSEUEEO, R RCVUS SOPGN
RQ[HXRCIB MCPHFWEXU QBMNDBNMX LCEEXY, PECDOSXU [O ECWCH\EOSN DNMQN [MOGMCSSFMORCEFK R
DOHHULZU: QRKPCEEXU Q[FQDF, JFECMEXU LUMUR\K, YUV-BCJHF^X F RQU [MOWUU, WBO N[OSFECUB 0ENB. $C
QCSOS LUHU EU BCD NZ RCZEO, DCDCK QBMNDBNMC LCEEXY HNWVU [OLO_LUB LHK EFPDONMOREURO_ MUCHFPC^FF.
5MUZLU RQUGO EUOJYOLFSO [OEKB\, DCD ZU FQ[OH\PORCB\ ]BF EFPDONMOREURXU QMULQBRC F OLEORMUSUEEO
QOPLCB\ LHK DHFUEBQDFY OJaUDBOR R[UWCBHUEFU, WBO OEF FSUIB LUHO Q QCSXS OJXWEXS SCQQFROS?
# QHULNITU_ MUCHFPC^FF SUBOLOS GMNJO_ QFHX LHK YMCEUEFK LCEEXY FQ[OH\PNIBQK QRKPCEEXU
Q[FQDF. .BMNDBNMC Index NZU RQBMUWCHCQ\ ECS RXVU.
class SparseArray {
private:
struct Node {
Index index; // D(0"&) 2$))/4$
Foo* content; // F'0"71/2'" 2$))/4$ 5' 0$(('23 /(0"&)3
Node* next; // F#"03>K/? Q#"2"(* )5/)&$
Node(Index i, Foo* f, Node* n) : index(i), content(f), next(n) {};
};
Node* cells; // F4%-$((<? )5/)'& Q#"2"(*'4
public:
SparseArray() : cells(NULL) {}
Foo* operator[](Index i);
};

inline Foo* SparseArray::operator[](Index i)
{
SimpleSparseArray::Node* n = cells;
while (n != NULL) {
if (n->index == i) // D)5'#,-3"* 5"7"8731"((<? '5"7$*'7 ==
return n->content;
n = n->next;
}
return NULL;
}
..5

Foo* foo = array[Index(17, 29)]; // O$;'*$"*
. WBUEFUS SCQQFRC [MOJHUS EUB. %QHF FELUDQ QNTUQBRNUB, ROPRMCTCUBQK QOLUMZFSOU SCQQFRC [O
LCEEOSN FELUDQN. %QHF FELUDQ R SCQQFRU OBQNBQBRNUB, PECWUEFU NULL [OHEOQB\I QOOBRUBQBRNUB FLUU
[MULRCMFBUH\EO_ FEF^FCHFPC^FF SCQQFRC PECWUEFKSF NULL. 6FENBDN, EO DCD LOJCRFB\ R SCQQFR EORNI
KWU_DN FHF FPSUEFB\ NZU QNTUQBRNITNI? "ECWUEFU, ROPRMCTCUSOU O[UMCBOMEO_ `NED^FU_
operator[], EU KRHKUBQK EF HUROQBOMOEEFS RXMCZUEFUS (lvalue), EF DHCQQOS Q [UMUGMNZUEEXS
O[UMCBOMOS = F [O EUSN EUH\PK RX[OHEFB\ [MFQRCFRCEFU.
array[Index(31, 37)] = foo; // +" 7$;'*$"*
#CV DOS[FHKBOM EU Q[FB EOWCSF F ZLUB, DOGLC ZU N EUGO [OKRFBQK BCDCK PCSUWCBUH\ECK ROPSOZEOQB\
PCJFB\ [OBOD )"rr QOOJTUEFKSF OJ OVFJDCY. 6OZEO JXHO JX QOPLCB\ FEBUM`U_Q EC JCPU `NED^F_, EO
BOGLC N DHFUEBC ECMNVFBQK FHHIPFK BOGO, WBO OE FSUUB LUHO Q EOMSCH\EXS, WUQBEXS SCQQFROS.
.NTUQBRNUB HF Q[OQOJ FQ[OH\PORCB\ O[UMCBOM [] R HURO_ WCQBF O[UMC^FF [MFQRCFRCEFK LHK FELUDQOR,
DOBOMXY UTU EUB? )DCPXRCUBQK, QNTUQBRNUB, EO LHK ]BO_ ^UHF ECS [OBMUJNUBQK EORCK FLFOSC DNMQOM.
Kypcopu u paspeeuuue raccueu
!BCD, RBOMCK [O[XBDC. $CVC OQEORECK ^UH\ WBOJX O[UMCBOMECK `NED^FK operator[] ROPRMCTCHC
EUWBO, OJHCLCITUU QHULNITFSF QRO_QBRCSF:
/. )EO LOHZEO [MUOJMCPORXRCB\QK D BF[N QOLUMZFSOGO SCQQFRC.
2. )EO SOZUB FQ[OH\PORCB\QK R HURO_ WCQBF O[UMC^FF [MFQRCFRCEFK LHK FPSUEUEFK QOLUMZFSOGO
QOOBRUBQBRNITU_ KWU_DF.
3BO EUWBO [MULQBCRHKUB QOJO_ OQOJX_ DHCQQ, DOBOMX_ ECPXRCUBQK $86.%6%, (cursor). $FZU [ODCPCE
NZU PECDOSX_ MCPMUZUEEX_ SCQQFR Q DNMQOMOS R O[UMCBOMEO_ `NED^FF operator[]:
class ArrayCursor;
class SparseArray {
friend class ArrayCursor;
private:
struct Node {
Index index;
Foo* content;
Node* next;
Node(Index i, Foo* c, Node* n) : index(i), content(c), next(n) {};
};
Node* cells;
public:
SparseArray() : cells(NULL) {}
ArrayCursor operator[](Index i);
};

class ArrayCursor {
friend class SparseArray;
private:
SparseArray& array; // L;7$*(<? 3&$-$*"#, ($ 2$))/4-4#$0"#"B
Index index; // Y#"2"(*, 57"0)*$4#"((<? &37)'7'2
SparseArray::Node* node; // V)#/ )3K")*43"* /(0"&), '*#/.(<? '* NULL
// I'()*73&*'7< ';E%4#"(< -$&7<*<2/, 5'Q*'23 5'#,-'4$*,)% /2/
// 2'1"* *'#,&' SparseArray. ="74<? &'()*73&*'7 /)5'#,-3"*)%, &'80$
// /(0"&) "K" (" )3K")*43"*, $ 4*'7'? &'80$ /(0"&) 31" 57/)3*)*43"*
// 4 2$))/4".
..6
ArrayCursor(SparseArray& arr, Index i)
: array(arr), index(i), node(NULL) {}
ArrayCursor(SparseArray& arr, SparseArray::Node* n)
: array(arr), node(n), index(n->index) {}
public:
// F#"03>K/? '5"7$*'7 = 5'-4'#%"* 57"';7$-'4$*, 57/)4$/4$(/" &37)'73 4
// 57/)4$/4$(/" )''*4"*)*43>K"23 Q#"2"(*3 2$))/4$.
ArrayCursor& operator=(Foo* foo);
};

ArrayCursor& ArrayCursor::operator=(Foo* foo) {
if (node == NULL) { // D(0"&) (" )3K")*43"*
node = new SparseArray::Node(index, foo, array.cells);
array.cells = node;
}
else
// D(0"&) 31" )3K")*43"*, /-2"(/*, -($."(/" Q#"2"(*$
node->content = foo;
return *this;
}

ArrayCursor SparseArray::operator[](Index i)
{
SparseArray::Node* n = cells;
while (n != NULL)
if (n->index = i)
return ArrayCursor(*this, n); // F3K")*43"*
else
n = n->next;
return ArrayCursor(*this, i); // VK" (" )3K")*43"*
}
)GO! 1BO ZU [MOFQYOLFB R ]BOS YFBMONSEOS DOLU? #QU ROHVUJQBRO PCDHIWUEO R LRNY O[UMCBOMEXY
`NED^FKY, SparseArray::operator[]() F ArrayCursor::operator=(). SparseArray::
operator[]() ROPRMCTCUB ArrayCursor EUPCRFQFSO OB BOGO, QNTUQBRNUB FELUDQ FHF EUB (OJ ]BOS
ArrayCursor NPECUB [O BOSN, DCDO_ DOEQBMNDBOM JXH RXJMCE). ArrayCursor::operator=(Foo*)
LUHCUB OLEO FP LRNY: UQHF FELUDQ NZU QNTUQBRNUB, ]HUSUEB FPSUEKUBQK, C #.2( *# .8L#."&8#" %*
)(*+,(-#.$( )%/+&24#".4 & ,+..(&. # ]BOS [MOKRHKUBQK RQK QNB\ DNMQOMEOQBF (DNMQOMFPSC?):
[UMUGMNZUEEX_ O[UMCBOM = RX[OHEKUB [MFQRCFRCEFU EU LHK QCSOGO DNMQOMC, C LHK QBMNDBNMX LCEEXY,
OB DOBOMO_ [MOFQYOLFB DNMQOM. +U[UM\ [MFQRCFRCEFU MCJOBCUB EUPCRFQFSO OB BOGO, QNTUQBRNUB FELUDQ
FHF EUB.
array[Index(17, 29)] = new Foo; // :';$4#%"* /(0"&)
array[Index(17, 29)] = new Foo; // D-2"(%"* -($."(/" ) -$0$((<2 /(0"&)'2
$U[HOYO LHK WCQORO_ MCJOBUEDF, EU [MCRLC HF? $CV SCQQFR MCJOBCUB QORQUS DCD ECQBOKTF_. 5OWBF.
Onepafopu npeopasoeauun u onepafop ->
)QBCHOQ\ LOJCRFB\ UTU [CMN VBMFYOR. #O-[UMRXY, O[UMCBOM [] R [MCRO_ WCQBF O[UMC^FF [MFQRCFRCEFK
MCJOBCUB NZU EU BCD, DCD JXHO EC[FQCEO, [OQDOH\DN OE ROPRMCTCUB ArrayCursor, C EU Foo* FHF Foo*&.
$O [MFWFE LHK JUQ[ODO_QBRC EUB, [OBOSN WBO Foo*() R QHNWCU EUOJYOLFSOQBF CRBOSCBFWUQDF
[MUOJMCPNUB ArrayCursor D Foo*. #BOMCK [MOJHUSC PCDHIWCUBQK R BOS, WBO O[UMCBOM [] EU SOZUB
FQ[OH\PORCB\QK QHURC OB O[UMCBOMC ->; EC [OSOT\ [MFYOLFB operator->()!
..7
class ArrayCursor {
friend class SparseArray;
private:
SparseArray& array;
Index index;
SparseArray::Node* node;
ArrayCursor(SparseArray& arr, Index i)
: array(arr), index(i), node(NULL) {}
ArrayCursor(SparseArray& arr, SparseArray::Node* n)
: array(arr), node(n), index(n->index) {}
public:
ArrayCursor& operator=(Foo* foo);
operator Foo*() { return node != NULL ? node->content : NULL; };
Foo* operator->()
{
if (node = NULL)
// D(/B//7'4$*, /)&#>."(/"
else
return node->contents;
}
};

Foo* foo = array[Index(17, 29)]; // O$;'*$"*
array[Index(17, 29)]->MemberOfFoo(); // A'1" 7$;'*$"*
$N ROB, BU[UM\ SOZEO MCQQHCJFB\QK. *HK DHFUEBQDOGO OJaUDBC ECV SCQQFR EFWUS EU OBHFWCUBQK OB
OJXWEOGO. 3BO OPECWCUB, WBO RX SOZUBU [MOGMCSSFMORCB\ LHK [MOQBO_ QUSCEBFDF SCQQFRC F OBLUH\EO
RXJMCB\ RENBMUEEII MUCHFPC^FI QBMNDBNM LCEEXY LCZU EC [OPLEU_ QBCLFF [MOUDBC.
-fo-fo suakoroe
#PGHKEFBU UTU MCP EC DHCQQ ArrayCursor. )E [MULQBCRHKUB QOJO_ OJaUDB, DOBOMX_ DOQRUEEO QQXHCUBQK
EC Foo, FSUUB O[UMCBOMENI `NED^FI operator Foo*() F [UMUGMNZUEEX_ O[UMCBOM - -- -> >> >, [OPROHKITF_
OJMCTCB\QK D WHUECS Foo WUMUP DNMQOM. #XGHKLFB PECDOSO? +CD F LOHZEO JXB\. 0NMQOMX EC QCSOS LUHU
[MULQBCRHKIB QOJO_ QHULNITUU [ODOHUEFU NSEXY NDCPCBUHU_. #QU, WBO GOROMFHOQ\ OJ NSEXY NDCPCBU-
HKY R BMUY [OQHULEFY GHCRCY, HUGDO MCQ[MOQBMCEKUBQK F EC DNMQOMX. ! ECOJOMOB, FPNWUEFU
DNMQOMOHOGFF [OSOGCUB MCQVFMFB\ EUDOBOMXU DOE^U[^FF NSEXY NDCPCBUHU_. 5UMUGMNZCK O[UMCBOM =
LHK NSEOGO NDCPCBUHK, RX QNSUUBU FPJUZCB\ SEOGFY EU[MFKBEXY [MOJHUS. $C[MFSUM, RQ[OSEFBU
DOE^U[^FI D]VFMNITUGO NDCPCBUHK, DOBOMX_ R [OQHULEF_ SOSUEB QWFBXRCH OJaUDB Q LFQDC R
O[UMCBOMU ->. 5OLOJECK [UMUGMNPDC O[UMCBOMC [MFQRCFRCEFK EUMULDO OWFTCUB [MOGMCSSN F FPJCRHKUB
DOL OB EUENZEXY BUYEFWUQDFY LUBCHU_. *MNGO_ [OHUPEX_ [MFUS [MFRKPDC NSEOGO NDCPCBUHK D
EUDOBOMO_ QBMNDBNMU LCEEXY ([OLOJEO BOSN, DCD ArrayCursor [MFRKPXRCHQK D DHCQQN SparseArray).
+CDOU GCMSOEFWEOU OJaULFEUEFU FLU_ [MOUDBFMORCEFK KRHKUBQK YOMOVFS [MFPECDOS SX
[MFJHFZCUSQK D EUNHORFSO_ RXQVU_ FQBFEU C++. 1US JOHUU [UMULORXSF FLFOSCSF RX [OH\PNUBUQ\,
BUS JOH\VU ROPEFDCUB QYOLQBRC.
Hfepafopu
!BCD, SX SOZUS MCJOBCB\ Q HIJXS OBLUH\EXS ]HUSUEBOS DOHHUD^FF. 0CD ECQWUB BOGO, WBOJX [UMUJMCB\
RQU ]HUSUEBX? +N[O_ [UMUJOM R ^FDHU for EU [OSOZUB:
for (int i = 0; i < ... ."8'?
5MF RXJMCEEO_ MUCHFPC^FF MCPMUZUEEOGO SCQQFRC FPSUMUEFK EU FSUIB RUMYEU_ GMCEF^X. #[MOWUS,
LCZU UQHF JX OEC F JXHC, YOBUHOQ\ JX RCS [UMUJFMCB\ / 000 000 000 RQUROPSOZEXY FELUDQOR R [OFQDCY
..8
DCDO_-BO BXQKWF FQ[OH\PNUSXY? "ECI, PECI, RCV RISC-DOS[\IBUM [MOGOEKUB JUQDOEUWEX_ ^FDH PC
QUS\ QUDNEL, EO LCRC_BU SXQHFB\ MUCH\EO. %QHF LHK DOHHUD^FF QNTUQBRNUB O[BFSCH\EX_ Q[OQOJ
OJMCTCB\QK BOH\DO D FQ[OH\PNUSXS ]HUSUEBCS, SX LOHZEX [MULOQBCRFB\ UGO R MCQ[OMKZUEFU DHFUEBC.
$O [OSEFBU, DHFUEB EFWUGO EU PECUB O RENBMUEEUS QBMOUEFF ECVFY DOHHUD^F_; QOJQBRUEEO, FSUEEO LHK
]BOGO SX FPOJMUBCHF DNMQOMX. *OJMO [OZCHORCB\ R NLFRFBUH\EX_ F JUPNSEX_ SFM FBUMCBOMOR
(iterators) DHCQQOR, [MULECPECWUEEXY LHK [UMUJOMC DOHHUD^F_! 4LFRFBUH\EX_ [OQDOH\DN
FBUMCBOMX [MOQBO MUVCIB SEOGFU [MOJHUSX [MOUDBFMORCEFK. 8UPNSEX_ [OQDOH\DN LRC [MO-
GMCSSFQBC C++ EF PC WBO EU [MFLNB D OJTUSN SEUEFI O BOS, DCDFU ZU FLFOSX LOHZEX FQ[OH\PORCB\QK
R MUCHFPC^FF FBUMCBOMOR.
Akfueuue ufepafopu
-DBFREXS ECPXRCUBQK FBUMCBOM, DOBOMX_ QCS [UMUSUTCUBQK D QHULNITU_ [OPF^FF.
class Collection {
public:
class Iterator {
public:
bool More();
Foo* Next();
};
Collection::Iterator* Iterate(); // F'-0$"* /*"7$*'7
};
Collection::Iterator* iter = collection->Iterator();
while (iter.More())
f(iter.Next());
0CD [MCRFHO, FBUMCBOMX OBEOQKBQK D DOEDMUBEXS DOHHUD^FKS; [O ]BO_ [MFWFEU OEF WCQBO OJaKRHKIBQK
R RFLU RHOZUEEXY DHCQQOR. :NED^FK 9'r"() ROPRMCTCUB true, UQHF R DOHHUD^FF FSUUBQK QHULNITF_
]HUSUEB R [OMKLDU [UMUJOMC, F false R [MOBFREOS QHNWCU. :NED^FK Next() ROPRMCTCUB QHULNITF_
]HUSUEB F [UMUSUTCUB FBUMCBOM D QHULNITU_ [OPF^FF.
%QHF RX GOBORX [O_BF EC LO[OHEFBUH\EXU MCQYOLX, QRKPCEEXU Q RFMBNCH\EXSF `NED^FKSF, FBUMCBOM
BCDZU SOZEO MUCHFPORCB\ R RFLU NEFRUMQCH\EOGO VCJHOEC, MCJOBCITUGO Q HIJXSF DOHHUD^FKSF.
template <class Type>
class Iterator { // ='0C'0/* 0#% #>;<C &'##"&B/? / */5'4
public:
virtual bool More() = 0;
virtual Type* Next() = 0;
};
0CZLCK DOHHUD^FK SOZUB MUCHFPORCB\ FBUMCBOM PCEORO R [MOFPROLEOS DHCQQU, C DHFUEBX [O-[MUZEUSN
[OEKBFK EU FSUIB O BOS, DCD [MOFQYOLFB [UMUJOM F LCZU DCDO_ DHCQQ ECYOLFBQK [O LMNGNI QBOMOEN
PCJOMC. 0 QOZCHUEFI, R EUDOBOMXY DOHHUD^FKY EUOJYOLFSO [MULOQBCRFB\ QMULQBRC, EU [OLLUMZFRCUSXU
DOHHUD^FKSF LMNGFY BF[OR (EC[MFSUM, OGMCEFWUEFU [UMUJFMCUSOGO LFC[CPOEC), [O]BOSN BCDO_ VCJHOE
EU ECQBOH\DO NEFRUMQCHUE, DCD DCZUBQK Q [UMROGO RPGHKLC.
& ECPXRCI BCDFU FBUMCBOMX +$"(&*',(, [OQDOH\DN LHK RX[OHEUEFK RQU_ OQEOREO_ MCJOBX RXPXRCIBQK
FY `NED^FF. .FBNC^FK RXGHKLFB BCD, QHOREO DBO-BO OBHOSFH DNQOD DOHHUD^FF F RQBCRFH UGO R
[UMUEOQFSX_ SCHUE\DF_ OJaUDB. 5OQHU DOEQBMNFMORCEFK BCDO_ OJaUDB QCS PECUB, WBO USN LUHCB\
LCH\VU.
Raccueuue ufepafopu
$C LMNGOS `HCEGU QBOKB FBUMCBOMX, DOBOMXU EC QCSOS LUHU EU LUHCIB EFWUGO QNTUQBRUEEOGO. # EFY
YMCEFBQK QHNZUJECK FE`OMSC^FK, PCEUQUEECK DOHHUD^FU_, EO [UMUSUTUEFU F RQU OQBCH\EXU O[UMC^FF
RX[OHEKIBQK QCSO_ DOHHUD^FU_. $CS [OECLOJKBQK BU ZU `NED^FF [MOQBO FP FBUMCBOMC OEF
..9
[UMUSUTCIBQK R DOHHUD^FI, C FBUMCBOM [MFSUEKUBQK BOH\DO LHK YMCEUEFK QHNZUJEO_ FE`OMSC^FF ]BFY
`NED^F_. 8CPORX_ FBUMCBOM F ^FDH FBUMC^FF RXGHKLKB BCD:
class Iterator;
class Collection {
public:
Iterator* Iterate(); // G'-47$K$"* 5$))/4(<? /*"7$*'7
bool More(Iterator*);
Foo* Next(Iterator*);
};
Iterator* iter = collection->Iterate();
while (collection->More(iter))
f(collection->Next(iter));
+CDFU FBUMCBOMX ECPXRCIBQK >+..(&*',(, [OQDOH\DN QCSF [O QUJU OEF EU RX[OHEKIB EFDCDFY
LU_QBRF_ F [MULECPECWUEX HFV\ LHK YMCEUEFK QHNZUJEO_ FE`OMSC^FF.
-fo nyue?
#XJOM SUZLN CDBFREXSF F [CQQFREXSF FBUMCBOMCSF R OQEOREOS PCRFQFB OB QBFHK, EO K [MUL[OWFBCI
CDBFREXU FBUMCBOMX [O EUQDOH\DFS [MFWFECS:
"CDOEWUEEX_ DHCQQ FBUMCBOMC [MOTU FQ[OH\PORCB\ [ORBOMEO, WUS [CMN `NED^F_ JOH\VOGO
DHCQQC.
(CEO FHF [OPLEO RCS PCYOWUBQK [MULOQBCRFB\ EUQDOH\DO MCPEXY Q[OQOJOR [UMUJOMC QOLUMZFSOGO
DOHHUD^FF. )LFE F BOB ZU OJTF_ FEBUM`U_Q DHCQQC Iterator [OLO_LUB LHK HIJOGO Q[OQOJC, C R
`OMSU `NED^F_ DHCQQC LHK DCZLOGO BF[C [UMUJOMC RCS [MFLUBQK QOPLCRCB\ [CMN EORXY `NED^F_.
5CQQFREXU FBUMCBOMX EU FSUIB OBDMXBOGO FEBUM`U_QC, OLECDO DHFUEBQDFU OJaUDBX RFLKB FY
WUMUP CLMUQC. 3BO RXGHKLFB LOROH\EO QBMCEEO.
5MF MCRUEQBRU RQUY OQBCH\EXY [ODCPCBUHU_ K OJXWEO [MUL[OWFBCI CDBFREXU FBUMCBOMX,
[OQDOH\DN OEF OJUQ[UWFRCIB HNWVNI FEDC[QNHK^FI.
# DOSSUMWUQDFY JFJHFOBUDCY DHCQQOR SOZEO RQBMUBFB\ YOMOVFU [MFSUMX OJUFY `OMS. # RO[MOQU OJ
CDBFREXY F [CQQFREXY FBUMCBOMCY OBMCZCUBQK OJTF_ Q[OM OJ CDBFREXY F [CQQFREXY OJaUDBCY, [O]BOSN
R [UMRNI OWUMUL\ QHULNUB NWFBXRCB\ QOJQBRUEEXU [MFUSX [MOUDBFMORCEFK.
Yorue, uo pacnpocfpaueuuue eapuaufu
#MKL HF RX RQBMUBFBU R DOSSUMWUQDFY JFJHFOBUDCY DHCQQOR FBUMCBOMX FSUEEO R BCDOS RFLU. 4 DCZLOGO
ECYOLFBQK QRO_ [OLYOL D ]BO_ BUSU. $FZU [UMUWFQHUEX EUDOBOMXU RCMFCEBX, DOBOMXU WCQBO
RQBMUWCIBQK R QBMCEQBRFKY [O .++, Q DMCBDFSF DOSSUEBCMFKSF [O [OROLN FY LOQBOFEQBR F EULOQBCBDOR.
Mouoropquue akfueuue ufepafopu eue onacfu pecfeun
*CZU ZCHDO MCQYOLORCB\ PCSUWCBUH\EX_ BUMSFE EC BCDNI [MOQBNI DOE^U[^FI. !BUMCBOMX ECPXRCIBQK
SOEOSOM`EXSF, [OQDOH\DN R EFY EU FQ[OH\PNIBQK RFMBNCH\EXU `NED^FF, F ECYOLKBQK REU OJHCQBF
LU_QBRFK, [OQDOH\DN OEF EU OJaKRHKIBQK RHOZUEEXSF R DOHHUD^FI.
class Collection { ... };
class CollectionIterator {
private:
Collection* coll;
public:
CollectionIterator(Collection* coll);
bool More();
Foo* Next();
};
.20
CollectionIterator iter(collection); // F'-0$*, /*"7$*'7
while (iter.More())
f(iter.Next());
5MOQBO NLFRFBUH\EO, WBO RQUGO EUQDOH\DO QBMOD [MOGMCSSX [OMOZLCUB QBOH\DO [MOJHUS:
5MF FQ[OH\PORCEFF DHCQQC, [MOFPROLEOGO OB Collection, DCZLX_ DHFUEB LOHZUE PECB\, DCDFU
EORXU DHCQQX FBUMCBOMOR LOHZEX FQ[OH\PORCB\QK RSUQBO QBCMOGO CollectionIterator.
5UMUSUEEXU DHCQQC FBUMCBOMC RFLEX RQUS F DCZLOSN. *CZU UQHF OEF EU QOQBCRHKIB
GOQNLCMQBRUEEO_ BC_EX, RUQ\ DHFUEBQDF_ DOL [MFLUBQK [UMUDOS[FHFMORCB\ DCZLX_ MCP, DOGLC
RCS PCYOWUBQK FPSUEFB\ MUCHFPC^FI FBUMCBOMC.
"CEUQUEFU FBUMCBOMOR R QBUD [MOBFROMUWFB EUDOBOMXS QBMCBUGFKS SEOGO[OBOWEOQBF,
MCQQSCBMFRCUSXS R QHULNITU_ GHCRU.
6EOGODMCBEOU FQ[OH\PORCEFU BCDOGO DOLC PCLCWC SUMPDCK.
4WFBXRCK RQU ]BO, JNLUB ECSEOGO, ECSEOGO HNWVU [O[MOQFB\ DHCQQ DOHHUD^FF: 5OZCHN_QBC, Q]M,
QLUHC_BU SEU FBUMCBOM RSUQBO BOGO, WBOJX QCSOSN QOPLCRCB\ UGO R QBUDU. $URPFMCK EC RQU [MOJHUSX,
]BOB BF[ FBUMCBOMOR WCQBO RQBMUWCUBQK R DOSSUMWUQDFY JFJHFOBUDCY DHCQQOR.
Raccueuue ufepafopu funa void*
.CSCK MCQ[MOQBMCEUEECK RCMFC^FK EC BUSN [CQQFREXY FBUMCBOMOR EU ROPFB\QK Q [MULRCMFBUH\EXS
OJaKRHUEFUS DHCQQC FBUMCBOMC, C OJSCENB\ DHFUEBOR F RENVFB\ FS, WBO EC QCSOS LUHU OEF FSUIB LUHO Q
BF[OS void*. #QU ]BO WCQBO SCQDFMNUBQK DCDFS-EFJNL\ DMCQFRXS FSUEUS Q [OSOT\I typedef, EO
NMOLHFRX_ void* BCD HUGDO EU Q[MKWUV\.
typedef void* AprilInParis;
class Collection {
public:
AprilInParis Iterate(); // G'-47$K$"* -$87/2/7'4$((<? void*
bool More(AprilInParis&);
Foo* Next(AprilInParis&);
};
0OEUWEO, RO RENBMUEEUS [MULQBCRHUEFF YMCEFBQK WBO-BO JOHUU MCPNSEOU, WUS void*, [O]BOSN DOL
MUCHFPC^FF Collection LOHZUE [OQBOKEEO [MUOJMCPORXRCB\ void* D MUCH\EOQBF. $U PECI DCD RCQ, EO
HFWEO SUEK [MFROLFB R NZCQ OLEC SXQH\ O BOS, WBO DHFUEBQDF_ DOL JNLUB ROPFB\QK Q void* LO UGO
[MUOJMCPORCEFK. 0 BOSN ZU OBHCLDC BCDOGO DOLC L\KROH\QDF QHOZEC, [OQDOH\DN OBHCLWFD PECUB O BOS, Q
WUS OE FSUUB LUHO, EFWNB\ EU JOH\VU DHFUEBC. 0MCQFROU ECPRCEFU FBUMCBOMC EU QDMOUB FPECWCH\EOGO
NMOLQBRC BCDOGO [OLYOLC.
Hefunusupoeauuue suaeuun qyukuuu Next()
6EOGFU DHCQQX FBUMCBOMOR [FVNBQK R OJOJTUEEO_ `OMSU LHK BF[C void* FHF DCDOGO-BO CJQBMCDBEOGO
JCPOROGO DHCQQC. 0HFUEB LOHZUE QCS [MFROLFB\ PECWUEFU, ROPRMCTCUSOU `NED^FU_ Next(), OJMCBEO D
[MCRFH\EOSN BF[N F GOMU USN, UQHF OE WBO-EFJNL\ EC[NBCUB. <CJHOEX FPOJMUBCHFQ\ FSUEEO LHK ]BO_
^UHF, BCD WBO BU[UM\ [OLOJEX_ JMUL NZU EUH\PK O[MCRLCB\.
Pyuue eapuaufu
$CWFECK Q ]BOGO SUQBC, K JNLN GOROMFB\ OJ CDBFREXY FBUMCBOMCY, OLECDO RQU QDCPCEEOU R MCREO_ SUMU
OBEOQFBQK F D [CQQFREXS FBUMCBOMCS. $UDOBOMXU MCPEORFLEOQBF FBUMCBOMOR QFH\EO PCRFQKB OB
YCMCDBUMFQBFD DOHHUD^FF, EO LMNGFU OJHCLCIB JOH\VU_ NEFRUMQCH\EOQB\I. 5UMUWFQHKI FY, EU
[MFLUMZFRCKQ\ DCDOGO-BO O[MULUHUEEOGO [OMKLDC.
.2.
Bosepaf e ucxopuyk foky
$UDOBOMXU DHCQQX FBUMCBOMOR QOLUMZCB `NED^FI, DOBOMCK ROPRMCTCUB FBUMCBOM D ECWCHN [UMUJOMC. &
ECPXRCI UU `NED^FU_ ROPRMCBC, Rewind(). +CDCK ROPSOZEOQB\ [OLLUMZFRCUBQK EU RQUSF DOHHUD^FKSF
EC[MFSUM, LHK [OBODC LCEEXY FP DOSSNEFDC^FOEEOGO [OMBC ]BO EUROPSOZEO.
Orpauueuue puanasoua
%QHF QORODN[EOQB\ OJaUDBOR, [MULQBCRHUEEXY R RFLU DOHHUD^FF, N[OMKLOWUEC, FBUMCBOM LOHZUE
OJHCLCB\ EUDOBOMXSF QMULQBRCSF LHK OGMCEFWUEFK [UMUJOMC DOEDMUBEXS LFC[CPOEOS OJaUDBOR.
class Collection {
public:
class Iterator {
public:
Iterator(Key* low, Key* high);
// D *.0.
};
// D *.0.
};
# ]BOS `MCGSUEBU low F high O[MULUHKIB SFEFSCH\EOU F SCDQFSCH\EOU PECWUEFU DHIWC
QOOBRUBQBRUEEO. More() F Next() [MO[NQDCIB ]HUSUEBX, EU RYOLKTFU R PCLCEEX_ LFC[CPOE QO
RDHIWUEFUS GMCEF^. *MNGFU RCMFC^FF EC ]BN BUSN RQU ]HUSUEBX JOH\VU X, RQU ]HUSUEBX SUE\VU
X F FQDHIWUEFU GMCEF^ (< RSUQBO <=).
Ofkaf
!BUMCBOMX BCDZU SOGNB [OLLUMZFRCB\ `NED^FI Previous() LHK OBDCBC EC OLEN [OPF^FI, UQHF BCDCK
ROPSOZEOQB\ OJUQ[UWFRCUBQK QCSO_ DOHHUD^FU_. 3BC `NED^FK WCQBO FQ[OH\PNUBQK RSUQBU Q `NED^FU_
Current(), DOBOMCK ROPRMCTCUB BO, WBO Next() ROPRMCBFHC [MF [OQHULEUS RXPORU.
Kypcopu
1CQBO JXRCUB OWUE\ [OHUPEO OJaULFEFB\ DOE^U[^FF, O[FQCEEXU R ]BO_ GHCRU, F ROPRMCTCB\ FP Next()
EU *-NDCPCBUH\, C DNMQOM, DOBOMX_ PECUB, OBDNLC RPKHQK ]HUSUEB. 8HCGOLCMK ]BOSN [OH\PORCBUH\ QSOZUB
RX[OHEFB\ NLCHUEFU, PCSUEN FHF RQBCRDN LO FHF [OQHU BUDNTUGO OJaUDBC. #OPSOZEX LRC RCMFCEBC
MUCHFPC^FF: ROPRMCTCB\ DNMQOM FP `NED^FF Next() FHF RDHIWFB\ DNMQOMO[OLOJEXU O[UMC^FF R
DCWUQBRU `NED^F_ DHCQQC QCSOGO FBUMCBOMC, MCJOBCITFY Q [OQHULEU_ [OHNWUEEO_ [OPF^FU_. 5UMRX_
RCMFCEB BMUJNUBQK RPCFSOLU_QBRFK FBUMCBOMC Q DNMQOMOS; RO RBOMOS OEF OJaULFEKIBQK R OLFE DHCQQ.
Hfepafop acfpakfuoro raccuea
5UMU_LUS D [MOQBOSN [MFSUMN EC OQEORU ECVUGO MCPMUZUEEOGO SCQQFRC. 0HCQQX SCQQFRC F DNMQOMC
RPKBX FP [MULXLNTUGO OJQNZLUEFK JUP FPSUEUEF_ PC FQDHIWUEFUS BOGO, WBO DHCQQ SCQQFRC BU[UM\
BCDZU ROPRMCTCUB FBUMCBOM HFV\ LHK EU[NQBXY KWUUD. 4EFRUMQCH\EX_ VCJHOE FBUMCBOMC EU
FQ[OH\PNUBQK, [OQDOH\DN `NED^FK Next() ROPRMCTCUB DCD FELUDQ, BCD F OJaUDB Q ]BFS FELUDQOS, C ]BO
BMUJNUB EUQBCELCMBEOGO FEBUM`U_QC D Next(). 0HCQQX DNMQOMC F MCPMUZUEEOGO SCQQFRC OQBCHFQ\ R
[MUZEUS RFLU. & EU NBRUMZLCI, WBO ]BO ?%6%@(3 MCPMUZUEEX_ SCQQFR OLECDO OE OJHCLCUB
LOQBCBOWEO [MOQBXS LFPC_EOS, DOBOMX_ EU JNLUB ECS SUVCB\ [MF OJQNZLUEFF FBUMCBOMOR.
// SparseArray.h
class ArrayCursor;
class SparseArray {
friend class ArrayCursor;
private:
struct Node {
Index index;
Foo* content;
.22
Node* next;
Node(Index i, Foo* c, Node* n) : index(i), content(c), next(n) {}
};
Node* cells;
public:
class Iterator {
private:
Node* next;
public:
Iterator(Node* first) : next(first) {}
bool More() { return next != NULL; ]
Foo* Next(Index& index)
{
Foo* object = next->content;
index = next->index;
next = next->next;
return object;
}
};
Iterator* NonEmpty() { return new SparseArray::Iterator(cells); }
SparseArray() : cells(NULL) {}
ArrayCursor operator[](Index i);
};

class ArrayCursor {
friend class SparseArray;
private:
SparseArray& array;
Index index;
SparseArray::Node* node;
ArrayCursor(SparseArray& arr, Index i)
: array(arr), index(i), node(NULL) {}
ArrayCursor(SparseArray& arr, SparseArray::Node* n)
: array(arr), node(n), index(n->index) {}
public:
ArrayCursor& operator=(Foo* foo);
operator Foo*() { return node != NULL ? node->content : NULL; }
Foo* operator->()
{
if (node == NULL)
throw nil_error;
else
return node->current;
}
};
5OZCHN_, K JX EU MFQDENH [ODCPXRCB\ ]BN [MOGMCSSN [OBUE^FCH\EOSN MCJOBOLCBUHI DCD
LODCPCBUH\QBRO GHNJODFY [OPECEF_ R .++, EO OEC [MOQBC, JXQBMC F Q[MCRHKUBQK QO QROU_ PCLCWU_. $FZU
[UMUWFQHUEX EUDOBOMXU FPSUEUEFK, DOBOMXU SOZEO JXHO JX REUQBF R DOSSUMWUQDF_ RCMFCEB:
.23
!EDC[QNHFMN_BU SparseArray::Iterator, [MURMCBFR UGO R CJQBMCDBEX_ JCPORX_ DHCQQ, C
PCBUS RUMEFBU [MOFPROLEX_ DHCQQ FP QDMXBO_ MUCHFPC^FF NonEmpty() (]BC FLUK BCDZU YOMOVO
[OLYOLFB LHK DHCQQOR SCQQFRC F DNMQOMC, [O]BOSN SX MCPOR\US UU R WCQBF 3).
5MULOQBCR\BU LO[OHEFBUH\EXU FBUMCBOMX, DOBOMXU RDHIWCIB DCD [NQBXU, BCD F EU[NQBXU
KWU_DF.
,CMCEBFMN_BU O[MULUHUEEX_ [OMKLOD [UMUJOMC KWUUD.
#OPRMCTC_BU FP Next() DNMQOM, C EU NDCPCBUH\, WBOJX DHFUEBX SOGHF FPSUEKB\ QOLUMZFSOU
KWU_DF RO RMUSK [UMUJOMC. %QHF ]BO JNLUB QLUHCEO, FELUDQ SOZUB YMCEFB\QK R DNMQOMU, [O]BOSN
OB[CLCUB EUOJYOLFSOQB\ ROPRMCTCB\ UGO R RFLU OBLUH\EOGO QQXHOWEOGO CMGNSUEBC Next().
Onepafopu konnekuu
6EOGFU DOHHUD^FF FELUDQFMNIBQK OLEFS FHF EUQDOH\DFSF Q[OQOJCSF F YOMOVO QOOBRUBQBRNIB
O[UMCBOMN [], OLECDO R ECVUS OJQNZLUEFF DNMQOMOR F FBUMCBOMOR EFGLU EU RXLRFGCHOQ\ BMUJORCEFU
EU[MUSUEEO FQ[OH\PORCB\ O[UMCBOM [] FHF FELUDQFMORCB\ DOHHUD^FI. 0NMQOM HFV\ O[MULUHKUB
EUDOBOMNI RENBMUEEII [OPF^FI R DOHHUD^FF; ]BC [OPF^FK EU OJKPCEC JXB\ WUS-BO [OEKBEXS FHF
[MULQBCRHKITFS FEBUMUQ LHK [OH\PORCBUHK. %QHF NJMCB\ FP `NED^FF Next() CMGNSUEB Index&,
O[FQCEEX_ FBUMCBOM SOZEO JNLUB Q BCDFS ZU NQ[UYOS FQ[OH\PORCB\ EU LHK SCQQFRC, C LHK WUGO-BO
QORUMVUEEO FEOGO.
# JOH\VFEQBRU DOHHUD^F_ FSUIBQK OJTFU O[UMC^FF. 0CD F R QHNWCU Q O[UMCBOMOS [], O[UMCBOMX .++
OJXWEO [UMUGMNZCIBQK LHK [OHNWUEFK JOHUU [OEKBEOGO F NLOJOWFBCUSOGO DOLC. >OBK EU QNTUQBRNUB
[ORQUSUQBEOGO QBCELCMBC O[UMCBOMOR DOHHUD^F_, [MFRULUEEX_ EFZU [UMUWUE\ [OSOZUB RCS ECWCB\
RCVF QOJQBRUEEXU MCPMCJOBDF. #O RQUY [MFRULUEEXY O[UMCBOMCY QOYMCEKUBQK QUSCEBFDC
QOOBRUBQBRNITFY O[UMC^F_ Q WFQHCSF.
template <class Element>
class Set {
public:
Set(); // =3)*'" 2('1")*4'
Set(const Set<Element>&); // :3;#/7'4$*, 2('1")*4'
Set(Element*); // 9('1")*4' ) '0(/2 /)C'0(<2 Q#"2"(*'2

// P/($7(<" '5"7$B// / '5"7$B// '*('M"(/% (2('1")*4', 2('1")*4')
// (*$&1" 4$7/$(*< |=, &=, -=, <, <=)
Set<Element> operator|(const Set<Element>&) const; // L;E"0/("(/"
// 2('1")*4
Set<Element> operator&(const Set<Element>&) const; // ="7")"."(/"
Set<Element> operator-(const Set<Element>-) const; // O$-(')*,
// 2('1")*4
bool operator>(const Set<Element>&) const; // D)*/((', ")#/ this
// %4#%"*)% *'.(<2 ($02('1")*4'2 $7832"(*$
bool operator>=(const Set<Element>&) const; // D)*/((', ")#/ this
// %4#%"*)% ($02('1")*4'2 $7832"(*$
bool operator==(const Set<Element>&) const; // D)*/((', ")#/ 2('1")*4$
// /2">* '0/($&'4'" )'0"71/2'"

// P/($7(<" '5"7$B// / '5"7$B// '*('M"(/% (2('1")*4', Q#"2"(**)
// (*$&1" 4$7/$(*< |=, -=)
Set<Element> operator|(Element*); // :';$4/*, Q#"2"(* 4 this
Set<Element> operator-(Element*); // this 2/(3) Q#"2"(*
bool operator>(const Element*) const; // D)*/((', ")#/ Q#"2"(*
// 57/($0#"1/* 2('1")*43, (' (" %4#%"*)% "0/()*4"((<2
.24
bool operator>=(const Element*) const; // D)*/((', ")#/ Q#"2"(*
// 57/($0#"1/* 2('1")*43
bool operator==(const Element*) const; // D)*/((', ")#/ Q#"2"(*
// %4#%"*)% "0/()*4"((<2 Q#"2"(*'2 2('1")*4$
};
.NTUQBRNUB UTU OLFE RCMFCEB [UMUGMNPDF O[UMCBOMC, O DOBOMOS K RXENZLUE N[OSKENB\. & BCD F EU
[MFRXD D O[UMCBOMCS << F >> R DCWUQBRU O[UMCBOMOR [OMCPMKLEXY QLRFGOR R [OBOD F FP EUGO, EO
[OQDOH\DN OEF [MOWEO REULMFHFQ\ R DNH\BNMN .++, ]BN FLFOSN [MFYOLFBQK FQ[OH\PORCB\ YOBK JX DCD
JCPN LHK LCH\EU_VFY MCQVFMUEF_. 3BO [MFROLFB ECQ D LO[OHEFBUH\EOSN [MFSUEUEFI << F >> R
DOEBUDQBU DOHHUD^F_ F FBUMCBOMOR:
)[UMCBOM << SOZUB FQ[OH\PORCB\QK R FBUMCBOMCY DCD QFEOEFS `NED^FF Next().
)[UMCBOM >> SOZUB FQ[OH\PORCB\QK DCD QFEOEFS JOHUU LHFEEOGO O[UMCBOMC Set&
operator|=(Element*) LHK QLRFGC EORXY ]HUSUEBOR R DOHHUD^FI.
# OJOFY FLFOSCY O[UMCBOM LOHZUE [UMUGMNZCB\QK R `OMSU REUVEU_ `NED^FF, [OQDOH\DN R HURO_ WCQBF
O[UMCBOMC ECYOLFBQK Element*, C EU Set. !LFOSC >> RXGHKLFB ECFJOHUU UQBUQBRUEEO LHK DOHHUD^F_,
QOYMCEKITFY FQYOLEX_ [OMKLOD RQBCRDF (EC[MFSUM, Q[FQDOR).
6X RUMEUSQK D ]BO_ BUSU R WCQBF 3 [MF OJQNZLUEFF GOSOSOM`EXY FUMCMYF_ DHCQQOR.
Myppue kypcopu u uapeuocfu ufepafopoe
0NMQOM SOZUB FQ[OH\PORCB\QK LHK RQBCRDF OJaUDBC R EUDOBOMNI [OPF^FI DOHHUD^FF EUPCRFQFSO OB
BOGO, OBMCZUEC HF LCEECK [OPF^FK RO RENBMUEEFY QBMNDBNMCY LCEEXY DOHHUD^FF. !SUEEO ]BOB [MFE^F[
JCH PCHOZUE R OQEORN [UMUGMNPDF O[UMCBOMC = LHK DNMQOMOR. %GO SOZEO OJOJTFB\ EC LMNGFU O[UMC^FF Q
DNMQOMCSF. $FZU [UMUWFQHUEX BF[FWEXU MCQVFMUEEXU O[UMC^FF Q DNMQOMCSF, RXMCZUEEXU R RFLU
`NED^F_ DHCQQC DNMQOMC:
void InsertBefore(Foo* f); // G)*$4/*, f 5"7"0 &37)'7'2
void InsertAfter(Foo* f); // G)*$4/*, f 5')#" &37)'7$
void RemoveAt(); // H0$#/*, ';E"&* 4 *"&3K"? 5'-/B// &37)'7$
.DCPCEEOU OBEOQFBQK D VFMODOSN LFC[CPOEN DOHHUD^F_, R DOBOMXY QNTUQBRNUB WUBDO O[MULUHUEECK
[OQHULORCBUH\EOQB\ ]HUSUEBOR. 5UMUWFQHUEEXU O[UMC^FF BCDZU SOGNB OJUQ[UWFRCB\QK FBUMCBOMCSF,
DOBOMXU EU ROPRMCTCIB DNMQOM DCD PECWUEFU `NED^FF Next(), C QDMXRCIB BUDNTNI [OPF^FI R
FBUMCBOMU.
3BF O[UMC^FF NQHOZEKIB QOJHILUEFU ULFEO_ QUSCEBFDF [UMUJOMC, C R YNLVUS QHNWCU [OMOZLCIB
QUM\UPEXU EULOQBCBDF LFPC_EC, DOBOMXU SOGNB NGMOJFB\ RCVN [MOGMCSSN. #[MOWUS, [MOJHUSX SOGNB
ROPEFDENB\ F JUP MCQVFMUEEXY O[UMC^F_, UQHF FPSUEUEFK R DOHHUD^FF SOGNB [MOFQYOLFB\ [MF ECHFWFF
CDBFREXY DNMQOMOR F FBUMCBOMOR. 5MULQBCR\BU QUJU, WBO EUDF_ `MCGSUEB [MOGMCSSX NLCHKUB OJaUDB, EC
DOBOMX_ QQXHCUBQK BUDNTF_ CDBFREX_ DNMQOM! 5MFYOLFBQK OQOJO PCJOBFB\QK, WBOJX ]BO EU RXPRCHO
DCBCQBMO`FWUQDFY [OQHULQBRF_. ,HCRECK [MOJHUSC QLUHCB\ DNMQOM *+)#D*',, WBOJX OEF SOGHF
[UMUZFB\ OJEORHUEFU QROFY JCPORXY DOHHUD^F_.
*HK [MFSUMC ROP\SUS QRKPCEEX_ Q[FQOD F UGO FBUMCBOM.
A B

0NMQOMX A F B FQ[OH\PNIBQK LHK OBQHUZFRCEFK BUDNTU_ [OPF^FF LRNY MCPEXY FBUMCBOMOR R OLEOS
Q[FQDU. #QU OBHFWEO MCJOBCUB, [ODC Q[FQOD OQBCUBQK JUP FPSUEUEF_. $O QBOFB DHFUEBN OLEOGO FP
FBUMCBOMOR ROQ[OH\PORCB\QK DNMQOMOS LHK OJEORHUEFK Q[FQDC, DCD EUSULHUEEO ROPEFDCIB [MOJHUSX:
.25
%QHF DHFUEB RX[OHEFB O[UMC^FI RQBCRDF [OQHU Q DNMQOMOS B, OJC FBUMCBOMC [MF
ROPOJEORHUEFF [UMUJOMC NRFLKB BOH\DO WBO RQBCRHUEEX_ OJaUDB.
%QHF DHFUEB RX[OHEFB O[UMC^FI RQBCRDF LO Q DNMQOMOS B FHF RQBCRDF [OQHU Q DNMQOMOS A,
FBUMCBOM-RHCLUHU^ A NRFLFB RQBCRHUEEX_ OJaUDB, C FBUMCBOM-RHCLUHU^ B EUB.
%QHF DHFUEB NLCHFB OJaUDB R [OPF^FF B, A EFDOGLC EU NRFLFB ]BOGO OJaUDBC, YOBK BOB ECYOLFHQK
EC Q[OUS SUQBU, DOGLC FBUMCBOM-RHCLUHU^ A ECWCH [UMUJOM Q[FQDC.
%QHF DHFUEB NLCHFB OJaUDB R [OPF^FF A, B NQ[UUB NRFLUB\ ]BOB OJaUDB [UMUL BUS, DCD
[MOFPOVHO NLCHUEFU.
5MF RX[OHEUEFF RQBCRDF [OQHU HIJOGO DNMQOMC R EUDOBOMXY CHGOMFBSCY RQBCRDF ROPEFDCUB
JUQDOEUWECK MUDNMQFK, [OQDOH\DN DCZLX_ BOH\DO WBO RQBCRHUEEX_ OJaUDB SOZUB FEF^FFMORCB\
RQBCRDN LMNGOGO OJaUDBC.
%QHF A F B QQXHCIBQK EC OJTF_ ]HUSUEB Q[FQDC, C OLFE FP EFY ]BOB ]HUSUEB NLCHFB
"LMCRQBRN_, LUJCGGUM!
0OMOWU, [MF REUQUEFF FPSUEUEF_ R DOHHUD^FI RO RMUSK [UMUJOMC QUSCEBFDC [MURMCTCUBQK R Q[HOVEO_
RFEUGMUB. - UQHF [MF ]BOS OLEORMUSUEEO MCJOBCIB LRC F JOHUU FBUMCBOMC, MUPNH\BCBX SOZEO
O[MULUHKB\ [O JMOQDCS DNJFDOR.
$C QCSOS LUHU Q[FQDF QHNWC_ OBEOQFBUH\EO [MOQBO_. 5OLNSC_BU, WBO [MOFPO_LUB, UQHF DOHHUD^FK
YMCEFBQK R RFLU SCQQFRC (EUPCRFQFSO OB BOGO, [MULQBCRHKUBQK HF OEC DHFUEBN SCQQFROS FHF EUB), C
DNMQOM MCQ[OHCGCUB ^UHOWFQHUEEXS FELUDQOS R ]BOS SCQQFRU.
A B

1BOJX OJUQ[UWFB\ RX[OHEUEFU RQBCRDF LO/[OQHU F NLCHUEFK, [MFYOLFBQK QLRFGCB\ ]HUSUEBX SCQQFRC
ECL [OPF^FU_ RQBCRDF FHF NLCHKB\ OLEF ]HUSUEB RXVU FHF EFZU. %QHF EC LFCGMCSSU NLCHFB\ ]HUSUEB R
A F QLRFENB\ RQU, WBO ECYOLFBQK RXVU, EC OLEN [OPF^FI REFP, B [MO[NQBFB [OPF^FI. %QHF RQBCRFB\
]HUSUEB R A, B NRFLFB OLFE F BOB ZU OJaUDB LRCZLX.
.USCEBFDC [UMUJOMC LOHZEC JXB\ ECSEOGO JOHUU KQEO_ F JOHUU [MULQDCPNUSO_. *HK JOH\VFEQBRC
[MFHOZUEF_ [OMKLOD ]HUSUEBOR QHULNUB `FDQFMORCB\ EC SOSUEB ECWCHC [UMUJOMC, WBO EC EUGO EU
RHFKHF [OQHULNITFU O[UMC^FF RQBCRDF F NLCHUEFK. 0CD [MCRFHO, FLFOSX FBUMCBOMC F DNMQOMC LOHZEX
QOJHILCB\ LRC [MCRFHC:
/. !BUMCBOM LOHZUE [UMUJFMCB\ OJaUDBX DOHHUD^FF EC SOSUEB QROUGO DOEQBMNFMORCEFK.
2. 0NMQOM LOHZUE OQBCRCB\QK LU_QBRFBUH\EXS OB SOSUEBC DOEQBMNFMORCEFK LO SOSUEBC
NEFWBOZUEFK. *MNGFSF QHORCSF, [MOGMCSSC EU LOHZEC RX[OHEKB\ O[UMC^FF, [OQHU DOBOMXY
CDBFREX_ DNMQOM SOZUB [OBUMKB\ MCJOBOQ[OQOJEOQB\. 3BO EU OPECWCUB, WBO PECWUEFU R [OPF^FF
DNMQOMC LOHZEO OQBCRCB\QK OLEFS F BUS ZU MUW\ FLUB HFV\ O BOS, WBO DNMQOM OJKPCE
QOYMCEKB\ MCJOBOQ[OQOJEOQB\.
3BF [MCRFHC REOQKB EUDOBOMX_ [OMKLOD R BO, WBO GMOPFHO [MURMCBFB\QK R CJQOHIBEX_ YCOQ. 5UMROU FP
EFY SOZEO ECPRCB\ [MFE^F[OS PCBUEUEFK, [OQDOH\DN RQU FPSUEUEFK, REOQFSXU R DOHHUD^FI [OQHU
DOEQBMNFMORCEFK FBUMCBOMC, QDMXRCIBQK (PCBUEKIBQK) OB EUGO. 3BO OLEC FP GHOJCH\EXY DOE^U[^F_
LFPC_EC, [O DOBOMO_ PC[MOQBO SOZEO EC[FQCB\ OBLUH\ENI DEFGN, EO, D QWCQB\I, N ECQ [OQBCRHUEC JOHUU
[MFPUSHUEECK ^UH\ [MOLUSOEQBMFMORCB\ BU FLFOSX .++, R DOBOMXY RO[HOTCIBQK [MCDBFWUQDFU
MUVUEFK.
.26
-acfuue konuu konnekuu
%QHF FBUMCBOM F UGO DNMQOM EU [OPROHKIB REOQFB\ FPSUEUEFK R DOHHUD^FI, QNTUQBRNUB [MOQBO_ RXYOL:
QOPLCB\ WCQBENI DO[FI DOHHUD^FF R DOEQBMNDBOMU FBUMCBOMC. $C [QURLODOLU ]BO RXGHKLFB BCD:
class Iterator {
private:
Collection collection;
Cursor location; // A"&3K$% 5'-/B/% 4 &'5//
public:
Iterator(Collection& c)
: collection(c), location(collection.First()) {}
bool More();
Foo* Next();
};
0OEQBMNDBOM FBUMCBOMC Q [OSOT\I DOEQBMNDBOMC DO[F_ DHCQQC Collection QOPLCUB RBOMNI WCQBENI
DO[FI DOHHUD^FF. 5UMUL RCSF OLFE FP MULDFY QHNWCUR, DOGLC LU_QBRFBUH\EO FSUUB PECWUEFU BOB
`CDB, WBO [UMUSUEEXU DHCQQC DOEQBMNFMNIBQK R [OMKLDU FY [UMUWFQHUEFK; OJaUDB collection LOHZUE
JXB\ QDOEQBMNFMORCE MCE\VU OJaUDBC location, R [MOBFREOS QHNWCU RCS [MULQBOKB SNWUEFK Q OBHCLDO_
`NED^FF First().
Konnekuuu oLekfoe unu konnekuuu ykasafene?
3BC QYUSC OJXWEO FQ[OH\PNUBQK R QFBNC^FKY, DOGLC DOHHUD^FK QOQBOFB FP NDCPCBUHU_ FHF QQXHOD EC
OJaUDBX, DOBOMXU RO RQUS OQBCH\EOS EFDCD EU QRKPCEX Q DOHHUD^FU_. # LMNGFY DOHHUD^FKY RSUQBO
NDCPCBUHU_ FHF QQXHOD QOLUMZCBQK QOJQBRUEEO OJaUDBX.
template <class Type, int Size>
class Array {
private:
int Size; // I'#/.")*4' ';E"&*'4 Type
Type elements[size]; // L;E"&*< (4(3*7"((/")
// / *.0.
};
"LUQ\ OJaUDBX JNDRCH\EO REULMKIBQK R DOHHUD^FI. 1BOJX [MOLNJHFMORCB\ DOHHUD^FI, RCS [MFLUBQK
QDO[FMORCB\ EU BOH\DO NDCPCBUHF, EO F OJaUDBX C ]BO SOZUB OJO_BFQ\ QHFVDOS LOMOGO. . LMNGO_
QBOMOEX, SOZUB ROPEFDENB\ EUOJYOLFSOQB\ R BOS, WBOJX FBUMCBOM ROPRMCTCH NDCPCBUH\ FHF QQXHDN EC
FQYOLEX_ OJaUDB FQYOLEO_ DOHHUD^FF, C EU EC DO[FI. # HIJOS QHNWCU RCMFCEB Q WCQBEXSF
DOHHUD^FKSF OB[CLCUB.
+OB ZU [MFE^F[ LU_QBRNUB DCZLX_ MCP, DOGLC DOHHUD^FK [MULQBCRHKUB QOJO_ ECJOM RULNTFY NDCPCBUHU_
EC UU QOLUMZFSOU. *C, OEC QOLUMZFB NDCPCBUHF, C EU OJaUDBX, OLECDO DOHHUD^FK FSUUB [MCRO NLCHKB\
]BF OJaUDBX, [O]BOSN WCQBECK DO[FK JNLUB EUNQBO_WFRO_. $UDOBOMXU RO[MOQX N[MCRHUEFK [CSKB\I,
QRKPCEEXU Q ]BO_ [MOJHUSO_ DOEDMUBEUU, QJOMDC SNQOMC MCQQSCBMFRCIBQK R WCQBF 4 ]BO_ DEFGF.
Ynpoeuue acfuo konnekuuu
5MUL[OHOZFS, FQYOLECK DOHHUD^FK [MULQBCRHKUB QOJO_ JFECMEOU LUMURO FHF LMNGNI QHOZENI
QBMNDBNMN LCEEXY. +CD HF EUOJYOLFSO ROQ[MOFPROLFB\ R DO[FF RQU LO[OHEFBUH\EXU FPLUMZDF
LMURORFLEO_ QBMNDBNMX, UQHF NWUQB\, WBO RX EU QOJFMCUBUQ\ [OH\PORCB\QK FELUDQFMORCEEXS LOQBN[OS?
.NTUQBRNUB OJTU[MFEKBOU MUVUEFU QOPLCB\ R DCWUQBRU WCQBEO_ DO[FF N[MOTUEEX_ RCMFCEB
DOHHUD^FF. 3BO JNLUB [MOTU, UQHF R DHCQQU DOHHUD^FF FSUUBQK O[UMCBOM [MUOJMCPORCEFK,
[OMOZLCITF_ ]DPUS[HKM N[MOTUEEO_ DOHHUD^FF. #SUQBO DOEQBMNDBOMC DO[F_ DOHHUD^FF FBUMCBOM
FQ[OH\PNUB UU O[UMCBOM [MUOJMCPORCEFK:
class SimpleCollection; // H57'K"((<? 4$7/$(*
class ComplexCollection {
.27
public:
operator SimpleCollection*();
};
.NTUQBRNUB F LMNGO_, [OYOZF_ RCMFCEB QOPLCB\ R DHCQQU SimpleCollection DOEQBMNDBOMX LHK RQUY
OQBCH\EXY BF[OR DOHHUD^F_. )LECDO Q BOWDF PMUEFK LFPC_EC BCDOU MUVUEFU EUNLCWEO DCZLX_ MCP,
DOGLC RX [MFLNSCUBU DCDNI-EFJNL\ EORNI ]DPOBFWUQDNI DOHHUD^FI, RCS [MFLUBQK FPSUEKB\ DHCQQ
SimpleCollection. *HK BCDFY QHNWCUR QNTUQBRNIB O[UMCBOMX [MUOJMCPORCEFK.
%QHF FQ[OH\PORCB\ ]BOB RCMFCEB, FBUMCBOM QBCEORFBQK NEFRUMQCH\EXS F [OLYOLKTFS LHK MCPHFWEXY
BF[OR DOHHUD^F_. !BUMCBOMN EU ENZEO EFWUGO PECB\ OJ FQYOLEO_ DOHHUD^FF. 0OEQBMNDBOMN FBUMCBOMC
[UMULCUBQK CLMUQ N[MOTUEEO_ DOHHUD^FF RSUQBO FQYOLEO_, [MF ]BOS FEBUM`U_Q RXGHKLFB BCD:
class Iterator {
private:
SimpleCollection* collection;
Cursor location; // A"&3K$% 5'-/B/% 4 &'5//
public:
Iterator(SimpleCollection* c)
: collection(c), location(collection->First()) {}
bool More();
bool Next();
};
Buyfpeuuue u eueuuue ufepafopu
#UMEUSQK D FBUMCBOMCS, MCJOBCITFS Q FQYOLEO_ DOHHUD^FU_. .NTUQBRNIB LRC BF[C FBUMCBOMOR:
OBEOQKTFUQK D RENBMUEEU_ MUCHFPC^FF DOHHUD^FF (EC[MFSUM, LHK [MFRULUEEOGO RXVU DHCQQC
SimpleCollection) F OBDMXBXU REUVEUSN SFMN. )EF ECPXRCIBQK &*8"6#**(,( (internal iterator) F
&*#@*(,( (external iterator) FBUMCBOMCSF QOOBRUBQBRUEEO.
#ENBMUEEF_ FBUMCBOM OJXWEO [MULQBCRHKUB QOJO_ BN[O_, EUECLUZEX_ FBUMCBOM, DOBOMX_ [UMUJFMCUB
OJaUDBX DOHHUD^FF R UU BUDNTUS QOQBOKEFF. %QHF R DOHHUD^FF [MOFQYOLFB RQBCRDC FHF NLCHUEFU,
RENBMUEEFU FBUMCBOMX ECWFECIB RXDFLXRCB\ RQU BU QBMCEEXU `OMBUHF, O DOBOMXY GOROMFHOQ\ R ECWCHU
MCPLUHC. 5O ]BO_ [MFWFEU FY BTCBUH\EO [MKWNB OB VCHORHFRXY MND DHFUEBC. 0CD [MCRFHO, RENBMUEEFU
FBUMCBOMX BUQEO QRKPCEX QO QBMNDBNMCSF LCEEXY, FQ[OH\PORCEEXSF R MUCHFPC^FF DOHHUD^FF. 0CD F
HIJXU LMNGFU FBUMCBOMX, OEF SOGNB ROPRMCTCB\ *-NDCPCBUH\ FHF DNMQOM R PCRFQFSOQBF OB RCVFY
[OBMUJEOQBU_.
#EUVEFU FBUMCBOMX QOJHILCIB [MFE^F[ PCBUEUEFK. "CBUEUEFK SOZEO LOJFB\QK SEOGFSF Q[OQOJCSF,
WCQB\ FP DOBOMXY MCQQSCBMFRCUBQK LCHUU R ]BO_ GHCRU F R GHCRU 9. 0CD RQUGLC, QNB\ DMOUBQK EU R
DOEDMUBEOS CHGOMFBSU FHF QBMNDBNMU LCEEXY, C R BOS, DCD Q[MKBCB\ FY OB [NJHFDF.
Bpereuuue euyfpeuuue ufepafopu
%QHF REUVEF_ FBUMCBOM QOPLCUB WCQBENI DO[FI DOHHUD^FF (QS. [MULXLNTF_ MCPLUH) F [MF ]BOS EU
QNTUQBRNUB O[UMCBOMC [MUOJMCPORCEFK FHF DOEQBMNDBOMC, Q[OQOJEOGO [MURMCBFB\ FQYOLENI DOHHUD^FI
R WCQBENI, R DOEQBMNDBOMU REUVEUGO FBUMCBOMC SOZEO ROQ[OH\PORCB\QK RENBMUEEFS FBUMCBOMOS. #
QHULNITUS `MCGSUEBU LRC RENBMUEEFY FBUMCBOMC OJaULFEKIBQK R MUCHFPC^FF OLEOGO REUVEUGO:
class ExternalIterator {
private:
SimpleCollection collection;
SimpleIterator* my_iter; // G'-47$K$"*)% &'##"&B/"?
public:
ExternalIterator(ComplexCollection* c)
{
InternalIterator* iter = c->Iterator();
.28
while (c->More())
collection += *(c->Next());
delete iter;
my_iter = collection->Iterator();
}
bool More() { return my_iter->More(); }
bool Next() { return my_iter->Next(); }
};
ComplexCollection [MULOQBCRHKUB RENBMUEEF_ FBUMCBOM, DOBOMX_ QNTUQBRNUB MOREO QBOH\DO, QDOH\DO
EUOJYOLFSO LHK QOPLCEFK DO[FF. SimpleCollection ROPRMCTCUB FBUMCBOM, FQ[OH\PNUSX_ LHK
MUCHFPC^FF `NED^FF More() F Next() REUVEUGO FBUMCBOMC. 0OEUWEO, RQU SOGHO JX RXGHKLUB\ ECSEOGO
]HUGCEBEUU, UQHF JX N SimpleCollection JXH DOEQBMNDBOM Q CMGNSUEBOS ComplexCollection FHF N
ComplexCollection O[UMCBOMECK `NED^FK [MUOJMCPORCEFK operator SimpleCollection(). $O
LCZU [MF FY OBQNBQBRFF DHCQQ FBUMCBOMC OJUQ[UWFRCUB RUQ\ EUOJYOLFSX_ NMORUE\ FEDC[QNHK^FF.
Ycfoueue euyfpeuuue ufepafopu
+UMSFE NQBO_WFRX_ (persistent) OPECWCUB, WBO RENBMUEEF_ FBUMCBOM QNTUQBRNUB LO BUY [OM, [ODC
QNTUQBRNUB REUVEF_ FBUMCBOM (my_iter R [MULXLNTUS [MFSUMU). #ENBMUEEF_ FBUMCBOM SOZUB JXB\
[UMUSUEEO_ DHCQQC REUVEUGO FBUMCBOMC, DCD JXHO [ODCPCEO, C [MF LOQBCBOWEO_ OQBOMOZEOQBF UGO
SOZEO QOPLCB\ DCD [MOFPROLEX_ DHCQQ [OQMULQBROS PCDMXBOGO ECQHULORCEFK. #CMFCEB Q PCDMXBXS
ECQHULORCEFUS SOZUB RXGHKLUB\ BCD:
// G @$?#" .h
class Collection {
public:
class ExternalIterator {
public:
virtual bool More() = 0;
virtual Foo* Next() = 0;
};
ExternalIterator* Iterator();
};

// G @$?#" .cpp
// +$)*'%K/? &#$)), 4'-47$K$"2<? &#/"(*$2
class RealExternalIterator
: public ExternalIterator, private InternalIterator
(...);

Collection:ExternalIterator* Collection::Iterator()
{
return new RealExternalIterator(this);
}
)JHCLCITF_ HODCH\EO_ OJHCQB\I LU_QBRFK ExternalIterator OJUQ[UWFRCUB CJQBMCDBEX_ FEBUM`U_Q,
[MULOQBCRHKUSX_ DHFUEBN. $CQBOKTF_ ROPRMCTCUSX_ DHCQQ, RealExternalIterator, [OMOZLUE OB
Collection::ExternalIterator [OQMULQBROS OBDMXBOGO ECQHULORCEFK, C BCDZU (O WUS DHFUEB EU
[OLOPMURCUB) OB SimpleIterator [OQMULQBROS PCDMXBOGO ECQHULORCEFK. 0CD F R JOH\VFEQBRU
[MOJHUS LFPC_EC .++, PCDMXBOU ECQHULORCEFU [MOTU MUCHFPNUBQK, C LUHUGFMORCEFU [UMUSUEEO_ DHCQQC
ODCPXRCUBQK JOHUU NEFRUMQCH\EXS. $C[MFSUM, RX SOZUBU EC [OH[NBF PCSUEFB\ [UMUSUEENI, WBOJX
Q^U[FB\ EUQDOH\DO RENBMUEEFY FBUMCBOMOR R OLEOS REUVEUS.
.29
4unufpykue ufepafopu
)LEC FP [MOJHUS, QRKPCEEXY Q ]BO_ FLFOSO_ MUCHFPC^FK `NED^FF More(). 5MUL[OHCGCUBQK, WBO
`NED^FK Next() REUVEUGO FBUMCBOMC SOZUB [MO[NQBFB\ OJaUDB, ROPRMCTCUSX_ RENBMUEEU_ `NED^FU_
Next(). $C[MFSUM, UQHF RENBMUEEF_ FBUMCBOM ROPRMCTCUB ]HUSUEB, RQBCRHUEEX_ [OQHU
DOEQBMNFMORCEFK REUVEUGO FBUMCBOMC, REUVEF_ FBUMCBOM SOZUB PCYOBUB\ [MO[NQBFB\ UGO. :NED^FK
More() RENBMUEEUGO FBUMCBOMC PCKRHKUB, WBO R DOHHUD^FF UTU OQBCHFQ\ ]HUSUEBX, EO [MF [O[XBDU
FPRHUWUEFK OEF JHCGO[OHNWEO OBRUMGCIBQK `NED^FU_ Next(). )LFE FP RCMFCEBOR MUVUEFK RDHIWFB\
RO RENBMUEEF_ FBUMCBOM `NED^FI [OLQSCBMFRCEFK Peek(). +CDCK `NED^FK ROPRMCTCUB BO ZU, WBO F
Next(), EO EU [UMUSUTCUB DNMQOM D QHULNITU_ [OPF^FF. 5OQHU BCDOGO LOJCRHUEFK ROPEFDCUB
QBO[MO^UEBEO ECLUZEX_ Q[OQOJ REULMFB\ RENBMUEEF_ FBUMCBOM RO REUVEF_:
class RealExternalIterator : public ExternalIterator {
private:
InternalIterator* iter;
bool Accept(Foo*); // J/#,*73>K$% @3(&B/%
public:
RealExternalIterator(Collection* c) : iter(c->Iterator()) {}
virtual bool More()
{
while (iter.More()) {
if (Accept(iter->Peek()))
return true;
(void)iter->Next(); // L*4"78(3*, / 5"7"2")*/*,)%
}
return false;
}
virtual Foo* Next() { return iter->Next(); }
};
0CZLX_ MCP, DOGLC DHFUEB RXPXRCUB More() (R BOS WFQHU F R ECWCHU ^FDHC), RENBMUEEF_ FBUMCBOM
[UMUSUTCUBQK R[UMUL LO BUY [OM, [ODC EU ECBDEUBQK EC ]HUSUEB, DOBOMX_ NLORHUBROMKUB `FH\BMNITU_
`NED^FF Accept() REUVEUGO FBUMCBOMC.
# OQOJO PHORMULEXY DOHHUD^FKY, WBOJX MUCHFPORCB\ `NED^FI Peek(), RCS [MFLUBQK QOYMCEKB\ DO[FI
[OQHULEUGO NRFLUEEOGO OJaUDBC, OLECDO R JOH\VFEQBRU QHNWCUR NLCUBQK HUGDO RX[OHEFB\
EUMCPMNVCITUU QWFBXRCEFU BUDNTU_ [OPF^FF.
(CPNSUUBQK, ROPSOZEOQBF ]BO_ SUBOLFDF EU OGMCEFWFRCIBQK PCBUEUEFUS FBUMCBOMOR. %U SOZEO
[MFSUEKB\ R HIJO_ QFBNC^FF, DOGLC REUVEF_ FBUMCBOM OBRUMGCUB WCQB\ OJaUDBOR, ROPRMCTCUSXY
RENBMUEEFS. $C[MFSUM, `NED^FK Accept() SOZUB ECDHCLXRCB\ OGMCEFWUEFK LHK PC[MOQC D JCPU
LCEEXY.
Bpereuuan norefka
)LFE FP [MOQBU_VFY `ODNQOR LHK RQBCRDF RMUSUEECK [OSUBDC RQBCROD F FBUMCBOMOR. %QHF [OSUBDC
FBUMCBOMC OBEOQFBQK D JOHUU MCEEUSN SOSUEBN, WUS [OSUBDC [OPF^FF, FBUMCBOM [MO[NQDCUB OJaUDB R
LCEEO_ [OPF^FF. #MUSUEENI [OSUBDN SOZEO MUCHFPORCB\ [O-MCPEOSN: JNDRCH\EO (DCD DOHFWUQBRO
BCDBOR BC_SUMC); R RFLU EOSUMC YMCEKTUGOQK GLU-BO R QBCBFWUQDO_ [UMUSUEEO_ DHCQQC; FHF R
[UMUSUEEO_ OJaUDBC DOHHUD^FF.
4LCHUEFU OJMCJCBXRCUBQK CECHOGFWEO. %QHF DBO-BO [XBCUBQK NLCHFB\ OJaUDB FP DOHHUD^FF, R
LU_QBRFBUH\EOQBF OJaUDB OQBCUBQK EC QROUS SUQBU LO FQWUPEORUEFK RQUY QBCMXY FBUMCBOMOR. +UDNTFU
DHFUEBX F EORXU FBUMCBOMX FGEOMFMNIB UGO, C FBUMCBOMX, QDOEQBMNFMORCEEXU LO NLCHUEFK,
[MOLOHZCIB MCJOBCB\ BCD, QHOREO EFDBO EU QOOJTFH FS O [UWCH\EO_ QNL\JU OJaUDBC. :CDBFWUQDF
OJaUDB NLCHKUBQK HFV\ BOGLC, DOGLC OE PCRULOSO EFDOSN EU ENZUE. 6X QBOHDENHFQ\ Q OLEFS FP
RO[MOQOR QJOMDF SNQOMC, O DOBOMOS [O_LUB MUW\ R WCQBF 4. 4LCHUEEXU OJaUDBX HUGDO NEFWBOZCIBQK R
.30
[MO^UQQU QOYMCEUEFK DOHHUD^FF EC EOQFBUHU FE`OMSC^FF FHF R HIJO_ SOSUEB [MF OBQNBQBRFF
CDBFREXY FBUMCBOMOR F DNMQOMOR.
!EOGLC OJaUDB SOZUB ECYOLFB\QK QMCPN DCD RO RQBCRHUEEOS, BCD F R NLCHUEEOS QOQBOKEFF; RQBCRDC
[MOFPOVHC [OQHU BOGO, DCD FBUMCBOM JXH QDOEQBMNFMORCE, C NLCHUEFU LO NEFWBOZUEFK FBUMCBOMC. #
QNTEOQBF, LHK DCZLOGO OJaUDBC SOZEO RUQBF ^UHX_ ZNMECH RQBCROD F NLCHUEF_, UQHF LHK ]BFY QOJXBF_
YRCBFB ZFPEUEEOGO QMODC RCVUGO FBUMCBOMC. *HK RULUEFK BCDOGO ZNMECHC [OLYOLKB SEOGFU MCPHFWEXU
QBMNDBNMX LCEEXY. 3BC [OJOWECK BUSC LOQBCBOWEO FEBUMUQEC, YOBK OEC F EU FSUUB OQOJOGO OBEOVUEFK D
MCQQSCBMFRCUSXS FLFOSCS .++. 1BOJX OJUQ[UWFB\ EUOJYOLFSX_ NMORUE\ FEDC[QNHK^FF, SX REUQUS
EUDOBOMXU FPSUEUEFK R DOE^U[^FI RENBMUEEUGO FBUMCBOMC FP [MULXLNTUGO MCPLUHC.
Knacc epereuuux refok
.HULNITF_ DHCQQ FEDC[QNHFMNUB RMUSUEEXU [OSUBDF. %GO SOZEO SOLF`F^FMORCB\, WBOJX RSUQBO
[OQHULORCBUH\EOGO QWUBWFDC FQ[OH\PORCHFQ\ [ODCPCEFK QFQBUSEXY WCQOR LHK DHFUEBC ]BO GHNJODO
JUPMCPHFWEO. )JMCBFBU REFSCEFU: DOEQBMNDBOM DO[F_ F O[UMCBOM = *# >#6#768D+F".4. 5MF [UMULCWU
Timestamp [O PECWUEFI QOPLCUBQK RMUSUEEX_ OJaUDB Timestamp Q BUS ZU RMUSUEUS, WBO F R FQYOLEOS
OJaUDBU, C R QHNWCU [MFQRCFRCEFK OLEOGO Timestamp LMNGOSN HUROQBOMOEEF_ OJaUDB [MFOJMUBCUB BN ZU
SUBDN, WBO F [MCROQBOMOEEF_.
class Timestamp {
private:
static int last_time; // D)5'#,-3"*)% 0#% 57/)4$/4$(/% ./)#$
int stamp;
public:
Timestamp() : stamp(++last_time) {}
bool operator>(Timestamp ts) { return stamp > ts.stamp; }
bool operator>=(Timestamp ts) { return stamp >= ts.stamp; }
bool operator<(Timestamp ts) { return stamp < ts.stamp; }
bool operator<=(Timestamp ts) { return stamp <= ts.stamp; }
bool operator==(Timestamp ts) { return stamp == ts.stamp; }
bool operator!=(Timestamp ts) { return stamp != ts.stamp; }
};
Buyfpeuuu ufepafop c epereuuo norefko
#ENBMUEEF_ FBUMCBOM BCDZU EUOJYOLFSO SOLF`F^FMORCB\, WBOJX OE NWFBXRCH [MFQNBQBRFU RMUSUEEXY
[OSUBOD. .OOBRUBQBRNITFU `MCGSUEBX FEBUM`U_QC [MFRULUEX EFZU. 5OLMOJEOQBF MUCHFPC^FF R
PECWFBUH\EO_ SUMU O[MULUHKIBQK QBMNDBNMCSF LCEEXY DOHHUD^FF:
class InternalIterator {
public:
bool More(Timestamp as_of);
Foo* Next(Timestamp as_of);
bool Peek(Timestamp as_of);
};
#ENBMUEEF_ FBUMCBOM JNLUB [MO[NQDCB\ OJaUDBX, OBQNBQBRORCRVFU R DOHHUD^FF R NDCPCEEOU RMUSK.
Cnocou euyfpeuue peanusauuu
)LFE FP ROPSOZEXY [NBU_ MUCHFPC^FF BCDOGO [ORULUEFK QRKPCB\ Q DCZLO_ [OPF^FU_ DOHHUD^FF
RUDBOM RMUSUEEXY [OSUBOD, R DOBOMOS QCSX_ QBCMX_ ]HUSUEB JNLUB QOOBRUBQBRORCB\ FQYOLEO_ RQBCRDU,
C [OQHULNITFU ]HUSUEBX [OOWUMULEO O[FQXRCB\ [OQHULNITFU RQBCRDF F NLCHUEFK. %QHF RUDBOM
QOLUMZFB EUWUBEOU DOHFWUQBRO ]HUSUEBOR, OJaUDB R ECQBOKTUU RMUSK ECYOLFBQK R DOHHUD^FF, C [UMRX_
]HUSUEB RUDBOMC OBEOQFBQK D SOSUEBN [OQHULEU_ RQBCRDF. %QHF WFQHO ]HUSUEBOR WUBEOU, OJaUDB
OBQNBQBRNUB R DOHHUD^FF, C [UMRX_ ]HUSUEB O[FQXRCUB SOSUEB [OQHULEUGO NLCHUEFK. # [MO^UQQU
N[HOBEUEFK DOHHUD^FF N[HOBEKIBQK F ZNMECHX NLCHUEF_ R EFY OQBCUBQK HFV\ SOSUEB [OQHULEU_
.3.
RQBCRDF. .NTUQBRNIB F LMNGFU ROPSOZEOQBF MUCHFPC^FF (EC[MFSUM, WUMUP Q[FQDF FQDHIWUEF_), OLECDO
SUBOLFDC ZNMECHOR NLCHUEF_ [O DMC_EU_ SUMU LUSOEQBMFMNUB DOE^U[^FI.
Bueuuu ufepafop c epereuuo norefko
#EUVEF_ FBUMCBOM [MULQBCRHKUB QOJO_ BMFRFCH\ENI OJOHOWDN LHK BOH\DO WBO O[FQCEEOGO RENBMUEEUGO
FBUMCBOMC:
class RealExternalIterator : public ExternalIterator {
private:
InternalIterator* iter;
Timestamp my_time; // G7"2% &'()*73/7'4$(/% this
bool Accept(Foo*); // J/#,*73>K$% @3(&B/%
public:
RealExternalIterator(Collection* c) : iter(c->Iterator()) {}
virtual bool More() {
while (iter.More(my_time)) {
if (Accept(iter->Peek(my_time)))
return true;
(void)iter->Next(my_time);
}
return false;
}
virtual Foo* Next() { return iter->Next(my_time); }
};
8UPCMGNSUEBEX_ DOEQBMNDBOM Timestamp FQ[OH\PNUB LHK [OSUBDF BUDNTUU RMUSK. #O SEOGFY QFBNC^FKY
`NED^FK Accept() RQUGLC ROPRMCTCUB true, F UU SOZEO NJMCB\.
Rpurep
*CRC_BU PCRUMVFS ]BN PCBKENRVNIQK GHCRN [MFSUMOS VCJHOEOS LHK ECJOMC OJaUDBOR, BF[ DOBOMXY
O[MULUHKUBQK [CMCSUBMOS VCJHOEC. # ]BOS ECJOMU DCZLX_ OJaUDB [MFQNBQBRNUB MOREO OLFE MCP; [MF
[O[XBDU QEORC RQBCRFB\ NZU QNTUQBRNITF_ OJaUDB ECJOM OQBCUBQK JUP FPSUEUEF_. *HK MUCHFPC^FF
ECLUZEXY FBUMCBOMOR JNLUB FQ[OH\PORCEC SUBOLFDC RMUSUEEXY [OSUBOD RSUQBO WCQBEXY DO[F_,
QOPLCRCUSXY [MF DOEQBMNFMORCEFF FBUMCBOMC. "COLEO SX [OQSOBMFS, EC DCDFU NYFTMUEFK [OMO_
[MFYOLFBQK FLBF, WBOJX MCPNSEO FQ[OH\PORCB\ EUMCPNSEXU DOSSUMWUQDFU DHCQQX.
Heuapeuu korrepecku knacc cnoeapn
# MUCH\EOS SFMU MULDO [MFYOLFBQK ECWFECB\ Q [NQBOGO SUQBC. )JXWEO R RCVUS MCQ[OMKZUEFF NZU
FSUIBQK GOBORXU DHCQQX DOHHUD^F_. *CZU UQHF OEF MCJOBCIB EU QORQUS BCD, DCD YOWUBQK, [O DMC_EU_
SUMU OEF FPJCRKB RCQ OB ENLEOGO [UMU[FQXRCEFK HIJFSXY GHCR FP DEFG 0ENBC [MF MUCHFPC^FF JCPORXY
QBMNDBNM LCEEXY. # BOS ZU MUCH\EOS SFMU ]BF DHCQQX OJXWEO EU OJMCTCIB OQOJOGO REFSCEFK EC
[MOJHUSN ECLUZEOQBF FBUMCBOMOR, BCD WBO ECV [MFSUM EFDCD EU ECPORUV\ CJQBMCDBEXS. *HK [NTUGO
MUCHFPSC SX JNLUS QWFBCB\, WBO DOHHUD^FK [MULQBCRHKUB QOJO_ QHORCM\, DOBOMX_ FELUDQFMNUB PECWUEFU
BF[C void* F ROPRMCTCUB void* R DCWUQBRU DHIWC. !SUUBQK [CQQFREX_ FBUMCBOM Slot, MUCH\ECK
QBMNDBNMC DOBOMOGO Q[MKBCEC GHNJODO RENBMF DHCQQC QHORCMK. )BDMXBX_ FEBUM`U_Q RXGHKLFB BCD:
class Dictionary {
public:
Dictionary(); // F'-0$"* 53)*'? )#'4$7,
Dictionary(const Dictionary&); // I'()*73&*'7 &'5/?
~Dictionary();
Dictionary& operator=(const Dictionary&);

void AddEntry(void* key, void* value);
.32
bool At(void* key, void*& value);
void RemoveEntry(void* key);

typedef void* Slot; // +$)*'%K"" ';E%4#"(/" ($0"1(' )57%*$('
Slot First(); // G'-47$K$"* Slot 0#% 5"7";'7$
// Y&4/4$#"(* ($M"? @3(&B// Peek
bool GetCurrent(Slot slot, void*& key, void*& value);
// Y&4/4$#"(* ($M"? @3(&B// Next
bool GetNext(Slot& slot, void*& key, void*& value);
};
:NED^FK AddEntry() PCEOQFB R QHORCM\ EOROU PECWUEFU Q PCLCEEXS DHIWOS. %QHF DHIW NZU
QNTUQBRNUB LHK LMNGOGO PECWUEFK, PECWUEFU PCSUEKUBQK EORXS. :NED^FK At() ROPRMCTCUB HOGFWUQDF_
DOL, DOBOMX_ [ODCPXRCUB, [MFQNBQBRNUB HF DHIW R QHORCMU; UQHF [MFQNBQBRNUB, `NED^FK ROPRMCTCUB
true F value (PECWUEFU, QOOBRUBQBRNITUU LCEEOSN DHIWN). :NED^FK RemoveEntry() NLCHKUB DHIW F
QRKPCEEOU Q EFS PECWUEFU. :NED^FK First() ROPRMCTCUB [CQQFREX_ FBUMCBOM, EC[MCRHUEEX_ BCDFS
OJMCPOS, WBOJX [UMRX_ RXPOR GetNext() ROPRMCBFH [UMRX_ ]HUSUEB QHORCMK. :NED^FK GetCurrent()
ROPRMCTCUB [CMN DHIW/PECWUEFU, ECYOLKTNIQK R BUDNTU_ [OPF^FF Slot. :NED^FK GetNext()
ROPRMCTCUB [CMN DHIW/PECWUEFU F [UMUSUTCUB FBUMCBOM D QHULNITUSN ]HUSUEBN. %LFEQBRUEEOU
OBHFWFU SUZLN ]BFSF `NED^FKSF PCDHIWCUBQK R [UMUSUTUEFF HOGFWUQDO_ [OPF^FF [OQHU [OHNWUEFK
OJaUDBC.
6X ROQ[OH\PNUSQK QHORCMUS QHULNITFS OJMCPOS: DHIWOS JNLUB OJaUDB, YMCEKTF_QK R ECVUS ECJOMU,
C PECWUEFUS ]BOGO DHIWC ZNMECH RQBCROD/NLCHUEF_ LHK LCEEOGO OJaUDBC.
Knacc ypuana
$FZU [MFRULUE OBDMXBX_ FEBUM`U_Q DHCQQC, R DOBOMOS YMCEFBQK FQBOMFK RQBCROD/NLCHUEF_ LHK
OJaUDBC. 3BOB DHCQQ FQ[OH\PNUB MCQQSOBMUEEX_ RXVU DHCQQ Timestamp OE OJMCPNUB RBOMNI
QOQBCRHKITNI [CM DHIW/PECWUEFU, YMCEKTFYQK R QHORCMU. # MUCHFPC^FF EUB EFWUGO FEBUMUQEOGO,
[O]BOSN K UU [MO[NQDCI.
class History {
public:
History(); // =3)*'? 137($#
void Insert(Timestamp); // G)*$4&$ 4 -$0$(('" 47"2%
void Remove(Timestamp); // H0$#"(/" 4 -$0$(('" 47"2%
bool Exists(Timestamp); // G -$0$(('" 47"2%
bool Exists(); // G ($)*'%K/? 2'2"(*
};
:NED^FK Exists(Timestamp) ROPRMCTCUB true, UQHF R PCLCEEOU RMUSK [OQHULEU_ O[UMC^FU_ JXHC
RQBCRDC, F false UQHF [OQHULEU_ O[UMC^FU_ JXHO NLCHUEFU FHF LO ]BOGO RMUSUEF ROOJTU EU JXHO
O[UMC^F_. 8UPCMGNSUEBECK `NED^FK Exists() KRHKUBQK QFEOEFSOS LHK Exists(Timestamp) Q OWUE\
JOH\VFS PECWUEFUS RMUSUEF BO UQB\ LO ECQBOKTUGO SOSUEBC.
Acfpakfuu asoeu knacc
0HCQQ ECJOMC LUHFBQK EC LRU WCQBF: CJQBMCDBEX_ JCPORX_ DHCQQ, MCJOBCITF_ Q void*, F [MOFPROLEX_
[CMCSUBMFPORCEEX_ DHCQQ, R DOBOMX_ LOJCRHUEC JUPO[CQEOQB\ BF[OR. -JQBMCDBEX_ JCPORX_ DHCQQ
RXGHKLFB BCD:
// G @$?#" Set.h
class SetBase : private Dictionary {
friend class InternalIterator;
protected:
SetBase(); // S*';< &#$)) ;<# $;)*7$&*(<2
.33
public:
class Iterator { // P$-'4<? &#$)) 4("M("8' /*"7$*'7$
public:
virtual bool More() = 0;
virtual Type* Next() = 0;
};
};
Iterator* SetBase::ProvideIterator()
{
return new InternalIterator(this);
}
void SetBase::AddObject(void* entry)
{
void* v;
History* h;
if (At(entry, v)) { // H1" ")*, 57'4"7/*, 47"2%
h = (History*)v;
if (!h->Exists()) // +"';C'0/2' 4<5'#(/*, 4)*$4&3
h->Insert(Timestamp());
}
else { // VK" ("*
h = new History;
h->Insert(Timestamp());
AddEntry(entry, h);
}
}
void SetBase::RemoveObject(void* entry)
{
void* v;
History* h;
if (At(entry, v)) { // H1" ")*, 57'4"7/*, 47"2%
h = (History*)v;
if (h->Exists()) // +"';C'0/2' 4<5'#(/*, 30$#"(/"
h->Remove(Timestamp());
}
}
bool SetBase::Exists(void* entry, Timestamp ts)
{
void* v;
return At(entry, v) && ((History*)v)->Exists(ts);
}
bool SetBase::Exists(void* entry)
{
void* v;
return At(entry, v) && ((History*)v)->Exists();
}
.NTUQBRNIB F LMNGFU ROPSOZEOQBF, DOBOMXU SOZEO JXHO LOJCRFB\, EO F [ODCPCEEOGO R[OHEU YRCBFB
LHK LUSOEQBMC^FF MCQQSCBMFRCUSO_ SUBOLFDF.
.34
Buyfpeuuu ufepafop
1BOJX MUCHFPORCB\ `NED^FI ProvideIterator(), SX QOPLCUS DCD EUBF[FPFMORCEEX_ RENBMUEEF_
FBUMCBOM, OGMCEFWUEEX_ `C_HOS .cpp F [MOFPROLEX_ OB SetBase::Iterator, BCD F REUVEF_ R RFLU
[CMCSUBMFPORCEEO_, JUPO[CQEO_ [O OBEOVUEFI D BF[CS OJOHOWDF. $FZU [MFRULUE DOL RENBMUEEUGO
FBUMCBOMC, OJaKRHUEEOGO QBCBFWUQDF (BO UQB\ HODCH\EOGO [O OBEOVUEFI D `C_HN .cpp). #QK HOGFDC
RMUSUEEXY [OSUBOD Q[MKBCEC R MUCHFPC^FF ]BOGO DHCQQC.
// G @$?#" set.cpp
class InternalIterator : public SetBase::Iterator {
private:
Dictionary* dictionary;
Dictionary::Slot* slot; // A"&3K$% 5'-/B/%
Timestamp my_time; // G7"2% 7'10"(/% 0$(('8' /*"7$*'7$
public:
InternalIterator(Dictionary* d)
: dictionary(d), slot(d->First()), my_time() {}
virtual bool More();
virtual void* Next();
};
bool InternalIterator::More()
{
void* key;
void* h;
if (!dictionary->GetCurrent(slot, key, h))
return false; // 5'-/B/% 4<C'0/* -$ *"&3K/" 87$(/B<

do
if (((History*)h)->Exists(my_time))
return true;
while (dictionary->GetNext(slot, key, h));
return false;
}
void* InternalIterator::Next()
{
void* key;
void* key1;
void* h;
// =7"05'#$8$"*)%, .*' &#/"(* )($.$#$ 4<-4$# More(),
// 5'Q*'23 ';E"&* GetNext() (" 3)*$7"#
dictionary->GetCurrent(slot, key, h);
dictionary->GetNext(slot, key1, h);
return key;
}
Raparefpusoeauuan oonoka, esonacuan no ofuoueuuk k funar
$CDOEU^, R [MFRULUEEOS EFZU [CMCSUBMFPORCEEOS DHCQQU RQU QBCEORFBQK JUPO[CQEXS [O OBEOVUEFI D
BF[CS F ECWFECUB MCLORCB\ GHCP. #EUVEF_ FBUMCBOM [MULQBCRHKUB QOJO_ [CMCSUBMFPORCEENI OJOHOWDN
LHK RENBMUEEUGO FBUMCBOMC, [MULOQBCRHKUSOGO SetBase.
template <class Type>
class Set : private SetBase {
.35
public:
// P"-$7832"(*(<? &'()*73&*'7 5'0C'0/*
// I'()*73&*'7 &'5/? 5' 32'#.$(/> 5'0C'0/*
// L5"7$*'7 = 5' 32'#.$(/> *'1" 5'0C'0/*
Set<Type>& operator+=(Type* object)
{ AddObject(object); return *this; }
Set<Type>& operator-=(Type* object)
{ RemoveObject(object); return *this; }
bool operator>=(Type* object)
{ return Exists(object); }
class Iterator {
private:
SetBase::Iterator* iter;
public:
Iterator(Set&* i) : iter(s.ProvideIterator()) {}
bool More() { return iter->More(); }
Type* Next() { return (Type*)(iter->Next()); }
};
Iterator* ProvideIterator()
{ return new Set::Iterator(*this); }
};
.NTUQBRNIB F LMNGFU ROPSOZEOQBF, DOBOMXU JXHO JX EU[HOYO LOJCRFB\ R [CMCSUBMFPORCEEX_ DHCQQ,
EO K LNSCI, WBO RX [OEKHF OJTF_ [MFE^F[. )B [OLOJEXY [CMCSUBMFPORCEEXY DHCQQOR MULDO QOPLCIBQK
[MOFPROLEXU, [O]BOSN RHOZUEEX_ DHCQQ FBUMCBOMC O`OMSHUE Q FQ[OH\PORCEFUS [OLQBCRHKUSXY
`NED^FK. # QNTEOQBF, ]BOB FBUMCBOM SOZEO [MOQBO OJaKRFB\ R QBUDU:
Set::Iterator iter(aSet);
+CDO_ RCMFCEB MCJOBCUB R[OHEU EOMSCH\EO, OLECDO OE EU QOOBRUBQBRNUB OJXWEO_ FLFOSU ROPRMCTUEFK
FBUMCBOMC FP DOHHUD^FF. "CQHNZFRCUB REFSCEFK F LMNGO_ RCMFCEB: QLUHCB\ SetBase [UMUSUEEO_ DHCQQC
RSUQBO PCDMXBOGO JCPOROGO DHCQQC. 3BO [OPROHFB RCS N[MKBCB\ SetBase R `C_H .cpp, WBOJX DHFUEB
EFDOGLC EU RFLUH UGO. *HK ]BOGO R VCJHOEU Set [MFLUBQK O[MULUHFB\ DOEQBMNDBOMX F O[UMCBOM =, EO RQU
OQBCH\EXU SOLF`FDC^FF VCJHOEC JNLNB [MOQBXSF F EUPCSXQHORCBXSF.
Tpausakuuu u
reuuanuuue
ykasafenu
6X [OLOVHF D [OQHULEU_ GHCRU, [OQRKTUEEO_ DOQRUEEXS OJMCTUEFKS (DOBOMCK, R[MOWUS, LCHUDO EU
FQWUM[XRCUB ]BO_ BUSX). *CRC_BU [OQSOBMFS, DCD MCPRFB\ FLUI NSEXY NDCPCBUHU_. #QBMUWCRVFUQK LO
QFY [OM FLFOSX F [MFSUMX NSEXY F SNLMXY NDCPCBUHU_, DNMQOMOR F FBUMCBOMOR GHCREXS OJMCPOS JXHF
HODCHFPORCEX R OLEOS FEDC[QNHFMORCEEOS OJaUDBU. >RCBFB SUHOWFB\QK [OMC [OGOROMFB\ O BOS, DCD
JNLUB RXGHKLUB\ CMYFBUDBNMC R ^UHOS, UQHF [MFSUEFB\ ]BF FLFOSX R JOHUU VFMODOS SCQVBCJU.
4DCPCBUHF, MCQQSCBMFRCUSXU R ]BO_ GHCRU, NSEX ECQBOH\DO, WBO QBCEORFBQK [MOQBO QBMCVEO. 3[FBUBX
NSEX_ F SNLMX_ NZU EU O[FQXRCIB FY R LOQBCBOWEO_ QBU[UEF. 5OBMKQCITFU, OQHU[FBUH\EXU,
EURUMOKBEO OLCMUEEXU PRNWFB QHFVDOS RXQ[MUEEU, [O]BOSN K QDMOSEO ECPORN FY GUEFCH\EXSF.
5MULN[MUZLUEFU: R ]BO_ GHCRU [MORUMKUBQK EU BOH\DO RCVU SCQBUMQBRO, EO F ROOJMCZUEFU. )[FQCEEXU
EFZU [MOJHUSX F FLFOSX EC[OSFECIB NPDNI GOMENI BMO[N, [O DOBOMO_ SOZEO [MOUYCB\ BOH\DO EC
RUHOQF[ULU. $CLURC_BU VHUS F [OWCTU OQBCECRHFRC_BUQ\, WBOJX [UMULOYENB\.
Tepuucfue nyfu pusaua
0CD [MCRFHO, [OQHU O[FQCEFK FLFOS R ]BO_ DEFGU QMCPN ZU MCQQSCBMFRCIBQK FY [MCDBFWUQDFU
[MFSUEUEFK. 5OPROH\BU SEU OBDHOEFB\QK OB ]BO_ BMCLF^FF F OJQNLFB\ EUDOBOMXU [MOJHUSX LFPC_EC,
DOBOMXU [OECLOJKBQK ECS [OPLEUU [O SUMU BOGO, DCD JNLUB MCPROMCWFRCB\QK LU_QBRFU ]BO_ GHCRX.
Tpausakuuu
# [MFHOZUEFKY DHFUEB/QUMRUM F JCPCY LCEEXY WCQBO RQBMUWCUBQK QFBNC^FK, DOGLC EUQDOH\DO NLCHUEEXY
[OH\PORCBUHU_ OJMCTCIBQK Q PC[MOQOS EC OJEORHUEFU OLEO_ JCPX FHF QBMNDBNMX LCEEXY. 0RCEB
OJEORHUEFK, FHF "6+*9+$C(4 (transaction), Q BOWDF PMUEFK DHFUEBC SOZUB QOQBOKB\ FP EUQDOH\DFY
]HUSUEBCMEXY FPSUEUEF_ R JCPU FHF QBMNDBNMU LCEEXY. # BCDFY QFBNC^FKY MCPMCJOBWFDF
MNDOROLQBRNIBQK EUQDOH\DFSF [MCRFHCSF, [OPCFSQBRORCEEXSF FP SFMC .48*:
/. +MCEPCD^FF LOHZEX JXB\ CBOSCMEXSF. 'FJO REOQKBQK RQU FPSUEUEFK, EUOJYOLFSXU LHK
QORUMVUEFK BMCEPCD^FF, HFJO EFDCDFU.
2. #O RMUSK OJMCJOBDF BMCEPCD^FF OLEOGO DHFUEBC LCEEXU LOHZEX RXGHKLUB\ BCD, DCD OEF
RXGHKLUHF R ECWCHU EUPCRUMVUEEXY BMCEPCD^F_ RQUY OQBCH\EXY DHFUEBOR. *O SOSUEBC QROUGO
PCRUMVUEFK BMCEPCD^FK OQBCUBQK EURFLFSO_ LHK LMNGFY DHFUEBOR; RQU RXGHKLFB BCD, QHOREO
BMCEPCD^FK F EU ECWFECHCQ\.
3. %QHF QMCPN EUQDOH\DO DHFUEBOR R QROFY BMCEPCD^FKY [XBCIBQK FPSUEFB\ OLFE OJaUDB,
LO[NQDCUBQK NQ[UVEOU PCRUMVUEFU EU JOHUU OLEO_ BMCEPCD^FF.
5OQHULEUU [MCRFHO GCMCEBFMNUB, WBO DCZLX_ OJaUDB OJEORHKUBQK EU JOHUU WUS OLEFS DHFUEBOS.
.NTUQBRNIB LRU QBMCBUGFF UGO MUCHFPC^FF:
9
.38
/. 5UMUL RX[OHEUEFUS OJEORHUEFK DCZLCK BMCEPCD^FK JHODFMNUB RQU OJaUDBX, DOBOMXU OEC
QOJFMCUBQK FPSUEFB\. %QHF BMCEPCD^FF EU NLCUBQK NQBCEORFB\ EUOJYOLFSXU JHODFMORDF, OEC
ROOJTU EU ECWFECUBQK.
2. "C[MOQ EC JHODFMORDN RXLCUBQK EU RECWCHU, C RO RMUSK BMCEPCD^FF [O SUMU RX[OHEUEFK
OJEORHUEF_. %QHF EUOJYOLFSX_ OJaUDB NZU PCJHODFMORCE LMNGFS DHFUEBOS, BO BMCEPCD^FK HFJO
OZFLCUB UGO OQROJOZLUEFK, HFJO PCRUMVCUBQK EUNLCWU_.
#BOMCK QBMCBUGFK SOZUB [MFRUQBF D RPCFSEO_ JHODFMORDU (deadlock): BMCEPCD^FK A JHODFMNUB OJaUDB X
F OZFLCUB ROPSOZEOQBF JHODFMORDF OJaUDBC Y, BOGLC DCD BMCEPCD^FK B JHODFMNUB OJaUDB Y F OZFLCUB
ROPSOZEOQBF JHODFMORDF OJaUDBC X.
# SFMU JCP LCEEXY EC ]BN BUSN EC[FQCEO OGMOSEOU DOHFWUQBRO HFBUMCBNMX, [O]BOSN EUB QSXQHC UU
PLUQ\ [OLMOJEO MCQQSCBMFRCB\. $CQ FEBUMUQNIB BU FLFOSX F ROPSOZEOQBF .++, DOBOMXU OJHUGWCIB
MUVUEFU ^UHOGO DHCQQC [OLOJEXY PCLCW.
Ofreua
6EOGFU GMC`FWUQDFU [MFHOZUEFK HIJUPEO MCPMUVCIB [OH\PORCBUHI OBSUEFB\ [OQHULEII
RX[OHEUEENI O[UMC^FI. $C [UMRX_ RPGHKL R ]BOS EUB EFWUGO QHOZEOGO, EO R LU_QBRFBUH\EOQBF EU RQU
BCD [MOQBO. # OJaUDBEO-OMFUEBFMORCEEOS SFMU EC_LUBQK EU BCD NZ SEOGO [MOJHUS LFPC_EC, DOBOMXU
RXPXRCIB JOH\VNI GOHORENI JOH\, WUS [MOJHUSX OBSUEX R QHOZEXY [MFHOZUEFKY. 1BOJX
MUCHFPORCB\ OBSUEN, SEOGFU [MOGMCSSFQBX PCVFRCIB R [MOGMCSSN QBMNDBNMX LCEEXY,
OMFUEBFMORCEEXU EC DOEDMUBENI O[UMC^FI, EO BCDO_ [OLYOL WMURCB OVFJDCSF F EUNQBO_WFR [MF
QO[MOROZLUEFF [MOGMCSSX.
# EUDOBOMXY KPXDCY (BCDFY DCD Lisp) SOZEO JNDRCH\EO LUHCB\ QEFSDF [CSKBF R MCPHFWEXU SOSUEBX
RMUSUEF. 5MF ECHFWFF BCDOGO QEFSDC RUMENB\QK D [MUZEUSN QOQBOKEFI [MFHOZUEFK OWUE\ [MOQBO. 4RX.
# .++ BCDFY FPKTEXY ROPSOZEOQBU_ EU [MULNQSOBMUEO; PCBO *+@( [MOGMCSSX EU PC[MCVFRCIB 3 ,J
[CSKBF F NQ[URCIB PCRUMVFB\ MCJOBN UTU LO OJULC. +CD WBO ]BO PCSUWCEFU QBOFB ROQ[MFEFSCB\ EU DCD
DMFBFDN .++, C DCD DOEQBCBC^FI `CDBC: [MOJHUSC UQB\, F UU EUOJYOLFSO MUVCB\.
# LCH\EU_VUS OJQNZLUEFF JNLNB MCQQSCBMFRCB\QK LRU RCMFC^FF EC ]BN BUSN. )LEF [MFHOZUEFK RQUGLC
[MULOQBCRHKIB OLFE NMORUE\ OBSUEX, C R LMNGFY [OH\PORCBUH\ SOZUB RXJFMCB\ DOSCELN Undo QEORC F
QEORC [MOGMCSSC DCZLX_ MCP ROPRMCTCUBQK EC OLEN O[UMC^FI ECPCL. 0OEUWEO, OGMCEFWUEFK RQU ZU
QNTUQBRNIB, EO OJXWEO EU OWUE\ ZUQBDFU. 3BO ECPXRCUBQK SEOGONMOREURO_ OBSUEO_ [MOJHUSC,
DOBOMO_ SX PC_SUSQK [OQHU OLEONMOREURO_ OBSUEX. #BOMCK RCMFC^FK OBEOQFBQK D DOEBUDQBEO_ OBSUEU.
%QHF [OH\PORCBUH\ RX[OHEKUB O[UMC^FI OBSUEX QECWCHC R OLEOS, C [OBOS R LMNGOS ODEU, BO [OQHU
ROPRMCBC D [UMROSN ODEN F RX[OHEUEFK DOSCELX Undo OJXWEO QHULNUB OBSUEFB\ [OQHULEII O[UMC^FI
BOH\DO LHK [UMROGO ODEC, C EU LHK RQUGO [MFHOZUEFK. !ECWU GOROMK, O[UMC^FK OBSUEX NWFBXRCUB
DOEBUDQB [MFHOZUEFK EC SOSUEB QROUGO RXPORC.
Xeafuf?
.NTUQBRNIB F LMNGFU [MOJHUSX, OBEOQKTFUQK D BOSN ZU DHCQQN, EO F QDCPCEEOGO R[OHEU LOQBCBOWEO,
WBOJX [OLBOHDENB\ ECQ D LCH\EU_VFS FQQHULORCEFKS. 8OH\VFEQBRO [MOGMCSSFQBOR MCQQSCBMFRCUB ]BF
[MOJHUSX DCD EUWBO FPOHFMORCEEOU R DOEBUDQBU DOEDMUBEOGO [MFHOZUEFK. )LECDO, DCD RX RQDOMU
NJULFBUQ\, EUDOBOMXU Q[U^F`FWUQDFU (C DBO-BO QDCZUB FPRMCTUEEXU) OQOJUEEOQBF QFEBCDQFQC .++
[OPROHKIB [MFJHFPFB\QK D OJTFS MUVUEFKS. 5OSEFBU: SX FPNWCUS .++ F UGO FLFOSX, C EU QBMNDBNMX
LCEEXY FHF [MFE^F[X [MOUDBFMORCEFK [MOGMCSS. 6EOGFU CMYFBUDBNMX F RCMFCEBX PLUQ\ EU
[MFROLKBQK, OLECDO ]BO RORQU EU GOROMFB [MOBFR EFY.
Opasu u ykasafenu
(CPRU SOZEO ECWCB\ EORNI GHCRN F EU RRUQBF EORNI MCPEORFLEOQB\ NDCPCBUHU_? .OQBOKEFU OJaUDBC
SOZEO ROQQBCEORFB\ LRNSK Q[OQOJCSF: QOYMCEFB\ UGO OJMCP (image) LO F [OQHU O[UMC^FF FHF ZU
YMCEFB\ FE`OMSC^FI, LOQBCBOWENI LHK RX[OHEUEFK O[UMC^F_ R OJMCBEOS EC[MCRHUEFF. #CMFCEB
LOQBCBOWEO [MOQB F NEFRUMQCHUE, C [O[XBDF ROPRMCBC WUMUP RX[OHEUEFU O[UMC^F_ R OJMCBEOS
EC[MCRHUEFF [MFRKPCEX D DOEDMUBEOSN OJaUDBN F [MFHOZUEFI, [O]BOSN K [MUL[OWFBCI YMCEFB\
EUQDOH\DO DO[F_ OLEOGO OJaUDBC. 0HIWURCK DOE^U[^FK, OJUQ[UWFRCITCK MUCHFPC^FI ]BO_ SUBOLFDF EC
.++ NDCPCBUH\ OJMCPOR (image pointer). +CDFU NDCPCBUHF EUPCSUBEO LHK DHFUEBC QOLUMZCB EUQDOH\DO
.39
DO[F_ NDCPXRCUSOGO OJaUDBC. .NTUQBRNUB SEOZUQBRO RQUROPSOZEXY DOSJFEC^F_ F RCMFC^F_, BCD WBO
RXJOM PCRFQFB GHCREXS OJMCPOS OB RCVUGO ECQBMOUEFK.
Rpocfo ykasafenu opasoe
$C EUQDOH\DFY JHFZC_VFY QBMCEF^CY [ODCPCEO [MOQBU_VUU MUVUEFU ]BO_ [MOJHUSX. - [ODC HFV\
QDCZN, WBO SX FSUUS LUHO Q RULNTFS NDCPCBUHUS, NLCHKITFS OJaUDBX, EC DOBOMXU OE QQXHCUBQK.
template <class Type>
class ImagePtr {
private:
Type* current; // A"&3K/? ';7$-, 57"0')*$4#%"2<? &'25'("(*3
Type* undo; // =7"0<03K/? ';7$-
public:
ImagePtr() : undo(NULL), current(new Type) {}
ImagePtr(const ImagePtr<Type>& ip)
: current(new Type(*(ip.current))), undo(NULL) {}
~ImagePtr() { delete current; delete undo; }
ImagePtr<Type>& operator=(const ImagePtr<Type>& ip)
{
if (this != &ip) {
delete current;
current = new Type(*(ip.current));
}
return *this;
}
void Snapshot()
{
delete undo; // +$ )#3.$?, ")#/ ;<# )*$7<? ';7$-
undo = current;
current = new Type(*undo);
}
void Commit()
{
delete undo;
undo = NULL;
}
void Rollback()
{
if (undo != NULL) {
delete current;
current = undo;
undo = NULL;
}
}
Type* operator->() const { return current; }
};
4DCPCBUH\ RQUGLC ROPRMCTCUB BUDNTF_ OJMCP DCD PECWUEFU O[UMCBOMC ->, OLECDO PC DNHFQCSF OE
[MKWUB [MULXLNTNI RUMQFI NDCPXRCUSOGO OJaUDBC. :NED^FK Shapshot() QOPLCUB OJMCP Q [OSOT\I
DOEQBMNDBOMC DO[F_ NDCPXRCUSOGO OJaUDBC. %QHF DHFUEB [UMULNSCUB F PCYOWUB OBDCPCB\QK OB FPSUEUEF_,
OE RXPXRCUB `NED^FI Rollback(); UQHF FPSUEUEFK UGO NQBMCFRCIB, OE RXPXRCUB `NED^FI Commit().
.40
0OEQBMNDBOM DO[F_ F O[UMCBOM = [OLLUMZFRCIB QUSCEBFDN RULNTFY NDCPCBUHU_, EO EU QOPLCIB QEFSDOR
RO RMUSK DOEQBMNFMORCEFK FHF QMCPN ZU [OQHU [MFQRCFRCEFK. 5OSEFBU: ECQ FEBUMUQNUB QOQBOKEFU
8$+9'&+#,%7% %/0#$"+, C EU 8$+9+"#24. 0OGLC SX QOPLCUS EORNI DO[FI OJaUDBC LHK [OLLUMZCEFK
QUSCEBFDF RULNTUGO NDCPCBUHK, LHK ]BO_ DO[FF UTU EU QNTUQBRNUB [MULXLNTFY OJMCPOR, DOBOMXU
EUOJYOLFSO OBQHUZFRCB\.
*UQBMNDBOM [MUL[OHCGCUB, WBO UQHF DHFUEB EU RXPRCH `NED^FI Commit(), WBO-BO JXHO QLUHCEO
EURUMEO, F NEFWBOZCUB DO[FI. .[U^FCHFQBX [O JCPCS LCEEXY OBaKRHUEEXU [UQQFSFQBX; UQHF
[MOFQYOLFB WBO-BO EU[MULRFLUEEOU, OEF RQUGLC [MUL[OHCGCIB QCSOU YNLVUU. #O SEOGFY [MFHOZUEFKY
[MF NEFWBOZUEFF NDCPCBUHK RSUQBO Rollback() QHULORCHO JX [MOQBO RXPRCB\ Commit(), [MUL[OHCGCK,
WBO LO ECQBOKTUGO SOSUEBC RQU [MOFQYOLFHO R[OHEU MCPNSEO.
Cfeku opasoe
*HK SEOGONMOREURO_ OBSUEX RCS SOZUB [OECLOJFB\QK QBUD [MULXLNTFY OJMCPOR. )LFE FP RCMFCEBOR
MUCHFPC^FF YMCEFB\ QBUD R DCZLOS NDCPCBUHU OJMCPOR. # QHULNITUS `MCGSUEBU [MUL[OHCGCUBQK, WBO
N RCQ FSUUBQK [CMCSUBMFPORCEEX_ DHCQQ Stack Q `NED^FKSF Empty(), Push(), Pop() F DeleteAll().
:NED^FK Pop() ROPRMCTCUB RUMYEF_ ]HUSUEB QBUDC FHF NULL, UQHF QBUD [NQB. :NED^FK DeleteAll()
O[NQBOVCUB QBUD F NEFWBOZCUB RQU OJaUDBX [O SUMU FY FPRHUWUEFK. 0CZLX_ NDCPCBUH\ YMCEFB QBUD
[MULXLNTFY OJMCPOR. %QHF QBUD [NQB, PECWFB, OJMCPX EU QOPLCRCHFQ\. %QHF QBUD EU [NQB, R UGO EFZEU_
WCQBF ECYOLFBQK FQYOLEX_ OJaUDB. :NED^FK Rollback() ECYOLFB F ROQQBCECRHFRCUB ]BOB OJaUDB.
0OEQBMNDBOM DO[F_ F O[UMCBOM = MCJOBCIB BCD ZU, DCD F R O[FQCEEOS RXVU [MOQBU_VUS NDCPCBUHU
OJMCPOR.
template <class Type>
class ImageStackPtr {
private:
Type* current; // A"&3K/? ';7$-, 57"0')*$4#%"2<? &#/"(*3
Stack<Type> history; // =7"0<03K/" ';7$-<
public:
ImageStackPtr() : current(new Type) {}
ImageStackPtr(const ImageStackPtr<Type>& ip)
: current(new Type(*(ip.current))) {}
~ImageStackPtr() { delete current; }
ImageStackPtr<Type>& operator=(const ImageStackPtr<Type>& ip)
{
if (this != &ip) {
history.DeleteAll();
delete current;
current = new Type(*(ip.current));
}
return *this;
}
void PushImage()
{
history.Push(current);
current = new Type(*current);
}
void Commit() { history.DeleteAll(); }
void PopImage() // G"7(3*,)% ($ '0/( 37'4"(,
{
if (!history.Empty()) {
delete current;
current = history.Pop();
.4.
}
}
void Rollback() // G"7(3*,)% & )$2'23 )*$7'23 ';7$-3
{
Type* old = history.Pop();
Type* oldere = NULL;
if (old != NULL) { // R'*% ;< '0/( 7$-
while ((older = history.Pop()) != NULL) {
delete old;
old = older;
}
delete current;
current = old;
}
}
Type* operator->() const { return current; }
};
>MCEUEFU OBLUH\EOGO QBUDC R DCZLOS NDCPCBUHU O[MCRLCEEO LHK BMCEPCD^F_, R DOBOMXY NWCQBRNUB
EUJOH\VOU DOHFWUQBRO OJaUDBOR. $O UQHF OLEO_ BMCEPCD^FF [MFYOLFBQK OBQHUZFRCB\ SEOZUQBRO
OJEORHKUSXY OJaUDBOR, DNWN SUHDFY QBUDOR HNWVU OJaULFEFB\ R OLFE JOH\VO_. 6X QLUHCUS ]BO
[OPLEUU, DOGLC MUW\ [O_LUB O BMCEPCD^FKY.
Opasu aeforafueckux oLekfoe
0OE^U[^FI OJMCPC SOZEO EUSEOGO OJOJTFB\, WBOJX OEC MCQ[MOQBMCEKHCQ\ EU BOH\DO EC OJaUDBX,
QOPLCEEXU O[UMCBOMOS new F OJQHNZFRCUSXU *-NDCPCBUHKSF, EO F CRBOSCBFWUQDFU OJaUDBX.
-RBOSCBFWUQDFSF QWFBCIBQK QBUDORXU OJaUDBX, C BCDZU [UMUSUEEXU F DOS[OEUEBX JCPORXY DHCQQOR
RSUTCITUGO OJaUDBC EUPCRFQFSO OB BOGO, RXLUHKHCQ\ [CSKB\ [OL RSUTCITF_ OJaUDB LFECSFWUQDF FHF
EUB.
template <class Type>
class AutoImage {
private:
Type current;
Type image;
bool have_image; // D)*/($, ")#/ ';7$- )3K")*43"*
public:
AutoImage() : have_image(false) {}
AutoImage(const AutoImage<Type>& ai)
: current(ai.current), image(), have_image(false) {}
AutoImage<Type>& operator=(const AutoImage<Type>& ip)
{
if (this != &ip) {
current = ip.current;
have_image = false;
}
return *this;
}
AutoImage<Type>& operator=(const Type& t)
{
current = t;
.42
return *this;
}
operator Type&() { return current; }
void Snapshot()
{
image = current;
have_image = true;
}
void Commit() { have_image = false; }
void Rollback()
{
current = image;
have_image = false;
}
bool HaveImage() { return have_image; }
};
3BOB VCJHOE MCJOBCUB QO RQUSF DHCQQCSF, DOBOMXU NLORHUBROMKIB LRNS NQHORFKS:
/. +F[, FQ[OH\PNUSX_ R DCWUQBRU [CMCSUBMC, FSUUB DOEQBMNDBOM JUP CMGNSUEBOR. )E FQ[OH\PNUBQK R
DOEQBMNDBOMU AutoImage LHK FEF^FCHFPC^FF current F image.
2. +F[, FQ[OH\PNUSX_ R DCWUQBRU [CMCSUBMC, LO[NQDCUB [MFQRCFRCEFU Q [OSOT\I O[UMCBOMC = [O
NSOHWCEFI, [MULOQBCRHUEEOGO DOS[FHKBOMOS, FHF [UMUGMNZUEEOGO RCMFCEBC LHK LCEEOGO BF[C.
!Q[OH\PNUBQK R `NED^FKY Shapshot() F Rollback().
#QU RQBMOUEEXU BF[X (BCDFU DCD int F double) NLORHUBROMKIB ]BFS NQHORFKS. 5OLYOLKB F LMNGFU
DHCQQX, FSUITFU DOEQBMNDBOM JUP CMGNSUEBOR F MCJOWF_ O[UMCBOM =. 1US LOH\VU K FSUI LUHO Q C++,
BUS WCTU SEU DCZUBQK, WBO ECMNVUEFU ]BFY BMUJORCEF_ [MOKRHUEFU PHOQBEOGO EU[MO`UQQFOECHFPSC,
PC DOBOMOU QHULNUB ECDCPXRCB\ [CMO_ HUB DCBOMZEOGO [MOGMCSSFMORCEFK EC BASIC. "COLEO K JX FPLCH
PCDOE O BOS, WBOJX DOEQBMNDBOMX DO[F_ &.#7)+ MCJOBCHF BCD, DCD FS [OHOZUEO.
0OEQBMNDBOM DO[F_ AutoImage QHULNUB [MFSUMN ImagePtr F ImageStackPtr OE FQ[OH\PNUB
DOEQBMNDBOM JUP CMGNSUEBOR LHK QOPLCEFK `FDBFREOGO OJaUDBC image F [MFQRCFRCUB have_image
PECWUEFU false. )[UMCBOM = LUHCUB BO ZU QCSOU, OLECDO R EUS EU NLCUBQK EC_BF NLOJEX_ Q[OQOJ
NEFWBOZFB\ OJaUDB [UMUSUEEO_ image. 6X RXJFMCUS SUE\VUU FP LRNY POH OJaUDB OQBCUBQK JUP
FPSUEUEF_ F [O[MOQBN FGEOMFMNUBQK, [OQDOH\DN [UMUSUEECK have_image MCREC false. %QHF RCQ ]BO EU
NQBMCFRCUB F RX LU_QBRFBUH\EO YOBFBU OQBCRFB\ OJaUDB image EUFEF^FCHFPFMORCEEXS LO BUY [OM, [ODC
R EUS EU [OKRFBQK ECQBOKTF_ OJMCP, F NEFWBOZFB\ UGO [OQHU [MFQROUEFK false [UMUSUEEO_
have_image, FSUIBQK LRC ROPSOZEXY MUVUEFK:
/. !PSUEFB\ BF[ image Q Type EC Type* F RXLUHKB\ LHK EUGO [CSKB\ O[UMCBOMOS new. 3BO
NRUHFWFB ECDHCLEXU MCQYOLX [O QMCREUEFI Q CRBOSCBFWUQDFSF OJaUDBCSF, OLECDO RX QSOZUBU
R [OHEO_ SUMU DOEBMOHFMORCB\ [MO^UQQ QOPLCEFK F NEFWBOZUEFK.
2. #OQ[OH\PORCB\QK FLFOSO_ RFMBNCH\EXY DOEQBMNDBOMOR FP GHCRX /3. $U RLCRCKQ\ R
[OLMOJEOQBF, QDCZN, WBO ]BO [OPROHFB RCS OJaKRFB\ image WUS-BO [MFKBEXS LHK GHCPC
EC[MFSUM, unsigned char image(sizeof Type) EUZUHF RXPXRCB\ DOEQBMNDBOM F
LUQBMNDBOM Type RMNWENI. 0OS[FHKBOMX .++ EULOHIJHFRCIB [OLOJEXU `ODNQX, [O]BOSN,
[MUZLU WUS [NQDCB\QK EC CRCEBIMX, REFSCBUH\EO [MOWFBC_BU GHCRN /3.
%QHF AutoImage JNLUB FQ[OH\PORCB\QK BOH\DO LHK QBMNDBNM FHF DHCQQOR, LOJCR\BU O[UMCBOM ->:
Type* operator->() { return &current; }
)JMCBFBU REFSCEFU: R OBHFWFU OB [MULXLNTFY RUMQF_ -> ]BOB O[UMCBOM EU SOZUB JXB\ DOEQBCEBEO_
`NED^FU_, [OQDOH\DN current ECYOLFBQK RENBMF *this F SX EU SOZUS GCMCEBFMORCB\, WBO -> EU JNLUB
FQ[OH\PORCB\QK LHK OJMCTUEF_ D EUDOEQBCEBEXS `NED^FKS current.
.43
.HULNITF_ DHCQQ LUSOEQBMFMNUB ROPSOZEOU FQ[OH\PORCEFU ]BOGO VCJHOEC. #SUTCITUSN OJaUDBN Foo
EUPCWUS QOPLCRCB\ QRO_ OJMCP, DCD R [MULXLNTFY NDCPCBUHKY EC OJaUDBX, [OQDOH\DN RQU UGO [UMUSUEEXU
Q[OQOJEX [OLLUMZFRCB\ QROF OJMCPX [O OBLUH\EOQBF.
class Foo {
private:
AutoImage<int> some_integer;
AutoImage<Bar> bar;
public:
void Rollback()
{
some_integer.Rollback();
bar.Rollback();
}
void Commit()
{
some_integer.Commit();
bar.Commit();
}
void Snapshot()
{
some_integer.Snapshot();
bar.Snapshot();
}
int ProvideInt() const { return some_integer; }
void ChanheInt(int new_value)
{
if (!some_integer.HaveImage())
some_integer.Snapshot();
int&(some_integer) = new_value;
}
const Bar& ProvideBar() const { return bar; }
Bar& UpdateBar()
{
if (!bar.HaveImage())
bar.Shapshot();
return Bar&(bar);
}
};
5MUL[OHCGCUBQK, WBO Bar QOOBRUBQBRNUB EUOJYOLFSXS NQHORFKS. 5OQHULEFU WUBXMU `NED^FF [UMUL BUS,
DCD OJEORHKB\ [UMUSUEENI, QOPLCIB SOSUEBCH\EX_ QEFSOD OJaUDBC. *HK int [OHNWUEFU DO[FF [O
O[MULUHUEFI KRHKUBQK DOEQBCEBEXS [O OBEOVUEFI D DO[FMNUSO_ [UMUSUEEO_. 5MF RXPORU `NED^FF,
FPSUEKITU_ PECWUEFU [UMUSUEEO_, ECQBCUB RMUSK LUHCB\ QEFSOD. *HK MCJOBX Q LMNGO_ [UMUSUEEO_,
bar, [MULOQBCRHKUBQK DCD DOEQBCEBECK, BCD F EUDOEQBCEBECK `NED^FK. 0OEUWEO, YOBUHOQ\ JX [MOQBO
[UMUGMNPFB\ `NED^FI ProvideBar(), WBOJX OLEC [UMUGMNZUEECK RUMQFK ROPRMCTCHC const Bar&, C
LMNGCK EUDOEQBCEBEX_ Bar&, EO BOGLC FY QFGECBNMX JNLNB QOR[CLCB\. 5OSEFBU: LRU `NED^FF EU
SOGNB FSUB\ OLFECDORXU FSUEC F CMGNSUEBX F OBHFWCB\QK BOH\DO BF[OS ROPRMCTCUSOGO PECWUEFK. &
EFDOGLC EU [OEFSCH ]BOGO OGMCEFWUEFK .++, DOBOMOU PC[MUTCUB QOPLCRCB\ DOEQBCEBENI F
EUDOEQBCEBENI RUMQFI O[UMCBOMC ->:
const Type* operator->() const; // F(/2'& (" )'-0$"*)%
Type* operator->() const; // F'-0$"* )(/2'&
.44
0OEUWEO, ]BO ECSEOGO N[MOQBFHO JX ZFPE\, EO ECPRCB\ ]BF PCGCLOWEXU OGMCEFWUEFK JUQ[OHUPEXSF
EUH\PK OEF LCIB PECBODCS .++ YOMOVNI BUSN LHK MCPGOROMOR EC QUSFECMCY Q DODBU_HKSF.
(CP NZ MUW\ PCVHC OJ OGMCEFWUEFKY .++, N[OSKEN UTU OJ OLEOS. #PGHKEFBU EC [MFRULUEEX_ RXVU DOL
DHCQQC Foo. (CJOBC EUDOBOMXY UGO `NED^F_ QROLFBQK D RXPORN OLEO_ F BO_ ZU `NED^FF LHK RQUY
[UMUSUEEXY DHCQQC F R JOHUU OJTUS QHNWCU JCPORXY DHCQQOR. .DCZUS, Foo::Commit() [MOQBO
RXPXRCUB Commit() LHK RQUY [UMUSUEEXY. #UQ\ [ORBOMKITF_QK DOL [MFYOLFBQK [FQCB\ RMNWENI; R
KPXDU QFH\EO EU YRCBCUB SCDMOQMULQBR, DOBOMXU JX [OPROHKHF QDCPCB\: #XPRCB\ `NED^FI Commit()
LHK DCZLO_ [UMUSUEEO_ DHCQQC. 0OS[FHKBOM PECUB, DCD QOQBCRFB\ Q[FQOD BCDOGO MOLC (F FQ[OH\PNUB UGO
R DOEQBMNDBOMCY), EO RCS EF PC WBO EU QDCZUB.
Opasu ykasafene
4 VCJOEC AutoImage UQB\ OLEO LOROH\EO PCEKBEOU [MFSUEUEFU FS SOZEO ROQ[OH\PORCB\QK LHK
QOPLCEFK OJMCPOR *-NDCPCBUHK. # EUDOBOMXY QFBNC^FKY EU YOWUBQK QOPLCRCB\ HFVEFU DO[FF
NDCPXRCUSOGO OJaUDBC BOH\DO WBOJX QHULFB\ PC BUS, EC WBO QQXHCHQK NDCPCBUH\ R [MOVHO_ ZFPEF.
.OJQBRUEEO, LUHO OJQBOFB BCD DCZLX_ MCP, DOGLC NDCPCBUH\ EU KRHKUBQK RULNTFS. 4DCPCBUH\ BCDZU
[OSOGCUB QHULFB\ PC OJaUDBCSF, DOBOMXU JXHF QOPLCEX FHF NEFWBOZUEX R [MO^UQQU BMCEPCD^FF.
AutoImage<Foo*> f;
+U[UM\ RX SOZUBU ROQQBCEORFB\ QOQBOKEFU NDCPCBUHK f R ECWCHU BMCEPCD^FF, R BOS WFQHU F NULL. +US EU
SUEUU, QNTUQBRNUB RUQDF_ LOROL R [OH\PN QOPLCEFK Q[U^FCHFPFMORCEEOGO VCJHOEC LHK *-NDCPCBUHU_
EUOJYOLFSOQB\ [UMUGMNPDF O[UMCBOMC ->, WBOJX NDCPCBUH\ OJMCPOR SOZEO JXHO FQ[OH\PORCB\ R HURO_
WCQBF RXMCZUEF_ (WBO-EFJNL\ BF[C ptr->MemberOfPointer();). *HK *-NDCPCBUHU_ AutoImage [OYOZ
EC GHN[XU NDCPCBUHF, Q DOBOMXSF SX MCQQ[MCRFHFQ\ R ECWCHU GHCRX 5. .HULNITF_ VCJHOE JOH\VU
EC[OSFECUB OJXWEXU NSEXU (EO EU RULNTFU!) NDCPCBUHF.
template <class Type>
class PtrImage {
private:
Type* current;
Type* image;
bool have_image; // D)*/($, ")#/ ';7$- )3K")*43"*
public:
PtrImage() : current(NULL), image(NULL), have_image(false) {}
PtrImage(const PtrImage<Type>& pi)
: current(pi.current), image(NULL), have_image(false) {}
PtrImage<Type>& operator=(const PtrImage<Type>& pi)
{
if (this != &pi)
current = pi.current;
return *this;
}
PtrImage<Type>& operator=(Type* t)
{ current = t; return *this; }
operator Type*() { return current; }
Type* operator->() const { return current; }
bool operator!() { return current == NULL; }
void Snapshot()
{
image = current;
have_image = true;
}
void Commit() { image = NULL; have_image = false; }
.45
void Rollback()
{
if (have_image) {
current = image;
have_image = false;
}
bool HaveImage() { return have_image; }
};
%QHF RCS PCYOWUBQK UTU EUSEOGO CRBOSCBFPFMORCB\ ]BOB VCJHOE, LOJCR\BU RXPORX Snapshot() R OJU
O[UMCBOMEXU `NED^FF operator=().
4DCPCBUHU_ MCQ[HOLFHOQ\ QHFVDOS SEOGO, F BUMSFEOHOGFK ECWFECUB PC[NBXRCB\QK. +UMSFE NDCPCBUH\
OJMCPOR OJOPECWCUB NDCPCBUH\, R DOBOMOS QOLUMZFBQK EUQDOH\DO OJMCPOR OJaUDBC (F DOBOMX_ [OWBF
RQUGLC KRHKUBQK RULNTFS), BOGLC DCD BUMSFE OJMCPX NDCPCBUHU_ OBEOQFBQK D DHCQQN EC[OLOJFU
[ODCPCEEOGO RXVU, R DOBOMOS YMCEFBQK EUQDOH\DO [MULXLNTFY PECWUEF_ QCSOGO NDCPCBUHK.
Koruuauuu u eapuauuu
# ECVU_ DOHHUD^FF QDO[FHOQ\ NZU EUSCHO QBMOFBUH\EXY JHODOR, C ROPSOZEOQBF FY DOSJFEFMORCEFK
JUPGMCEFWEX. #XJUMFBU [O OLEOSN RCMFCEBN R DCZLO_ [OPF^FF, F RX [OHNWFBU EUDOU
Q[U^FCHFPFMORCEEOU MUVUEFU LHK MCJOBX Q OJMCPCSF:
[MOQBXU/RULNTFU NDCPCBUHF;
OJMCPX CRBOSCBFWUQDFU/QOPLCEEXU O[UMCBOMOS new;
OLFE OJMCP/QBUDF OJMCPOR;
OJMCPX OJaUDBOR/ OJMCPX NDCPCBUHU_;
Q[OEBCEEOU QOPLCEFU OJMCPC/ MNWEO_ RXPOR `NED^FF Snapshot().
5MFRULUEEX_ Q[FQOD EF R DOUS QHNWCU EU FQWUM[XRCUB RQUY ROPSOZEXY RCMFCEBOR. .DOMUU ]BO
[MULQBCRFBUH\EX_ [UMUWUE\ DOE^U[^F_, QOQMULOBOWUEEXY RODMNG OJTU_ BUSX N[MCRHUEFK OJMCPCSF.
#QU DOE^U[^FF OMFUEBFMORCEX EC .++ Q UGO NEFDCH\EXS QFEBCDQFQOS F QUSCEBFDO_ (R WCQBEOQBF,
DOEQBMNDBOMCSF F O[UMCBOMCSF). 5OVURUHFBU SOPGCSF F [OLNSC_BU, DCD ]BF DOE^U[^FF [OLYOLKB D
RCVU_ DOEDMUBEO_ PCLCWU. !SUEEO ]BFS SX F PC_SUSQK R OQBCRVU_QK WCQBF ]BO_ GHCRX.
Tpausakuuu u ofreua
(UVUEFU [MOJHUSX BMCEPCD^F_ R PECWFBUH\EO_ QBU[UEF QRKPCEO Q [MOJHUSCSF OBSUEX F
SEOGO[OBOWEXY FBUMCBOMOR, [O]BOSN QECWCHC SX [OGOROMFS O BMCEPCD^FKY. !BCD, SX YOBFS
[MULOBRMCBFB\ OJEORHUEFU EUDOBOMOGO OJaUDBC JOHUU WUS OLEO_ BMCEPCD^FU_. 5OYOZU, R MUVUEFF ]BO_
PCLCWF ECS [OSOGNB NDCPCBUHF OJMCPOR. *CRC_BU [OQSOBMFS QRUZFS RPGHKLOS EC OJOJTUEEX_ NDCPCBUH\
OJMCPOR, [MFRULUEEX_ R ECWCHU GHCRX:
template <class Type>
class ImagePtr {
private:
Type* current; // A"&3K/? ';7$-, 57"0')*$4#%"2<? &'25'("(*3
Type* undo; // =7"0<03K/? ';7$-
public:
ImagePtr();
ImagePtr(const ImagesPtr<Type>& ip);
~ImagePtr();
ImagePtr<Type>& operator=(const ImagePtr<Type>& ip);
void Snapshot();
void Commit();
.46
void Rollback();
Type* operator->() const;
};
*HK SFMC BMCEPCD^F_ [MFLUBQK REUQBF MKL FPSUEUEF_:
)JaUDB R HIJO_ SOSUEB RMUSUEF SOZUB JXB\ PCJHODFMORCE EU JOHUU WUS OLEO_ BMCEPCD^FU_.
)JaUDB EU SOZUB JXB\ FPSUEUE [MF QEKBO_ JHODFMORDU.
"CJHODFMOREEX_ OJaUDB SOZUB JXB\ FPSUEU HFV\ OJaUDBOS, DOBOMX_ [MFECLHUZFB BMCEPCD^FF,
NQBCEORFRVU_ JHODFMORDN.
.HULORCBUH\EO, ECS [MFLUBQK QOPLCB\ EUDOBOMOU [MULQBCRHUEFU LHK BMCEPCD^FF, C PCOLEO [OMCPSKB\
SXV^X .++ F [OQBMOFB\ QOOBRUBQBRNITNI QUSCEBFDN. +MCEPCD^FF JNLNB [MULQBCRHUEX DHCQQOS
Transaction. *HK JHODFMOROD SX ROQ[OH\PNUSQK Q[U^FCH\EXS OJEORHKITFS NDCPCBUHUS. !ECWU
GOROMK, OJXWEXU DHFUEBX MCJOBCIB Q NSEXS NDCPCBUHUS, EU LO[NQDCITFS OJEORHUEFK, C DHFUEBX
BMCEPCD^FF-RHCLUH\^C [OHNWCIB LOQBN[ D LMNGOSN NDCPCBUHI Q ROPSOZEOQB\I OJEORHUEFK. $FZU
[MFRULUEC [MKSOHFEU_ECK (YOBK EUOJKPCBUH\EO QCSCK ]``UDBFRECK) MUCHFPC^FK ]BO_ CMYFBUDBNMX.
5OPLEUU SX QEFSUS ]BF N[MOTCITFU OGMCEFWUEFK F MCQVFMFS CMYFBUDBNMN:
/. $CQ FEBUMUQNUB BOH\DO OBSUEC FPSUEUEF_ R QNTUQBRNITFY OJaUDBCY, C EU OBSUEC QOPLCEFK F
NEFWBOZUEFK OJaUDBOR R [MO^UQQU BMCEPCD^FF.
2. #O[MOQ O BOS, DOGLC FSUEEO LOHZEC NQBCECRHFRCB\QK JHODFMORDC OJaUDBC RXYOLFB PC MCSDF
O[FQCEEO_ N[MOTUEEO_ CMYFBUDBNMX.
Tpausakuuu u nokupoeku
# LU_QBRFBUH\EOQBF BMCEPCD^FK [MULQBCRHKUB QOJO_ EUWBO FEOU, WUS DOHHUD^FI NDCPCBUHU_ OJMCPOR, R
DOBOMO_ FSUUBQK EUQDOH\DO `NED^F_ LHK [UMUJOMC. )LEC FP BMNLEOQBU_ QOQBOFB R BOS, WBO OLEC
BMCEPCD^FK SOZUB OJEORHKB\ HIJOU WFQHO OJaUDBOR, OBEOQKTFYQK D MCPHFWEXS BF[CS. .HULORCBUH\EO,
DHCQQ BMCEPCD^FF LOHZUE JXB\ MCQ[FQCE BCD, WBOJX OE SOG MCJOBCB\ Q HIJXSF BF[CSF [OYOZU, MUW\
FLUB OJ CJQBMCDBEOS JCPOROS DHCQQU.
// G @$?#" Transaction.h
class Lock {
friend class Transaction;
protected:
Transaction* transaction; // A7$(-$&B/%, &'*'7'? 57/($0#"1/* this
Lock() : transaction(NULL) {}
void RegisterLock(Transaction* t)
{
if (transaction != NULL) {
// I'(@#/&* 31" /2""*)% 0738'? 4#$0"#"B
cerr << Lock::RegisterLock already locked << endl;
}
else {
t->AddLock(this);
transaction = t;
}
}
virtual ~Lock() {}
virtual void Rollback() = 0;
virtual void Commit() = 0;
};
class Transaction {
friend class Lock; // S*';< 57"0')*$4/*, 0')*35 & AddLock()
.47
private:
SafeSet<Lock>* locks;
void AddLock(Lock*); // G&#>./*, ;#'&/7'4&3 4 *7$(-$&B/>
public:
~Transaction();
void Commit(); // T$&7"5/*, 4)" ';7$-<
void Rollback(); // L*2"(/*, 4)" ';7$-<
bool OwnsLock(Lock*); // D)*/($, ")#/ ;#'&/7'4&$
// 57/($0#"1/* *7$(-$&B//
};
0HCQQ Transaction [OLLUMZFRCUB DOHHUD^FI JHODFMOROD Q [OSOT\I GF[OBUBFWUQDOGO VCJHOEC
Collection. :NED^FK RegisterLock() RDHIWUEC R JCPORX_ DHCQQ Lock F [OBOSN SOZUB OJMCBFB\QK D
PCDMXBO_ `NED^FF AddLock() DHCQQC Transaction. *MNZJC EU ECQHULNUBQK, [O]BOSN OJaKRHUEFU
LMNGOS DHCQQC Lock EU LUHCUB LMNP\KSF UGO [MOFPROLEXU DHCQQX. (UCHFPC^FF RXGHKLKB LOROH\EO
[MOQBO.
void Transaction::AddLock(Lock* lock)
{
*locks += lock; // D)5'#,-3"* 5"7"873-&3 += 0#% &'##"&B//
}
void Transaction::Commit()
{
SafeSetIterator<Lock>* iter = locks->Iterator();
while (iter->More())
iter->Next()->Commit();
delete iter;
}
void Transaction::Rollback()
{
SafeSetIterator<Lock>* iter = locks->Iterator();
while (iter->More())
iter->Next()->Rollback();
delete iter;
}
bool Transaction::OwnsLock(Lock* lock)
{
return *locks >= lock;
}
5MUL[OHCGCUBQK, WBO VCJHOE Collection QOLUMZFB `NED^FI DeleteAll() LHK NLCHUEFK RQUY
OJaUDBOR; WBO [UMUGMNZUEEX_ O[UMCBOM += (O[UMCBOMECK `NED^FK operator+=(Type*)) RDHIWCUB
]HUSUEB R DOHHUD^FI; WBO [UMUGMNZUEEX_ O[UMCBOM >= O[MULUHKUB [MFECLHUZEOQB\ D DOHHUD^FF, C
`NED^FK Iterator() ROPRMCTCUB RHOZUEEX_ FBUMCBOM. 3BO OJOJTUEEXU NQHORFK; FQ[OH\PN_BU BU,
DOBOMXU LU_QBRNIB R RCVUS QHNWCU.
Knacc ConstPtr
0HCQQX, [MOFPROLEXU OB Lock, LOHZEX QQXHCB\QK EC EUWBO JHFPDOU D NDCPCBUHKS, LOQBN[EXS BOH\DO
LHK WBUEFK, Q DOBOMXSF EC QBMCEF^CY DEFGF RX NZU [OPECDOSFHFQ\.
template <class Type>
class LockPtr; // F)<#&$ 45"7"0 ($ &#$)), 57'/-4'0(<? '* Lock

.48
template <class Type>
class ConstPtr {
friend class LockPtr<Type>;
private:
Type* old_image; // L;7$- 5"7"0 *7$(-$&B/"?
LockPtr<Type>* lock; // A"&3K$% ;#'&/7'4&$, ")#/ '($ ")*,
~ConstPtr() { delete old_image; }
ConstPtr<Type>& operator=(const ConstPtr<Type>& cp)
{ return *this; } // =7/)4$/4$(/" (" 7$-7"M$"*)%
public:
ConstPtr() : old_image(NULL), lock(NULL) {}
ConstPtr(const ConstPtr<Type>& cp)
: old_image(new Type(*(cp.old_image))), lock(NULL) {}
const Type* operator->() const { return old_image; }
LockPtr<Type>& Lock(Transaction* t);
};
template <class Type>
LockPtr<Type>& ConstPtr<Type>::Lock(Transaction* t)
{
if (lock != NULL && !t->OwnsLock(lock))
// I'(@#/&* 31" /2""*)% 0738'? 4#$0"#"B
else {
lock = new LockPtr<Type>(t, this);
return *lock;
}
}
$ORX_ OJaUDB ConstPtr SOZEO QDOEQBMNFMORCB\ EC JCPU QBCMOGO (YOBK EORX_ QOPLCUBQK JUP
JHODFMORDF), OLECDO ECS [MFLUBQK REUQBF FPSUEUEFK LHK [MFQRCFRCEFK, DOBOMOU MCPMUVUEO BOH\DO LHK
LockPtr, EO EU LHK ConstPtr. *HK ]BO_ ^UHF SX O[MULUHKUS `FDBFREX_ O[UMCBOM = F LUHCUS UGO
PCDMXBXS, WBOJX LO EUGO EFDBO EU LOJMCHQK. 5OQDOH\DN NDCPCBUH\ KRHKUBQK RULNTFS, UGO NLCHUEFU
[MFROLFB F D NLCHUEFI NDCPXRCUSOGO OJaUDBC (QCSOU MCLFDCH\EOU FPSUEUEFU, DOBOMOU BOH\DO SOZEO
[MULQBCRFB\). 5O ]BO_ [MFWFEU DOEQBMNDBOM BCDZU OJaKRHUE PCDMXBXS, WBOJX EFDBO EU [O[XBCHQK
NLCHFB\ ConstPtr.
0OE`HFDB R `NED^FF Lock SOZEO OJMCJOBCB\ MCPEXSF Q[OQOJCSF:
!EF^FFMORCB\ FQDHIWUEFU.
!PSUEFB\ FEBUM`U_Q F ROPRMCTCB\ RSUQBU Q JHODFMORDO_ `HCG, [ODCPXRCITF_, NQ[UVEO HF
[MOVHC JHODFMORDC.
#OPRMCTCB\ LockPtr<Type>* QO PECWUEFUS NULL, QRFLUBUH\QBRNITUS O EUNLCWEO_
JHODFMORDU.
#OPRMCTCB\ DOE`HFDBENI JHODFMORDN Q [UMUGMNZUEEXS O[UMCBOMOS !, Q [OSOT\I DOBOMOGO
SOZEO [MORUMFB\ [MCRFH\EOQB\ JHODFMORDF.
5MULOQBCRFB\ OBLUH\ENI `NED^FI CanLock(Transaction*), DOBOMCK ROPRMCTCUB HOGFWUQDOU
PECWUEFU.
#XJOM PCRFQFB OB QBFHK. #CMFCEB Q FQDHIWUEFUS EU BCD NZ OWURFLUE; EUNLCWC [MF JHODFMORDU
[MULQBCRHKUB QOJO_ R[OHEU MCPNSEX_ FQYOL.
.49
Knacc LockPtr
-GC! 6X [OLOVHF D ^UEBMCH\EO_ FLUU RQU_ DOE^U[^FF NDCPCBUHKS, DOBOMXU MCPMUVCIB OJEORHUEFU
NDCPXRCUSOGO OJaUDBC. 5MULBMCEPCD^FOEEX_ ([MULECPECWUEEX_ LHK OBSUEX) OJMCP YMCEFBQK R
ConstPtr, C BUDNTF_ OJEORHUEEX_ OJMCP LOQBN[UE BOH\DO WUMUP LockPtr. 0HCQQ LockPtr QOLUMZFB
NZU PECDOSXU `NED^FF Rollback() F Commit(). # `NED^FF Snapshot() EUB EUOJYOLFSOQBF,
[OQDOH\DN LockPtr [MF EUOJYOLFSOQBF QOPLCUB OJMCPX R O[UMCBOMU ->.
template <class Type>
class LockPtr : public Lock {
friend class ConstPtr<Type>;
private:
ConstPtr<Type>* master_ptr;
Type* new_image;
Transaction* transaction;
LockPtr(Transaction* t, ConstPtr<Type>* cp);
virtual ~LockPtr();
virtual void Rollback();
virtual void Commit();
public:
Type* operator->() const { return new_image; }
};
template <class Type>
LockPtr<Type>::LockPtr(Transaction* t, ConstPtr<Type>* cp)
: transaction(t), master_ptr(cp), new_image(new Type(*(cp->old_image)))
{
}
template <class Type>
LockPtr<Type>::~LockPtr()
{
// G )3K(')*/ 57'/)C'0/* '*&$*
delete new_image; // L*&$-$*,)% '* /-2"("(/?
master_ptr->lock = NULL; // L)*$4/*, ConstPtr
}
template <class Type>
void LockPtr<Type>::Rollback()
{
delete new_image;
new_image = new Type(*(master_ptr->old_image));
}
template <class Type>
void LockPtr<Type>::Commit()
{
delete master_ptr->old_image;
master_ptr->old_image = new_image; // ="7"2")*/*, 4 master_ptr
new_image = new Type(*new_image); // +31($ ('4$% &'5/%
}
*UQBMNDBOM OJaKRHUE PCDMXBXS, WBOJX EFDBO EU SOG EC[MKSNI NLCHFB\ LockPtr. #SUQBO ]BOGO
BMCEPCD^FK-RHCLUHU^ LOHZEC QLUHCB\ ]BO WUMUP JCPORX_ DHCQQ Lock. :NED^FF Rollback() F Commit()
OJaKRHUEX RFMBNCH\EXSF, WBOJX Q FY [OSOT\I SOZEO JXHO MUVCB\ PCLCWF, OBEOQKTFUQK D
.50
DOEDMUBEOSN BF[N (EC[MFSUM, QOPLCEFU F NEFWBOZUEFU OJMCPOR). )JU `NED^FF [OQHU PCRUMVUEFK
OQBCRHKIB ConstPtr PCJHODFMORCEEXS.
Cospauue u yuufoeuue oLekfoe
5OMC PC[OHEFB\ DOU-DCDFU [MOJUHX. (CP NZ ECVF BMCEPCD^FF LOQBCBOWEO QHOZEX, WBOJX LHK EFY JXHC
O[MCRLCEC RQK ]BC ROPEK, OEF ECRUMEKDC JNLNB QOPLCRCB\ FHF NEFWBOZCB\ OJaUDBX. )[UMC^FF QOPLCEFK F
NEFWBOZUEFK BCDZU LOHZEX JXB\ OBSUEKUSXSF. %QHF OJaUDB QOPLCRCHQK, O[UMC^FK OBSUEX LOHZEC UGO
NEFWBOZCB\, C UQHF NEFWBOZCHQK ROPRMCTCB\ UGO FP SUMBRXY. *HK ]BOGO [MFLUBQK REUQBF FPSUEUEFK
DCD R DHCQQ ConstPtr, BCD F R DHCQQ LockPtr. 6X NZU QLUHCHF [UMRX_ VCG R ]BOS EC[MCRHUEFF,
OJaKRFR LUQBMNDBOM ConstPtr PCDMXBXS, WBOJX FS SOGHF ROQ[OH\PORCB\QK BOH\DO ConstPtr FHF UGO
LMNP\K. *CRC_BU MCPJUMUSQK Q OQBCRVFSFQK [MOJHUSCSF.
Hsreueuun e knacce ConstPtr
$UQOSEUEEO, QOPLCEFU NDCPXRCUSOGO OJaUDBC [MULQBCRHKUB QOJO_ FPSUEUEFU F [OBOSN LOHZEO
OQNTUQBRHKB\QK WUMUP LockPtr. $O LHK BOGO WBOJX [OHNWFB\ LockPtr, SX LOHZEX QECWCHC FSUB\
ConstPtr F UGO `NED^FI Lock(). .HULORCBUH\EO, BOH\DO WBO O[FQCEEX_ DOEQBMNDBOM ConstPtr
MCJOBCB\ EU JNLUB OE QOPLCUB NEFDCH\EX_ OJaUDB [UMUL RXPOROS Lock(). ConstPtr LOHZUE
ECYOLFB\QK R QOQBOKEFF NULL LO BUY [OM, [ODC LockPtr EU RXLUHFB [CSKB\ [OL OJaUDB F EU PCDMU[FB
]BF FPSUEUEFK. # ConstPtr EUOJYOLFSO REUQBF QHULNITFU FPSUEUEFK:
# DOEQBMNDBOMU JUP CMGNSUEBOR [MFQRCFRCB\ [UMUSUEEO_ old_image PECWUEFU NULL.
*OJCRFB\ O[UMCBOM !, DOBOMX_ [MORUMKUB, MCRUE HF CLMUQ PECWUEFI NULL.
!EF^FFMORCB\ FQDHIWUEFU R O[UMCBOMU ->, UQHF CLMUQ MCRUE PECWUEFI NULL.
'FJO PC[MUBFB\ DO[FMORCEFU, HFJO [MFQROFB\ DO[FF old_image PECWUEFU NULL.
5MOJHUSC Q OJXWEXS DOEQBMNDBOMOS DO[F_ ConstPtr PCDHIWCUBQK R BOS, WBO OE SOZUB QOPLCB\ EORNI
DO[FI NDCPXRCUSOGO OJaUDBC, EO EU [OPROHFB OBSUEFB\ UU QOPLCEFU. $FZU [MFROLFBQK EORCK RUMQFK
DOEQBMNDBOMC ConstPtr. )[MULUHUEFK `NED^F_, EU FPSUEFRVFUQK [O QMCREUEFI Q [ODCPCEEO_ RXVU
N[MOTUEEO_ RUMQFU_ EU [ODCPCEX.
private:
ConstPtr(const ConstPtr&) : old_image(NULL), lock(NULL) {}
public:
ConstPtr() : old_image(NULL), lock(NULL) {}
bool operator!() { return old_image == NULL; }
const Type* operator->() const
{
if (old_image == NULL)
// D)&#>."(/"
return old_image;
}
Hsreueuun e knacce LockPtr
)BEXEU LockPtr [MULQBOFB RX[OHEKB\ ECSEOGO JOH\VU MCJOBX:
)E LOHZUE [MF EUOJYOLFSOQBF QOPLCRCB\ NDCPXRCUSX_ OJaUDB [O BMUJORCEFI. *HK ]BOGO R EUGO
JNLUB LOJCRHUEC `NED^FK Make().
)[UMCBOM -> LOHZUE FEF^FFMORCB\ FQDHIWUEFU, UQHF CLMUQ MCRUE NULL.
$FZU [MFRULUEX O[MULUHUEFK BOH\DO FPSUEFRVFYQK `NED^F_.
// G ';E%4#"(// LockPtr
public:
void Make(); // F'-0$*, ('4<? 3&$-<4$"2<? ';E"&*
void Destroy(); // H(/.*'1/*, 3&$-<4$"2<? ';E"&*
.5.
// D-2"(/4M/")% '57"0"#"(/%
template <class Type>
LockPtr<Type>::LockPtr(Transaction* t, ConstPtr<Type>* cp)
: transaction(t), master_ptr(cp),
new_image(cp->old_image != NULL ? new Type(*(cp->old_image)) : NULL)
{
}
template <class Type>
void LockPtr<Type>::Commit()
{
delete master_ptr->old_image;
master_ptr->old_image = new_image;
if (new_image != NULL)
new_image = new Type(*new_image);
}
template <class Type>
Type* LockPtr<Type>::operator->() const
{
if (new_image == NULL)
// /)&#>."(/"
return new_image;
}
template <class Type>
void LockPtr<Type>::Make()
{
delete new_image; // V)#/ new_image (" 7$4"( NULL
new_image = new Type; // +'4<? 53)*'? ';E"&*
}
template <class Type>
void LockPtr<Type>::Destroy()
{
delete new_image;
new_image = NULL;
}
:NED^FK Make() QOJHILCUB QUSCEBFDN [MFQRCFRCEFK, WBO [OPROHKUB RXPRCB\ UU LHK QNTUQBRNITUGO
NDCPXRCUSOGO OJaUDBC. 5MF ]BOS OJaUDB, EC DOBOMX_ R LCEEX_ SOSUEB QQXHCUBQK LockPtr,
NEFWBOZCUBQK F PCSUEKUBQK EORXS [NQBXS OJaUDBOS.
Ynpoeuuoe cospauue oLekfoe
)JaUDBX BU[UM\ QOPLCIBQK R BMF ]BC[C:
/. .OPLCB\ ConstPtr, NDCPXRCITF_ EC NULL.
2. "C[MOQFB\ N EUGO Lock.
3. 5OBMUJORCB\ N Lock QOPLCB\ OJaUDB `NED^FU_ Make().
0OEUWEO, ]BO [MOFPRULUB R[UWCBHUEFU EC RCVFY DOHHUG F HFVEF_ MCP LODCZUB RCVN BUYEFWUQDNI
DRCHF`FDC^FI, EO OEF DOQO [OQSOBMKB EC RCQ F RUMENBQK D O[UMCBOMN new. #UL\ OE Q[MCRHKUBQK Q
PCLCWU_ PC OLFE ]BC[, C ECQ ODMNZCIB PCEKBXU, OWUE\ PCEKBXU HILF. .NTUQBRNUB EUQDOH\DO Q[OQOJOR
QRUQBF [MO^UQQ QOPLCEFK D OLEOSN ]BC[N, F QCSX_ [MOQBO_ FP EFY RDHIWFB\ R ConstPtr LMNGO_
DOEQBMNDBOM.
.52
ConstPtr<Type>::ConstPtr(Transaction* t) : old_image(NULL), lock(NULL)
{
LockPtr<Type>& lp = Lock(t);
lp.Make();
}
5OQHULNITF_ RXPOR Lock() ROPRMCTCUB NZU QOPLCEEX_ LockPtr.
Ofreua
#QU LO QSUVEOGO [MOQBO. %QHF RX REFSCBUH\EO QHULFHF PC BUS, DCD MCPRFRCUBQK BUSC BMCEPCD^F_, BO LHK
JUPO[CQEO_ F NEFRUMQCH\EO_ MUCHFPC^FF OBSUEX RCS [OBMUJNUBQK QORQUS EUSEOGO RDHIWFB\
EUOJYOLFSXU `MCGSUEBX FP RCVU_ HIJFSO_ JFJHFOBUDF DHCQQOR Q GMC`FWUQDFS FEBUM`U_QOS
[OH\PORCBUHK. *HK QOPLCEFK F SCEF[NHK^F_ QO QBMNDBNMCSF LCEEXY BMCEPCD^F_ FLUCH\EO [OLYOLKB
DHCQQX .%/'"(3. )JaUDB-QOJXBFU QOPLCUBQK LHK RX[OHEUEFK EUDOBOMO_ DOSCELX FHF REUQUEFK
FPSUEUEF_. $C[MFSUM, [OH\PORCBUH\ RXJFMCUB DOSCELN Delete R SUEI Edit FHF ECZFSCUB DHCRFVN
Delete EC DHCRFCBNMU. )JaUDB QOPLCUBQK EC JCPU DHCQQC, DOBOMX_ [MUDMCQEO MCPJFMCUBQK R NLCHUEFKY. #
LCH\EU_VUS ]BOB OJaUDB EU BOH\DO REOQFB PCBMUJORCEEXU FPSUEUEFK, EO F OJUQ[UWFRCUB MCJOBN
DOSCELX Undo SUEI Edit. .OPLC_BU BMCEPCD^FI R UGO DOEQBMNDBOMU, ROQ[OH\PN_BUQ\ BMCEPCD^FU_ LHK
QOYMCEUEFK RQUY FPSUEUEF_, C PCBUS LHK [OLLUMZDF OBSUEX.
Bapuaufu
6X EU JNLUS [UMUZORXRCB\ LO[OHEFBUH\EX_ DOL, OBEOQKTF_QK D BMCEPCD^FKS. %QHF RX UTU EU NHORFHF
OJTF_ [MFE^F[, JUQQSXQHUEEO [OLHFRCB\ SCQHO R OGOE\, C UQHF NHORFHF, BO JUP BMNLC MUCHFPNUBU RQU, O
WUS GOROMFBQK EFZU. +CD WBO K OGMCEFWNQ\ HFV\ PCSUWCEFKSF, R DOBOMXY O[FQXRCIBQK EUDOBOMXU
RCZEXU RCMFC^FF EC LCEENI BUSN.
Bnoeuuue nokupoeku
1BOJX RQK SUBOLFDC FSUHC YOB\ DCDO_-BO QSXQH, SX LOHZEX Q[MKBCB\ DHIWF OB NDCPXRCUSXY OJaUDBOR
F PCQBCRFB\ RQUY MCJOBCB\ Q ContrPtr F LockPtr. 3BO OBEOQFBQK EU BOH\DO D FPSUEUEFKS, REOQFSXS R
NDCPXRCUSXU OJaUDBX EU[OQMULQBRUEEO DHFUEBCSF, EO F D BUS, DOBOMXU OLFE NDCPXRCUSX_ OJaUDB
REOQFB R LMNGO_. +CDFS OJMCPOS, R OJTUS QHNWCU NDCPXRCUSXU OJaUDBX LOHZEX OJMCTCB\QK LMNG D
LMNGN WUMUP ConstPtr F LockPtr, DCD F DHFUEBX.
class A {
private:
ConstPtr<B>& b; // ConstPtr, &$& 4<M"
// D *.0.
};
%QHF ]DPUS[HKM DHCQQC A PCYOWUB RXPRCB\ EUDOEQBCEBENI `NED^FI b, OE LOHZUE QECWCHC [OHNWFB\
LockPtr LHK b. +CDFS OJMCPOS, DHCQQ A LOHZUE PECB\, DCDNI BMCEPCD^FI OE RX[OHEKUB [MF [O[XBDU
FPSUEUEFK b, F ]BC FE`OMSC^FK LOHZEC [OQBN[FB\ OB DHFUEBC. *HK [MOQBOBX ECPORUS OJaUDBX, D
DOBOMXS DHFUEBX OJMCTCIBQK EC[MKSNI, >#6&(-*',(, C OJaUDBX, DOQRUEEO OJEORHKUSXU NDCPXRCUSXS
OJaUDBOS, &"%6(-*',( [O OBEOVUEFI D NDCPXRCUSOSN OJaUDBN (OLFE F BOB ZU OJaUDB SOZUB
OLEORMUSUEEO JXB\ F [UMRFWEXS, F RBOMFWEXS).
%QHF RBOMFWEX_ OJaUDB FEDC[QNHFMNUBQK R [UMRFWEOS (BO UQB\ RBOMFWEX_ OJaUDB EURFLFS LHK
ODMNZCITUGO SFMC), ]BO [MCRFHO SOZEO OJO_BF. 0OEQBMNDBOM DO[F_ [UMRFWEOGO OJaUDBC LOHZUE
[MOLNJHFMORCB\ RBOMFWEX_ OJaUDB, C O[UMCBOM = [UMRFWEOGO OJaUDBC LOHZUE [MOLNJHFMORCB\
RBOMFWEX_ OJaUDB [MCROQBOMOEEUGO RXMCZUEFK. 5MF QOJHILUEFF ]BFY NQHORF_ HOGFDC QOPLCEFK
OJMCPOR R ConstPtr F LockPtr JNLUB [MCRFH\EO MCJOBCB\ Q FEDC[QNHFMORCEEXSF OJaUDBCSF. 3BO
[MOFQYOLFB CRBOSCBFWUQDF R BUY QHNWCKY, DOGLC RBOMFWEX_ OJaUDB REULMKUBQK R [UMRFWEX_ (BO UQB\
DOGLC R DCZLOS ]DPUS[HKMU A OJaUDB B YMCEFBQK EU DCD NDCPCBUH\, C DCD OJXWECK [UMUSUEECK DHCQQC):
class A {
private:
.53
B b; // G("07"((<? ';E"&*
};
0OS[FHKBOM JNLUB CRBOSCBFWUQDF RXPXRCB\ DOEQBMNDBOM DO[F_ B [MF DCZLOS DO[FMORCEFF A, F
O[UMCBOM = DHCQQC B [MF RX[OHEUEFF [MFQRCFRCEFK.
5MUL[OHOZFS, DHCQQ A LOHZUE PCJHODFMORCB\ b. )BDNLC JUMUBQK Transaction*? (CPNSUUBQK, FPREU A
BO UQB\ OB DHFUEBC. #[MOWUS, ]BN PCLCWN SOZEO MUVFB\ BMUSK Q[OQOJCSF:
5UMULCRCB\ Transaction* R DCZLNI `NED^FI A, DOBOMO_ SOZUB [OBMUJORCB\QK RXPRCB\
EUDOEQBCEBENI `NED^FI B.
)LFE MCP [UMULCB\ Transaction* R A RO RMUSK JHODFMORDF F QOYMCEFB\ R [UMUSUEEO_ DHCQQC.
.LUHCB\ NDCPCBUH\ ConstPtr DHCQQC A UTU JOHUU GUEFCH\EXS ECNWFB\ UGO JHODFMORCB\
RBOMFWEXU OJaUDBX [O [OMNWUEFI A.
$C [OQHULEUS MUVUEFF QHULNUB [ORUQFB\ BCJHFWDN: +OH\DO LHK [MO`UQQFOECH\EXY DCQDCLUMOR. $U
NRUMUE EU [XBC_QK. +US EU SUEUU, R EUDOBOMXY QFBNC^FKY HNWVCK MUCHFPC^FK BMCEPCD^F_
[OLMCPNSURCUB FQ[OH\PORCEFU DOSSUMWUQDFY DHCQQOR NDCPXRCUSXY OJaUDBOR. 3BO_ QBMCBUGFU_ SOZEO
ROQ[OH\PORCB\QK LCZU LHK BOGO, WBOJX MCPMUVFB\ A YMCEFB\ UGO OJOZCUSX_ B* F EFWUGO EU PECB\ O
ConstPtr F LockPtr. 5ONSEURVFU ConstPtr F/FHF LockPtr DHCQQC A SOGNB JUP UGO RULOSC SUEKB\
CLMUQC [MF QOPLCEFF OJMCPOR F PCDMU[HUEFF FPSUEUEF_. # LCH\EU_VUS SX UTU EUOLEODMCBEO
RQBMUBFSQK Q DOE^U[^FU_ OJaUDBOR, DOBOMXU O[FQXRCIB LMNGFU OJaUDBX F/FHF SCEF[NHFMNIB FSF.
8HFZU D DOE^N SX QEORC RUMEUSQK D [MOJHUSU SUZOJaUDBEXY QQXHOD.
Bsauruue nokupoeku u oepepu
%QHF R HIJO_ SOSUEB RMUSUEF SOZUB QNTUQBRORCB\ EU JOHUU OLEO_ BMCEPCD^FF, RQU PCSUWCBUH\EO. %QHF
ZU Q RCVFSF OJaUDBCSF SOGNB ROPFB\QK QMCPN EUQDOH\DO BMCEPCD^F_, [MFLUBQK QLUHCB\ UTU EUQDOH\DO
VCGOR. #OPSOZEX MCPEXU [MFWFEX EC[MFSUM, RCVU [MFHOZUEFU-QUMRUM SOZUB OJQHNZFRCB\
EUQDOH\DO [OH\PORCBUHU_, FHF RX EC[FVUBU GMC`FWUQDOU [MFHOZUEFU Q DOEBUDQBEO_ OBSUEO_, R
DOBOMOS EUOJYOLFSO PC[OSFECB\ OBSUEKUSNI DOSCELN LHK EUQDOH\DFY ODOE. $CDOEU^, OQBCUBQK UTU
OLEO [MU[KBQBRFU EUOJYOLFSO [MOLNSCB\ [ORULUEFU RCVU_ [MOGMCSSX R QFBNC^FF, DOGLC OEC
[XBCUBQK PCJHODFMORCB\ NZU PCJHODFMORCEEX_ OJaUDB.
Koucepeafueuan nokupoeka
5MF $%*.#6&+"(&*%3 /2%$(6%&$# (conservative locking) BMCEPCD^FK JHODFMNUB RQU OJaUDBX, DOBOMXU U_
SOGNB [OECLOJFB\QK, LO REUQUEFK DCDFY-HFJO FPSUEUEF_. %QHF PCJHODFMORCB\ RQU OJaUDBX EU NLCUBQK,
BMCEPCD^FK HFJO ZLUB, [ODC OEF QBCENB LOQBN[EXSF, HFJO [OLEFSCUB MNDF F QOOJTCUB [OH\PORCBUHI,
WBO [MF RQUS NRCZUEFF D EUSN [MOQ\JC OBDHOEKUBQK. )LEC FP ROPSOZEXY MUCHFPC^F_ DOEQUMRCBFREO_
JHODFMORDF PCDHIWCUBQK R BOS, WBOJX QNJDHCQQFMORCB\ Transaction F [O[XBCB\QK PCJHODFMORCB\ RQU
EUOJYOLFSOU R DOEQBMNDBOMU [MOFPROLEOGO DHCQQC ([MF ECHFWFF QBCELCMBEO_ OJMCJOBDF FQDHIWUEF_)
FHF R UGO OBLUH\EO_ FEF^FCHFPFMNITU_ `NED^FF ([MF OBQNBQBRFF BCDO_ OJMCJOBDF).
Arpeccueuan nokupoeka
5MF +76#..(&*%3 /2%$(6%&$# (aggressive locking) BMCEPCD^FK SOZUB ECWFECB\QK R HIJO_ SOSUEB F
JHODFMORCB\ OJaUDBX [O SUMU EUOJYOLFSOQBF. & JX ECPRCH UU QROURMUSUEEO_ JHODFMORDO_,
[OQDOH\DN JHODFMNIBQK BOH\DO EU[OQMULQBRUEEO OJEORHKUSXU OJaUDBX F ]BO [MOFQYOLFB [UMUL [UMRXS
OJEORHUEFUS.
Oepepu u esauruue nokupoeku
#O[MOQ O BOS, QBOFB HF QOPLCRCB\ OWUMULF PC[MOQOR EC JHODFMORDN, QOQBCRHKUB OBLUH\EX_ CQ[UDB
LFPC_EC. %QHF OWUMULF EU [OLLUMZFRCIBQK F BMCEPCD^FK [O[XBCUBQK PCJHODFMORCB\ OJaUDB, MCEUU
PCJHODFMORCEEX_ LMNGO_ BMCEPCD^FU_, OEC PCDCEWFRCUBQK EUNLCWU_. 5MF DOEQUMRCBFREO_ JHODFMORDU
BMCEPCD^FK ROOJTU EU ECWFECUBQK, C [MF CGGMUQQFREO_ OEC ROPRMCTCUBQK D [MUZEUSN QOQBOKEFI,
QDMUTFRCUB MNDF EC QROU_ LROFWEO_ GMNLF F QNMORO QSOBMFB EC [OH\PORCBUHK. # EUDOBOMXY
[MFHOZUEFKY ]BO R[OHEU EOMSCH\EO, EO R LU_QBRFBUH\EOQBF ]BO MUVUEFU FP BUY, O DOBOMXY Q[U^FCHFQBX
FP QHNZJX [OLLUMZDF SOGNB HFV\ SUWBCB\ RUL\ OEO GCMCEBFMNUB FS [OQBOKEENI MCJOBN. 1BOJX EU
.54
OBDCPXRCB\QK OB RBOMO_ BMCEPCD^FF, OJXWEO QBOFB [OLOZLCB\ QEKBFK JHODFMORDF Q OJaUDBC BUDNTU_
BMCEPCD^FU_.
5MF OBQNBQBRFF OWUMULU_ RCS EU [MFLUBQK JUQ[ODOFB\QK O QFBNC^FKY RPCFSEO_ JHODFMORDF (DOGLC A
OZFLCUB B, C B OZFLCUB A). %QHF BMCEPCD^FK PC[MOQFHC JHODFMORDN F EU QSOGHC UU [OHNWFB\, OEC
NEFWBOZCUBQK. %QHF OWUMULF [OLLUMZFRCIBQK, DOL JHODFMORDF LOHZUE O[MULUHFB\, [MFECLHUZFB HF
]BO_ BMCEPCD^FF DCDFU-HFJO JHODFMORDF, DOBOMXY LOZFLCIBQK OQBCH\EXU, F UQHF [MFECLHUZCB,
FPJCRFB\ OLEN FP BMCEPCD^F_ OB JUQDUEUWEOGO OZFLCEFK.
5MOFQYOLKTUU ODCPXRCUBQK R O[CQEO_ JHFPOQBF OB BOWDF, R DOBOMO_ RCS [MFYOLFBQK HFJO MCPJFRCB\
QROU [MFHOZUEFU EC EUQDOH\DO [OLPCLCW F [OMNWCB\ O[UMC^FOEEO_ QFQBUSU FY [HCEFMORCEFU, HFJO
ROQ[OH\PORCB\QK OLEO_ FP DOSSUMWUQDFY JFJHFOBUD Q [OLLUMZDO_ SEOGO[OBOWEOQBF. +CD FHF FECWU, R
]BO_ OJHCQBF SX EU NPECUS EFWUGO [MFE^F[FCH\EO EOROGO, OBEOQKTUGOQK D .++, F [O]BOSN EU JNLUS
MCPRFRCB\ ]BN BUSN. )J OWUMULKY, JHODFMORDCY F SEOGO[OBOWEOQBF EC[FQCEO EUSCHO YOMOVFY DEFG, RX
ECRUMEKDC EC_LUBU FY R MCPLUHU 8CPX LCEEXY QROUGO DEFZEOGO SCGCPFEC.
Muoroypoeueean ofreua
.USCEBFDC BMCEPCD^F_ LOROH\EO HUGDO MCQ[MOQBMCEKUBQK F EC SEOGONMOREURNI OBSUEN (UQHF RQ[OSEFB\
DOE^U[^FF StackPtr, O DOBOMXY GOROMFHOQ\ RXVU). .NTUQBRNUB LRC OQEOREXY RCMFCEBC MUCHFPC^FF.
Knacc LockPtr co cfekaru opasoe
.CSX_ [MKSOHFEU_EX_ RCMFCEB MUCHFPC^FF SEOGONMOREURO_ OBSUEX LHK BMCEPCD^F_ RDHIWUEFU
QBUDC QBCMXY OJMCPOR R DCZLX_ LockPtr. 3BC FLUK [OPCFSQBRORCEC FP MCQQSOBMUEEOGO RXVU DOLC
StackPtr. +US EU SUEUU, OEC [OLYOLFB HFV\ LHK DOEQUMRCBFREO_ JHODFMORDF. # QHNWCU Q CGMUQQFREO_
JHODFMORDO_ OJaUDB SOZUB JXB\ R[UMRXU PCJHODFMORCE NZU [OQHU FPSUEUEFK OQBCH\EXY OJaUDBOR. 3BO
NQHOZEKUB OBSUEN EUQDOH\DFY FPSUEUEF_, [OQDOH\DN QBUDF MCPEXY LockPtr EU QFEYMOEFPFMNIBQK.
Cfeku nap LockPtr/opas
0 [MOJHUSU SOZEO [OLO_BF F FECWU RDHIWFB\ R Transaction QBUD, R DOBOMOS YMCEKBQK [CMX QBCMX_
OJMCP/LockPtr. $C DCZLOS NMOREU QBUDC YMCEKBQK HFV\ BU LockPtr, DOBOMXU QNTUQBRORCHF EC SOSUEB
PCDMU[HUEFK. # OJTUS QHNWCU ]BO MUVUEFU MCJOBCUB HNWVU, D BOSN ZU OEO WNB\ JOHUU ]``UDBFREO RX
FQ[OH\PNUBU OLFE JOH\VO_ QBUD RSUQBO SEOZUQBRC SCHUE\DFY.
Onfurusauun oLera
*MNGOU MUVUEFU MUOMGCEFPC^FK QBMNDBNM LCEEXY LHK QODMCTUEFK FPLUMZUD, QRKPCEEXY Q YMCEUEFUS
EUPCJHODFMORCEEXY ConstPtr (YOBK F ^UEO_ EUDOBOMO_ [OBUMF QDOMOQBF). ConstPtr HFV\
EUPECWFBUH\EO OBHFWCUBQK OB NDCPCBUHU_ BOH\DO LHK WBUEFK, DOBOMXU MCQQSCBMFRCHFQ\ R GHCRU 6 F EU
FSUHF EFWUGO OJTUGO Q BMCEPCD^FKSF: OE FSUUB QQXHDN EC ConstPtr F `NED^FI Lock(). 6X
FPJCRFSQK OB [UMROGO F REUQUS EUDOBOMXU FPSUEUEFK RO RBOMOU.
5MULQBCR\BU QUJU GHOJCH\ENI QBMNDBNMN LCEEXY (RUMOKBEO, YMCEKTNIQK R RFLU QBCBFWUQDOGO WHUEC
DHCQQC Transaction), R DOBOMO_ ECYOLFBQK FE`OMSC^FK O BOS, DCDFU Transaction JHODFMNIB DCDFU
ConstPtr. *HK DCZLO_ [CMX R BCJHF^U QOLUMZFBQK QOOBRUBQBRNITF_ LockPtr. 0CZLX_ MCP, DOGLC
RXPXRCUBQK `NED^FK Lock() DHCQQC ConstPtr, OEC [MORUMKUB, [MFQNBQBRNUB HF this R BCJHF^U. %QHF
[MFQNBQBRNUB, `NED^FK QMCREFRCUB BMCEPCD^FI, [UMULCEENI R DCWUQBRU CMGNSUEBC, Q ECYOLKTU_QK R
BCJHF^U. %QHF ConstPtr EU ECYOLFB QUJK R BCJHF^U, OE RDHIWCUB R EUU EORX_ BMF[HUB (ConstPtr,
Transaction, LockPtr), C UQHF ECYOLFB Q LMNGO_ BMCEPCD^FU_ FEF^FFMNUB FQDHIWUEFU.
+CDCK QYUSC ODCPXRCUBQK JOHUU ]DOEOSEO_, WUS O[FQCEECK RXVU; OEC EU BMCBFB [CSKB\ EC PECWUEFK
NULL LHK RQUY EUPCJHODFMORCEEXY OJaUDBOR. (CPNSUUBQK, OEC QHOZUEUU F SULHUEEUU MCJOBCUB
QBMNDBNMC LCEEXY UTU BOH\DO MCPOGMURCUB LRFGCBUH\ EC QBCMBU, C DOQRUEEO_ OJMCTUEFU WUMUP
[UMUSUEENI DHCQQC NZU [UMUQUDCUB `FEFVENI WUMBN.
#OPSOZEO, N RCQ ROPEFD RO[MOQ C [OWUSN `NED^FK Lock() LOHZEC OQBCRCB\QK Q ConstPtr? 5OWUSN
UU EUH\PK RDHIWFB\ R LMNGO_ DHCQQ FHF LCZU QLUHCB\ GHOJCH\EO_ `NED^FU_? %QHF SX FPJCRFSQK OB
[UMUSUEEO_ LockPtr* F `NED^FF Lock(), ConstPtr [MURMCBFBQK R QCSX_ OJXWEX_ NDCPCBUH\ BOH\DO
LHK WBUEFK, DOBOMX_ EC RO[MOQ O BMCEPCD^FKY HFV\ BN[O QSOBMFB EC RO[MOVCITUGO. #[MOWUS, BCD HF
]BO? LockPtr [O-[MUZEUSN [MFYOLFBQK OJaKRHKB\ LMNGOS; QHULORCBUH\EO, YOBK JX BMFRFCH\EXY
.55
FPSUEUEF_ EU FPJUZCB\. 8OHUU BOGO, Transaction EU PECUB DOEDMUBEX_ BF[ NDCPXRCUSOGO OJaUDBC F
[OBOSN EU SOZUB FQ[OH\PORCB\ VCJHOE LockPtr LHK QOPLCEFK OJaUDBC JHODFMORDF. %QHF RX UTU EU
PCJXHF, CJQBMCDBEX_ JCPORX_ DHCQQ Lock QOPLCRCHQK FSUEEO LHK ]BO_ ^UHF. 4RX. $CS YOBUHOQ\ JX
OQBCRFB\ ConstPtr R QWCQBHFROS EURULUEFF EO EU QNZLUEO.
Heckonuko npoanuuux cnoe
(UCHFPC^FK [OHEO_ QYUSX OJMCJOBDF BMCEPCD^F_ PCEFSCUB EU BCD NZ SEOGO SUQBC, EO OB ]BOGO OEC EU
QBCEORFBQK [MOTU. !PSUEUEFK [MFYOLFBQK REOQFB\ [MCDBFWUQDF R HIJO_ DHCQQ, DOBOMX_ QQXHCUBQK EC
LMNGFU DHCQQX, [OQDOH\DN JOH\VFEQBRO NDCPCBUHU_ LOHZEO QOOBRUBQBRORCB\ QOGHCVUEFKS
ConstPtr/LockPtr. #[MOWUS, ]BO EU LUSOEQBMFMNUB [OHENI JUPECLUZEOQB\ [OLOJEXY [O[XBOD EC
.++, C HFV\ [OLWUMDFRCUB RCZEOQB\ QOJHILUEFK LRNY OQEOREXY [MFE^F[OR:
/. !Q[OH\PN_BU NSEXU NDCPCBUHF, LCZU UQHF RX EU NRUMUEX, WBO ]BO ENZEO.
2. :CECBFWEO QHULFBU PC BUS, WBOJX DOEQBCEBEXU OJMCTUEFK OBLUHKHFQ\ OB EUDOEQBCEBEXY.
%QHF RCV DOL JNLUB FPECWCH\EO NQBMOUE BCDFS OJMCPOS, [OLOJECK MCQVFMUEECK CMYFBUDBNMC
MUCHFPNUBQK EC [OMKLOD [MOTU.
# ]BOS DMOUBQK OLFE FP SFQBFWUQDFY [MFE^F[OR .++, O DOBOMXY GOROMFHOQ\ RXVU RX LOHZEX
[OEKB\ EU BO, DCD KPXD Q[MCRHKUBQK Q DOEDMUBEO_ [MOJHUSO_, C BO, DCD OE OJUQ[UWFRCUB [OQBMOUEFU
[OHEO^UEEO_, ECLUZEO_ [MOGMCSSX. $UDOBOMXU FEQBMNSUEBX .++, [OLLUMZFRCITFU [OLOJENI
CMYFBUDBNMN, EU FSUIB CECHOGOR R LMNGFY KPXDCY (RPKB\ YOBK JX DOEQBMNDBOMX DO[F_, O[UMCBOMX = F
->). 8HCGOLCMK ]BFS QFEBCDQFWUQDFS F QUSCEBFWUQDFS QBMCEEOQBKS QHOZEXU JFJHFOBUDF DHCQQOR
QBCEORKBQK JOHUU [OEKBEXSF F [OHUPEXSF. +OH\DO [OLNSC_BU, ECQDOH\DO JX RQU NQHOZEFHOQ\, UQHF JX
SX EU SOGHF [UMUGMNPFB\ O[UMCBOM -> R ConstPtr F LockPtr. 5MF [MCRFH\EOS RXJOMU FLFOS .++ EU
[OLRULUB EF EC QDOH\PDO_ LOMOGU, EF R [HOYNI [OGOLN.
$CDOEU^, [OSEFBU O BOS, WBO ]BC GHCRC [MULECPECWCHCQ\ LHK BMUEFMORDF BROMWUQDOGO ROOJMCZUEFK
SX YOBUHF NPECB\, DNLC ECQ PCRULUB DOE^U[^FK NSEOGO NDCPCBUHK, UQHF [MFSUEFB\ UU EC QRUZUS
SCBUMFCHU. )BRUB: LOROH\EO LCHUDO. 5OQHU LOJCRHUEFK EUDOBOMXY FLFOS F [MFE^F[OR LFPC_EC,
MCQQSOBMUEEXY R QHULNITFY GHCRCY, [OLOJENI CMYFBUDBNMN JNLUB HUGWU RO[HOBFB\ R MUCH\EO_
[MOGMCSSU.
Cuoea o funax
) [MOUDBFMORCEFF FUMCMYF_ DHCQQOR EC[FQCEO QBOH\DO, WBO K LCZU EU
PECI, Q WUGO ECWCB\. 8OH\VCK WCQB\ [OLOJEO_ HFBUMCBNMX EU FSUUB
OBEOVUEFK D Q[U^F`FDU .++, F UU SOZEO [MO[NQBFB\. )LECDO FP BOGO, WBO
OQBCHOQ\, EUDOBOMXU BUSX EU [OHNWFHF LOHZEOGO REFSCEFK. .MULF BUS,
FSUITFY OQOJOU PECWUEFU LHK [MOGMCSSFMORCEFK EC .++, OQOJCK
MCPEORFLEOQB\ FUMCMYFF DHCQQOR, BCD ECPXRCUSCK GOSOSOM`ECK FUMCMYFK.
.NTUQBRNUB F LMNGCK FEBUMUQECK DOE^U[^FK LHK DHFUEBC NDCPCBUH\
SOZUB RXGHKLUB\ DCD ECQBOKTF_, WUQBEX_ OJaUDB, C EU DCD [NB\ D EUSN.
3BF LRU BUSX QBCENB OQEOREXSF R ]BO_ WCQBF. "COLEO SX, DCD RQUGLC,
FQQHULNUS MKL JODORXY BMO[FEOD, NROLKTFY R QBOMOEN OB GHCREO_
LOMOGF.
3
-acfu
Muoecfeeuuan
nepepaa
0OGLC MUW\ PCYOLFB OJ FUMCMYFF DHCQQOR, QMCPN ZU YOWUBQK MCPMCPFB\QK BMUQDNWU_ MUW\I OJ OJaUDBEO-
OMFUEBFMORCEEOS LFPC_EU. )LECDO K Q[MCRHIQ\ Q FQDNVUEFUS F OGMCEFWNQ\ HFV\ BO_ WCQB\I BUSX,
DOBOMCK MCPRFRCUB [OBUE^FCH .++, C FSUEEO GOSOSOM`EXSF FUMCMYFKSF. "C LHFEEXS BUMSFEOS
[MKWUBQK [MOQBCK DOE^U[^FK FUMCMYFK DHCQQOR Q OLFECDORXS OBDMXBXS FEBUM`U_QOS,
NECQHULORCEEXS OB OJTUGO JCPOROGO DHCQQC. .NB\ [MOQBC, EO ROPSOZEOQBF OGMOSEX.
$USULHUEEO ROPEFDCUB [UMRX_ RO[MOQ: DCD RX[OHEKB\ [UMULCWN RXPOROR `NED^F_, DOGLC ULFEQBRUEEOU,
WBO RCS FPRUQBEO OJ CMGNSUEBCY, RQU OEF [MOFQYOLKB OB EUDOBOMOGO OJTUGO [MULDC? .FHOROU
MUVUEFU Q DOEQBMND^FU_ switch/case, EUMULDO RQBMUWCITUUQK R MUCH\EXY [MOGMCSSCY, OJXWEO
NLCUBQK PCSUEFB\ ECSEOGO JOHUU ]HUGCEBEO_, JXQBMO_ F [MOQBO_ R QO[MOROZLUEFF CMYFBUDBNMO_,
FPRUQBEO_ [OL ECPRCEFUS ,*%D#."&#**%3 >#6#)+-( (multiple dispatch).
# ]BO_ F QHULNITU_ GHCRU SX RMUSUEEO OBRHUWUSQK OB ECRKPWFRO_ BUSX NDCPCBUHU_. 5ODHOEEFDF
NDCPCBUHU_, EU OBWCFRC_BUQ\! # GHCRU /2 GOSOSOM`FPS F NSEXU NDCPCBUHF OJaULFEKBQK R EORO_
MCPEORFLEOQBF NSEXY NDCPCBUHU_ ECQBOH\DO NSEXY, WBO RX LCZU EU JNLUBU [OLOPMURCB\ OJ FY
[MFQNBQBRFF.
Fororopquue uepapxuu knaccoe
#O GHCRU GOSOSOM`EO_ FUMCMYFF DHCQQOR RQUGLC QBOFB CJQBMCDBEX_ JCPORX_ DHCQQ, DOBOMX_ O[MULUHKUB
OBDMXBX_ FEBUM`U_Q QROFY [MULDOR. !P WFQBO QUEBFSUEBCH\EXY [OJNZLUEF_ K ECPORN ]BOB DHCQQ-
[MULOD LULNVDO_ (Grandpa). 0CD [MCRFHO, Grandpa KRHKUBQK -(."% +/."6+$"*', $2+..%, BO
UQB\ OE EU QOLUMZFB EF OLEO_ [UMUSUEEO_, C RQU UGO `NED^FF KRHKIBQK RFMBNCH\EXSF.
class Grandpa {
public: // T$&7<*<" / -$K/K"((<" .#"(< '*)3*)*43>*
virtual void Fn1() = 0;
virtual void Fn2(int) = 0;
};
(CPNSUUBQK, DHCQQN Grandpa EU ENZEX DOEQBMNDBOMX. $CHFWFU WFQBO RFMBNCH\EXY WHUEOR GCMCEBFMNUB,
WBO ]DPUS[HKMX Grandpa EU[OQMULQBRUEEO EFDOGLC QOPLCRCB\QK EU JNLNB. *HK WFQBO CJQBMCDBEXY
JCPORXY DHCQQOR K FEOGLC FQ[OH\PNI LMNGO_, EU`OMSCH\EX_ BUMSFE DHCQQ-[UEQFOEUM. #UMOKBEO,
BCDFU DHCQQX LUHCHF WBO-BO [OHUPEOU EC MCEEFY QBCLFKY ^FDHC MCPMCJOBDF, EO BU[UM\ OEF QHNZCB RQUGO
HFV\ LHK CJQBMCDBEOGO OJaULFEUEFK QUSU_QBRC.
3BO UTU EU OJUQ[UWFRCUB GOSOSOM`FPSC. #QU PCRFQFB OB BOGO, DCD OB Grandpa [OMOZLCIBQK EORXU
DHCQQX. ,OSOSOM`EXSF [O OBEOVUEFI D Grandpa ECPXRCIBQK [MOFPROLEXU DHCQQX, R DOBOMXU EU
LOJCRHKUBQK EFDCDFY OBDMXBXY WHUEOR. )EF SOGNB FSUB\ HIJXU PCDMXBXU F PCTFTUEEXU WHUEX, EO
BOH\DO EU EORXU OBDMXBXU.
class Dad : public Grandpa {
private:
// L ."2 5$5$ (/&'80$ (" 7$))&$-<4$#
.0
.60
protected:
// S*' ;<#' 3 5$5<, (' (" ;<#' 3 0"03M&/
public:
virtual void Fn1();
virtual void Fn2(int);
};
class AuntMartha : public Grandpa {
private:
// W/.($% 1/-(, *"*3M&/ 9$7*<
protected:
// A', .*' '($ 5"7"0$#$ 2'/2 &3-"($2
public:
virtual void Fn1();
virtual void Fn2(int);
};
!UMCMYFI SOZEO [MOLOHZFB\ F LCH\VU (EC[MFSUM, class Me : public Dad) [MF NQHORFF, WBO R
OBDMXBX_ FEBUM`U_Q EU LOJCRHKUBQK EORXY `NED^F_.
6X MCQQSOBMFS SEOZUQBRO [MFSUMOR, LUSOEQBMFMNITFY [OHUPEOQB\ GOSOSOM`EXY FUMCMYF_, EO
QECWCHC K [MFRULN BMO_EO_ CMGNSUEB R [OH\PN ]BO_ DOE^U[^FF.
Bsaurosareunerocfu npouseopuux knaccoe
+OB, DBO [MFVUH EC OJaUDBEO-OMFUEBFMORCEENI RUWUMFEDN MCE\VU LMNGFY, QSOG RO_BF R FQBOMFI.
$UDBO 'FQDOR PCMCJOBCH QUJU FSK EC QHULNITU_ FLUU: UQHF DHFUEB FSUUB LUHO Q JCPORXS DHCQQOS, UGO
EU LOHZEO FEBUMUQORCB\, DCDO_ FP [MOFPROLEXY DHCQQOR EC QCSOS LUHU RX[OHEKUB MCJOBN. #X LOHZEX
FSUB\ ROPSOZEOQB\ [OLQBCRFB\ ]DPUS[HKM HIJOGO [MOFPROLEOGO DHCQQC RSUQBO ]DPUS[HKMC HIJOGO
LMNGOGO [MOFPROLEOGO DHCQQC; DHFUEBX JCPOROGO DHCQQC [MOQBO [OZFSCIB [HUWCSF F [MOLOHZCIB
MCJOBCB\ BCD, QHOREO EFWUGO EU [MOFPOVHO. 3BO ECPXRCUBQK [OLQBCEOROWEXS DMFBUMFUS 'FQDORC.
"ECBODF OJaUDBEO-OMFUEBFMORCEEOGO [MOGMCSSFMORCEFK OJXWEO QYOLKBQK EC BOS, WBO ]BO >OMOVCK
6XQH\.
.BMOGO GOROMK, LCEEX_ DMFBUMF_ SOZEO RX[OHEFB\ F JUP GOSOSOM`FPSC. %QHF [MOFPROLEX_ DHCQQ
QOLUMZFB LO[OHEFBUH\EXU OBDMXBXU `NED^FF, FY SOZEO [MOQBO EU RXPXRCB\ FP DHFUEBC JCPOROGO
DHCQQC. 5OQBO_BU-DC C PCWUS LOJCRHKB\ OBDMXBXU `NED^FF, UQHF FY EU FQ[OH\PORCB\? %QHF R OLEOS
[MOFPROLEOS DHCQQU JXHF LOJCRHUEX OLEF QDMXBXU `NED^FF, C R LMNGOS LMNGFU, QO RMUSUEUS R
RCVU_ [MOGMCSSU ECRUMEKDC OBXTUBQK BOWDC, R DOBOMO_ FY EUH\PK QROJOLEO [OSUEKB\ SUQBCSF.
$CQBOKTCK O[CQEOQB\ PCDHIWCUBQK RBOS, WO JUP RX[OHEUEFK ]BOGO DMFBUMFK DHFUEBCS [MFLUBQK LNSCB\
O [MOFPROLEXY DHCQQCY, C EU BOH\DO O JCPOROS DHCQQU, DOBOMX_ OEF PECIB F HIJKB. %QHF JX R Dad
[MFQNBQBRORCHF LO[OHEFBUH\EXU OBDMXBXU WHUEX, DHFUEBC Grandpa QO RMUSUEUS SOG JX Q[MOQFB\ QRO_
OJaUDB: *OHO_ [MFBROMQBRO WBO BX [MULQBCRHKUV\ QOJO_ R LU_QBRFBUH\EOQBF? # FBOGU JXHO JX
ECMNVUEO QBOH\DO [MFE^F[OR SOLNH\EOGO QBMOUEFK F FEDC[QNHK^FF, WBO OJ ]BOS SOZEO JXHO JX
EC[FQCB\ ^UHNI DEFGN.
.CSX_ [MOQBO_ Q[OQOJ OJUQ[UWFB\ RPCFSOPCSUEKUSOQB\ ROQ[OH\PORCB\QK GOSOSOM`FPSOS. 5O
DMC_EU_ SUMU, LHK FEBUM`U_QOR GOSOSOM`FPS OJUQ[UWFRCUB RPCFSOPCSUEKUSOQB\ [O O[MULUHUEFI,
[OQDOH\DN DHFUEBCS Grandpa EU [MFLUBQK JUQ[ODOFB\QK O QNTUQBRORCEFF LMNGFY `NED^F_, Q DOBOMXSF
FS [OHOZUEO MCJOBCB\.
Hopranuuoe uacnepoeauue
0HCQQ Grandpa SOZUB QOLUMZCB\ EU WFQBO RFMBNCH\EXU `NED^FF F [UMUSUEEXU F [MF RQUS ]BOS
OJUQ[UWFRCB\ [OHENI RPCFSOPCSUEKUSOQB\. +US EU SUEUU, QOR[CLUEFU FEBUM`U_QOR UTU EU OPECWCUB
RPCFSOPCSUEKUSOQBF OJaUDBOR. 5MFYOLFBQK NWFBXRCB\ LU_QBRFU RBOMFWEXY ]``UDBOR. 5MUL[OHOZFS,
`NED^FK Fn1() DHCQQC Grandpa EU KRHKUBQK WFQBO RFMBNCH\EO_:
void Grandpa::Fn1()
.6.
{
// I'0, 4<-<4$>K/? 4*'7/.(<" Q@@"&*<
}
void Dad::Fn1()
{
// I'0, 4<-<4$>K/? 0738/" 4*'7/.(<" Q@@"&*<
}
void AuntMartha::Fn1()
{
Grandpa::Fn1();
// =7'.""
}
0HFUEB Grandpa SOZUB [OHCGCB\QK EC RBOMFWEXU ]``UDBX ]BOGO DHCQQC. "ECI, PECI, FEDC[QNHK^FK F
RQU BCDOU, EC RBOMFWEXU ]``UDBX [OHCGCB\QK EFDOGLC EU QHULNUB EO LCRC_BU Q[NQBFSQK EC PUSHI.
:NED^FF, DOBOMXU SX RXPXRCUS, RX[OHEKIB MCPHFWEXU LU_QBRFK QDCZUS, MFQNIB EC ]DMCEU,
QOPLCIB OJaUDBX FHF PC[FQXRCIB FE`OMSC^FI R `C_HU. 8UP ]BFY RBOMFWEXY ]``UDBOR BOHDN OB EFY
JNLUB EUSEOGO. %QHF Grandpa OJHCLCUB EUDOBOMXSF RQBMOUEEXSF RBOMFWEXSF ]``UDBCSF, DHFUEBX
Grandpa SOGNB Q [OHEXS [MCROS ECLUKB\QK, WBO ]BF ]``UDBX QOYMCEKBQK RO RQUY [MOFPROLEXY DHCQQCY.
$O ROB Dad NQOSEFHQK R CRBOMFBUBU Grandpa F R QROUS [UMUO[MULUHUEFF Fn1() EU [OBMNLFHQK RXPRCB\
Grandpa::Fn1(). #BOMFWEXU ]``UDBX Grandpa::Fn1() [MO[CLCIB. (CEO FHF [OPLEO ]BO ECWEUB
JUQ[ODOFB\ DHFUEBC Grandpa, DOBOMXU, ROPSOZEO, ZLCH OB Dad QORQUS FEOGO. - ROB AuntMartha R
QROS [UMUO[UMULUHUEFF RXPXRCUB Grandpa::Fn1() F [OBOSN QOYMCEKUB RQU RBOMFWEXU ]``UDBX
Grandpa::Fn1(). +U[UM\ AuntMartha SOZUB RX[OHEKB\ HIJXU LO[OHEFBUH\EXU LU_QBRFK R [MULUHCY
MCPNSEOGO DHFUEBOR Grandpa ]BO QORUMVUEEO EU FEBUMUQNUB.
%QHF [UMUO[MULUHUEECK `NED^FK RXPXRCUB RUMQFI JCPOROGO DHCQQC, GOROMKB, WBO OEC *%6,+2;*%
*+.2#)8#".4 OB ]BO_ `NED^FF. $U RCZEO, GLU ECYOLFBQK ]BOB RXPOR R ECWCHU, R DOE^U FHF QUMULFEU
[UMUO[MULUHUEEO_ `NED^FF. #CZEO HFV\ BO, WBO R DCDO_-BO SOSUEB OE RQU ZU [MOFQYOLFB. %QHF RQU
[UMUO[MULUHUEEXU `NED^FF [MOFPROLEOGO DHCQQC ECQHULNIBQK EOMSCH\EO, GOROMKB, WBO RUQ\ DHCQQ
ECQHULNUBQK EOMSCH\EO. %QHF RQU [MOFPROLEXU DHCQQX GOSOSOM`EOGO JCPOROGO DHCQQC ECQHULNIBQK
EOMSCH\EO F EF OLFE FP EFY EU OJHCLCUB OQOJO RO[FITFSF RBOMFWEXSF ]``UDBCSF, FY SOZEO
[OLQBCRHKB\ RSUQBO LMNG LMNGC.
.CSX_ [MOQBO_ Q[OQOJ OJUQ[UWFB\ RPCFSOPCSUEKUSOQB\ QLUHCB\ RQU `NED^FF Grandpa WFQBO
RFMBNCH\EXSF. 3BO RXMOZLUEEX_ QHNWC_ EOMSCH\EOGO ECQHULORCEFK; UQHF `NED^FK JCPOROGO DHCQQC
KRHKUBQK WFQBO RFMBNCH\EO_, BO RQU UU RBOMFWEXU ]``UDBX (DOBOMXY EC QCSOS LUHU EUB) QOYMCEKIBQK [O
O[MULUHUEFI.
Hukancynnuun npouseopuux knaccoe
6X RQU UTU EU MCQQSOBMUHF RQUY [MFWFE MCPSUTUEFK WFQBO CJQBMCDBEOGO JCPOROGO DHCQQC RO GHCRU
FUMCMYFF. #PCFSOPCSUEKUSOQB\ F EOMSCH\EOU ECQHULORCEFU SOZEO OJUQ[UWFB\ DCD Q [UMUSUEEXSF F
EURFMBNCH\EXSF `NED^FKSF R Grandpa, BCD F Q RFMBNCH\EXSF `NED^FKSF, DOBOMXU EOMSCH\EO
ECQHULNIBQK [MOFPROLEXSF DHCQQCSF. "CWUS ECQBCFRCB\, WBOJX Grandpa JXH WFQBO RFMBNCH\EXS
JCPORXS DHCQQOS? )BRUB QOQBOFB RQUGO FP OLEOGO QHORC: (*$+>.824C(4. %QHF DHFUEB FSUUB LUHO BOH\DO Q
WFQBO CJQBMCDBEXS JCPORXS DHCQQOS, QOLUMZCTFS BOH\DO OBDMXBXU `NED^FF, OE [OHNWCUB CJQOHIBEX_
SFEFSNS FE`OMSC^FF, EUOJYOLFSO_ LHK FQ[OH\PORCEFK DHCQQC. #QU OQBCH\EOU (R BOS WFQHU F QCSF
[MOFPROLEXU DHCQQX) SOZUB JXB\ Q[MKBCEO OB WNZFY GHCP R `C_HU .cpp.
// G @$?#" .h
class Grandpa { ... };
// G @$?#"(-$C) .cpp
class Dad : public Grandpa { ... };
class AuntMartha : public Grandpa { ... };
!EDC[QNHK^FK [MOFPROLEXY DHCQQOR OLEO FP MULDFY [MOKRHUEF_ FQBFEEOGO [MOQRUBHUEFK
[MOGMCSSFQBC; RUMEX_ [MFPECD BOGO, WBO CRBOM [MOGMCSSX YOMOVO MCPJFMCUBQK R BOS, WBO OE LUHCUB.
.62
1BOJX NQFHFB\ ]``UDB, PCDMXBXU DHCQQX SOZEO OJaKRFB\ QBCBFQBFWUQDFSF F BUS QCSXS OGMCEFWFB\ FY
[MOQBMCEBQRO FSUE FQYOLEXS `C_HOS, R DOBOMOS OEF ECYOLKBQK.
. FEDC[QNHFMORCEEXSF [MOFPROLEXSF DHCQQCSF QRKPCEX O[MULUHUEEXU [MOJHUSX. $C[MFSUM, DCD
QOPLCB\ ]DPUS[HKMX BCDFY DHCQQOR, DCD Dad, DOBOMXU EU RFLEX DHFUEBN FP `C_HC .h? 3BF [MOJHUSX
HUGDO MUVCIBQK Q [OSOT\I FLFOS, O[FQCEEXY R LRNY QHULNITFY GHCRCY. - [ODC SX [MOLOHZFS
[NJHFDORCB\ [MOFPROLEXU DHCQQX R `C_HU .h, PECK, WBO QNTUQBRNUB ROPSOZEOQB\ FY [OHEO_
FEDC[QNHK^FF.
Muoecfeeuuan nepepaa
.CSX_ MCQ[MOQBMCEUEEX_ [MFSUM GOSOSOM`EO_ FUMCMYFF ECJOM DHCQQOR, QOOBRUBQBRNITFY
MCPHFWEXS RFLCS WFQUH: ^UHXS, DOS[HUDQEXS, RUTUQBRUEEXS F B.L. 0HCQQ-[MULOD BCDO_ FUMCMYFF
SOZUB ECPXRCB\QK Number F FSUB\ FEBUM`U_Q QHULNITUGO RFLC:
class Number {
public:
virtual Number operator+(const Number&) = 0;
virtual Number operator-(const Number&) = 0;
// D *.0.
};
class Integer : public Number {
private:
int i;
public:
Integer(int x) : i(x) {}
virtual Number operator+(const Number&);
// D *.0.
};
$C JNSCGU RQU RXGHKLFB [MOTU, WUS R LU_QBRFBUH\EOQBF. 0CD MUCHFPORCB\
Integer::operator+(Number&), UQHF ECS EU FPRUQBEO, WBO R QDOJDCY ECYOLFBQK RORQU EU Number, C
EUDOBOMX_ [MOFPROLEX_ DHCQQ? *HK DCZLO_ [CMX BF[OR, NWCQBRNITFY R QHOZUEFF, QNTUQBRNUB QRO_
CHGOMFBS. .NSSFMORCEFU Complex + Integer OBHFWCUBQK OB Integer + Real, DOBOMOU, R QROI
OWUMUL\, OBHFWCUBQK OB Integer + ArbitraryPrecisionNumber. 0CD [MOGMCSSU MCPOJMCB\QK, DCDO_
FP CHGOMFBSOR QHULNUB FQ[OH\PORCB\? 1BO-WBO? 0BO QDCPCH: "C[MOQFB\ N CMGNSUEBC O[UMCBOMC + UGO
ECQBOKTF_ BF[? $USULHUEEO RQBCE\BU R NGOH.
class Number {
protected:
int type; // R7$(/* /(@'72$B/> ' ($)*'%K"2 */5"
int TypeOf() { return type; }
// D *.0.
};
// 60"-*' 4 57'87$22"
switch (type) {
case kInteger: ...
case kComplex: ...
}
!SUEEO ]BOGO PECEFK BF[OR SX [OQBCMCUSQK FPJUZCB\. 0MOSU BOGO, RQU [MKSXU MUCHFPC^FF [OLOJEXY
QYUS EU OBHFWCIBQK OQOJO_ ]HUGCEBEOQB\I. #X DOGLC-EFJNL\ RFLUHF DOL, GUEUMFMNUSX_ DOS[FHKBOMOS
LHK DOEQBMND^FF switch/case? $F DMCQOBX, EF ]``UDBFREOQBF. #SUQBO ]BOGO SX OJaULFEFS PECEFK
DOS[FHKBOMC O BF[CY Q WNLUQCSF QORMUSUEEO_ BUYEOHOGFF v-BCJHF^CSF.
.63
eouan nepepaa
# OJOJTUEEOS RFLU PCLCWN SOZEO [MULQBCRFB\ R RFLU SCBMF^X, QBMODF DOBOMO_ QOOBRUBQBRNIB BF[CS
HUROGO O[UMCELC, C QBOHJ^X RQUROPSOZEXS BF[CS [MCROGO O[UMCELC. # DCZLO_ KWU_DU SCBMF^X
ECYOLFBQK DOEDMUBEX_ CHGOMFBS LHK OJMCJOBDF QOWUBCEFK BF[OR. 1CTU RQUGO BCDCK QFBNC^FK ROPEFDCUB
LHK GOSOSOM`EXY FUMCMYF_ RMOLU ECVU_, EO ROOJTU BF[X HUROGO O[UMCELC EU OJKPCEX QOR[CLCB\ Q
BF[CSF [MCROGO O[UMCELC.
0OEUWEO, ROPSOZEX QFHORXU MUVUEFK EC[MFSUM, PC[MKBCB\ R DCZLOS ]DPUS[HKMU QRULUEFK O UGO
BF[U. )LECDO JOHUU ]HUGCEBEOU MUVUEFU (F OJXWEO JOHUU ]``UDBFREOU) MUVUEFU EOQFB ECPRCEFU
)&%3*%3 >#6#)+-( (double dispatch).
class Number {
protected:
// :/)5"*."7)&/" @3(&B// 0#% '5"7$*'7$ +
virtual Number& operator+(const Integer&) = 0;
virtual Number& operator+(const Complet&) = 0;
// D *.0. 0#% 4)"C 57'/-4'0(<C */5'4
public:
virtual Number& operator+(const Number&) = 0;
virtual Number& operator-(const Number&) = 0;
// D *.0.
};
class Integer : public Number {
private:
int I;
protected:
virtual Number& operator+(const Integer&);
virtual Number& operator+(const Complex&);
public
Integer(int x) : i(x) {}
virtual Number& operator+(const Number&);
// D *.0.
};
Number& Integer::operator+(const Number& n)
{
return n + *this; // ='2"(%*, 2")*$2/ #"4<? / 57$4<? '5"7$(0
}
Number& Integer::operator+(const Integer& n)
{
// +/1" 57/4"0"( 5)"40'&'0
if (i + n.i )#/M&'2 4"#/&' 0#% int) {
return !"#'"F='4<M"(('?A'.(')*,>
}
else return Integer(i + n.i);
}
. ]BFS `MCGSUEBOS QRKPCEC OLEC EUBMFRFCH\ECK [MOJHUSC, D DOBOMO_ SX RUMEUSQK [OPZU, C [ODC
QOQMULOBOW\BU RQU REFSCEFU EC DOE^U[^FF. )EC [OYOZC EC QBUMUOGMCSSN WBOJX QDMXBCK DCMBFEDC
[MOKRFHCQ\, RCS [MFLUBQK MCQQHCJFB\ GHCPC F EUDOBOMOU RMUSK MCQQSCBMFRCB\ DOL. 0OGLC DHFUEB
[XBCUBQK QHOZFB\ LRC Integer, DOS[FHKBOM [UMULCUB RXPOR Integer::operator+(), [OQDOH\DN
operator+(Number&) KRHKUBQK RFMBNCH\EXS DOS[FHKBOM [MCRFH\EO ECYOLFB MUCHFPC^FI
[MOFPROLEOGO DHCQQC. 0 SOSUEBN RX[OHEUEFK Integer::operator+(Number&) ECQBOKTF_ BF[ HUROGO
.64
O[UMCELC NZU FPRUQBUE, OLECDO [MCRX_ O[UMCEL RQU UTU OQBCUBQK PCGCLDO_. $O R ]BOB SOSUEB ECQBN[CUB
RBOMO_ ]BC[ LRO_EO_ [UMULCWF: return n + *this. 'URX_ F [MCRX_ O[UMCELX SUEKIBQK SUQBCSF, C
DOS[FHKBOM [MFQBN[CUB D [OFQDCS v-BCJHF^X n. )LECDO EC ]BOB MCP OE FTUB [UMUO[MULUHUEFU
Number::operator+(Integer&), BCD DCD OE PECUB, WBO *this R LU_QBRFBUH\EOQBF FSUUB BF[ Integer.
3BO [MFROLFB D RXPORN Integer::operator+(Integer&), [OQDOH\DN BF[X OJOFY O[UMCELOR FPRUQBEX
F SOZEO ECDOEU^ [MOFPRUQBF RXWFQHUEFK. %QHF RX BCD F EU [OEKHF, WBO ZU [MOFQYOLFB, [MOGNHK_BUQ\
EC QRUZUS ROPLNYU F [O[MOJN_BU QEORC, [ODC EU [O_SUBU. #OPSOZEO, RCS [OSOZUB QHULNITCK
`OMSNHFMORDC: RSUQBO DOLFMORCEFK BF[C R ^UHO_ [UMUSUEEO_ SX O[MULUHFHF ECQBOKTF_ BF[ Number Q
[OSOT\I v-BCJHF^X.
+CDOU MUVUEFU EU BOH\DO ]HUGCEBEO. #UMOKBEO, OEO UTU F JOHUU ]``UDBFREO, WUS BU, DOBOMXU
[MFYOLFHF RCS R GOHORN. .DCZUS, [MFYOLFHOQ\ HF RCS RFLUB\ DOL, GUEUMFMNUSX_ DOS[FHKBOMOS LHK
DOEQBMND^FF switch/case? )E EUDMCQFR F RLOJCROD DNLC SUEUU ]``UDBFRUE, WUS [OQHULORCBUH\EOU
FELUDQFMORCEFU LRNY v-BCJHF^.
$UQSOBMK EC RQI ]HUGCEBEOQB\, LRO_ECK [UMULCWC LOROH\EO LOMOGO OJYOLFBQK [O OJaUSN DOLC F
QHOZEOQBF:
%QHF N RCQ FSUUBQK m [MOFPROLEXY DHCQQOR F n O[UMCBOMOR, BO $+D)'3 [MOFPROLEX_ DHCQQ
LOHZUE QOLUMZCB\ m*(n+/) RFMBNCH\EXY `NED^F_, LC UTU QBOH\DO ZU WFQBO RFMBNCH\EXY
PCGHNVUD R DHCQQU-[MULDU. !BOGO SX [OHNWCUS (m+/)*m*(n+/) LFQ[UBWUMQDFY `NED^F_. *HK
RQUY FUMCMYF_, DMOSU QCSXY BMFRFCH\EXY, ]BO LOROH\EO SEOGO.
%QHF O[UMCBOM EU KRHKUBQK DOSSNBFMNUSXS (BO UQB\ USN EUH\PK [UMULCB\ [ORBOMEX_ RXPOR Q
CMGNSUEBCSF, [UMUQBCRHUEEXSF R OJMCBEOS [OMKLDU), ]BO WFQHO NLRCFRCUBQK, [OQDOH\DN RCS
[MFLUBQK MUCHFPORCB\ OBLUH\EXU `NED^FF LHK LRNY RCMFCEBOR [OMKLDC CMGNSUEBOR. $C[MFSUM,
y/x QORQUS EU BO ZU, WBO x/y; RCS [OECLOJFBQK O[UMCBOM / F Q[U^FCH\ECK `NED^FK
DivideInto LHK [UMUQBCRHUEEXY CMGNSUEBOR.
0HFUEBX JCPOROGO DHCQQC RFLKB RQU NQBMCVCITFU PCTFTUEEXU `NED^FF, YOBK ]BO FS
QORUMVUEEO EU ENZEO.
+US EU SUEUU, R [MOQBXY QFBNC^FKY LRO_ECK [UMULCWC ODCPXRCUBQK R[OHEU MCPNSEXS MUVUEFUS RUL\
[MOJHUSC, DCD EF DMNBF, LOQBCBOWEO QHOZEC. .[U^F`FDC QFBNC^FF EUFPJUZEO BMUJNUB SEOZUQBRC
SUHDFY `MCGSUEBOR DOLC. *RO_ECK [UMULCWC RQUGO HFV\ PCSUEKUB JOH\VFU, NMOLHFRXU, EUSOLNH\EXU
DOEQBMND^FF switch/case JOHUU JXQBMO_ F SOLNH\EO_ RFMBNCH\EO_ LFQ[UBWUMFPC^FU_.
0CD [MCRFHO, DOHFWUQBRO `NED^F_ NLCUBQK QODMCBFB\, EO [MF ]BOS [MFYOLFBQK R BO_ FHF FEO_ QBU[UEF
FLBF EC DOS[MOSFQQ Q ECVFS QBMOGFS [MCRFHOS EFDOGLC EU Q[MCVFRCB\ N OJaUDBC, DCDOR UGO
ECQBOKTF_ BF[. $UDOBOMXU FP ]BFY [MFUSOR MCQQSCBMFRCIBQK EFZU. #FLFSOQB\ [MOFPROLEXY DHCQQOR
LHK DHFUEBOR Number BOZU NLCUBQK HFDRFLFMORCB\ SFEFSCH\EO_ ^UEO_; OJ ]BOS JNLUB MCQQDCPCEO R
GHCRU /2. 0CD F RO SEOGFY [MOJHUSCY LFPC_EC R .++, R DOBOMXY PCLU_QBRORCEX SCBMF^X O[UMC^F_, RCS
[MFLUBQK EC NMOREU PLMCROGO QSXQHC MUVFB\, QBOFB HF [ORXVCB\ SOLNH\EOQB\ PC QWUB JXQBMOLU_QBRFK
FHF OJaUSC DOLC.
Fefeporopquan peouan nepepaa
*RO_ECK [UMULCWC OJXWEO ROPEFDCUB R QFBNC^FKY, DOGLC OJC CMGNSUEBC [MOFQYOLKB OB OJTUGO [MULDC,
EO ]BO EU OJKPCBUH\EO. 'URX_ F [MCRX_ O[UMCELX SOGNB [MFECLHUZCB\ D MCPEXS DHCQQCS, EU FSUITFS
OJTUGO [MULDC.
)LFE FP SOFY HIJFSXY [MFSUMOR OBEOQFBQK D OJMCJOBDU QOJXBF_ R GMC`FWUQDFY QMULCY. .NTUQBRNUB
SEOZUQBRO ROPSOZEXY QOJXBF_: O[UMC^FF F SXV\I, QOJXBFK OB DHCRFCBNMX, QOJXBFK O[UMC^FOEEO_
QFQBUSX F LCZU BCDCK ]DPOBFDC, DCD MCQ[OPECRCEFU GOHOQC FHF QRUBOROU [UMO. . LMNGO_ QBOMOEX, R
[OH\PORCBUH\QDF_ FEBUM`U_Q OJXWEO RYOLKB MCPEOOJMCPEXU &()', >+*#2( FHF %$*+ (BUMSFEOHOGFK
PCRFQFB OB O[UMC^FOEEO_ QFQBUSX F FQ[OH\PNUSOGO KPXDC) REUVEFU ODEC Q PCGOHORDCSF F DEO[DCSF
PCDMXBFK, [OHK LHK MULCDBFMORCEFK BUDQBC F OJHCQBF, R DOBOMXY SOZEO MFQORCB\ DMCQFRXU DCMBFEDF.
*HK DCZLO_ DOSJFEC^FF DOEDMUBEOGO QOJXBFK Q DOEDMUBEXS BF[OS RFLC SOZUB [OBMUJORCB\QK
NEFDCH\ECK MUCHFPC^FK. #OPEFDCUB BC ZU [MOJHUSC, WBO F Q FUMCMYFU_ WFQUH, YOBK EC ]BOB MCP QOJXBFK F
RFLX EU FSUIB OJTUGO JCPOROGO DHCQQC. +US EU SUEUU, SUBOLFDC LRO_EO_ [UMULCWF RQU MCREO MCJOBCUB.
class Event { // S/)*' 4/7*3$#,(<? ;$-'4<? &#$)) 0#% )';<*/?
public:
.65
virtual void Process(View* v) = 0;
};
class MouseClick : public Event {
public:
virtual void Process(View* v) { v->Process(*this); }
};
class View { // S/)*' 4/7*3$#,(<? ;$-'4<? &#$)) 0#% 4/0'4
public:
virtual void Process(MouseClick& ev) = 0;
virtual void Process(Keystroke& ev) = 0;
// D *.0.
};
>OBK EC [UMRX_ RPGHKL DCZUBQK, WBO [MOJHUSC OBHFWCUBQK OB FUMCMYFF Number, [MFQSOBMFBUQ\
[OREFSCBUH\EUU. (UCHFPC^FK `NED^FF Process() DHCQQC Event RQUGO HFV\ MCPROMCWFRCUB O[UMC^FI
F [UMUEC[MCRHKUB RXPOR. 5OQDOH\DN `NED^FK Event::Process() KRHKUBQK RFMBNCH\EO_, DOGLC LUHO
LOYOLFB LO DHCQQC View, BOWEX_ BF[ Event NZU FPRUQBUE, F DOS[FHKBOM RXPXRCUB [MCRFH\ENI
[UMUGMNZUEENI RUMQFI View::Process().
0CZLX_ MCP, DOGLC RCS PCYOWUBQK PCJFB\ DOL BF[C R [UMUSUEENI DHCQQC, WBOJX NPECB\, Q DCDFS
[MOFPROLEXS DHCQQOS RX FSUUBU LUHO, [OLNSC_BU, EUH\PK HF [UMUHOZFB\ YHO[OBX EC DOS[FHKBOM Q
[OSOT\I LRO_EO_ [UMULCWF (FHF OLEOGO FP O[FQCEEXY EFZU RCMFCEBOR).
Repepaa onee eucokoro nopnpka
*O QFY [OM SX MCQQSCBMFRCHF BOH\DO JFECMEXU `NED^FF, OLECDO BC ZU SUBOLFDC MCQ[MOQBMCEKUBQK EC
`NED^FF Q [MOFPROLEXS DOHFWUQBROS CMGNSUEBOR EUFPRUQBEOGO BF[C. %QHF `NED^FK FSUUB n
CMGNSUEBOR, [UMULCRCB\ [MFLUBQK n MCP. 5MUL[OHOZFS, N RCQ FSUUBQK `NED^FK, DOBOMCK [OHNWCUB BMF
CMGNSUEBC Number F ROPRMCTCUB Number&. 6OZEO NQBMOFB\, WBOJX [UMRX_ CMGNSUEB ODCPCHQK R HURO_
WCQBF O[UMCBOMC -> (FHF .), C LCH\VU ECWFECIBQK DOSJFECBOMEXU FGMX.
class Number {
protected:
// this ("%4(<? 4*'7'? $7832"(*
virtual Number& fn1(Integer& n1, Number& n3) = 0;
virtual Number& fn1(Complex& n1, Number& n3) = 0;
// D *.0. 0#% 4)"C */5'4 4 5"74'? 5'-/B//

// this ("%4(<? *7"*/? $7832"(*
virtual Number& fn2(Integer& n1, Integer& n2) = 0;
virtual Number& fn2(Integer& n1, Complex& n2) = 0;
virtual Number& fn2(Complex& n1, Integer& n2) = 0;
virtual Number& fn2(Complex& n1, Complex& n2) = 0;
// D *.0. 0#% 4)"C )'."*$(/?
public:
// this ("%4(<? 5"74<? $7832"(*
virtual Number& fn(Number& n2, Number& n3) = 0;
};
class Integer : public Number {
protected:
// this ("%4(<? 4*'7'? $7832"(*
virtual Number& fn1(Integer& n1, Number& n3)
{ return n3.fn2(n1, *this); }
virtual Number& fn1(Complex& n1, Number& n3)
.66
{ reutrn n3.fn2(n1, *this); }
// D *.0. 0#% 4)"C */5'4 4 5"74'? 5'-/B//

// this ("%4(<? *7"*/? $7832"(*
virtual Number& fn2(Integer& n1, Integer& n2)
{
// +$)*'%K$% 7"$#/-$B/% /-4")*(< 4)" *7/ $7832"(*$
}
// D *.0. 0#% 4)"C )'."*$(/?
public:
// this -$0$((<? 5"74<? $7832"(*
virtual Number& fn(Number& n2, Number& n3)
{ return n2.fn1(*this, n3); }
};
+CDO_ RCMFCEB, DCD F LRO_ECK [UMULCWC, OJXWEO MCJOBCUB JXQBMUU LMNGFY [MULHCGCUSXY CMYFBUDBNM.
#QU LUHCUBQK PC BMF ]HUSUEBCMEXY [UMUYOLK WUMUP v-BCJHF^X, C ]BO ECSEOGO JXQBMUU, WUS YUVFMORCEFU
F [MOQSOBM BCJHF^. )LECDO OE EUDMCQFR F JXQBMO QBCEORFBQK EUN[MCRHKUSXS. #OP\SFBU MUVUEFU Q
LRO_EO_ [UMULCWU_ F ROOJMCPFBU, WBO UGO QHOZEOQB\ ECWFECUB ROPMCQBCB\ [O ]DQ[OEUEBU; RX [OHNWFBU
EUDOBOMOU [MULQBCRHUEFU O BOS, Q WUS QRKPCEO [OLLUMZCEFU BCDO_ QBMNDBNMX.
)[FQCEECK SUBOLFDC [MFSUEFSC F D GUBUMOSOM`EXS FUMCMYFKS, YOBK R MUPNH\BCBU N RCQ [OHNWFBQK
[MOGMCSSC-DNPEUWFD: OEC QORUMVCUB GOHORODMNZFBUH\EXU [MXZDF FP QBOMOEX R QBOMOEN. %QHF RX
[MOLUHCUBU EUWBO [OLOJEOU R EUBMFRFCH\EO_ QFBNC^FF, R LUE\ QLCWF [MOGMCSSX [MFYRCBFBU [OEWFDOR
FHF DOMOJDN DOE`UB F JNL\BU EUOJXWC_EO HIJUPEX QO QROFSF DOHHUGCSF. *CZU UQHF ]BO O[BFSCH\EOU
MUVUEFU, UGO ECRUMEKDC QOWBNB DCD JX ]BO QDCPCB\ R HNWVUS QHNWCU, Q[OMEXS.
%QHF `NED^FK FSUUB JOH\VU LRNY CMGNSUEBOR, WFQHO QOWUBCEF_ MCQBUB JXQBMUU, WUS GMFJX [OQHU
LOZLK. )MGCEFPNK SEOZUQBRUEENI [UMULCWN LHK EUQDOH\DFY CMGNSUEBOR, QUM\UPEO [OLNSC_BU ECL
O[FQCEEXSF EFZU [MFUSCSF GMN[[FMORDF, NSUE\VCITFSF DOHFWUQBRO QOWUBCEF_.
Fpynnupoeka nepepa u npeopasoeauun
# MUCH\EO_ ZFPEF MULDO RQBMUWCIBQK NEFDCH\EXU MUCHFPC^FF LHK RQUY QOWUBCEF_ HUROGO F [MCROGO
O[UMCELOR. $C[MFSUM, R HIJO_ O[UMC^FF Q NWCQBFUS DOS[HUDQEOGO F DCDOGO-BO LMNGOG WFQHC MUPNH\BCB
JNLUB DOS[HUDQEXS. 5MUOJMCPORCEFU EUDOS[HUDQEOGO CMGNSUEBC R DOS[HUDQEX_ QODMCTCUB DOHFWUQBRO
LFQ[UBWUMQDFY `NED^F_. 5MO^UQQ QODMCTUEFK SCBMF^X [UMULCW K O[FQXRCI OJTFS BUMSFEOS
768>>(6%&$+ (clustering). $C QCSOS LUHU LHK JOH\VFEQBRC PCLCW EU QNTUQBRNUB ]HUGCEBEOGO,
NEFRUMQCH\EOGO F [MFBOS GOHORODMNZFBUH\EO JXQBMOGO Q[OQOJC GMN[[FMORDF. 0 BOSN ZU ]BF Q[OQOJX
[MCDBFWUQDF EFDCD EU QRKPCEX Q QFEBCDQFQOS FHF FLFOSCSF .++. )EF HFJO BMUJNIB PECEFK BF[OR
(BUSC, D DOBOMO_ SX RUMEUSQK R QHULNITU_ GHCRU), HFJO OQEORCEX EC HOGFDU if/then/else FHF
switch/case, DOBOMO_ SX [XBCUSQK RQKWUQDF FPJUGCB\ R ]BO_ WCQBF.
.NTUQBRNB LRC OQEOREXY [OLYOLC:
/. !Q[OH\PORCB\ FUMCMYFI DHCQQOR LHK OJQHNZFRCEFK EUQDOH\DFY QOWUBCEF_ MCPHFWEXY BF[OR
CMGNSUEBOR OLEO_ MUCHFPC^FU_.
2. .`OMSFMORCB\ (#6+6?(F >6#%/6+9%&+*(3 F [MUOJMCPORCB\ OLFE FHF OJC CMGNSUEBC D JOHUU
NEFRUMQCH\EOSN BF[N, [OQHU WUGO RX[OHEFB\ [UMULCWN.
!Y EUBMNLEO Q[NBCB\, EO EC QCSOS LUHU OEF OBHFWCIBQK.
Fpynnupoeka e asoeux knaccax
5UMRX_ [OLYOL OJXWEO QRKPCE Q QOPLCEFUS Q[U^F`FWUQDO_ FUMCMYFF DHCQQOR, DOBOMCK OBOJMCZCUB
QBMNDBNMN GMN[[. 5MF ]BOS LFQ[UBWUMQDFU `NED^FF [OLLUMZFRCIBQK BOH\DO EC RXQODFY NMOREKY
FUMCMYFF DHCQQOR. 5MF [OFQDU QFGECBNM DOS[FHKBOM CRBOSCBFWUQDF [MUOJMCPNUB [MOFPROLEXU DHCQQX
D [MOSUZNBOWEXS JCPORXS DHCQQCS. +CDO_ RCMFCEB YOMOVO [OLYOLFB HFV\ LHK EU OWUE\ GHNJODFY
.67
FUMCMYF_, [OQDOH\DN [MF QOR[CLUEFF QFGECBNMX R LRNY JCPORXY DHCQQCY DOS[FHKBOM ECWEUB DMFWCB\
0CMCNH, EUOLEOPECWEOQB\!.
class foo { ... };
class bar : public foo { ... };
class banana : public bar { ... };
void fn(bar&);
void fn(foo&);
fn(*(new banana)); // +"'0('-($.(')*,! R$-C$-C$!
0OS[FHKBOMX OJOZCIB [OLOJEXU VNBDF, [OQDOH\DN OEF SOGNB ZLCB\ F EU QOOJTCB\ OJ OVFJDU LO BUY
[OM, [ODC FS EU RQBMUBFBQK PCRUBEOU QOWUBCEFU BF[OR. %QHF JX QNTUQBRORCHC [UMUGMNPDC fn() LHK
CMGNSUEBC banana&, EFDCDFY [MOJHUS EU ROPEFDHO JX DOS[FHKBOM RQUGLC [MUL[OWFBCUB BOWEOU
QOR[CLUEFU [MUOJMCPORCEFI. $O BOGLC [MO[CLCUB RUQ\ QSXQH GMN[[FMORDF [OQMULQBROS
CRBOSCBFWUQDOGO [MUOJMCPORCEFK D JCPOROSN DHCQQN.
Ofpeneuue funoe of uepapxuu knaccoe
#BOMO_ [OLYOL QO[MOROZLCUBQK SNWFBUH\EXSF HOGFWUQDFSF [OQBMOUEFKSF. 5UMUL RX[OHEUEFUS
[UMULCWF CMGNSUEBX [MUOJMCPNIBQK OB Q[U^FCHFPFMORCEEXY BF[OR D JOHUU NEFRUMQCH\EXS. $C[MFSUM,
[MF HIJO_ O[UMC^FF, R DOBOMO_ NWCRQBRNUB DOS[HUDQEOU WFQHO (Complex), RBOMO_ CMGNSUEB PCMCEUU
[MUOJMCPNUBQK D BF[N Complex. +US QCSXS FP SCBMF^X `CDBFWUQDF FQDHIWCUBQK ^UHCK QBMODC F
QBOHJU^. %QHF EF OLFE FP CMGNSUEBOR EU KRHKUBQK DOS[HUDQEXS, SX FTUS QMULF EFY RUTUQBRUEEX_
(Real); UQHF OE JNLUB EC_LUE, RBOMO_ CMGNSUEB BCDZU [MUOJMCPNUBQK R Real. %QHF EU JNLNB EC_LUEX EF
Complex, EF Real, FTUS Rational F B.L. 5OLOJECK FUMCMYFK [MUOJMCPORCEF_ OB Integer (FHF WUGO
NGOLEO) D Rational, PCBUS Real F Complex EU QOR[CLCUB Q FUMCMYFU_ DHCQQOR, [OQDOH\DN JXHO JX
GHN[O [OMOZLCB\ HUGDF_ Integer OB BKZUHORUQEOGO Complex. 0QBCBF, RUQ\SC FEBUMUQEX_ RO[MOQ:
[OWUSN FUMCMYFF BF[OR (R LCEEOS QHNWCU WFQHORXY) WCQBO [HOYO NDHCLXRCIBQK R FUMCMYFF DHCQQOR,
OQEORCEEXY EC OJTFY QRO_QBRCY?
Sfo ee ue ece
0OEUWEO, BOH\DO WBO O[FQCEECK SUBOLFDC [UMULCWF FSUUB EUDOBOMXU EULOQBCBDF. #O-[UMRXY,
[MOFPROLEXU DHCQQX EU NLCUBQK EOMSCH\EO FEDC[QNHFMORCB\, [OQDOH\DN FY RQU [MFYOLFBQK [UMUWFQHKB\
R FEBUM`U_QCY LFQ[UBWUMQDFY `NED^F_ JCPOROGO DHCQQC. # QNTEOQBF, WBOJX EU RROLFB\ DOL BF[C,
RFLFSX_ VFMODO_ [NJHFDU, SX RXQBCRFHF EC RQUOJTUU OJOPMUEFU RQU [MOFPROLEXU BF[X EU OWUE\
YOMOVF_ DOS[MOSFQQ. #O-RBOMXY, WBO [MOFPO_LUB Q O[UMCBOMOS RMOLU +=? %QHF R [MOGMCSSU
RQBMUWCUBQK Integer+=Complex, MUPNH\BCB JNLUB FSUB\ BF[ Complex, C SX [ODC EU MCQ[OHCGCUS
QMULQBRCSF LHK [MUOJMCPORCEFK BF[C EC SUQBU.
# GHCRCY // F /2 OJU [MOJHUSX JNLNB MUVUEX LHK GOSOSOM`EXY FUMCMYF_ DHCQQOR, YOBK [MFRULUEEXU
SUBOLFDF OJOJTCIBQK F LHK LMNGFY QFBNC^F_ (QDCZUS, LHK N[OSKENBO_ RXVU [MOJHUSX Q DHCQQCSF
Event/View). - [ODC HFV\ QDCZN, WBO O[FQCEEXU R ]BO_ GHCRU [MFUSX [MFEOQKB EU[OQMULQBRUEENI
[OH\PN R BUY QFBNC^FKY, DOGLC EC [UMROU SUQBO RXYOLFB JXQBMOLU_QBRFU, C EU FEDC[QNHK^FK. *RC
[UMUYOLC [O v-BCJHF^CS [OWBF RQUGLC MCJOBCIB JXQBMUU BMCLF^FOEEXY [OLYOLOR.
$CDOEU^, EU NLFRHKHO HF RCQ BO, DCD ECVF `NED^FF ROPRMCTCHF Number&?
Number& Integer::operator+(const Integer& n)
{
// +/1" 57/4"0"( 5)"40'&'0
if (i + n.i )#/M&'2 4"#/&' 0#% int) {
return !"#'"F='4<M"(('? *'.(')*,>
}
else return Integer(i + n.i);
}
#OPRMCTUEFU QQXHOD EC [UMUSUEENI RUHFWFEN LUHO O[CQEOU. 6EOGFU DOS[FHKBOMX [NQDCIB R
MCQYOL ROPRMCTCUSNI RUHFWFEN LO BOGO, DCD RCS NLCQBQK UU FQ[OH\PORCB\. #XLUHUEFU [CSKBF [OL
.68
ROPRMCTCUSX_ OJaUDB O[UMCBOMOS new (RSUQBO QBUDC) MUVCUB [MOJHUSN, [OQDOH\DN RUHFWFEC PCRULOSO
OQBCUBQK ZFB\ [OQHU PCRUMVUEFK `NED^FF. $O BOGLC ROPEFDCIB [MOJHUSX Q N[MCRHUEFUS [CSKB\I
DOGLC F DCD NLCHKB\ ROPRMCTCUSNI RUHFWFEN? 1BOJX MUVFB\ UU, ECS [OECLOJFBQK SCBUMFCH GHCR // F
/2, C BCDZU OLEC FP SUBOLFD N[MCRHUEFK [CSKB\I (QDCZUS, [OLQWUB QQXHOD), MCQQSCBMFRCUSXY R
[OQHULEU_ WCQBF DEFGF.
!BCD, [MFRULUEEO_ R ]BO_ GHCRU FE`OMSC^FF YRCBFB LHK MUVUEFK [MOQBXY [MOJHUS (EC[MFSUM,
QRKPCEEXY Q QOJXBFKSF F RFLCSF), EO OEC HFV\ PCDHCLXRCUB OQEORN LHK [OQBMOUEFK JOHUU OJTFY
MUVUEF_.
Rpouseopnue
qyukuuu u
oLekfu knaccoe
# [MULXLNTU_ GHCRU SX QBMOHDENHFQ\ Q GOSOSOM`EXSF FUMCMYFKSF DHCQQOR F Q GOHORO_ [OGMNPFHFQ\
RO SEOZUQBRUEENI [UMULCWN. # ]BO_ GHCRU SX [MOLOHZFS FQQHULORCB\ ^CMQBRO FUMCMYF_ DHCQQOR,
MCQQSCBMFRCK OJaUDBX DHCQQOR F QO[NBQBRNITFU BUSX.
5MFSUMX FP [MULXLNTU_ GHCRX OJHCLCHF OLEFS EULOQBCBDOS RQU [MOFPROLEXU DHCQQX JXHF RFLEX
DHFUEBCS. $O UQHF [MOFPROLEXU DHCQQX [OGMUJUEX R `C_HCY .cpp EC GHNJFEU EUQDOH\DFY SUBMOR, DCD
DHFUEBN QOPLCRCB\ ]DPUS[HKMX ]BFY Q[MKBCEEXY DHCQQOR? 3BO_ BUSU [OQRKTUEO ECWCHO GHCRX.
56%(9&%)4L#3 B8*$C(#3 (factory function) ECPXRCUBQK `NED^FK, DOBOMCK FEDC[QNHFMNUB [MFSUEUEFU
O[UMCBOMC new LHK QOPLCEFK ]DPUS[HKMOR DHCQQC. "ECBODF .++ OJXWEO QYOLKBQK EC BOS, WBO
[MOFPROLKTFU `NED^FF >OMOVCK #UT\, F RQDOMU RX [O_SUBU [OWUSN. #X ODCPCHFQ\ EC QUSFECMU Q
DODBU_HKSF F YOBFBU EC_BF YOMOVNI BUSN LHK MCPGOROMC? 5OLEFSFBU QBCDCE F EUJMUZEO N[OSKEFBU O
BOS, DCD [MOFPROLKTFU `NED^FF RXMNWFHF RCQ R BMNLENI SFENBN.
#O SEOGFY [MOGMCSSCY ECS YOBUHOQ\ JX R [MO^UQQU FY RX[OHEUEFK QLUHCB\ EUWBO, EU [OLLUMZFRCUSOU
LFECSFWUQDO_ SOLUH\I .++ (EC[MFSUM, PC[MOQFB\ N OJaUDBC UGO DHCQQ). *HK ]BO_ ^UHF QNTUQBRNUB
[MULHOZUEEX_ QBCELCMB RTTI (Run Time Type Information, *FECSFWUQDCK FE`OMSC^FK O BF[U), EO [O
[MFWFECS, O DOBOMXY JNLUB QDCPCEO EFZU, UGO RMKL HF SOZEO QWFBCB\ NEFRUMQCH\EXS FHF YOBK JX
[OHUPEXS QMULQBROS. #SUQBO ]BOGO SX MCQQSOBMFS EUQBCELCMBEXU MUVUEFK, OQEORCEEXU EC DOE^U[^FF
OJaUDBOR DHCQQOR, R BOS WFQHU OQOJX_ QHNWC_ [MULQBCRFBUHU_ DHCQQOR.
Rpouseopnue qyukuuu
5MUL[OHOZFS, RX QOGHCQFHFQ\, WBO GOSOSOM`FPS ]BO YOMOVO, F BNB ZU QOBROMFHF QROI QOJQBRUEENI
GOSOSOM`ENI FUMCMYFI DHCQQOR.
// G @$?#" Grandpa.h
class Grandpa { ... };

// F&7<*' 4 @$?#" Grandpa.cpp
class Dad : public Grandpa { ... };
class AuntieEm : public Grandpa { ... };

// 60"-*' 4 ($M"? 57'87$22"
#include Grandpa.h
Grandpa* g = new ... // F*'5! I$& )'-0$*, 5$53?
*O[NQBFS, Q [OPF^F_ JFOHOGFF RQU [OEKBEO, EO SX GOROMFS O .++, EU [MCRLC HF? 5MOJHUSC
PCDHIWCUBQK R BOS, WBO SX ECLUZEO FPOHFMORCHF [C[N (Dad) OB REUVEUGO SFMC [O DMC_EU_ SUMU
LHK HIJOGO DOLC, MCQ[OHOZUEEOGO PC [MULUHCSF `C_HC Grandpa.cpp. "CSUWCBUH\EX_ FEBUM`U_Q
..
.70
Grandpa [OPROHKUB ECS DCD NGOLEO SCEF[NHFMORCB\ HIJXS ]DPUS[HKMOS [MOFPROLEOGO DHCQQC,
RDHIWCK Dad, EO [MF ]BO EU QNTUQBRNUB Q[OQOJC QOPLCB\ ]BOB ]DPUS[HKM!
make-qyukuuu
$C Q^UEN RXYOLKB [MOFPROLKTFU `NED^FF. 5O OJTU[MFEKBOSN QOGHCVUEFI FY [MOQBU_VCK `OMSC
ECPXRCUBQK makeFoo(), GLU Foo FSK GUEUMFMNUSOGO DHCQQC.
class Grandpa {
public:
static Grandpa* makeDad(); // F'-0$"* Q&-"25#%7< Dad
static Grandpa* makeAuntieEm();
};
// G Grandpa.cpp
Grandpa* Grandpa::makeDad()
{
return new Dad;
}
Grandpa* Grandpa::makeAuntieEm()
{
return new AuntieEm;
}
) QNTUQBRORCEFF DOEDMUBEXY [MOFPROLEXY DHCQQOR [O-[MUZEUSN FPRUQBEO RQUS, OLECDO ECQBOKTFU
FEBUM`U_QX Dad F AuntieEm ECLUZEO Q[MKBCEX OB HIJO[XBEXY GHCP.
Cureonueckue knaccu u neperpyeuuue make-qyukuuu
#QU ]BF `NED^FF makeFoo MCQYOLKBQK Q [UMUGMNZCUSO_ [MFMOLO_ .++, EU [MCRLC HF? .HULNITF_
`MCGSUEB [OSOGCUB RXJMCB\ ENZENI RUMQFI make.
class Variation Dad {}; // =3)*'" ';E%4#"(/" &#$))$
class VariationAuntieEm {};
class Grandpa {
public:
static Grandpa* make(VariationDad);
static Grandpa* make(VariationAuntieEm);
};
// G 4$M"? 57'87$22"
Grandpa* g = Grandpa::make(VariationDad());
#XPOR VariationDad() QOPLCUB +*%*(,*'3 J$9#,>246 (anonymous instance) DHCQQC VariationDad
BO UQB\ ]DPUS[HKM, EU QRKPCEEX_ EF Q DCDO_ [UMUSUEEO_ R FQYOLEO_ OJHCQBF LU_QBRFK. )E ZFRUB HFV\
QBOH\DO, QDOH\DO EUOJYOLFSO LHK RXPORC, C PCBUS FQWUPCUB. 3DPUS[HKM VariationDad ENZUE HFV\ LHK
OLEOGO OE QOOJTCUB DOS[FHKBOMN, DCDCK [UMUGMNZUEECK RUMQFK make LOHZEC RXPXRCB\QK. 0HCQQ,
DOBOMX_ EU FSUUB WHUEOR F FQ[OH\PNUBQK [OLOJEXS OJMCPOS, ECPXRCUBQK .(,&%2(-#.$(, $2+..%,
(symbol class). )E FGMCUB BN ZU MOH\, WBO F QFSROHFWUQDF_ BF[ LCEEXY R KPXDCY BF[C Lisp: QBMODC,
DOBOMCK PCMCEUU DOS[FHFMNUBQK R JOHUU ]``UDBFRENI `OMSN.
5OQDOH\DN [MOFPROLEXU DHCQQX RQU MCREO FEDC[QNHFMORCEX R `C_HU .cpp, SX SOZUS ROQ[OH\PORCB\QK
]BFS OJQBOKBUH\QBROS F PCSUEFB\ FSK FQYOLEOGO Dad LMNGFS HODCH\EXS [O OBEOVUEFI D `C_HN .cpp, C
PCBUS [MOQBO ROQ[OH\PORCB\QK Dad RSUQBO VariationDad R `C_HU .h.
Onfurusauun c npureueuuer npouseopnux qyukuu
"CLUMZFSQK EC SFENBDN. *O[NQBFS, EF OLFE FP [MOFPROLEXY DHCQQOR Grandpa EU FEBUMUQNUB [NJHFDN
ECQBOH\DO, WBOJX MCPHFWCB\ FY [MF RXJOMU [MOFPROLKTU_ `NED^FF. *CZU R ]BOS QHNWCU
.7.
DOEQBMNFMORCEFU ]DPUS[HKMOR Q [OSOT\I OLEO_ FHF EUQDOH\DFY [MOFPROLKTFY `NED^F_ R[OHEU
O[MCRLCEO. # WCQBEOQBF, [MF ]BOS QDMXRCUBQK HOGFDC RXJOMC [MOFPROLEOGO DHCQQC, ]DPUS[HKM DOBOMOGO
QOPLCUBQK EC OQEORCEFF FE`OMSC^FF, [MULOQBCRHUEEO_ EC SOSUEB QOPLCEFK. !ECWU GOROMK,
[MOFPROLKTFU `NED^FF SOGNB [OQHNZFB\ QMULQBROS O[BFSFPC^FF RCVFY [MOGMCSS.
class Number {
public:
static Number* make(); // I'()*73/73"* ./)#' 5' 32'#.$(/>
static Number* make(int);
static Number* make(double);
static Number* make(string); // +$57/2"7, -1.23
};
// G @$?#" .cpp
class Integer : public Number { ... };
class Real : public Number { ... };
class ArbitraryPrecisionNumber : public Number { ... };

Number* Number::make()
{
return new Integer(0);
}
Number* Number::make(int x)
{
return new Integer(x);
}
Number* Number::make(double x)
{
return new Real(x);
}
Number* Number::make(string s)
{
// =)"40'&'0
if (2$#'" B"#'")
return new Integer(atoi(s));
if (;'#,M'" B"#'")
return new ArbitraryPrecisionNumber(s);
if (4"K")*4"(('")
// D *.0.
}
.LUHCB\ BO ZU Q [OSOT\I DOEQBMNDBOMOR EU NLCQBQK. 0 BOSN SOSUEBN, DOGLC DOS[FHKBOM ECWFECUB
FQDCB\ DOEQBMNDBOM Q [OLYOLKTU_ QFGECBNMO_, RX NZU QOOJTFHF USN, ]DPUS[HKM DCDOGO DHCQQC
QOPLCUBQK. 8OHUU BOGO, BCDCK SUBOLFDC OBLUHKUB QBMNDBNMN [MOFPROLEXY DHCQQOR OB CMGNSUEBOR
[MOFPROLKTU_ `NED^FF.
Pokanusoeauuoe ucnonusoeauue npouseopnux qyukuu
)LEO FP QCSXY PCSUWCBUH\EXY [MFSUEUEF_ [MOFPROLKTFY `NED^F_ ROPSOZEOQB\ FPOHFMORCEFK
DOLC, FPSUEKUSOGO [MF [UMUEOQU [MOGMCSSX EC LMNGO_ DOS[\IBUM FHF QMULN. )BDMXBX_ FEBUM`U_Q,
RXMCZUEEX_ QMULQBRCSF JCPOROGO DHCQQC, OQBCUBQK [MUZEFS, C R `C_HU .cpp [MKWUBQK
Q[U^FCHFPFMORCEEX_ [MOFPROLEX_ DHCQQ Q DOLOS, OMFUEBFMORCEEXS EC LCEENI [HCB`OMSN.
class Window {
public:
.72
static Window* make();
// :$#"" )#"03"* 8'2'2'7@(<? /(*"7@"?)
};
// G window.cpp 0#% LF Windows
class MS_Window : public Window { ... };
Window* Window::make()
{
return MS_Window();
}

// /#/ 4 window.cpp 0#% Mac OS
class Mac_Window : public Window { ... };
Window* Window::make()
{
return Mac_Window*();
}
1BOJX [UMUDHIWFB\QK Q OLEO_ [HCB`OMSX EC LMNGNI, LOQBCBOWEO [UMUDOS[FHFMORCB\ F
[UMUDOS[OEORCB\ `C_H .cpp. #QU DHFUEBX DHCQQC Window EFWUGO EU JNLNB PECB\ O [MOFPOVULVU_
HODCHFPC^FF ([MUL[OHCGCUBQK, WBO RX QOJFMCUBUQ\ QOPLCB\ LU_QBRFBUH\EO NEFRUMQCH\EOU, GOSOSOM`EOU
[MULQBCRHUEFU ODEC R GMC`FWUQDOS FEBUM`U_QU PCLCWC, [UMUL DOBOMO_ LMOGEUB LCZU QCSX_
OBWCKEEX_ [MOUDBFMORTFD).
Yuufoakue qyukuuu
K*(-"%D+FL(# B8*$C(( (junkyard functions) NEFWBOZCIB ]DPUS[HKMX DHCQQOR. !LUK PCDHIWCUBQK R
BOS, WBOJX QLUHCB\ LUQBMNDBOM PCDMXBXS FHF PCTFTUEEXS, C PCBUS [MULOQBCRFB\ `NED^FI, R DOBOMO_
FEDC[QNHFMNUBQK RXPOR O[UMCBOMC delete.
class Grandpa {
protected:
virtual ~Grandpa();
public:
static Grandpa make();
static void destroy(Grandpa*);
};
// G @$?#" grandpa.cpp
void Grandpa::destroy(Grandpa* g)
{
delete g;
}
#OPSOZEO, QU_WCQ ]BO EU FSUUB OQOJOGO QSXQHC, EO R EUQBCELCMBEXY QYUSCY N[MCRHUEFK [CSKB\I
NEFWBOZCITFU `NED^FF Q[OQOJEX [MFEUQBF OWUE\ JOH\VNI [OH\PN. - [ODC QDCZFBU ECWCH\EFDN F
DOHHUGCS, WBO NEFWBOZCITFU `NED^FF ENZEX RCS MCLF QFSSUBMFF. )EF DOQO [OQSOBMKB EC RCQ F
OBO_LNB [OLCH\VU, BCD WBO EC DCDOU-BO RMUSK RCS JNLUB Q[ODO_EUU MCJOBCB\.
Cuoea o peouo nepepae: nporeyfouue asoeue knaccu
5MFEKR EC ROOMNZUEFU [MOFPROLKTFU `NED^FF, SX HUGDO [ORXQFS FEDC[QNHK^FI LRO_EO_ [UMULCWF.
// G @$?#" grandpa.h
class Grandpa {
public:
// =7'/-4'0%K/" @3(&B// / 8'2'2'7@(<? /(*"7@"?)
.73
};
// G @$?#" grandpa.cpp
class RealGrandpa : public Grandpa {
// =7'2"13*'.(<? 8'2'2'7@(<? ;$-'4<? &#$))
protected:
// J3(&B// 04'?('? 5"7"0$./
};
class Dad : public RealGrandpa { ... };
class AuntieEm : public RealGrandpa { ... };
$CHFWFU [MOFPROLKTFY `NED^F_ OPECWCUB, WBO [MOFPROLEXU DHCQQX SOZEO QDMXB\. *OJCRHKK
[MOSUZNBOWEX_ JCPORX_ DHCQQ RealGrandpa, SX [OHEOQB\I [MKWUS RQU ZNBDFU [OLMOJEOQBF LRO_EO_
[UMULCWF R `C_HU .cpp. $FDCDFY PCTFTUEEXY `NED^F_ R `C_HU .h!
Hef koucfpykfopar konu u onepafopy =!
5MUL[OHCGCUBQK, WBO Grandpa WFQBO GOSOSOM`EX_ JCPORX_ DHCQQ, QOLUMZCTF_ YOBK JX OLEN WFQBO
RFMBNCH\ENI `NED^FI. 3BO [MULOBRMCTCUB EU[OQMULQBRUEEOU QOPLCEFU ]DPUS[HKMOR Grandpa
DHFUEBOS. %QHF RX FQ[OH\PNUBU [MOFPROLKTNI `NED^FI LHK DHCQQC Q ROPSOZEOQB\I QOPLCEFK
]DPUS[HKMOR, DOEQBMNDBOMX QHULNUB QLUHCB\ PCTFTUEEXSF, WBOJX ]DPUS[HKMX SOGHF QOPLCRCB\QK
BOH\DO [MOFPROLKTU_ `NED^FU_.
(CP NZ SX PCGOROMFHF EC ]BN BUSN, [OQHU EU[MOLOHZFBUH\EXY MCPSXVHUEF_ QBCEORFBQK KQEO, WBO
DHFUEB GOSOSOM`EOGO JCPOROGO DHCQQC EU LOHZUE FQ[OH\PORCB\ DOEQBMNDBOM DO[F_ FHF O[UMCBOM =.
%QHF DBO-EFJNL\ PCYOWUB [OLNJHFMORCB\ ]DPUS[HKM, QOPLC_BU Q[U^FCH\ENI RUMQFI make-`NED^FF LHK
DO[FMORCEFK this.
class Grandpa {
public:
virtual Grandpa* makeClone() = 0;
};
3BC `NED^FK EU OJaKRHKUBQK QBCBFWUQDO_, [OQDOH\DN R DCZLOS [MOFPROLEOS DHCQQU OEC LOHZEC MUVCB\
Q[U^FCHFPFMORCEENI PCLCWN. . [MFQROUEFUS LUHO OJQBOFB QHOZEUU. %QHF [UMUO[MULUHFB\ O[UMCBOM =
LHK HUROGO O[UMCELC, EU[OEKBEO, WBO ZU BOGLC LUHCB\ Q [MCRXS O[UMCELOS, BF[ DOBOMOGO EUFPRUQBUE.
5UMROU [MCDBFWUQDOU MUVUEFU [OHEOQB\I PC[MUBFB\ [MFQRCFRCEFU R BCDFY QFBNC^FKY F QLUHCB\
O[UMCBOM = PCDMXBXS. #BOMOU FQ[OH\PORCB\ RCMFC^FI EC BUSN LRO_EO_ [UMULCWF: QLUHCB\ O[UMCBOM =
RFMBNCH\EXS F R DCZLOS [MOFPROLEOS DHCQQU RXPXRCB\ RFMBNCH\ENI `NED^FI AssignTo(),
[UMUGMNZCUSNI LHK DCZOGO [MOFPROLEOGO DHCQQC. .SOBMFBQK NMOLHFRO, EO MCJOBCUB.
OLekfu knaccoe
)JaUDBOS DHCQQC ECPXRCUBQK OJaUDB, [MULECPECWUEEX_ LHK QOPLCEFK ]DPUS[HKMOR [MULQBCRHKUSOGO FS
BF[C. # ECVU_ BUMSFEOHOGFF OJaUDB DHCQQC [MULQBCRHKUB QOJO_ OJaUDB, OQEOREXU `NED^FF DOBOMOGO
KRHKIBQK [MOFPROLKTFSF. 5OPLEUU SX ROPHOZFS EC OJaUDBX DHCQQOR F LMNGFU OJKPCEEOQBF (EC[MFSUM,
O[FQCEFU QBMNDBNMX ]DPUS[HKMC), C [ODC MCQQSOBMFS [MCDBFWUQDF_ [MFSUM.
class GrandpaClass { // L;E"&* &#$))$ 0#% Grandpa
public:
Grandpa* make(); // F'-0$"* Q&-"25#%7< Grandpa
};
class Grandpa { ... };
#QU QDCPCEEOU O [MOFPROLKTFY `NED^FKY OBEOQFBQK F D OJaUDBCS DHCQQOR, RDHIWCK Q[MKBCEEXU
FEDC[QNHFMORCEEXU [MOFPROLEXU DHCQQX, O[BFSFPC^FI F [MOPMCWEOQB\ HODCHFPC^FF. >OMOVO,
QDCZUBU RX, EO PCWUS ]BO ENZEO? #O-[UMRXY, SX FPJCRHKUSQK OB EUDMCQFRXY QBCBFWUQDFY `NED^F_
F [UMUYOLFS D JOHUU WFQBOSN, OJaUDBEO-OMFUEBFMORCEEOSN RCMFCEBN, [MF DOBOMOS RQU [MOFQYOLFB
.74
[OQMULQBROS OB[MCRDF QOOJTUEF_ OJaUDBN. #O-RBOMXY, SX [OHNWCUS NLOJENI ROPSOZEOQB\ QHULFB\ PC
LMNGFSF YCMCDBUMFQBFDCSF ]DPUS[HKMOR F DHCQQOR.
Huqoprauun o knacce
# OJaUDBCY DHCQQC NLOJEO YMCEFB\ QRULUEFK O QCSOS DHCQQU. *HK ]BOGO HNWVU RQUGO QOPLCB\
GOSOSOM`EX_ JCPORX_ DHCQQ LHK OJaUDBOR DHCQQOR.
class Class {
protected:
Collection<Class> base_classes;
Collection<Class> derived_classes;
String class_name;
Class() {}; // I#$)) )*$('4/*)% $;)*7$&*(<2 ;$-'4<2
public:
// J3(&B// 0')*35$ 0#% 5'#3."(/% /2"(/ / *.0.
};
.OQBCR YMCEFSO_ FE`OMSC^FF R OGMOSEO_ QBU[UEF PCRFQFB OB [OBMUJEOQBU_ [MFHOZUEFK F OB BOGO,
ECQDOH\DO NRHUWUEEO RX PCEFSCHFQ\ SmallTalk EC ]BO_ EULUHU.
Hrn knacca u cospauue sksernnnpoe no ureuu
8CPORCK FE`OMSC^FK, DOBOMNI SOZUB QOOJTFB\ OJaUDB DHCQQC, FSK DHCQQC R RFLU EUDOBOMO_
QFSROH\EO_ QBMODF. 0MOSU BOGO, SOZEO YMCEFB\ QHORCM\ RQUY OJaUDBOR DHCQQOR, FELUDQFMNUSX_ [O
FSUEF DHCQQC. %QHF LOJCRFB\ D ]BOSN NEFRUMQCH\EX_ FEBUM`U_Q D [MOFPROLKTU_ `NED^FF, RCS NLCQBQK
MUCHFPORCB\ ROPSOZEOQB\, DOBOMCK EU [OLLUMZFRCUBQK R .++ EC[MKSNI .%9)+*(# J$9#,>246%& >%
(,#*( (instantiate by name).
// 60"-*' 4 &#/"(*)&'? 57'87$22"
Class* c = gClasses.Find(Grandpa);
???* g = (Grandpa*)c->make(???);
0CD RFLFBU, [MCDBFWUQDCK [OH\PC BCDOGO [OLYOLC OGMCEFWFRCUBQK EUDOBOMXSF [MOJHUSCSF. %QHF SX
NZU PECUS, WBO QOPLCUBQK ]DPUS[HKM Grandpa, BO QOPLCEFU ]DPUS[HKMC [O FSUEF RXGHKLFB EUMCPNSEO
ECS JNLUB BMNLEO O[MULUHFB\, D DCDOSN DHCQQN RX[OHEKUBQK [MUOJMCPORCEFU. #LOJCROD LCEECK QYUSC EU
[OPROHKUB [MULOQBCRFB\ OBLUH\EXU QFGECBNMX LHK [MOFPROLKTFY `NED^F_ [MOFPROLEXY DHCQQOR. +US
EU SUEUU, R EUDOBOMXY QFBNC^FKY BCDCK SUBOLFDC ODCPXRCUBQK WMUPRXWC_EO [OHUPEO_. 5MUL[OHOZFS, RX
QOYMCEFHF OJaUDB R RFLU [OBODC JC_BOR F BU[UM\ PCGMNZCUBU UGO. %QHF [UMRXU n JC_B QOLUMZFB FSK
DHCQQC R RFLU QFSROH\EO_ QBMODF, RX QSOZUBU EC_BF ENZEX_ OJaUDB DHCQQC LHK QOPLCEFK ]DPUS[HKMC.
0CD [MCRFHO, MUCHFPC^FK PCDCEWFRCUBQK QOPLCEFUS RO RQUY DHCQQCY Class `NED^FF make(istream&)
FHF UU ]DRFRCHUEBC. 5MOGMCSSC [MFOJMUBCUB QHULNITF_ RFL:
// G &'0" .*"(/% 5'*'&$
cin << className;
Class* c = gClasses.Find(className);
BasClass* obj = c->make(cin);
Hepapxun knaccoe
.RULUEFK OJ FUMCMYFF DHCQQOR SOZEO YMCEFB\ [O MCPEOSN, EO R DOEUWEOS QWUBU RQU QROLFBQK D
QBMNDBNMCS LCEEXY Q ]DPUS[HKMCSF Class. #XVU JXH [MULQBCRHUE OLFE FP RCMFCEBOR: RUQBF R DCZLOS
Class LRU DOHHUD^FF, [O OLEO_ LHK JCPORXY F [MOFPROLEXY DHCQQOR. 0OEUWEO, ]BO QHULNUB [OEFSCB\
NQHOREO MUW\ FLUB OJ FUMCMYFF EU OJaUDBOR Class, C [MULQBCRHUEEXY FSF DHCQQOR. $UOJYOLFSOQB\
MCPHFWCB\ [OEKBFK Class F DHCQQ ECRUMEKDC RXPORUB N RCQ GOHORENI JOH\, EO N [ODHOEEFDOR
SmallTalk F Lisp ]BO QWFBCUBQK YOMOVFS MCPRHUWUEFUS F [MFPECDOS SCQBUMQBRC. *MNGO_ Q[OQOJ
RRUQBF OLEN GHOJCH\ENI QBMNDBNMN LCEEXY Q [CMCSF (JCPORX_, [MOFPROLEX_), FELUDQFMNUSNI R OJOFY
EC[MCRHUEFKY. # EUDOBOMXY QFBNC^FKY RSUQBO [CM FQ[OH\PNIBQK BMF[HUBX (JCPORX_, [MOFPROLEX_,
[OMKLOD), WBOJX JCPORXU DHCQQX [UMUWFQHKHFQ\ R [OMKLDU FY OJaKRHUEFK R QOOBRUBQBRNITUS DHCQQU.
.75
Onucauun nepereuuux knacca
# EUDOBOMXY QFBNC^FKY OJaUDBX Class QBOFB QLUHCB\ LOQBCBOWEO NSEXSF, WBOJX OEF SOGHF [OHNWCB\
]DPUS[HKMX [MULQBCRHKUSOGO DHCQQC F O[FQXRCB\ FY QBMNDBNMN. #QU ECWFECUBQK Q [UMUSUEEXY DHCQQC. #
ECFJOHUU [MKSOHFEU_EOS RCMFCEBU Class ROPRMCTCUB FBUMCBOM, DOBOMX_ R QROI OWUMUL\ ROPRMCTCUB
[CMN QSUTUEFU/Class, O[FQXRCITNI QSUTUEFU [UMUSUEEO_ RENBMF ]DPUS[HKMC F UU Class. !SUUB
QSXQH QOPLCB\ [UMUWFQHUEFK LHK BMUY [OLSEOZUQBR [UMUSUEEXY DHCQQC:
/. #QU [UMUSUEEXU, RDHIWCK RQBMOUEEXU BF[X (BCDFU DCD int). *HK [MULQBCRHUEFK [MFSFBFREXY
BF[OR RCS [MFLUBQK QOPLCB\ `FDBFREXU DHCQQX, [MOFPROLEXU OB Class.
2. +OH\DO [UMUSUEEXU EURQBMOUEEXY BF[OR, LHK DOBOMXY OJXWEO F BCD QNTUQBRNUB QRO_ Class.
3. +OH\DO NDCPCBUHF F QQXHDF EC LMNGFU OJaUDBX.
5OQHULEF_ RCMFCEB FGMCUB OQOJUEEO RCZENI MOH\ R EUDOBOMXY EUBMFRFCH\EXY CHGOMFBSCY QJOMDF
SNQOMC.
Onucauun qyukuu knacca
# UTU JOHUU MULDFY QFBNC^FKY OJaUDB Class LOHZUE O[FQXRCB\ ECJOM `NED^F_ [MULQBCRHUEEOGO FS
DHCQQC. 5MF ]BOS RX `CDBFWUQDF ECWFECUBU FGMCB\ MOH\ DOS[FHKBOMC .++, BCD WBO EU [UMUGFJC_BU
[CHDN. ! QEORC O[BFSCH\EXS [MULQBCRHUEFUS ODCPXRCUBQK FBUMCBOM. *HK DCZLO_ `NED^FF SOZEO
ROPRMCTCB\ HIJNI FE`OMSC^FI, OB [MOQBU_VU_ (UU FSUEF) LO JOHUU QHOZEO_ (CLMUQ, FSUEC, BF[X F
[OMKLOD CMGNSUEBOR F BF[ ROPRMCTCUSOGO PECWUEFK). $UDOBOMXU [MOJHUSX [MOQBO RXYOLKB PC MCSDF
.++; UQHF RCS PCYOWUBQK [MOLUHCB\ EUWBO [OLOJEOU, QBOFB QUM\UPEO [OLNSCB\ OJ FQ[OH\PORCEFF
ECQBOKTUGO LFECSFWUQDOGO KPXDC.
Konnekuuu sksernnnpoe
0HCQQ Class [MULOQBCRHKUB UTU OLEN FEBUMUQENI ROPSOZEOQB\ RULUEFU DOHHUD^FF RQUY
]DPUS[HKMOR DHCQQC. 3BO SOZUB JXB\ HFJO OBLUH\ECK DOHHUD^FK LHK DCZLOGO Class, HFJO OLEC
GHOJCH\ECK QBMNDBNMC LCEEXY Q [CMCSF (Class, ]DPUS[HKM). %QHF RXJMCE RBOMO_ RCMFCEB F DOHHUD^FK
FELUDQFMNUBQK R OJOFY EC[MCRHUEFKY, OEC ODCPXRCUBQK WMUPRXWC_EO [OHUPEO_ [MF OBHCLDU (5ODCZF
SEU RQU ]DPUS[HKMX DHCQQC x), C BCDZU SOZUB [MFSUEKB\QK LHK OBRUBOR EC RO[MOQX RMOLU 0CDOR DHCQQ
LCEEOGO ]DPUS[HKMC? JUP `FPFWUQDOGO YMCEUEFK CLMUQC OJaUDBC Class R DCZLOS ]DPUS[HKMU. +CDOU
MUVUEFU MCJOBCUB BOH\DO LHK ]DPUS[HKMOR RUMYEUGO NMOREK, QOPLCRCUSXY [MOFPROLKTFSF `NED^FKSF;
RHOZUEEXU OJaUDBX ([UMUSUEEXU FHF JCPORXU DHCQQX) R ]BOB MUUQBM EU [O[CLNB.
Cfafucfuka
5ODCPCBUHF QX[HIBQK DCD FP MOGC FPOJFHFK DOHFWUQBRO ]DPUS[HKMOR, R LCEEX_ SOSUEB ECYOLKTFYQK
R [CSKBF; OJTUU DOHFWUQBRO ]DPUS[HKMOR, QOPLCEEXY Q SOSUEBC PC[NQDC [MOGMCSSX; QBCBFQBFWUQDFU
[MO`FHF Q O[FQCEFUS, DOGLC F DCD QOPLCRCHFQ\ ]DPUS[HKMX #OPSOZEOQBF OGMCEFWUEX BOH\DO BUS,
QDOH\DO RMUSUEF RX QSOZUBU FS [OQRKBFB\. %QHF RX MCJOBCUBU EC [ORMUSUEEO_ O[HCBU, EU
OGMCEFWFRC_BU QUJK RUL\ [MF ZUHCEFF OJOQEORCEFU SOZEO [MFLNSCB\ LHK HIJOGO [ODCPCBUHK. - UQHF
EUB, [OLNSC_BU, ODN[KBQK HF [OBMCWUEEXU NQFHFK.
Ee ueckonuko cnoe o yuufoakux qyukuunx
5OQHU LOHGOGO MCPGOROMC O BOS, DCDFU PCSUWCBUH\EXU VBNDF SOZEO [MOLUHXRCB\ Q OJaUDBCSF DHCQQOR,
RUMEUSQK D NEFWBOZCITFS `NED^FKS. 6EOGFU DOE^U[^FF, [MULQBCRHUEEXU R [MULXLNTUS MCPLUHU
(BCDFU DCD QDMXBXU DOHHUD^FF ]DPUS[HKMOR F QBCBFQBFDC), MUCHFPNIBQK HFV\ R BOS QHNWCU, UQHF RCS
NLCQBQK OBQHULFB\ RMUSK QOPLCEFK F NEFWBOZUEFK ]DPUS[HKMC.
0OEUWEO, LHK RULUEFK QBCBFQBFDF SOZEO ROQ[OH\PORCB\QK QBCBFQBFWUQDFSF [UMUSUEEXSF,
[MOFPROLKTFSF `NED^FKSF F B.L., [MFECLHUZCTFSF ^UHUROSN DHCQQN, OLECDO SUBOLFDC, QRKPCEECK Q
OJaUDBCSF DHCQQOR, OJUQ[UWFRCUB ECSEOGO HNWVNI SOLNH\EOQB\. #OP\SFBU QNTUQBRNITF_ DHCQQ.
*OJCR\BU DHCQQ OJaUDBC Class. #HU_BU OLEN-LRU [MOFPROLKTFU `NED^FF, [UMUSUVC_BU Q
NEFWBOZCITU_ `NED^FU_. 5OQBCR\BU EC OGOE\ QBCBFQBFDF F LORULFBU LO DF[UEFK. 4MC! #QU
CLSFEFQBMCBFREXU QMULQBRC JXHF LOJCRHUEX JUP SOLF`FDC^FF FQYOLEOGO DHCQQC. )J FYSUEUEFKY
[MFLUBQK QOOJTCB\ DHFUEBCS, EO UQHF R ECWCHU MCJOBX EFDCDFY DHFUEBOR UTU EU JXHO, C N[MCRHKUSX_
.76
DHCQQ LOHZUE OQBCRCB\QK EUFPSUEEXS FHF UGO FQYOLEXU BUDQBX EULOQBN[EX, ECS NLCHOQ\ LOROH\EO
SEOGOGO LOJFB\QK, EU QOPLCRCK EFDCDFY [OJOWEXY ]``UDBOR LHK DMFBFWUQDF RCZEOGO DOLC.
Onpepeneuue knacca no oLekfy
*HK QNTUQBRNITUGO ]DPUS[HKMC LOROH\EO WCQBO BMUJNUBQK O[MULUHFB\ UGO DHCQQ. #MOLU JX EFWUGO
QHOZEOGO, EO R LU_QBRFBUH\EOQBF ]BO OWUE\ GHNJODCK BUSC. 5OSEFBU, WBO OJaUDBX SOGNB QOPLCRCB\QK R
QBUDU FHF R DNWU, REULMKB\QK R LMNGFU OJaUDBX R RFLU [UMUSUEEXY FHF JCPORXY DHCQQOR, C BCDZU
QOPLCRCB\QK [MOFPROLKTFSF `NED^FKSF. $FZU O[FQCEO EUQDOH\DO OQEOREXY MUVUEF_.
Bueppeuue ykasafenn ua oLekf knacca
.CSOU OWURFLEOU MUVUEFU REULMKB\ NDCPCBUH\ EC Class R HIJO_ OJaUDB, RHOZUEEX_ FHF EUB.
class Object { // =7"0'& 4)"C 7"$#,(<C &#$))'4
protected:
static ObjectClass s_my_class;
Class* my_class; // == &s_my_class;
public:
Object() : my_class(&s_my_class) {}
Class* My_Class() { return my_class; }
};
class Foo : public Object
protected:
static FooClass s_my_class;
public:
Foo() { my_class = &s_my_class; }
};
#QU DHCQQX [OMOZLCIBQK OB OJTUGO [MULDC Object, R DOBOMOS O[MULUHKUBQK [MOBODOH LHK [OHNWUEFK
OJaUDBC Class. #X FSUUBU [OHEOU [MCRO FQ[OH\PORCB\ OLEF F BU ZU FSUEC WHUEOR EC MCPEXY NMOREKY
FUMCMYFF DHCQQOR (DCD ]BO QLUHCEO Q s_my_class R ECVUS [MFSUMU). 0OS[FHKBOM RXJFMCUB FSK,
ECYOLKTUUQK R EU[OQMULQBRUEEO_ OJHCQBF LU_QBRFK. 8OHUU BOGO, DOEQBMNDBOMX RX[OHEKIBQK R [OMKLDU
JCPORX_ DHCQQ/[UMUSUEEXU DHCQQC/ [MOFPROLEXU DHCQQX, [O]BOSN [OQHULEF_ DOEQBMNDBOM OQBCRFB
my_class [MCRFH\EOU PECWUEFU. 3BC QYUSC [OPROHKUB RQUGLC [OHNWFB\ OJaUDB Class EUPCRFQFSO OB
BOGO, QDOH\DO RX[OHEKHOQ\ [MUOJMCPORCEF_ BF[C OB [MOFPROLEXY D JCPORXS DHCQQCS.
!PLUMZDF QOQBCRHKIB WUBXMU JC_BC, EUOJYOLFSXU LHK YMCEUEFK NDCPCBUHK. #FMBNCH\EXU `NED^FF EU
BMUJNIBQK, [O]BOSN ECS EU [MFLUBQK LOJCRHKB\ v-BCJHF^N R DHCQQ, OJYOLFRVF_QK JUP EUU. $C
FPJXBOWEOU DOEQBMNFMORCEFU my_class JNLNB [OBMCWUEX LO[OHEFBUH\EXU BCDBX [MO^UQQOMC, EO LHK
JOH\VFEQBRC [MFHOZUEF_ ]BO EUQNTUQBRUEEO. 5OZCHN_, OQEOREXU FPLUMZDF QROLKBQK D
LO[OHEFBUH\EOSN DOLN, ECYOLKTUSNQK R DOEQBMNDBOMCY.
# JOHUU WFQBOS RCMFCEBU NDCPCBUH\ EC Class PCLCUBQK [MOFPROLKTFSF `NED^FKSF OJaUDBC Class:
class Object {
friend class Class;
private:
Class* my_class;
public:
Class* My_Class() { reutrn my_class; }
};
class Class {
protected:
void SetClass(Object& obj) { obj.my_class = this; }
};
class Foo : public Object { ... };
.77
class FooClass : public Class {
public:
Foo* make()
{
Foo* f = new Foo;
this->SetClass(f);
return f;
}
};
#XGHKLFB [OHNWVU, [OQDOH\DN [MOFPROLEXU OB Object DHCQQX F EU [OLOPMURCIB OJ ]BFY `ODNQCY EO
BCD HF ]BO? $ULOQBCBOD ]BOGO [OLYOLC R BOS, WBO OE EU MCJOBCUB LHK ]DPUS[HKMOR Foo, OJaKRHUEEXY R
QBUDU FHF RHOZUEEXY R LMNGFU DHCQQX R RFLU QBMNDBNM LCEEXY. 5UMUL RCSF OLEC FP QFBNC^F_, R
DOBOMXY [MFYOLFBQK [MFEFSCB\ BMNLEOU MUVUEFU: BO HF OGMCEFWFB\ DHCQQ BOH\DO LFECSFWUQDFSF
]DPUS[HKMCSF, BO HF FQDCB\ JOHUU QHOZEOU MUVUEFU F JUP BOGO QHOZEO_ [MOJHUSX.
.NTUQBRNUB UTU OLFE RCMFCEB N[MCRHKB\ RXLUHUEFUS [CSKBF F YMCEFB\ CLUQC OJaUDBC DHCQQC [MKSO
ECL QCSFS OJaUDBOS R [CSKBF RSUQBO BOGO, WBOJX LUHCB\ UGO [UMUSUEEO_ DHCQQC [MULDC. *HK ]BOGO ECS
[OECLOJKBQK [MFUSX N[MCRHUEFK [CSKB\I, O[FQCEEXU R WCQBF 4.
Bueuuue cfpykfypu pauuux
0CD N[OSFECHOQ\ RXVU, RX BCDZU SOZUBU QOPLCB\ GHOJCH\ENI DOHHUD^FI Q [CMCSF ]DPUS[HKM/Class.
#QU EU BCD QDRUMEO, DCD RXGHKLFB EC [UMRX_ RPGHKL, OQOJUEEO UQHF FE`OMSC^FK Class ENZEC BOH\DO R
[MO^UQQU OBHCLDF F JNLUB FQDHIWUEC R MCJOWUS MUZFSU. %QHF QOJHILCB\ OQBOMOZEOQB\ R MUCHFPC^FF,
MUVUEFU BCDZU MCQ[MOQBMCEKUBQK F EC BCDFU RHOZUEEXU OJaUDBX, DCD QBUDORXU [UMUSUEEXU FHF
]DPUS[HKMX, YOBK LHK ]BOGO RCS [OECLOJFBQK QOOBRUBQBRNITCK [OLLUMZDC QO QBOMOEX DOEQBMNDBOMC F
LUQBMNDBOMC OQEOREOGO DHCQQC.
Hecfaupapfuue npocfpaucfea narnfu
*MNGOU MUVUEFU, MCQQSCBMFRCUSOU R GHCRCY /5 F /6 `FPFWUQDOU MCPLUHUEFU OJaUDBOR [O MCPHFWEXS
[MOQBMCEQBRCS [CSKBF R QOOBRUBQBRFF Q FY DHCQQOS. )EO OBHFWCUBQK [ORXVUEEO_ QHOZEOQB\I F
[O[MOQBN EU MCJOBCUB LHK RHOZUEEXY OJaUDBOR, EO PCBO OJHCLCUB R[UWCBHKITFS JXQBMOLU_QBRFUS F
SCHXS MCQYOLOS [CSKBF.
Rpepcfaeufenu
# DEFGU Advanced C++ Programming Styles and Idioms *ZU_SQ 0O[HFE (James Coplien) RXLRFENH
OQOJNI MCPEORFLEOQB\ OJaUDBC DHCQQC, DOBOMX_ OE ECPRCH >6#)."+&("#2#, (exemplar). 5MULQBCRFBUH\
]BO OJaUDB DHCQQC, DOBOMX_ KRHKUBQK ]DPUS[HKMOS [MULQBCRHKUSOGO FS DHCQQC. 5OEKBEO? 4 SUEK OB
BCDFY RXQDCPXRCEF_ GOHORC FLUB DMNGOS.
class Exemplar {}; // F/24'#/.")&/? &#$))
class Foo {
private:
Foo(); // D 4)" ')*$#,(<" &'()*73&*'7<, &7'2" '0('8'
public:
Foo(Exemplar); // I'()*73&*'7 57"0)*$4/*"#%
Foo* make(); // =7'/-4'0%K/" @3(&B// 57"0)*$4/*"#%
};
extern Foo* foo; // F$2 57"0)*$4/*"#,
5OLMOJEOQBF EUQNTUQBRUEEX. #CZEO BO, WBO OLFE ]DPUS[HKM (EC DOBOMX_ QQXHCUBQK [UMUSUEECK foo)
RX[OHEKUB `NED^FF OJaUDBC DHCQQC LHK DHCQQC Foo. # MUCHFPC^FKY [MOFPROLKTFY `NED^F_ EUOJYOLFSO
NJULFB\QK, WBO this QOR[CLCUB Q [MULQBCRFBUHUS, [OQDOH\DN [MOFPROLKTCK `NED^FK EU LOHZEC
RXPXRCB\QK LHK RQUY OQBCH\EXY ]DPUS[HKMOR DHCQQC.
.78
. [MULQBCRFBUHKSF SOZEO LUHCB\ RQU BO ZU QCSOU, WBO F Q OJaUDBCSF DHCQQC. 5MF ]BOS EUOJYOLFSO
NWFBXRCB\ QHULNITUU:
*HK [MULQBCRFBUHU_ EU ENZEO QOPLCRCB\ OBLUH\EX_ DHCQQ Class.
. [MULQBCRFBUHKSF EU [MFYOLFBQK OJaKRHKB\ LMNPU_ (OJXWEO OJaUDB DHCQQC LOHZUE JXB\
LMNGOS BOGO DHCQQC, DOBOMX_ OE [MULQBCRHKUB).
$CQBOKTFU OJaUDBX DHCQQOR PCSUBEO N[MOTCIB SOLUHFMORCEFU FUMCMYF_ DHCQQOR.
$CQBOKTFU OJaUDBX DHCQQOR N[MOTCIB QOPLCEFU GOSOSOM`EOGO FEBUM`U_QC LHK O[FQCEEXY
RXVU QRULUEF_ O DHCQQCY.
. OJaUDBCSF DHCQQOR OBHFWFK SUZLN BUS, WBO OBEOQFBQK D OJaUDBCS DHCQQC/[MULQBCRFBUHKS, F
BUS, WBO OBEOQFBQK D MUCH\EXS ]DPUS[HKMCS, QBCEORKBQK JOHUU OBWUBHFRXSF.
# OJTUS F ^UHOS, OJaUDBX DHCQQOR ODCPXRCIBQK JOHUU GFJDFSF [MF EUPECWFBUH\EO NQHOZEUEFF
MUCHFPC^FF [O QMCREUEFI Q ]DPUS[HKMCSF.
Heeupurue
ykasafenu
$UBMFRFCH\EOU FQ[OH\PORCEFU .++ EC[OSFECUB OLFE FPRUQBEX_ ][FPOL FP `FH\SC .NSUMUWECK POEC.
,UMOFEK [O[CLCUB R CRBOSOJFH\ENI CRCMFI. )EC JUPNQ[UVEO ZLUB, [ODC DBO-EFJNL\ [MOULUB [O LOMOGU,
F R DOE^U DOE^OR MUVCUB OB[MCRFB\QK PC [OSOT\I. $O DNLC JX OEC EF VHC, DCD JX REFSCBUH\EO EF
QHULFHC PC EC[MCRHUEFUS, OEC RQUGLC ROPRMCTCHCQ\ D OJHOSDCS SCVFEX. +CD F Q NDCPCBUHKSF: DNLC JX
RX EF VHF, RX RQU MCREO RUMEUBUQ\ D OJHOSDCS. >S [OZCHN_, SEU QHULORCHO [OLXQDCB\ JOHUU
O[BFSFQBFWEOU QMCREUEFU.
# ]BO_ GHCRU SX QEORC ROPRMCTCUSQK D BUSU NDCPCBUHU_, EC ]BOB MCP R QRUBU GOSOSOM`EXY FUMCMYF_
DHCQQOR. (CQQSCBMFRCUSXU PLUQ\ NDCPCBUHF K ECPXRCI *#&()(,',( (invisible pointers), [OQDOH\DN R
JOH\VFEQBRU QHNWCUR SOZEO NQBMOFB\ BCD, WBOJX DHFUEB CJQOHIBEO EFWUGO EU PECH O [MFQNBQBRFF
NDCPCBUHK SUZLN EFS F ^UHURXS OJaUDBOS. *ZU_SQ 0O[HFE (James Coplien) MCQQSCBMFRCUB WCQBEX_
QHNWC_ EURFLFSXY NDCPCBUHU_ F ECPXRCUB UGO [CMCLFGSC DOERUMB/[FQ\SO; SX ZU [OGOROMFS O JOHUU
OJTUS QHNWCU.
Ocuoeuue kouuenuuu
%QHF GOSOSOM`FPS YOMOVO [OLYOLFB LHK LMNGFY DHCQQOR, PECWFB, OE [OLO_LUB F LHK NDCPCBUHU_.
0OE^U[^FK [MOQBC: NDCPCBUH\ F NDCPXRCUSX_ OJaUDB [OMOZLCIBQK OB OLEOGO F BOGO ZU WFQBO
CJQBMCDBEOGO JCPOROGO DHCQQC.
class Foo {
public:
virtual void do_something() = 0;
virtual void do_something_else() = 0;
};
class PFoo : public Foo {
private:
Foo* foo;
public:
virtual void do_something() { foo->do_something(); }
virtual void do_something_else() { foo->do_something_else(); }
};
class Bar : public Foo {
// G)" 0#% 57'/-4'0('8' &#$))$
};
#SUQBO [UMUGMNPDF O[UMCBOMC -> R PFoo FQ[OH\PNUBQK LUHUGFMORCEFU. 5MFRULUEEX_ `MCGSUEB HFV\
QHUGDC PCBMCGFRCUB LCEENI BUSN. $C [MCDBFDU [MFYOLFBQK NWFBXRCB\ SEOZUQBRO LUBCHU_, ECWFECK Q
BOGO, DCD QDMXB\ NDCPCBUHF F NDCPXRCUSXU OJaUDBX OB DHFUEBOR.
.2
.80
Hukancynnuun ykasafene u ykasueaerux oLekfoe
)LEO FP RUHFWC_VFY [MUFSNTUQBR GOSOSOM`EXY NDCPCBUHU_ PCDHIWCUBQK R BOS, WBO NDCPCBUH\ RSUQBU Q
NDCPXRCUSXS OJaUDBOS SOZEO FEDC[QNHFMORCB\ R `C_HU .cpp. #PGHKEFBU EC BOH\DO WBO [MFRULUEEX_
`MCGSUEB. 4DCPCBUH\ EFWUGO EU LOJCRHKUB D OBDMXBOSN FEBUM`U_QN, [MULQBCRHUEEOSN R DHCQQU Foo,
[O]BOSN DHFUEBCS EU ENZEO RFLUB\ PFoo FHF [MOFPROLEXU DHCQQX, EC DOBOMXU OE QQXHCUBQK. #
QNTEOQBF, [MF LOQBCBOWEO_ CDDNMCBEOQBF SOZEO NJULFB\ DHFUEBOR, WBO OEF MCJOBCIB EU[OQMULQBRUEEO
Q NDCPXRCUSXS OJaUDBOS, YOBK EC QCSOS LUHU R DCWUQBRU ^UEBMCH\EOGO PRUEC ^U[OWDF [MFQNBQBRNUB
NDCPCBUH\. )BQILC F BUMSFE *#&()(,'3 8$+9+"#2;.
// G @$?#" foo.h
class Foo {
public:
static Foo* make(); // =7'/-4'0%K$% @3(&B/%
virtual void do_something() = 0;
virtual void do_something_else() = 0;
};
// G @$?#" foo.cpp
class PFoo : public Foo {
private:
Foo* foo;
public:
PFoo(Foo* f) : foo(f) {}
virtual void do_something() { foo->do_something(); }
virtual void do_something_else() { foo->do_something_else(); }
};
class Bar : public Foo {
// G)" 0#% 57'/-4'0('8' &#$))$
};
Foo* Foo::make()
{
return new PFoo(new Foo);
}
#QBCRFB\ PFoo R QNTUQBRNITNI [MOGMCSSN QORQUS EUQHOZEO [MF NQHORFF, WBO RX [MFEKHF RQU
SUMX [MULOQBOMOZEOQBF, Q[MOUDBFMORCHF UGO Q MCQWUBOS EC GOSOSOM`ENI FUMCMYFI DHCQQOR F
FEDC[QNHFMORCHF [MOFPROLEXU DHCQQX RMOLU Bar. #UL\ RX ]BO QLUHCHF, EU [MCRLC HF? 5UMUL ECSF
OWUMULEO_ SFQBFWUQDF_ [MFE^F[ RX LUHCUBU WBO-BO EU LHK BOGO, WBOJX FPRHUW\ EU[OQMULQBRUEENI
[OH\PN, C LHK QOYMCEUEFK SFMORO_ GCMSOEFF. # OLFE [MUDMCQEX_ LUE\ RCS [OBMUJNUBQK RQBCRFB\ NSEX_
NDCPCBUH\, F R GCMSOEFWEOS SFMU ]BO EU RXPORUB EFDCDFY [MOJHUS.
Rpouseopnue qyukuuu
0OEUWEO, [MOFPROLKTFU `NED^FF [MFGOLKBQK RCS DCZLX_ MCP, DOGLC RX FEDC[QNHFMNUBU [MOFPROLEXU
DHCQQX. # [MFRULUEEOS RXVU `MCGSUEBU SX FPSUEFHF [MOFPROLKTNI `NED^FI BCD, WBJX OEC
QOPLCRCHC LRC OJaUDBC NDCPCBUH\ F NDCPXRCUSOU PECWUEFU.
)JMCBFBU REFSCEFU: NDCPXRCUSX_ OJaUDB EU QOPLCUBQK R DOEQBMNDBOMU NDCPCBUHK. *HK ]BOGO QNTUQBRNUB
RUQDCK [MFWFEC. #UMOKBEO, ECS PCYOWUBQK FQ[OH\PORCB\ DHCQQ NDCPCBUHK PFoo LHK RQUY [MOFPROLEXY
DHCQQOR Foo. 3BO OPECWCUB, WBO EUDBO PC [MULUHCSF DHCQQC NDCPCBUHK ([MOFPROLKTCK `NED^FK) MUVCUB,
WBO FSUEEO QHULNUB QOPLCB\ F Q[MKBCB\ R NDCPCBUHU.
# [MULXLNTFY GHCRCY, [OQRKTUEEXY NSEXS NDCPCBUHKS, OQEOREOU REFSCEFU NLUHKHOQ\ VCJHOECS F
OJOJTUEEXS DHCQQCS NDCPCBUHU_, QOOBRUBQBRNITFS DHCQQCS NDCPXRCUSXY OJaUDBOR. . EURFLFSXSF
NDCPCBUHKSF VCJHOEX NZU EU FSUIB EFDCDOGO MUCH\EOGO PECWUEFK.
.8.
#QU, WBO GOROMFHOQ\ O [MOFPROLKTFY `NED^FKY F OJaUDBCY DHCQQOR R [MULXLNTU_ GHCRU, R MCREO_
QBU[UEF OBEOQFBQK F D EURFLFSXS NDCPCBUHKS. )[BFSFPFMN_BU F HODCHFPN_BU, QDOH\DO LNVU NGOLEO.
0CD [MCRFHO, QCS DHCQQ NDCPCBUHK R ]BOS EU NWCQBRNUB.
Ccunku ua ykasafenu
5MOFPROLKTCK `NED^FK EU OJKPCEC ROPRMCTCB\ Foo*. . BCDFS ZU NQ[UYOS [OLO_LUB F Foo&.
class Foo {
public:
static Foo& make(); // =7'/-4'0%K$% @3(&B/%
virtual void do_something() = 0;
virtual void do_something_else() = 0;
};
// G @$?#" foo.cpp
class PFoo : public Foo {
private:
Foo* foo;
public:
PFoo(Foo* f) : foo(f) {}
virtual void do_something() { foo->do_something(); }
virtual void do_something_else() { foo->do_something_else(); }
};
class Bar : public Foo {
// G)" 0#% 57'/-4'0('8' &#$))$
};
Foo& Foo::make()
{
return *(new PFoo(new Foo));
}
%LFEQBRUEECK [MOJHUSC PCDHIWCUBQK R BOS, WBO DO[FMORCEFU Q [OSOT\I DOEQBMNDBOMC DO[F_, DCD RX
RQDOMU NJULFBUQ\, QBMOGO ROQ[MUTCUBQK. ! RQU ZU HILF, ROOMNZUEEXU O[UMCBOMOS &, EUFPSUEEO
[XBCIBQK DO[FMORCB\ OJaUDB. . O[UMCBOMOS * QOJHCPE ECSEOGO QHCJUU. #O RQUS OQBCH\EOS RXJOM
LUHO RDNQC.
Heeepyue ykasafenu
5CMCLFGSC EFRFLFSXY NDCPCBUHU_ MUCHFPNUBQK DCD LHK RULNTFY, BCD F EURULNTFY NDCPCBUHU_. )B BOGO,
DCDOU MUVUEFU JNLUB [MFEKBO EC QBCLFF LFPC_EC, PCRFQKB F Q[OQOJX MUVUEFK EUDOBOMXY [MOJHUS. $FZU
[MFRULUEX EUDOBOMXU [OLMOJEOQBF MUCHFPC^FF EURULNTFY NDCPCBUHU_.
Konupoeauue
0HFUEB EU SOZUB DO[FMORCB\ NDCPCBUH\ EOMSCH\EXSF QMULQBRCSF, [OQDOH\DN OE EU PECUB UGO
ECQBOKTUGO DHCQQC. "CBO YOMOVO [OLYOLKB QMULQBRC, O[FQCEEXU R [MULXLNTU_ GHCRU (R OQOJUEEOQBF
DO[FMORCEFU OJaUDBOR Q [OSOT\I Q[U^FCH\EOGO RFMBNCH\EOGO RCMFCEBC make-`NED^FF). *HK
EURULNTFY NDCPCBUHU_ LOQBCBOWEO [MOQBO QDO[FMORCB\ CLMUQ NDCPXRCUSOGO OJaUDBC.
class Foo {
private:
Foo(const Foo&) {}
public:
virtual Foo* makeClone(); // I'5/7'4$(/"
};
// G @$?#" foo.cpp
.82
class PFoo : public Foo {
private:
Foo* foo;
public:
PFoo(Foo* f) : foo(f) {}
virtual Foo* makeClone() { return new PFoo(foo); }
};
Foo* Foo::makeClone()
{
return NULL; // +")3K")*4"((' 0#% 4)"8', &7'2" 3&$-$*"#"?
}
(UCHFPC^FK `NED^FF makeClone() EUOJYOLFSC BOH\DO LHK DHCQQC NDCPCBUHK. 5O ]BO_ [MFWFEU, WBOJX
DCZLOSN [MOFPROLEOSN DHCQQN EU [MFVHOQ\ UU [UMUO[MULUHKB\, R DHCQQ-[MULOD RDHIWCUBQK PCGHNVDC.
Rpuceaueauue
(CPNSUUBQK, UQHF EU [MFEKB\ Q[U^FCH\EXY SUM, O[UMCBOM = BOZU EU JNLUB MCJOBCB\, [OQDOH\DN DHFUEB EU
PECUB `CDBFWUQDF_ BF[ NDCPCBUHK. +CD DCD SX FSUUS LUHO Q EURULNTFSF NDCPCBUHKSF, O[UMC^FK
[MFQRCFRCEFK QBOFB QOGHCQORCB\ Q DO[FMORCEFUS BO UQB\ [MFQRCFRCEFU LOHZEO PCBMCGFRCB\ BOH\DO
NDCPCBUH\, EO EU NDCPXRCUSX_ OJaUDB. 0CD F R QHNWCU DO[FMORCEFK, ]BO EUBMNLEO MUCHFPORCB\
LOQBCBOWEO QOPLCB\ RFMBNCH\EX_ O[UMCBOM = LHK NDCPCBUHK F PCGHNVDN LHK NDCPXRCUSOGO OJaUDBC.
class Foo {
public:
virtual Foo& operator=(const Foo&);
};
// G @$?#" foo.cpp
class PFoo : public Foo {
private:
Foo* foo;
public:
virtual Foo& operator=(const Foo& f)
{
foo = f.foo;
return *this;
}
};
Foo& Foo::operator=(const Foo&)
{
return *this;
}
Copka rycopa: esrnnp e ypyee
5OQDOH\DN [MOFPROLEXU DHCQQX FEDC[QNHFMORCEX, [MFSUEUEFU EURULNTFY NDCPCBUHU_ [OLROLFB ECQ D
QUM\UPEO_ [MOJHUSU LFPC_EC: DCD NPECB\, DOGLC ENZEO NLCHKB\ NDCPXRCUSX_ OJaUDB? # GHCRCY,
[OQRKTUEEXY N[MCRHUEFI [CSKB\I, SX QUM\UPEO PC_SUSQK ]BO_ [MOJHUSO_, C [ODC K HFV\ R OJTFY
WUMBCY O[FVN LRU JCPORXU QBMCBUGFF:
/. # NDCPXRCUSX_ OJaUDB RDHIWCUBQK QWUBWFD, DOBOMX_ [ODCPXRCUB, QDOH\DO NDCPCBUHU_ QQXHCUBQK
EC EUGO R LCEEX_ SOSUEB. 0OGLC QOQBOKEFU QWUBWFDC FPSUEKUBQK Q / EC 0, OJaUDB LOHZUE NLCHKB\
QUJK.
.83
2. (UCHFPNUBQK QYUSC QJOMDF SNQOMC, DOBOMCK [OPROHKUB EC_BF RQU NDCPCBUHF F NDCPXRCUSXU
OJaUDBX. 6X [OSUWCUS RQU NDCPXRCUSXU OJaUDBX, EC DOBOMXU QQXHCUBQK YOBK JX OLFE
NDCPCBUH\, C PCBUS NLCHKUS RQU EU[OSUWUEEXU NDCPXRCUSXU OJaUDBX.
5OLQWUB QQXHOD FQ[OH\PNUBQK EU BCD WCQBO, EO ECVC PCLCWC [MKSO-BCDF QOPLCEC LHK EUGO. .JOMDC SNQOMC
BUSC, ECL DOBOMO_ ECS [MULQBOFB OQEORCBUH\EO [OMCPSXQHFB\ R GHCRU /6.
Bepyue ykasafenu
$URFLFSXU NDCPC\UHF WCTU RQUGO KRHKIBQK RULNTFSF (BO UQB\ SUZLN NDCPCBUHUS F NDCPXRCUSXS
OJaUDBOS QNTUQBRNUB OLEOPECWEOU QOOBRUBQBRFU). . SOSUEBC MCQQSOBMUEFK RULNTFY NDCPCBUHU_ [MOVHO
EUSCHO RMUSUEF, [O]BOSN K DMCBDO EC[OSEI, WBO ECS [MULQBOFB QLUHCB\ LHK [OLLUMZCEFK QUSCEBFDF
RULNTFY NDCPCBUHU_ R ECVU_ QFBNC^FF:
/. 0OGLC NDCPCBUH\ NEFWBOZCUBQK, LOHZUE NEFWBOZCB\QK F NDCPXRCUSX_ OJaUDB.
2. 0OGLC NDCPCBUH\ DO[FMNUBQK, LOHZUE DO[FMORCB\QK F NDCPXRCUSX_ OJaUDB.
3. 0OGLC LHK NDCPCBUHK RX[OHEKUBQK [MFQRCFRCEFU, OE FPSUEKUBQK BCD, WBOJX QQXHCB\QK EC DO[FI
NDCPXRCUSOGO OJaUDBC FP [MCRO_ WCQBF RXMCZUEFK.
$ULOQBCBOWEO [MFQROFB\ NDCPXRCUSX_ OJaUDB FP [MCRO_ WCQBF NDCPXRCUSOSN OJaUDBN FP HURO_ WCQBF,
[OQDOH\DN OEF SOGNB [MFECLHUZCB\ D MCPEXS DHCQQCS.
Yuufoeuue
*UQBMNDBOM DHCQQC-[MULDC LOHZUE JXB\ RFMBNCH\EXS, C LUQBMNDBOM NDCPCBUHK LOHZUE NEFWBOZCB\
NDCPXRCUSX_ OJaUDB.
class Foo {
public:
virtual ~Foo() {}
};
// G @$?#" foo.cpp
class PFoo : public Foo {
private:
Foo* foo;
public:
virtual ~PFoo() { delete foo; }
};
Konupoeauue
0O[FMORCEFU EURFLFSXY RULNTFY NDCPCBUHU_ [MOLOHZCUBQK Q BOGO, EC WUS SX OQBCEORFHFQ\ [MF
DO[FMORCEFF EURULNTFY NDCPCBUHU_. 0CZLX_ [MOFPROLEX_ DHCQQ LOHZUE [UMUO[MULUHFB\ `NED^FI
makeClone().
class Foo {
protected:
Foo(const Foo&) {}
public:
virtual Foo* makeClone() = 0; // :#% &'5/7'4$(/%
};
// G @$?#" foo.cpp
class PFoo : public Foo {
private:
Foo* foo;
public:
PFoo(Foo* f) : foo(f) {}
.84
virtual Foo* makeClone() { return new PFoo(foo->makeClone()); }
};
class Bar : public Foo {
protected:
Bar(Bar&); // I'()*73&*'7 &'5/?
public:
virtual Foo* makeClone();
};
Foo* Bar::makeClone()
{
return new Bar(*this);
}
$CDOEU^ SX LOJMCHFQ\ F LO [MFSUEUEFK ECQBOKTUGO DOEQBMNDBOMC DO[F_. 4DCPCBUH\ QOPLCUB DO[FI
EU BOH\DO QROI, EO F NDCPXRCUSOGO OJaUDBC. # QROI OWUMUL\, NDCPXRCUSX_ OJaUDB [UMUDHCLXRCUB RQI
BKZUHNI MCJOBN EC QRO_ QOJQBRUEEX_ DOEQBMNDBOM DO[F_. )JMCBFBU REFSCEFU: WBOJX ]BO QBCHO
ROPSOZEXS, SX QLUHCHF DOEQBMNDBOM DO[F_ Foo PCTFTUEEXS.
Rpuceaueauue
5MFQRCFRCEFU LHK EURFLFSXY RULNTFY NDCPCBUHU_ [OYOZU EC [MFQRCFRCEFU LHK HIJXY LMNGFY BF[OR
RULNTFY NDCPCBUHU_. ! QEORC SX [MOLOHZCUS Q BOGO SUQBC, EC DOBOMOS OQBCEORFHFQ\ [MF [MFQRCFRCEFF
EURULNTFY NDCPCBUHU_.
class Foo {
public:
virtual Foo& operator=(const Foo&);
};
// G @$?#" foo.cpp
class PFoo : public Foo {
private:
Foo* foo;
public:
virtual Foo& operator=(const Foo& f)
{
if (this == &f) return *this;
delete foo;
foo = f.foo->makeClone();
return *this;
}
};
Foo& Foo::operator=(const Foo&)
{
return *this;
}
Cuoea o peouo nepepae
$URFLFSXU NDCPCBUHF [OPROHKIB ]HUGCEBEO MUVFB\ SEOGFU [MOJHUSX. )LEC FP BCDFY [MOJHUS
NHNWVUEECK FEDC[QNHK^FK LRO_EO_ [UMULCWF, F R BOS WFQHU MUVUEFU EU[MFKBEO_ [MOJHUSX, QRKPCEEO_
Q O[UMCBOMOS +=. 6X OJaULFEFS LRO_ENI [UMULCWN Q DOE^U[^FU_ [UMUYOLEXY BF[OR, O DOBOMXY
GOROMFHOQ\ LCREXS-LCREO, R GHCRU 7.
.85
Ypeoeuuan peouan nepepaa
!BCD, LCRC_BU [O[MOJNUS MUCHFPORCB\ LRO_ENI [UMULCWN LHK EURFLFSXY NDCPCBUHU_. 3BOB MCPLUH
[MULQBCRHKUB QOJO_ ]HUSUEBCMEOU MCQ[MOQBMCEUEFU [MFUSOR, DOBOMXSF SX [OH\PORCHFQ\ JUP QRKPF Q
NDCPCBUHKSF.
Repean nonufka
.U_WCQ SX QLUHCUS [UMRX_ PCYOL EC CMF`SUBFWUQDFU O[UMC^FF Q EURFLFSXSF NDCPCBUHKSF. )E
MCJOBCUB, EO OJHCLCUB EUDOBOMXSF OGMCEFWUEFKSF, EC DOBOMXU QHULNUB OJMCBFB\ REFSCEFU F LOHZEXS
OJMCPOS FQ[MCRFB\. 1BOJX FPJUZCB\ [MOJHUS, QRKPCEEXY Q ROPRMCTUEFUS QQXHOD EC RMUSUEEXU
PECWUEFK (QS. ODOEWCEFU GHCRX //), K [UMUYOZN EC FQ[OH\PORCEFU O[UMCBOMC new. 5MOJHUSX QJOMDF
SNQOMC JNLNB MCQQSCBMFRCB\QK [OPZU.
// G @$?#" number.h
class NBase; // I#/"(*$2 '; Q*'2 (/."8' -($*, (" (31('
class Number {
protected:
Number(const Number&) {}
Number() {}
public:
virtual NBase& operator+(const NBase&) = 0;
virtual Number& operator+(const Number&) = 0;
// D *.0.
};
// G @$?#" number.cpp
class Integer;
class Real;
class PNumber : public Number {
private:
NBase* number;
protected:
virtual NBase& operator+(const NBase& n) const
{ return *number + n; } // #2
public:
PNumber(NBase* n) : number(n) {}
virtual Number& operator+(const Number& n) const
{ return *(new PNumber(&(n + *number))); } // #1
};

class NBase : public Number {
// =7'2"13*'.(<? ;$-'4<? &#$))
// A7$0/B/'(($% 04'?($% 5"7"0$.$ 4 NBase
public:
virtual NBase& operator+(const Integer&) const = 0;
virtual NBase& operator+(const Real&) const = 0;
// D *.0.
virtual NBase& operator+(const NBase&) const = 0;
virtual Number& operator+(const Number& n) const
{ return Integer(0); } // T$8#3M&$ (" 4<-<4$"*)%
};
class Integer : public NBase {
.86
private:
int value;
protected:
virtual NBase& operator+(const Integer& i) const
{ return *(new Integer(value + i.value)); } // #4
public:
Integer(int i) : value(i) {}
virtual NBase& operator+(const NBase& n) const
{ return n + *this; } // #3
};
class Real : public NBase { ... };
0CD F R FQYOLEOS RCMFCEBU LRO_EO_ [UMULCWF, [OQBCMC_BUQ\ EU QOQMULOBCWFRCB\ RPGHKL F SULHUEEO
OBOLRFGC_BU QBMCEF^N OB EOQC, [ODC EN HORFBU QNB\ [MOFQYOLKTUGO. $FZU [OLMOJEO MCQ[FQCEO, WBO
[MOFQYOLFB, DOGLC DHFUEB [XBCUBQK QHOZFB\ LRC Number (C EC QCSOS LUHU LRC PNumber, EO DHFUEB OJ
]BOS EU PECUB). 5MUL[OHOZFS, QDHCLXRCIBQK LRC Integer:
/. #XPXRCUBQK O[UMCBOMECK `NED^FK PNumber::operator+(const Number&) HUROGO NDCPCBUHK.
#XMCZUEFU [UMUROMCWFRCUBQK, F RXPXRCUBQK CECHOGFWECK `NED^FK [MCROGO NDCPCBUHK, [MF ]BOS
CMGNSUEBOS KRHKUBQK HURX_ NDCPXRCUSX_ OJaUDB. )LECDO [UMUL BUS, DCD ]BO QHNWCUBQK, `NED^FK
QOPLCUB PNumber LHK MUPNH\BCBC.
2. #XPXRCUBQK O[UMCBOMECK `NED^FK PNumber::operator+(const NBase&) HUROGO NDCPCBUHK.
#XPOR LUHUGFMNUBQK O[UMCBOMN + NDCPXRCUSOGO OJaUDBC.
3. #XPXRCUBQK O[UMCBOMECK `NED^FK Integer::operator+(const NBase&) [MCROGO
NDCPXRCUSOGO OJaUDBC. #XMCZUEFU QEORC [UMUROMCWFRCUBQK.
4. #XPXRCUBQK O[UMCBOMECK `NED^FK Integer::opeator+(const Integer&) HUROGO
NDCPXRCUSOGO OJaUDBC, GLU ECDOEU^ F RX[OHEKUBQK MUCH\ECK O[UMC^FK RXWFQHUEFK QNSSX.
# FBOGU [MOFQYOLFB WUBXMU [UMULCWF LRU LHK NDCPCBUHU_ F LRU LHK NDCPXRCUSXY OJaUDBOR. )BQILC F
ECPRCEFU 8)&%#**+4 )&%3*+4 >#6#)+-+. 6X OJYOLFSQK JUP [MUOJMCPORCEF_ BF[OR, EO PCBO O
QNTUQBRORCEFF NBase [MFYOLFBQK OJaKRHKB\ EC [UMRXY QBMCEF^CY GCPUB.
Cokpaeuue po fpex nepepa
%QHF SX MCPMUVFS [MOGMCSSU PECB\, WBO FPECWCH\EO QHURC F Q[MCRC QBOKB PNumber, F RX[OHEFS
QOOBRUBQBRNITUU [MFRULUEFU BF[OR, DOHFWUQBRO [UMULCW SOZEO QODMCBFB\ LO BMUY: OQBCRFB\ OLEN
[UMULCWN LHK O[UMCBOMEO_ `NED^FF PNumber::operator+(const Number&) [HIQ LRU OJXWEXU
LRO_EXU [UMULCWF. 5UMRX_ PNumber [MFYOLFB D RXROLN, WBO Q[MCRC BCDZU QBOFB PNumber, RX[OHEKUB
[OEFZCITUU [MUOJMCPORCEFU OB Number D PNumber, C PCBUS EC[MKSNI OJMCTCUBQK D NDCPXRCUSOSN
OJaUDBN. 5MF ]BOS NLCUBQK OJO_BFQ\ JUP PNumber::operator+(const NBase&). %QB\ F
LO[OHEFBUH\EOU [MUFSNTUQBRO [MF LOHZEO_ OQBOMOZEOQBF SOZEO NLCHFB\ FP `C_HC .h RQU QQXHDF
EC NBase.
5MOJHUSC PCDHIWCUBQK R BOS, WBO DCDO_-EFJNL\ FLFOB SOZUB RO[MUDF RQUS [MULN[MUZLUEFKS [OMOLFB\
OB Number QRO_ DHCQQ, RXYOLKTF_ PC [MULUHX RCVU_ BTCBUH\EO [OQBMOUEEO_ FUMCMYFF. 3BO JNLUB
OPECWCB\, WBO EU RQU Number JNLNB OJKPCBUH\EO PC[CDORCEX R PNumber. +OH\DO WBO [ODCPCEECK
SUBOLFDC [MULOBRMCTCUB QOPLCEFU [MOFPROLEXY OB Number DHCQQOR PC [MULUHCSF `C_HC .cpp F LCZU
[MCRFH\EO MCJOBCUB Q [MOFPROLEXSF DHCQQCSF JUP OJOHOWUD (Number JUP PNumber) [MF NQHORFF, WBO
OEF [MCRFH\EO MUCHFPNIB QYUSN NLROUEEO_ LRO_EO_ [UMULCWF.
Kak ponro pesynufaf ocfaefcn pecfeufenuuur?
# [ODCPCEEO_ RXVU MUCHFPC^FF DHFUEB LOHZUE [OSEFB\ O EUOJYOLFSOQBF FPJCRHKB\QK OB Number,
RXPXRCK delete &aResult. 3BO QUM\UPEOU OGMCEFWUEFU QMULF [MOWUGO NQHOZEKUB RHOZUEEXU
RXWFQHUEFK, [OQDOH\DN LHK RQUY [MOSUZNBOWEXY MUPNH\BCBOR [MFYOLFBQK QOPLCRCB\ NDCPCBUH\ LHK FY
[OQHULNITUGO NLCHUEFK. # DOSFBUB ANSI [OQBN[FHO [MULHOZUEFU (BCD F EU [MFEKBOU), R QOOBRUBQBRFF
Q DOBOMXS DOS[FHKBOM LOHZUE GCMCEBFMORCB\, WBO RMUSUEECK RUHFWFEC R QBUDU OQBCUBQK LU_QBRFBUH\EO_
.87
LO [OHEOGO RXWFQHUEFK QCSOGO JOH\VOGO RSUTCITUGO RXMCZUEFK. %QHF RCV DOS[FHKBOM QHULNUB
]BOSN [MCRFHN, BO QBMODN
{ return *(new Integer(&(value + i.value)); }
SOZEO PC[FQCB\ R RFLU
{ return Integer(value + i.value); }
-ECHOGFWEO QOPLCUBQK F PNumber. #OPRMCTCUSOU PECWUEFU JNLUB OQBCRCB\QK LU_QBRFBUH\EXS RENBMF
RXWFQHKUSOGO RXMCZUEFK. 'IJCK QQXHDC, DOBOMCK SOZUB QNTUQBRORCB\ PC [MULUHCSF RSUTCITUGO
RXMCZUEFK, LOHZEC JXB\ [OHNWUEC RXPOROS `NED^FF makeClone(). 3BC `NED^FK QOPLCUB PNumber R
DNWU FHF [MFQRCFRCUB LMNGO_ Number RFMBNCH\EXS O[UMCBOMOS = LHK EURFLFSXY RULNTFY NDCPCBUHU_,
O DOBOMXY GOROMFHOQ\ RXVU. 1BOJX HFDRFLFMORCB\ ]BF MCPLMCZCITFU SUHDFU NBUWDF [CSKBF, SOZEO
ROQ[OH\PORCB\QK [MFUSCSF N[HOBEUEFK F QJOMDF SNQOMC, MCQQSOBMUEEXSF R WCQBF 4.
Caroropuqukauun u nepexopurocfu
$URFLFSX_ RULNTF_ NDCPCBUH\, DCD F HIJO_ NSEX_ NDCPCBUH\, SOZUB FEBUM[MUBFMORCB\QK DCD
[UMUYOLEX_ BF[. %QHF [MOQBO PCSUEFB\ NDCPXRCUSX_ OJaUDB DCDFS-EFJNL\ [MOFPROLEXS DHCQQOS, RX
`CDBFWUQDF FPSUEKUBU BF[ RQU_ RFLFSO_ DHFUEBN DOSJFEC^FF. $C ]BOS OQEORCEO MUVUEFU [MOJHUSX
O[UMCBOMC +=, DOBOMCK BMUJNUB QCSOSOLF`FDC^FF HUROGO O[UMCELC, C BCDZU ROPSOZEOGO O[UMCBFREOGO
FPSUEUEFK BF[C EC YOLN. %QHF [MCRX_ O[UMCEL Complex QDHCLXRCUBQK Q HURXS O[UMCELOS Integer,
BF[ HUROGO O[UMCELC [MFYOLFBQK SUEKB\.
// G @$?#" number.h
class NBase; // I#/"(*$2 '; Q*'2 (/."8' -($*, (" (31('
class Number {
protected:
Number(const Number&) {}
Number() {}
public:
virtual NBase& AddTo(const NBase&) = 0;
virtual Number& operator+(const Number&) = 0;
// D *.0.
};
// G @$?#" number.cpp
class Integer;
class Real;
class PNumber : public Number {
private:
NBase* number;
protected:
virtual NBase& AddTo(const NBase& n) const
{ return number->AddTo(n); } // #2
public:
PNumber(NBase* n) : number(n) {}
virtual Number& operator+(const Number& n) const
{
number = &(n.AddTo(*number)); // #1 - -$2"($
return *this;
}
};

class NBase : public Number {
// =7'2"13*'.(<? ;$-'4<? &#$))
.88
// A7$0/B/'(($% 04'?($% 5"7"0$.$ 4 NBase
public:
virtual NBase& operator+=(const Integer&) const = 0;
virtual NBase& operator+=(const Real&) const = 0;
// D *.0.
virtual NBase& AddTo(const NBase&) const = 0;
virtual Number& operator+(const Number& n) const
{ return Integer(0); } // T$8#3M&$ (" 4<-<4$"*)%
};
class Integer : public NBase {
private:
int value;
protected:
virtual NBase& operator+=(const Integer& i) const
{
if (value + i.value 0')*$*'.(' 2$#') {
value += i.value;
return *this;
}
else {
ArbitraryPrecisionInteger api(value);
api += i.value;
delete this;
return api;
}
public:
Integer(int i) : value(i) {}
virtual NBase& AddTo(const NBase& n) const
{ return n + *this; } // #3
};
class Real : public NBase { ... };
#QU DCD F MCE\VU, MCPRU WBO O[UMCBOMX + [MURMCBFHFQ\ R +=, C LRO_ECK [UMULCWC BU[UM\ [MOYOLFB WUMUP
+=(#"4<?, 57$4<?) F AddTo(57$4<?, #"4<?), WBOJX SX SOGHF MCPHFWCB\ LRC [OMKLDC CMGNSUEBOR.
3BO RCZEO, [OQDOH\DN R DOEUWEOS QWUBU SX YOBFS PCSUEFB\ NDCPXRCUSX_ OJaUDB HUROGO O[UMCELC
EORXS. 3BO [MOFQYOLFB R LRNY SUQBCY:
/. )[UMCBOMECK `NED^FK PNumber::operator+=(const Number&) CRBOSCBFWUQDF PCSUEKUB
WFQHO [OHNWUEEXS EORXS PECWUEFUS.
2. )[UMCBOMECK `NED^FK Integer::operator+=(const Integer&) ROPRMCTCUB N[MCRHUEFU,
UQHF U_ EU [MFYOLFBQK FPSUEKB\ BF[; R [MOBFREOS QHNWCU [OQHU NLCHUEFK QROUGO OJaUDBC OEC
ROPRMCTCUB EORX_ OJaUDB LMNGOGO BF[C.
5O R[OHEU [OEKBEXS [MFWFECS K ECPORN RBOMNI FP ]BFY `NED^F_ 9+,#*4FL#3. "CSUEKITFU `NED^FF
OJHCLCIB OLEO_ ]DPOBFWUQDO_ (UQHF EU RXMCPFB\QK QFH\EUU) OQOJUEEOQB\I: EUH\PK MCQQWFBXRCB\, WBO
CLMUQ OJaUDBC [UMUL RXPOROS OQBCUBQK LU_QBRFBUH\EXS F [OQHU RXPORC. (CPNSUUBQK, [OH\PORCB\QK ]BFS
OJQBOKBUH\QBROS SOZEO HFV\ R BOS QHNWCU, UQHF ]BN HOGFDN NLCQBQK PC[MKBCB\ R QCSNI GHNJODNI F
BUSENI LXMN, WBOJX EFDBO R EUU EU QNENHQK, EO UQHF ]BO NLCUBQK QLUHCB\, YHO[OBEXU CHGOMFBSX
EURUMOKBEO N[MOTCIBQK.
5ODCPCEEX_ [MFSUM ECLUZEO MCJOBCUB, [ODC PNumber LU_QBRNUB DCD RULNTF_ NDCPCBUH\ F [ODC SOZEO
GCMCEBFMORCB\, WBO EF OLFE OJaUDB, [MOFPROLEX_ OB NBase, EU JNLUB QNTUQBRORCB\ JUP QQXHCITUGOQK
EC EUGO PNumber. # ECVUS QHNWCU, DOGLC RQU [MKWUBQK R `C_HU .cpp, LUHO OJQBOFB FSUEEO BCD.
.89
*HK BCDO_ [MOQBO_ [MOJHUSX [MOGMCSSC [OHNWFHCQ\ LOROH\EO JOH\VO_. & EU NBRUMZLCI, WBO RCVF
YHO[OBX O[MCRLCIBQK RO RQUY [MOUDBCY. 6OU MUVUEFU R OQEOREOS [MULECPECWUEO LHK QFBNC^F_, R
DOBOMXY RX BMCBFBU SEOGO RMUSUEF EC MCPMCJOBDN FUMCMYFF DHCQQOR SEOGODMCBEOGO FQ[OH\PORCEFK F
SOZUBU [OPROHFB\ QUJU [OBMCBFB\ RMUSK EC [ORXVUEFU SOLNH\EOQBF. & [MFRUH UGO, [OQDOH\DN OEO
QOOBRUBQBRNUB OQEOREO_ FLUU DEFGF RXZCB\ FP .++ RQU ROPSOZEOU F EUROPSOZEOU F TULMO
MCPJMOQCB\ GOHOROHOSDF, [MULQBCRHKITFU FEBUMUQ LCZU LHK QCSXY RXLCITFYQK ]DQ[UMBOR.
Muoecfeeuuan peouan nepepaa
6EOZUQBRUEECK [UMULCWC F RQU UU MCPEORFLEOQBF BOZU FSUIB QROF CECHOGF R SFMU EURFLFSXY
NDCPCBUHU_, EO K JX EU MFQDENH MUDOSUELORCB\ FY LHK FQ[OH\PORCEFK R MUCH\EXY [MOUDBCY.
Rpureueuue ueeupurux ykasafene
# OQBCRVFYQK GHCRCY MUW\ [O_LUB OJ N[MCRHUEFF [CSKB\I. .U_WCQ K PCJUGN R[UMUL F [UMUWFQHI
EUDOBOMXU QBMCBUGFF N[MCRHUEFK [CSKB\I, DOBOMXU N[MOTCIBQK PC QWUB [MFSUEUEFK EURFLFSXY
NDCPCBUHU_.
Ksuupoeauue
0]VFMORCEFU NZU N[OSFECHOQ\ R DOEBUDQBU OJXWEXY NSEXY NDCPCBUHU_, OLECDO LHK EURFLFSXY
NDCPCBUHU_ OEO [MFOJMUBCUB LO[OHEFBUH\EOU PECWUEFU. $URFLFSX_ NDCPCBUH\ SOZUB QOLUMZCB\ CLMUQ
NDCPXRCUSOGO OJaUDBC EC LFQDU F R [OQHULEII QUDNELN [UMUL BUS, DCD [UMULCRCB\ [OHEOSOWFK OJaUDBN,
QWFBXRCB\ OJaUDB. #QU ]BO [MOFQYOLFB EUPCSUBEO LHK DHFUEBC, [O]BOSN QO QYUSO_ SOZEO
]DQ[UMFSUEBFMORCB\, OJYOLKQ\ JUP FPSUEUEF_ JOH\VFY OJaUSOR DOLC.
Pacnpepeneuuue oLekfu u nocpepuuku
(CP NZ SX PCGOROMFHF OJ ]BOS, QBOFB HF OGMCEFWFRCB\QK LFQDOS, UQHF LOQBN[EX F LMNGFU DOS[\IBUMX?
8HCGOLCMK EURFLFSXS NDCPCBUHKS DHFUEB EU PCJOBFBQK O BOS, ECYOLFBQK HF OJaUDB, D DOBOMOSN OE
OJMCTCUBQK, EC BOS ZU DOS[\IBUMU FHF ZU OE PCBUMKE R GHOJCH\EO_ QUBF GLU-BO R GOMCY +FJUBC. 0OGLC
EURFLFSX_ NDCPCBUH\ FQ[OH\PNUBQK LHK LUHUGFMORCEFK NLCHUEEOSN OJaUDBN, OE ECPXRCUBQK
>%.6#)*($%, (proxy) LHK ]BOGO OJaUDBC.
Hefpueuanuuue pacnpepeneuuue apxufekfypu
# EUDOBOMXY MCQ[MULUHUEEXY CMYFBUDBNMCY [OQMULEFD LOHZUE QOLUMZCB\ HODCH\EX_ D]VFMORCEEX_
OJMCP NLCHUEEOGO OJaUDBC. 3BO [MFROLFB D QEFZUEFI QUBUROGO BMC`FDC LHK MULDO FPSUEKUSXY
OJaUDBOR. # WCQBEOQBF, R LCEEO_ QBMCBUGFF EUMULDO FQ[OH\PNUBQK QYUSC Q 72+&*', ,+6$#6%, (master
token): WBOJX OJEORFB\ OJaUDB, RX LOHZEX QECWCHC [OHNWFB\ UGO DO[FI N [MO^UQQC F DOS[\IBUMC,
DOBOMXS OEC [MFECLHUZFB R ECQBOKTF_ SOSUEB. #QU ]BO SOZUB [MOFQYOLFB\ EUPCSUBEO LHK DHFUEBC, Q
FQ[OH\PORCEFU EURFLFSXY NDCPCBUHU_ F MCPHFWUEFUS DOEQBCEBEXY F EUDOEQBCEBEXY `NED^F_.
$URFLFSXU NDCPCBUHF ]BO PCSUWCBUH\ECK HCJOMCBOMFK, R DOBOMO_ SOZEO [O]DQ[UMFSUEBFMORCB\ Q
MCPHFWEXSF QBMCBUGFKSF F RXKQEFB\, DCDCK FP EFY MCJOBCUB HNWVU. 6UBOLFDF, R DOBOMXY MUCHFPNIBQK
[UMUYOLEXU BF[X, BCDZU [OPROHKIB O[UMCBFREO PCSUEKB\ OLEO [MULQBCRHUEFU OJaUDBC LMNGFS.
Ynpaeneuue narnfuk
)J N[MCRHUEFF [CSKB\I F FLFOSCY .++, N[MOTCITFY ]BOB [MO^UQQ,
EC[FQCEO EC NLFRHUEFU SCHO OQOJUEEO UQHF NWUQB\, QDOH\DO QFH
BMCBFBQK EC BCDOU N[MCRHUEFU R MUCH\EOS [MOGMCSSFMORCEFF. "LUQ\ SX
PC_SUSQK ]BO_ BCFEQBRUEEO_ BUSO_, ECWEUS Q QCSOGO [MOQBOGO F [UMU_LUS
D EURUMOKBEO QHOZEOSN. 5MF ]BOS SX JNLUS [OL MCPEXSF NGHCSF
DMNBFB\, QDHCLXRCB\ F MCQWHUEKB\ QFEBCDQFQ .++, WBOJX Q[MKBCB\
N[MCRHUEFU [CSKB\I FHF FPRHUW\ FP EUGO [OH\PN. 5MFUSX N[MCRHUEFK
[CSKB\I R[OHEU SOGHF JX QBCB\ BUSO_ LHK OBLUH\EO_ DEFGF. "CZFGC_BU
JHCGOROEFK F PC[URC_BU SCEBMX!
4
-acfu
Reperpyska
onepafopoe
ynpaeneuun
narnfuk
*CRC_BU OBLOYEUS OB NDCPCBUHU_ F [OGOROMFS OJ N[MCRHUEFF [CSKB\I. ,OROMKB, BF[FWEX_ [MOGMCSSFQB
EC .++ (UQHF OE ROOJTU QNTUQBRNUB) BMCBFB 50 [MO^UEBOR QROUGO MCJOWUGO RMUSUEF EC N[MCRHUEFU
[CSKB\I. 0OGLC NLCHKB\ OJaUDB? 0CD GCMCEBFMORCB\, WBO QBCMX_ CLMUQ OJaUDBC EFGLU EU OQBCEUBQK [OQHU
UGO NEFWBOZUEFK? 0CD LOJFB\QK [MFHFWEOGO JXQBMOLU_QBRFK OB [O[NHKMEXY DHCQQOR QO QBCELCMBEO_
QYUSO_ N[MCRHUEFK [CSKB\I, DOBOMNI DOS[FHKBOM FQ[OH\PNUB EC RQU QHNWCF ZFPEF? # OBHFWFU OB BCDFY
KPXDOR, DCD SmallTalk F Lisp, QBCELCMBEXU QMULQBRC .++ EU ODCZNB RCS OQOJO_ [OSOTF R ]BOS RO[MOQU.
0 QWCQB\I, R .++ FSUUBQK EUQDOH\DO [MUDMCQEXY HCPUUD; BOB, DBO QNSUUB EC_BF ]BF OJYOLEXU [NBF,
[MF EUOJYOLFSOQBF RQUGLC QSOZUB LOJFB\QK YOMOVUGO JXQBMOLU_QBRFK, C [O ROPSOZEOQBKS N[MCRHUEFK
[CSKB\I OQSUHIQ\ HF K [MOFPEUQBF ]BO RQHNY? UGO [MOGMCSSC EU NQBN[FB SmallTalk.
4[MCRHUEFU [CSKB\I OLEC FP QCSXY SFQBFWUQDFY BUS R DOS[\IBUMEXY BUYEOHOGFKY; BO, ECL WUS
J\IBQK RXLCITFUQK NSX R RUHFDFY NEFRUMQFBUBCY. & EU [MUBUELNI EC GHNJODOU OQRUTUEFU BUSX R
^UHOS. # OQBCRVU_QK WCQBF DEFGF SX [OQSOBMFS, DCD QFEBCDQFQ F FLFOSX .++ [OSOGCIB [OQBMOFB\
OQEORN LHK [OLDHIWUEFK BUY CHGOMFBSOR F QBMNDBNM LCEEXY, DOBOMXU RX PCYOBFBU MUCHFPORCB\. +US EU
SUEUU, LCZU DMCBDFU [MFSUMX FP ]BO_ F QHULNITU_ GHCRX SOGNB [MFGOLFB\QK EC [MCDBFDU, UQHF RCVC
PCLCWC EU OBHFWCUBQK OQOJO_ QHOZEOQB\I.
,HCRC ECWFECUBQK Q QCSOGO RCZEOGO [UMUGMNPDF O[UMCBOMOR new F delete. "CBUS SX MCQQSOBMFS
EUQDOH\DO N[MOTUEEXY, EO OWUE\ [OHUPEXY [MFUSOR N[MCRHUEFK [CSKB\I R .++. # [OQHULNITFY
GHCRCY O[FQXRCIBQK EUBMFRFCH\EXU SUBOLX, OQEORCEEXU EC FLUKY ]BO_ GHCRX.
Reperpyska onepafopoe new u delete
6EOGFU NLFRHKIBQK BOSN, WBO O[UMCBOMX new F delete SOZEO [UMUGMNZCB\, DCD F RQU OQBCH\EXU
O[UMCBOMX. 5OEKB\, DCD ]BO LUHCUBQK, [MOTU RQUGO EC [MFSUMU.
Rpocfo cnucok ceoopuo narnfu
(CQQSOBMFS [MOQBO_ [MFSUM. )[UMCBOM delete RDHIWCUB OQROJOZLCUSXU JHODF R Q[FQOD QROJOLEO_
[CSKBF. )[UMCBOM new QECWCHC [XBCUBQK RXLUHFB\ JHOD FP Q[FQDC F OJMCTCUBQK D GHOJCH\EOSN
O[UMCBOMN new HFV\ R BOS QHNWCU, UQHF Q[FQOD QROJOLEO_ [CSKBF [NQB.
class Foo {
private:
struct FreeNode {
FreeNode* next;
};
static FreeNode* fdFreeList;
.3
.94
public:
void* operator new(size_t bytes)
{
if (fgFreeList == NULL)
return ::operator new(bytes);
FreeNode* node = fgFreeList;
FgFreeList = fgFreeList->next;
return node;
}
void operator delete(void* space)
{
((FreeNode*)space->next = fgFreeList;
fgFreeList = (FreeNode*)space;
}
};
0CD RX RQDOMU NJULFBUQ\, [MFRULUEEX_ `MCGSUEB EU[OHOE, OLECDO OE LUSOEQBMFMNUB OJTFU [MFE^F[X
[UMUGMNPDF O[UMCBOMOR new F delete LHK DOEDMUBEOGO DHCQQC. )[UMCBOM new [OHNWCUB OLFE CMGNSUEB,
OJaUS RXLUHKUSOGO JHODC, F ROPRMCTCUB CLMUQ RXLUHUEEOGO JHODC. -MGNSUEBOS O[UMCBOMC delete
KRHKUBQK CLMUQ OQROJOZLCUSO_ OJHCQBF. $U [XBC_BUQ\ OJaKRHKB\ FY RFMBNCH\EXSF; DOS[FHKBOM HFV\
[OQSUUBQK ECL RCSF. 5MF RXPORU O[UMCBOMC new DOS[FHKBOM BOWEO PECUB, Q DCDFS DHCQQOS OE FSUUB
LUHO, [O]BOSN v-BCJHF^C USN EU ENZEC. 5MF RXPORU O[UMCBOMC delete LUQBMNDBOM O[MULUHKUB, DCDOSN
DHCQQN ]BOB O[UMCBOM LOHZUE [MFECLHUZCB\. %QHF RX YOBFBU GCMCEBFMORCB\, WBO JNLUB RXPXRCB\QK
O[UMCBOM delete [MOFPROLEOGO DHCQQC, BO RFMBNCH\EXS ENZEO QLUHCB\ LUQBMNDBOM, C EU O[UMCBOM
delete. 5UMUGMNPDF JNLNB NECQHULORCEX [MOFPROLEXSF DHCQQC Foo, [O]BOSN ]BO [ORHFKUB F EC
[MO^UQQ RXLUHUEFK/OQROJOZLUEFK [CSKBF R EFY. $C [MCDBFDU EUMULDO QOPLCUBQK CJQBMCDBEX_ JCPORX_
DHCQQ, DOBOMX_ EU LUHCUB [OWBF EFWUGO (DCD F R [MFRULUEEOS [MFSUMU) F FQ[OH\PNUBQK BOH\DO LHK
QOPLCEFK DHCQQOR Q LCEEO_ QYUSO_ N[MCRHUEFK [CSKB\I.
class Bar : public Baseclass, public Foo { ... };
"LUQ\ Bar ECQHULNUB RQU JCPORXU YCMCDBUMFQBFDF BF[C Baseclass, C EUQBCELCMBEOU N[MCRHUEFU
[CSKB\I OB Foo.
Orpauueuun ruuuranuuoro pasrepa
5UMUL BUS DCD YRCBCB\QK PC DOS[FHKBOM, EUOJYOLFSO [MFRUQBF R [OMKLOD [ODCPCEEX_ `MCGSUEB. #O-
[UMRXY, [MUL[OHCGCUBQK, WBO ]DPUS[HKM Foo QOLUMZFB [O DMC_EU_ SUMU EU SUE\VU JC_B, WUS
Foo::FreeNode*. *HK DHCQQOR RMOLU ECVUGO, EU FSUITUGO [UMUSUEEXY F RFMBNCH\EXY `NED^F_, ]BOGO
GCMCEBFMORCB\ EUH\PK. )E JNLUB FSUB\ O[MULUHUEEX_ MCPSUM (RO SEOGFY DOS[FHKBOMCY LRC JC_BC),
WBOJX OJaUDBX OJHCLCHF NEFDCH\EXS CLMUQOS, EO [O DOHFWUQBRN JC_B OE SOZUB JXB\ SUE\VU NDCPCBUHK
EC FreeNode. 6X LOHZEX GCMCEBFMORCB\, WBO MCPSUM Foo EU SUE\VU MCPSUMC NDCPCBUHK LHK ]BOGO
ENZEO RDHIWFB\ R EUGO v-BCJHF^N FHF YOBK JX [UMUSUEEXU, LO[OHEKITFU UGO LO MCPSUMC NDCPCBUHK.
Rpouseopuue knaccu c poaeneuuuru nepereuuuru
*MNGCK [MOJHUSC PCDHIWCUBQK R BOS, WBO [MFRULUEEX_ `MCGSUEB EU MCJOBCUB Q [MOFPROLEXSF DHCQQCSF,
R DOBOMXY LOJCRHKIBQK EORXU [UMUSUEEXU. (CQQSOBMFS QHULNITNI FUMCMYFI DHCQQOR.
class Bar : public Foo {
private:
int x;
};
0CZLX_ ]DPUS[HKM Bar [O DMC_EU_ SUMU EC [CMN JC_B JOH\VU, WUS ]DPUS[HKM Foo. %QHF NLCHFB\
]DPUS[HKM Foo, C PCBUS [O[XBCB\QK EUSULHUEEO RXLUHFB\ [CSKB\ LHK ]DPUS[HKMC Bar DCMCNH!
#XLUHUEEX_ JHOD ODCPXRCUBQK EC BN ZU EC [CMN JC_B DOMOWU. #OPSOZEOU QFHOROU MUVUEFU QLUHCB\
O[UMCBOM new LOQBCBOWEO NSEXS LHK BOGO, WBOJX OE [UMUYRCBXRCH BOH\DO [O[XBDF RXLUHUEFK
[MCRFH\EOGO DOHFWUQBRC JC_B. 5OPLEUU JNLNB MCQQSOBMUEX F JOHUU FPKTEXU MUVUEFK.
.95
class Foo {
public:
void* operator new(size_t bytes)
{
if (bytes != sizeof(Foo) || fgFreeList == NULL)
return ::operator new(bytes);
FreeNode* node = fgFreeList;
FgFreeList = fgFreeList->next;
Return node;
}
};
6X FPJCRFHFQ\ HFV\ OB [MOJHUS, QRKPCEEXY Q RXLUHUEFUS [CSKBF. 5MO^UQQ OQROJOZLUEFK EUOJYOLFSO
FPSUEFB\ R QOOBRUBQBRFF Q ]BO_ QBMCBUGFU_. -H\BUMECBFRECK `OMSC O[UMCBOMC delete FSUUB RBOMO_
CMGNSUEB DOHFWUQBRO OQROJOZLCUSXY JC_B. $C [UMRX_ RPGHKL DCZUBQK, WBO FP PCBMNLEUEF_ [OKRFHQK
FPKTEX_ RXYOL:
class Foo {
public:
void* operator new(size_t bytes); // F2. G<M"
void operator delete(void* space, size_t bytes)
{
if (bytes != sizeof(Foo))
::operator delete(space);
((FreeNode*)space)->next = fgFreeList;
fgFreeList = (FreeNode*)space;
}
};
+U[UM\ R Q[FQOD JNLNB PCEOQFB\QK BOH\DO ECQBOKTFU Foo F [MOFPROLEXU DHCQQX, QOR[CLCITFU [O
MCPSUMN. $U[HOYO, EO UQB\ OLEC [MOJHUSC. 0CD DOS[FHKBOM [ORULUB QUJK R QHULNITUS `MCGSUEBU?
Foo* foo = new Bar;
delete foo; // I$&'? 7$-2"7 ;30"* /)5'#,-'4$( &'25/#%*'7'2?
Bar JOH\VU Foo, [O]BOSN Foo::operator new [UMU[OMNWCUB MCJOBN GHOJCH\EOSN O[UMCBOMN new. $O
DOGLC [OLYOLFB RMUSK OQROJOZLCB\ [CSKB\, DOS[FHKBOM RQU [NBCUB. (CPSUM, [UMULCRCUSX_
Foo::operator delete, OQEORCE EC LOGCLDU DOS[FHKBOMC OBEOQFBUH\EO ECQBOKTUGO BF[C, C ]BC
LOGCLDC SOZUB ODCPCB\QK EURUMEO_. # LCEEOS QHNWCU SX QDCPCHF DOS[FHKBOMN, WBO ]BO Foo, C EU Bar;
DOS[FHKBOM NYSXHKUBQK F [MOLOHZCUB FGMCB\ [O ECVFS [MCRFHCS. 1BOJX Q[MCRFB\QK Q PCBMNLEUEFKSF,
EUOJYOLFSO PECB\ BOWENI [OQHULORCBUH\EOQB\ NEFWBOZUEFK, ROPEFDCITNI R O[UMCBOMCY RFLC delete
foo;. .ECWCHC RXPXRCIBQK LUQBMNDBOMX, ECWFECK Q [MOFPROLEOGO DHCQQC, F LCHUU RRUMY [O ^U[OWDU.
"CBUS O[UMCBOM delete RXPXRCUBQK DOLOS, ODMNZCITFS LUQBMNDBOM [MOFPROLEOGO DHCQQC. 3BO
OPECWCUB, WBO [MOJHUSC ROPEFDCUB BOH\DO LHK EURFMBNCH\EXY LUQBMNDBOMOR. %QHF LUQBMNDBOM KRHKUBQK
RFMBNCH\EXS, CMGNSUEB MCPSUMC R O[UMCBOMU delete RQUGLC JNLUB [MCRFH\EXS 2438-_ LOROL R
[OH\PN [MFSUEUEFK RFMBNCH\EXY LUQBMNDBOMOR, UQHF BOH\DO N RCQ EU ECYOLFBQK LU_QBRFBUH\EO RUQDFY
[MFWFE [MOBFR EFY.
Paou knacc cnucka ceoopuo narnfu
4WFBXRCK RQU QDCPCEEOU, QHULNITF_ `MCGSUEB RQUGLC JNLUB [MCRFH\EO MCJOBCB\ EC DOS[FHKBOMCY,
FQ[OH\PNITFY v-BCJHF^X.
class Foo {
private:
struct FreeNode {
FreeNode* next;
};
.96
static FreeNode* fdFreeList;
public:
virtual ~Foo() {}
void* operator new(size_t bytes)
{
if (bytes != sizeof(Foo) || fgFreeList == NULL)
return ::operator new(bytes);
FreeNode* node = fgFreeList;
FgFreeList = fgFreeList->next;
return node;
}
void operator delete(void* space, size_t bytes)
{
if (bytes != sizeof(Foo))
return ::operator delete(space);
((FreeNode*)space)->next = fgFreeList;
fgFreeList = (FreeNode*)space;
}
};
4DCPCBUH\ v-BCJHF^X GCMCEBFMNUB, WBO DCZLX_ Foo [O DMC_EU_ SUMU EU SUE\VU NDCPCBUHK EC
QHULNITF_ ]HUSUEB Q[FQDC (FreeNode*), C RFMBNCH\EX_ LUQBMNDBOM OJUQ[UWFRCUB [MCRFH\EOQB\
MCPSUMC, [UMULCRCUSOGO O[UMCBOMN delete.
5ORBOMKI: MCQQSOBMUEECK QYUSC N[MCRHUEFK [CSKB\I EU [MULECPECWUEC LHK [MCDBFWUQDOGO [MFSUEUEFK
(RQBMUBFR [MOFPROLEX_ DHCQQ, OEC QOJFMCUB RUTF F OB[MCRHKUBQK LOSO_). )EC HFV\ LUSOEQBMFMNUB
EUDOBOMXU JCPORXU [MFE^F[X [UMUGMNPDF O[UMCBOMOR new F delete.
Hacnepoeauue onepafopoe new u delete
%QHF [UMUGMNPFB\ O[UMCBOMX new F delete LHK EUDOBOMOGO DHCQQC, [UMUGMNZUEEXU RUMQFF JNLNB
NECQHULORCEX [MOFPROLEXSF DHCQQCSF. $FWBO EU [OSUVCUB RCS QEORC [UMUGMNPFB\ new F/FHF delete R
OLEOS FP ]BFY [MOFPROLEXY DHCQQOR.
class Bar : public Foo {
public:
virtual ~Bar(); // Foo::~Foo *'1" 0'#1"( ;<*, 4/7*3$#,(<2
void* operator new(size_t bytes);
void operator delete(void* space, size_t bytes);
};
. RFMBNCH\EXS LUQBMNDBOMOS RQU MCJOBCUB. %QHF LUQBMNDBOM EU RFMBNCH\EX_, R QHULNITUS `MCGSUEBU
JNLUB RXPRCE [MCRFH\EX_ O[UMCBOM new F O[UMCBOM delete JCPOROGO DHCQQC:
Foo* foo = new Bar;
delete foo;
>OBK ]BOB `MCGSUEB MCJOBCUB, [OLOJEOU [UMUO[MULUHUEFU [UMUGMNZUEEXY O[UMCBOMOR OJXWEO QWFBCUBQK
LNMEXS BOEOS. #O RQKDOS QHNWCU R DMNGN PECBODOR .++ O BCDFY RUTCY EU GOROMKB. 0OGLC [MOFPROLEX_
DHCQQ ECWFECUB RSUVFRCB\QK R N[MCRHUEFU [CSKB\I JCPOROGO DHCQQC, RO RQU_ [MOGMCSSU ECWFECIB
ROPEFDCB\ EU[MULRFLUEEXU ]``UDBX. %QHF RCS PCYOWUBQK FQ[OH\PORCB\ EUQDOH\DO QBMCBUGF_ N[MCRHUEFK
[CSKB\I R OLEO_ FUMCMYFF DHCQQOR, HNWVU QMCPN RDHIWFB\ ENZENI QBMCBUGFI R DOEDMUBEX_
[MOFPROLEX_ DHCQQ QMULQBRCSF SEOZUQBRUEEOGO ECQHULORCEFK, WUS NECQHULORCB\ UU F [OBOS PCKRFB\ R
[MOFPROLEOS DHCQQU: >C-YC, K [OVNBFH.
.97
Apryreufu onepafopa new
)[UMCBOM new SOZEO [UMUGMNPFB\ BCD, WBOJX [OSFSO MCPSUMC OE RXPXRCHQK F Q LMNGFSF
LO[OHEFBUH\EXSF CMGNSUEBCSF. 5UMUGMNPDC HFVCUB RCQ QBCELCMBEO_ QFGECBNMX void* operator
new(size_t), F, UQHF RCS ]BOGO EU YOWUBQK, UU [MFLUBQK RDHIWFB\ R [MOGMCSSN RMNWENI.
#define kPoolSize 4096
struct Pool {
unsigned char* next; // F#"03>K/? )4';'0(<? ;$?*
unsigned char space[kPoolSize];
Pool() : next(&space[0]) {}
};
class Foo {
public:
void* operator new(size_t bytes)
{ return ::operator new(bytes); }
void* operator new(size_t bytes, Pool* pool)
{
void* space = pool->next;
pool->next += bytes;
return space;
}
};
void f()
{
Pool localPool;
Foo* foo1 = new Foo; // D)5'#,-3"* '5"7$*'7 new 5' 32'#.$(/>
Foo* foo2 = new(&localPool) Foo; // D)5'#,-3"* 5"7"873-&3
}
"LUQ\ DHFUEB, C EU DHCQQ NDCPXRCUB, GLU QHULNUB MCPSUQBFB\ OJaUDB. 5ODCPCE HFV\ `MCGSUEB [OHEO_
QBMCBUGFF. $C[MFSUM, DCD O[UMCBOM delete NPECUB, OBDNLC JXHC RPKBC [CSKB\ FP GHOJCH\EOGO [NHC,
FQ[OH\PNUSOGO O[UMCBOMOS new [O NSOHWCEFI, FHF ECQBCELCMBEOGO [NHC, DOBOMX_ FQ[OH\PNUBQK
[UMUGMNZUEEXS O[UMCBOMOS new? #[MOWUS, OQEORECK FLUK [MOQBC: [MULOQBCRFB\ DHFUEBN DHCQQC
EUDOBOMNI QBU[UE\ DOEBMOHK ECL MCPSUTUEFUS ]DPUS[HKMOR R [CSKBF. 3BO OPECWCUB, WBO Q[OQOJ
RXLUHUEFK [CSKBF SOZUB RXJFMCB\QK LHK DOEDMUBEXY OJaUDBOR F EU OJKPCE QOR[CLCB\ LHK RQUY
]DPUS[HKMOR DHCQQC.
)[UMCBOM new SOZEO [UMUGMNZCB\ Q HIJXSF EORXSF QFGECBNMCSF [MF NQHORFF, WBO RQU OEF
MCPHFWCIBQK, C [UMRXS CMGNSUEBOS DCZLO_ [UMUGMNZUEEO_ RUMQFF KRHKUBQK size_t DOHFWUQBRO
ENZEXY JC_B. 5UMUGMNPDF SOGNB JXB\ DCD GHOJCH\EXSF, BCD F [MFECLHUZCB\ DOEDMUBEXS DHCQQCS.
0OGLC DOS[FHKBOM RQBMUWCUB CMGNSUEBX SUZLN new F FSUEUS DHCQQC, OE [OLQBCRHKUB MCPSUM R ECWCHO
Q[FQDC CMGNSUEBOR F FTUB [OLYOLKTNI QFGECBNMN.
Koucfpyupoeauue c paspeneuuer qas
3BC FLFOSC [MULHOZUEC *ZU_SQOS 0O[HFEOS (James Coplien), DOBOMX_ ECPRCH UU RFMBNCH\EXS
DOEQBMNDBOMOS. 1BO LUHCUB QHULNITF_ [UMUGMNZUEEX_ O[UMCBOM new?
class Foo {
public:
void* operator new(size_t, void* p) { return p; }
};
$C [UMRX_ RPGHKL EFWUGO; [NQBCK BMCBC RMUSUEF. $O BCD HF ]BO? 1BO [MOFPO_LUB R QHULNITUS
`MCGSUEBU?
.98
union U {
Foo foo;
Bar bar;
Banana banana;
};
U whatIsThis;
0OS[FHKBOM .++ EU SOZUB O[MULUHFB\, DCDO_ DOEQBMNDBOM QHULNUB RXPXRCB\ LHK whatIsThis
Foo::Foo(), Bar::Bar() FHF Banana::Banana(). (CPNSUUBQK, JOH\VU OLEOGO DOEQBMNDBOMC
RXPXRCB\ EUH\PK, [OQDOH\DN RQU WHUEX PCEFSCIB OLEO F BO ZU SUQBO R [CSKBF, EO JUP FEQBMND^F_ OB RCQ
EU SOZUB RXJMCB\ ENZEX_ DOEQBMNDBOM. 0CD F RO SEOGFY LMNGFY QFBNC^FKY, DOS[FHKBOM [OLEFSUB
MNDF; OE QOOJTCUB OJ OVFJDU F OBDCPXRCUBQK [MFEFSCB\ OJaULFEUEFU, WHUEX DOBOMOGO FSUIB
DOEQBMNDBOMX. %QHF RX YOBFBU, WBOJX OLEC OJHCQB\ [CSKBF SOGHC FEF^FCHFPFMORCB\QK EUQDOH\DFSF
MCPHFWEXSF Q[OQOJCSF, [MFLUBQK [OLNSCB\, DCD OJSCENB\ DOS[FHKBOM. )[FQCEEX_ RXVU [NQBO_
DOEQBMNDBOM [OLO_LUB HNWVU RQUGO.
unsigned char space[4096];
Foo* whatIsThis = new(&space[0]) Foo;
:CDBFWUQDF [MOFQYOLFB BO, WBO R .++ [MOFQYOLFB\ EU LOHZEO RXPOR DOEQBMNDBOMC. 5MF ]BOS [CSKB\
EC RXLUHKUBQK F EU OQROJOZLCUBQK, [OQDOH\DN O[UMCBOM new EFWUGO EU LUHCUB. +US EU SUEUU,
DOS[FHKBOM .++ QOWBUB, WBO ]BO EORX_ OJaUDB, F &.# 6+&*% &'9%&#" $%*."68$"%6. %QHF [OPLEUU RX
[UMULNSCUBU F PCYOBFBU FQ[OH\PORCB\ BN ZU OJHCQB\ [CSKBF LHK LMNGOGO OJaUDBC, BO QSOZUBU QEORC
RXPRCB\ YFBMONSEX_ O[UMCBOM new F FEF^FCHFPFMORCB\ UU PCEORO.
5MF QOPLCEFF OJaUDBC O[UMCBOMOS new DOS[FHKBOM RQUGLC FQ[OH\PNUB LRNYVCGORX_ [MO^UQQ:
/. #XLUHUEFU [CSKBF [OL OJaUDB.
2. #XPOR DOEQBMNDBOMC OJaUDBC.
3BOB DOL PC[MKBCE R RX[OHEKUSOS DOLU, GUEUMFMNUSOS DOS[FHKBOMOS, F R OJXWEXY QFBNC^FKY RBOMO_
VCG EU RX[OHEKUBQK JUP [UMROGO. !LFOSC RFMBNCH\EOGO DOEQBMNDBOMC [OPROHKUB ECLUB\ [ORKPDN EC GHCPC
DOS[FHKBOMN F OJO_BF ]BO OGMCEFWUEFU.
Onepafueuoe usreueuue funa oLekfa
%QHF [OPLEUU Foo RCS ECLOUQB F RX PCYOBFBU FQ[OH\PORCB\ BN ZU OJHCQB\ LHK Banana, BO [MF ECHFWFF N
Banana BOGO ZU [UMUGMNZUEEOGO O[UMCBOMC new RX QSOZUBU JXQBMO QSUEFB\ BF[ OJaUDBC.
Banana* b = new(&space[0]) Banana;
5N`! 8XH Foo, QBCH Banana. 3BO F ECPXRCUBQK FLFOSO_ &(6"8+2;*%7% $%*."68$"%6+. +CDOU MUVUEFU
[OHEOQB\I QOOBRUBQBRNUB Q[U^F`FDC^FF KPXDC.
Orpauueuun
5MFSUEKK ]BN FLFOSN, EUOJYOLFSO [OSEFB\ O LRNY OJQBOKBUH\QBRCY:
/. )JHCQB\, [UMULCRCUSCK O[UMCBOMN new, LOHZEC JXB\ LOQBCBOWEC LHK DOEQBMNFMORCEFK DHCQQC.
2. )J FPSUEUEFF LOHZEX PECB\ RQU DHFUEBX, YMCEKTFU CLMUQ OJaUDBC!
8NLUB RUQ\SC EU[MFKBEO, UQHF RX QSUEFHF BF[ OJaUDBC Q Foo EC Banana BOH\DO LHK BOGO, WBOJX DCDO_-
EFJNL\ DHFUEBQDF_ OJaUDB BNB ZU RXPRCH OLEN FP `NED^F_ Foo.
Yuufoeuue c paspeneuuer qas
)JaUDB, [UMULCEEX_ R DCWUQBRU CMGNSUEBC O[UMCBOMN delete, OJXWEO NEFWBOZCUBQK DOS[FHKBOMOS R
LRC ]BC[C:
/. #XPOR LUQBMNDBOMC.
2. #XPOR O[UMCBOMC delete LHK OQROJOZLUEFK [CSKBF.
*OROH\EO WCQBO SX DCWCUS GOHORO_ F GOROMFS: >OMOVO JX RXPRCB\ LUQBMNDBOM, EO EU BMOGCB\ [CSKB\.
*O[NQBFS, RX MCPSUQBFHF OJaUDB R [NHU, C BU[UM\ EU YOBFBU, WBOJX WCQB\ HODCH\EO QOPLCEEOGO [NHC
.99
RUMENHCQ\ R GHCREOU YMCEFHFTU [CSKBF. 5O CECHOGFF Q BUS, DCD SX MCPLUHFHF LRNYVCGORX_ [MO^UQQ
DOEQBMNFMORCEFK, SOZEO MCPLUHFB\ F LRNYVCGORX_ [MO^UQQ NEFWBOZUEFK, EC[MKSNI RXPXRCK
LUQBMNDBOMX. )LECDO R OBHFWFU OB BUY RXDMNBCQOR, DOBOMXSF QO[MOROZLCHOQ\ MCPLUHUEFU [MO^UQQC
DOEQBMNFMORCEFK, Q NEFWBOZUEFUS LUHO OJQBOFB OWUE\ [MOQBO LOQBCBOWEO RXPRCB\ LUQBMNDBOM BCD,
QHOREO ]BO OJXWECK `NED^FK DHCQQC.
void f()
{
Pool localPool;
Foo* foo1 = new Foo; // D)5'#,-3"* '5"7$*'7 new 5' 32'#.$(/>
Foo* foo2 = new(&localPool) Foo; // D)5'#,-3"* 5"7"873-&3
delete foo1; // :#% '5"7$*'7$ new 5' 32'#.$(/>
foo2->~Foo(); // =7%2'? 4<-'4 0")*73&*'7$
}
localPool JOH\VO_ JHOD [CSKBF, HODCH\EX_ [O OBEOVUEFI D `NED^FF. 5OQDOH\DN OE QOPLCUBQK R
QBUDU, [MF PCRUMVUEFF f() OE RXBCHDFRCUBQK FP QBUDC. #XLUHUEFU [MOFQYOLFB SOHEFUEOQEO, [OQDOH\DN
HODCH\EXU OJaUDBX PC[OHEKIB [NH QEFPN RRUMY. )QROJOZLUEFU [MOFQYOLFB UTU JXQBMUU, [OQDOH\DN
NEFWBOZCUBQK QMCPN RUQ\ [NH. %LFEQBRUEECK [MOJHUSC PCDHIWCUBQK R BOS, WBO DOS[FHKBOM EU JNLUB
CRBOSCBFWUQDF RXPXRCB\ LUQBMNDBOMX OJaUDBOR, QOPLCEEXY RENBMF localPool. #CS [MFLUBQK QLUHCB\
]BO QCSOQBOKBUH\EO, FQ[OH\PNK BOH\DO WBO O[FQCEENI SUBOLFDN.
Kfo ynpaennef eupeneuuer narnfu?
*OROH\EO MCPGOROMOR O DOEDMUBEXY SUYCEFPSCY; [OGOROMFS OJ CMYFBUDBNMU. .NTUQBRNIB BMF OQEOREXU
QBMCBUGFF LHK O[MULUHUEFK BOGO, GLU OJaUDB JNLUB ECYOLFB\QK R [CSKBF F DCD PCEFSCUSCK FS [CSKB\ R
DOEUWEOS QWUBU ROPRMCBFBQK R QFQBUSN:
/. ,HOJCH\EOU N[MCRHUEFU.
2. 4[MCRHUEFU R DHCQQCY.
3. 4[MCRHUEFU [OL MNDOROLQBROS DHFUEBC.
#[MOWUS, ]BO EU ODOEWCBUH\ECK DHCQQF`FDC^FK: DHFUEBQDF_ DOL SOZUB O[MULUHKB\, C SOZUB F EU
O[MULUHKB\ SUQBO MCPSUTUEFK OJaUDBOR. 3BF MUVUEFK SOGNB [MFEFSCB\QK, C SOGNB F EU [MFEFSCB\QK
OJaUDBCSF DHCQQOR. $CDOEU^, RQK BKZUHCK MCJOBC SOZUB RX[OHEKB\QK RULNTFSF NDCPCBUHKSF, C SOZUB F
EU RX[OHEKB\QK.
Fnoanuuoe ynpaeneuue
5O NSOHWCEFI OJaUDBX QOPLCIBQK GHOJCH\EXS O[UMCBOMOS new F NEFWBOZCIBQK GHOJCH\EXS
O[UMCBOMOS delete. 5UMUGMNPDC ]BFY O[UMCBOMOR [OPROHKUB RCS MUCHFPORCB\ EUQBCELCMBENI QYUSN
N[MCRHUEFK [CSKB\I, EO ]BO QWFBCUBQK LNMEXS BOEOS.
)WUE\ BMNLEO OJaULFEFB\ MCPLUH\EO EC[FQCEEXU JFJHFOBUDF, DCZLCK FP DOBOMXY [UMUGMNZCUB
PCLCEEXU [O NSOHWCEFI O[UMCBOMX new F delete.
#CVF [UMUGMNPDF RHFKIB EU BOH\DO EC RCV DOL, EO F EC DOL, EC[FQCEEX_ LMNGFSF (RDHIWCK
JFJHFOBUDF, LHK DOBOMXY EUB FQYOLEXY BUDQBOR).
#QU [UMUGMNPDF, [MFECLHUZCTFU DOEDMUBEOSN DHCQQN, [UMUGMNZCIB RCVF GHOJCH\EXU RUMQFF.
$C KPXDU .++ ]BO PRNWFB BCD, QHOREO RX PCDCPXRCUBU WC_ OLEORMUSUEEO Q SOHODOS F HFSOEOS.
%QHF RCS PCYOWUBQK [MOLUHCB\ EUWBO [OLOJEOU N QUJK LOSC FHF R O`FQU [OZCHN_QBC, EO K EU
QORUBNI N[OSFECB\ OJ ]BOS EC QUSFECMCY [O .++.
5OH\PORCBUHF SOGNB FPSUEFB\ RCVN [MUL[OHOZFBUH\EO GHOJCH\ENI QBMCBUGFI, [UMUGMNZCK
O[UMCBOMX new F delete R DOEDMUBEXY DHCQQCY. 5UMUGMNPDC QBCELCMBEXY GHOJCH\EXY
O[UMCBOMOR LCUB SUE\VU, WUS YOBUHOQ\ JX.
200
Bupeneuue u oceoopeuue narnfu e knaccax
5UMUGMNPDC O[UMCBOMOR new F delete DCD `NED^F_ DHCQQC EUQDOH\DO [ORXVCUB RCV DOEBMOH\ ECL
[MOFQYOLKTFS. !PSUEUEFK OBEOQKBQK BOH\DO D LCEEOSN DHCQQN F UGO [MOFPROLEXS DHCQQCS, BCD WBO
[OJOWEXU ]``UDBX OJXWEO ODCPXRCIBQK SFEFSCH\EXSF. +CDO_ RCMFCEB MCJOBCUB HNWVU RQUGO [MF
RXLUHUEFF EUQBCELCMBEO_ QYUSX N[MCRHUEFK [CSKB\I R OBLUH\EX_ DHCQQ F UGO [OQHULNITUS
[OLDHIWUEFF QMULQBRCSF SEOZUQBRUEEOGO ECQHULORCEFK. *HK EUDOBOMXY QYUS N[MCRHUEFK [CSKB\I
BCDCK ROPSOZEOQB\ FQDHIWCUBQK, EO ]BO NZU BMNLEOQBF CMYFBUDBOMC [ODCPCB\, [OWUSN UU *# .2#)8#"
MUCHFPORXRCB\ EC JCPU [OLDHIWCUSXY DHCQQOR.
%QHF N[MCRHUEFU [CSKB\I MUCHFPORCEO R DHCQQU F RX SOZUBU QOPLCB\ OB EUGO [MOFPROLEX_ DHCQQ,
LUQBMNDBOM QHULNUB QLUHCB\ RFMBNCH\EXS, WBOJX BOB ZU DHCQQ SOG F FQROJOZLCB\ [CSKB\. 5MOFPROLEXU
DHCQQX EU LOHZEX [UMUGMNZCB\ [UMUGMNZUEEXU RUMQFF.
Ynpaeneuue narnfuk nop pykoeopcfeor knueufa
0CD LUSOEQBMFMNIB [MFRULUEEXU RXVU `MCGSUEBX, DHFUEBQDF_ DOL SOZUB RXJFMCB\, GLU OJaUDB
LOHZUE ECYOLFB\QK R [CSKBF. )JXWEO ]BO LUHCUBQK Q [OSOT\I [UMUGMNZUEEOGO O[UMCBOMC new,
FSUITUGO LO[OHEFBUH\EXU CMGNSUEBX [OSFSO size_t. # N[MCRHUEFF [CSKB\I OBDMXRCIBQK EORXU
[UMQ[UDBFRX N[MCRHUEFU EC NMOREU OBLUH\EXY OJaUDBOR, C EU DHCQQC R ^UHOS. 0 QOZCHUEFI, ]BC
QBMCBUGFK [UMUDHCLXRCUB EC DHFUEBC YHO[OBX, QRKPCEEXU Q OQROJOZLUEFUS [CSKBF. (UCHFPC^FK
[OHNWCUBQK QHOZEO_, C SOLNH\EOQB\ EFPDO_. $C[MFSUM, QBOFB FPSUEFB\ CMGNSUEBX EUQBCELCMBEOGO
O[UMCBOMC new, F RCS [MFLUBQK REOQFB\ FPSUEUEFK RO RQUY SUQBCY DHFUEBQDOGO DOLC, GLU OE
FQ[OH\PNUBQK. 5ODC RQU [UMUDOS[FHFMNUBQK PCEORO, SOZEO [OGNHKB\ EC QRUZUS ROPLNYU. #[MOWUS,
EUQSOBMK EC RQU [MOJHUSX, ]BC QBMCBUGFK HUGDO MUCHFPNUSC, OWUE\ ]``UDBFREC F YOMOVO MCJOBCUB R
[MOQBXY QFBNC^FKY.
OLekfu knaccoe u npouseopnue qyukuuu
(CQ[OHOZUEFU OJaUDBC R [CSKBF BCDZU SOZUB RXJFMCB\QK OJaUDBOS DHCQQC FHF [MOFPROLKTU_
`NED^FU_ (FHF `NED^FKSF). #OPSOZEX MCPEXU RCMFCEBX, OB [MOQBU_VFY (EC[MFSUM, [MULOQBCRHUEFU
OLEO_ QBMCBUGFF LHK RQUGO DHCQQC) LO RXJOMC QBMCBUGFF EC OQEORCEFF CMGNSUEBOR, [UMULCEEXY
[MOFPROLKTU_ `NED^FF. 5MF FQ[OH\PORCEFF EUQDOH\DFY QBMCBUGF_ RX EUFPSUEEO [MFLUBU D QBMCBUGFF
EURFLFSXY NDCPCBUHU_, MCQQSOBMUEEO_ R QHULNITUS MCPLUHU. 8OHUU BOGO, ]BF LRU DOE^U[^FF [MUDMCQEO
MCJOBCIB RSUQBU.
Ynpaeneuue narnfuk c npureueuuer eepyux ykasafene
5OYOZU, K QORMCH; R ]BO_ GHCRU ECS RQU ZU [MFLUBQK RUMENB\QK D NSEXS NDCPCBUHKS. 4[MCRHUEFU
[CSKB\I [OL MNDOROLQBROS DHFUEBC SOZEO NQORUMVUEQBRORCB\, FEDC[QNHFMNK MCPHFWEXU QBMCBUGFF R
NSEXY RULNTFY NDCPCBUHKY. (CQVFMUEFU CMYFBUDBNMX Q HODCH\EXSF [NHCSF LUSOEQBMFMNUB OQEORENI
FLUI, DOBOMCK SOZUB JXB\ [MFQ[OQOJHUEC [MCDBFWUQDF LHK HIJO_ QYUSX Q N[MCRHUEFUS EC NMOREU
OJaUDBOR.
Cneuuanusupoeauuue eepyue ykasafenu
5MOQBU_VCK QBMCBUGFK PCDHIWCUBQK R QOPLCEFF Q[U^FCHFPFMORCEEOGO DHCQQC RULNTUGO NDCPCBUHK FHF
VCJHOEC, DOBOMX_ PECUB O HODCH\EOS [NHU F FQ[OH\PNUB GHOJCH\ENI [UMUGMNPDN O[UMCBOMC new.
struct Pool { ... }; // I$& / 7$(,M"
void* operator new(Pool* p); // G<0"#"(/" /- 53#$
template <class Type>
class PoolMP {
private:
Type* pointee;
PoolMP(const PoolMP<Type>&) {} // I'5/7'4$(/" (" 7$-7"M"('...
PoolMP<Type>& operator=(const PoolMP<Type>&)
{ return *this; } // .../ 57/)4$/4$(/" *'1"
public:
20.
PoolMP(Pool* p) : pointee(new(p) Type) {}
~PoolMP() { pointee->~Type(); }
Type* operator->() const { return pointee; }
};
5MF ZUHCEFF DHFUEB SOZUB FQ[OH\PORCB\ PoolMP LHK RXLUHUEFK F OQROJOZLUEFK [CSKBF R HODCH\EOS
[NHU. *UQBMNDBOM RULNTUGO NDCPCBUHK RXPXRCUB LUQBMNDBOM NDCPXRCUSOGO OJaUDBC, EO EU OQROJOZLCUB
[CSKB\. 5OQDOH\DN RULNTF_ NDCPCBUH\ EU QHULFB PC FQYOLEXS [NHOS, DO[FMORCEFU F [MFQRCFRCEFU
[OLLUMZFRCB\ EU NLCQBQK, BCD DCD RULNTF_ NDCPCBUH\ [OEKBFK EU FSUUB, R DCDOS [NHU QOPLCRCB\ EORXU
DO[FF. %QHF EU QWFBCB\ ]BFY EULOQBCBDOR, [UMUL ECSF `CDBFWUQDF [MOQBU_VF_ NDCPCBUH\, EU
OBKGOTUEEX_ EFDCDFSF FPLUMZDCSF.
$C ]BO SOZEO ROPMCPFB\, WBO DO[FMORCEFU F [MFQRCFRCEFU RQU ZU QHULNUB [OLLUMZFRCB\, EO Q
FQ[OH\PORCEFU O[UMCBOMOR new F delete [O NSOHWCEFI. # ]BOS QHNWCU DOEQBMNDBOM DO[F_ F O[UMCBOM
= MCJOBCIB BCD ZU, DCD F LHK OJXWEOGO RULNTUGO NDCPCBUHK.
Opafuue ykasafenu ua nyn
1BOJX [OLLUMZFRCB\ DO[FMORCEFU F [MFQRCFRCEFU R [NHU, SOZEO PC[OSFECB\ CLMUQ [NHC.
template <class Type>
class PoolMP {
private:
Type* pointee;
Pool* pool;
public:
PoolMP(Pool* p) : pointee(new(p) Type), pool(p) {}
~PoolMP() { pointee->Type::~Type(); }
PoolMP(const PoolMP<Type>& pmp) : pointee(new(pool) Type(*pointee)) {}
PoolMP<Type>& operator=(const PoolMP<Type>& pmp)
{
if (this == &pmp) return *this;
delete pointee;
pointee = new(pool) Type(*pointee);
return *this;
}
Type* operator->() const { return pointee; }
};
3BO OJO_LUBQK RCS R WUBXMU HFVEFY JC_BC [CSKBF, EO EU [OBMUJNUB HFVEFY BCDBOR [MO^UQQOMC [O
QMCREUEFI Q FQ[OH\PORCEFUS OJXWEXY RULNTFY NDCPCBUHU_.
Cocyecfeoeauue c ouuuru eepyuru ykasafennru
5MULHOZUEEOU MUVUEFU OBEIL\ EU FLUCH\EO. !EBUM`U_Q PoolMP OBDMXRCUB SEOGOU FP BOGO, O WUS
QHULORCHO JX PECB\ BOH\DO DHCQQCS. 8OHUU BOGO, UQHF RCS PCYOWUBQK QORSUQBEO MCJOBCB\ Q OJaUDBCSF FP
[NHC F OJaUDBCSF, MCPSUTUEEXSF LMNGFS Q[OQOJOS (EC[MFSUM, Q [OSOT\I QBCELCMBEOGO SUYCEFPSC),
ECWFECIBQK ECQBOKTFU BMNLEOQBF. ;UEO_ LOJCRHUEFK v-BCJHF^X SX QSOZUS PECWFBUH\EO HNWVU
FEDC[QNHFMORCB\ OBHFWFK R QBMCBUGFKY N[MCRHUEFK [CSKB\I.
template <class Type>
class MP {
protected:
MP(const MP<Type>&) {} // I'5/7'4$(/" (" 7$-7"M"('
MP<Type>& operator=(const MP<Type>&)
{ return *this; } // =7/)4$/4$(/" *'1"
MP() {} // D)5'#,-3"*)% *'#,&' 57'/-4'0(<2/ &#$))$2/
202
public:
virtual ~MP() {} // L)4';'10"(/" 4<5'#(%"*)% 57'/-4'0(<2/ &#$))$2/
virtual Type* operator->() const = 0;
};

template <class Type>
class DefaultMP : public MP<Type> {
private:
Type* pointee;
public:
DefaultMP() : pointee(new Type) {}
DefaultMP(const DefaultMP<Type>& dmp)
: pointee(new Type(*dmp.pointee)) {}
virtual ~DefaultMP() { delete pointee; }
DefaultMP<Type>& operator=(const DefaultMP<Type>& dmp)
{
if (this == &dmp) return *this;
delete pointee;
pointee = new Type(*dmp.pointee);
return *this;
}
virtual Type* operator->() const { return pointee; }
};

template <class Type>
class LocalPoolMP : public MP<Type> {
private:
Type* pointee;
Pool* pool;
public:
LocalPoolMP(Pool* p)
: pointee(new(p) Type), pool(p) []
LocalPoolMP(const LocalPoolMP<Type>& lpmp)
: pointee(new(lpmp.pool) Type(*lpmp.pointee)), pool(lpmp.pool) {}
virtual ~LocalPoolMP() { pointee->Type::~Type(); }
LocalPoolMP<Type>& operator=(const LocalPoolMP<Type>& lpmp)
{
if (this == &lpmp) return *this;
pointee->Type::~Type();
pointee = new(pool) Type(*lpmp.pointee);
return *this;
}
virtual Type* operator->() const { return pointee; }
};
+U[UM\ DefaultMP F LocalPoolMP SOZEO FQ[OH\PORCB\ QORSUQBEO LOQBCBOWEO QOOJTFB\ DHFUEBN,
WBO OEF [MFECLHUZCB D BF[N MP<Type>&. 0O[FMORCEFU F [MFQRCFRCEFU [OLLUMZFRCUBQK LHK BUY
DHCQQOR, DOBOMXU RPCFSOLU_QBRNIB Q [MOFPROLEXSF DHCQQCSF, EO PC[MUTUEO LHK BUY, DOBOMXU PECIB
BOH\DO O JCPOROS DHCQQU. # [MFRULUEEOS DOLU UQB\ OLEC BOEDOQB\: O[UMCBOMECK `NED^FK
LocalPoolMP::operator= RQUGLC FQ[OH\PNUB new(pool) RSUQBO new(lpmp.pool). 3BO [ORXVCUB
203
JUPO[CQEOQB\ R BUY QFBNC^FKY, DOGLC LRC RULNTFY NDCPCBUHK [OQBN[CIB FP MCPEXY OJHCQBU_ LU_QBRFK F
MCPEXY [NHOR.
Heeupurue ykasafenu
(CP NZ SX PC[HCBFHF RQBN[FBUH\EX_ RPEOQ F QOPLCHF FUMCMYFI DHCQQOR RULNTFY NDCPCBUHU_, [OWUSN
JX EU [O_BF LCH\VU F EU QLUHCB\ ]BF NDCPCBUHF EURFLFSXSF? #SUQBO [MFSUEUEFK VCJHOEC ECS
[MFLUBQK MUCHFPORCB\ OBLUH\EX_ DHCQQ NDCPCBUHK LHK DCZLOGO DHCQQC NDCPXRCUSOGO OJaUDBC, EO ]BO EU
QHFVDOS JOH\VCK ^UEC PC [OHNWCUSNI GFJDOQB\.
// G @$?#" foo.h
class Foo {
public:
static Foo* make(); // D)5'#,-3"* 4<0"#"(/" 5' 32'#.$(/>
static Foo* make(Pool*); // D)5'#,-3"* 53#
virtual ~Foo() {}
// :$#"" )#"03>* ./)*' 4/7*3$#,(<" @3(&B//
};
// G @$?#" foo.cpp
class PoolFoo : public Foo {
private:
Foo* foo;
Pool* pool;
public:
PoolFoo(Foo* f, Pool* p) : foo(f), pool(p) {}
virtual ~PoolFoo() { foo->~Foo(); }
// ="7"'57"0"#"(/% @3(&B/? &#$))$, 0"#"8/73>K/" & foo
};
class PFoo : public Foo {
// L;<.(<? ("4/0/2<? 3&$-$*"#,
};
class ConcreteFoo : public Foo { ... };
Foo* Foo::make()
{
return new PFoo(new ConcreteFoo);
}
Foo* Foo::make(Pool* p)
{
return new PoolFoo(new(p) ConcreteFoo, p);
}
+CDO_ RCMFCEB ECSEOGO WFTU LHK DHFUEBC. %LFEQBRUEEOU SUQBO, R DOBOMOS DHFUEBQDF_ DOL LOHZUE
PECB\ WBO-BO O [NHCY, QOPLCEFU OJaUDBC `NED^FU_ make(Pool*). )QBCH\EXU [OH\PORCBUHF
[OHNWUEEOGO EURFLFSOGO NDCPCBUHK [OEKBFK EU FSUIB, ECYOLFBQK FY MCJOWF_ OJaUDB R [NHU FHF EUB.
Cfekoeue oonoku
1BOJX LOJFB\QK SCDQFSCH\EO_ FEDC[QNHK^FF, QHULNUB REUQBF R O[FQCEENI CMYFBUDBNMN QHULNITFU
FPSUEUEFK:
.LUHCB\ Pool WFQBO CJQBMCDBEXS JCPORXS DHCQQOS Q FEDC[QNHFMORCEEXSF [MOFPROLEXSF
DHCQQCSF, [MOFPROLKTFSF `NED^FKSF F B.L.
5MULOQBCRFB\ `NED^FI static Foo::makePool(). :NED^FK make(Pool*) JNLUB MCJOBCB\ F
LHK LMNGFY MCPEORFLEOQBU_ Pool, EO makePool() [OPROHKUB Foo RXJMCB\ [MOFPROLKTNI
`NED^FI Pool, O[BFSCH\ENI LHK YMCEUEFK Foo (EC[MFSUM, Q [UMULCWU_ MCPSUMC ]DPUS[HKMC).
204
5UMUMCJOBCB\ QBCMX_ VCJHOE MP FP [MULXLNTFY GHCR (Q O[UMCBOMEO_ `NED^FU_ operator
Type*()), WBOJX [MF RXYOLU FP [NHC F NDCPCBUHU_ PC [MULUHX OJHCQBF LU_QBRFK RQU
EUOJYOLFSOU CRBOSCBFWUQDF NEFWBOZCHOQ\.
$FZU [ODCPCE [MFSUMEX_ RFL [OHNWUEEOGO FEBUM`U_QC, Q `MCGSUEBOS DHFUEBQDOGO DOLC F JUP
RFMBNCH\EOGO O[UMCBOMC =.
// G @$?#" foo.h
// ='0&#>./*, ';E%4#"(/" ./)*' $;)*7$&*('8' ;$-'4'8' &#$))$
#include pool.h
class Foo {
private:
Foo(const Foo&) {}
Foo& operator=(const Foo&) { return *this; }
public:
static Pool* makePool(); // F'-0$*, 53#, '5*/2/-/7'4$((<? 0#% Foo
static Foo* make(); // +" /)5'#,-3"* 53#
static Foo* make(Pool*); // D)5'#,-3"* 53#
// D *.0.
};
// I#/"(*)&/? &'0
void g(Foo*);
void f()
{
MP<Pool> pool(Foo::makePool());
MP<Foo> foo(Foo::make(pool));
foo->MemberOfFoo(); // D)5'#,-3"* '5"7$*'7(3> @3(&B/> operator->()
g(foo); // D)5'#,-3"* '5"7$*'7(3> @3(&B/> operator Type*()
// G<C'0 /- ';#$)*/ 0"?)*4/% 30$#%"*)% )($.$#$ foo, -$*"2 pool
}
Repcnekfueu
,HCRC PCDCEWFRCUBQK YOMOVO NSEO_, ]``UDBFREO_ FEDC[QNHK^FU_ OWUE\ QHOZEO_ [MOJHUSX LFPC_EC.
%LFEQBRUEEXS NKPRFSXS SUQBOS KRHKUBQK RXPOR `NED^FF g(), DOBOMCK LOHZEC [OOJUTCB\ EU
QOYMCEKB\ LOHGORMUSUEEX_ NDCPCBUH\ EC QRO_ CMGNSUEB. #[MOWUS, [OLOJEX_ CECHFP EUOJYOLFSO
[MOROLFB\ LHK HIJO_ CMYFBUDBNMX, R DOBOMO_ FQ[OH\PNIBQK RMUSUEEXU [NHX; R ECVUS QHNWCU DHIWOS
KRHKUBQK FEDC[QNHK^FK.
$C RMUSK PCJNL\BU O [NHCY, RMUSUEEXY FHF FEXY, F RX NRFLFBU MCPEOOJMCPEXU QBMCBUGFF [MFSUEUEFK
RULNTFY NDCPCBUHU_ LHK [OLLUMZDF F FEDC[QNHK^FF N[MCRHUEFK [CSKB\I R .++.
Ocuoeu
ynpaeneuun
narnfuk
# ]BO_ GHCRU O[FQCEX EUDOBOMXU [MOQBXU QBMCBUGFF N[MCRHUEFK [CSKB\I. %QHF RX [MO[NQBFHF
[MULXLNTNI GHCRN, RUMEFBUQ\ F [MOWFBC_BU UU. #UQ\ SCBUMFCH, FPHOZUEEX_ R ]BO_ F QHULNITFY
GHCRCY, BMUJNUB LOQDOECH\EOGO [OEFSCEFK JCPOROGO SCBUMFCHC, [MFRULUEEOGO RXVU.
5UMRCK GMN[[C QBMCBUGF_ FSUUB OLEN OJTNI WUMBN: DHFUEBQDF_ DOL QCS MUVCUB, DOGLC QHULNUB NLCHFB\
OJaUDBX F RUMENB\ [CSKB\ R QFQBUSN. !EOGLC ]BO OQNTUQBRHKUBQK DOQRUEEO, EO R HIJOS QHNWCU [CSKB\
ROPRMCTCUBQK HFV\ [OQHU RX[OHEUEFK DHFUEBOS O[MULUHUEEXY LU_QBRF_.
.BMCBUGFF RBOMO_ GMN[[X [OQBMOUEX EC DOE^U[^FF [OLQWUBC QQXHOD. 3BO [UMRX_ [MFSUM
CRBOSCBFWUQDO_ QJOMDF SNQOMC BUSX, DOBOMCK JNLUB OJOJTUEC R [OQHULEFY GHCRCY DEFGF. 5OLQWUB
QQXHOD Q[OQOJUE [MFEUQBF OGMOSENI [OH\PN, EO, DCD SX RQDOMU NRFLFS, OE BCDZU OJHCLCUB MKLOS
LOROH\EO ZUQBDFY OGMCEFWUEF_.
$CDOEU^, SX MCQQSOBMFS OJTNI DOE^U[^FI, EC OQEORU DOBOMO_ QBMOKBQK JOHUU FPOTMUEEXU SUBOLFDF:
[MOQBMCEQBRO [CSKBF. $C QCSOS LUHU ]BO RQUGO HFV\ EORX_ [OLYOL D EFPDONMOREURXS SUBOLFDCS, [MF
DOBOMOS OEF [MULQBCIB R QRUBU CMYFBUDBNMX, C EU O[BFSFPC^FF.
Cfpoufenuuue noku
# WFQHU OQEOREXY [MFE^F[OR EUQBCELCMBEOGO N[MCRHUEFK [CSKB\I R .++ LOHZUE JXB\ QHULNITF_:
5MFLNSC_BU OBDMORUEENI GHN[OQB\; R[OHEU ROPSOZEO, FP ]BOGO WBO-EFJNL\ [OHNWFBQK. *CZU UQHF
FLUK EU QMCJOBCUB QCSC [O QUJU, OEC SOZUB [MFGOLFB\QK R DCWUQBRU OB[MCREO_ BOWDF.
Ronouoe oceoopeuue narnfu
%QHF RXLUHUEFU F OQROJOZLUEFU [CSKBF [HOYO RHFKUB EC JXQBMOLU_QBRFU [MOGMCSSX, FEOGLC QCSOU
[MOQBOU MUVUEFU [MOJHUSX PCDHIWCUBQK R RX[OHEUEFF O[UMC^F_ Q JHODCSF. 5CSKB\ RXLUHKUBQK QEFPN
JHODC D UGO RUMYN, C ROPRMCTCUBQK R QFQBUSN QMCPN ^UHXS JHODOS (C EU OBLUH\EXSF OJaUDBCSF).
4ukfueuoe ypaneuue
"CLCWC SEOGFY [MOGMCSS [OJXQBMUU OBMCJOBCB\ QROU F N_BF. 3BO OQOJUEEO Q[MCRULHFRO R QMULU Unix,
GLU Q^UECMFF OJOHOWDF OJaULFEKIB SEOZUQBRO DMOVUWEXY, EULOHGORUWEXY [MOGMCSS. $UMULDO
RXLUHUEFU [CSKBF LHK EORXY OJaUDBOR ODCPXRCUBQK QCSXS QUM\UPEXS `CDBOMOS, QEFZCITFS
JXQBMOLU_QBRFU BCDFY [MOGMCSS. 5MOQBCK QBMCBUGFK O[BFSFPC^FF PCDHIWCUBQK R BOS, WBO RX RXLUHKUBU
[CSKB\ [OL OJaUDBX QEFPN RRUMY JOH\VOGO JHODC ( *# 8)+24#"# (?.
struct Pool {
static Pool* gCurrentPool; // =3# 0#% 4<0"#"(/% 5$2%*/
enum { block_size = 8096 }; // G<;"7/*" )4'? #>;/2<? 7$-2"7
unsigned char* space; // F#"03>K$% 4<0"#%"2$% ';#$)*,
size_t remaining; // I'#/.")*4' ')*$4M/C)% ;$?* 4 ;#'&"
.4
206
Pool() : space((unsigned char*)calloc(block_size, \0)),
remaining(block_size) {}
void* Allocate(size_t bytes)
{
if (bytes > block_size)
return ::operator new(bytes); // F#/M&'2 ;'#,M'? -$57')
if (gCurrentPool == NULL || bytes ? remaining)
gCurrentPool = new Pool;
void* memory = space;
space += bytes;
remaining -= bytes;
return memory;
}
};
class Foo {
public:
void* operator new(size_t bytes)
{
if (Pool::fCurrentPool == NULL)
Pool::gCurrentPool = new Pool;
return Pool::gCurrentPool->Allocate(bytes);
}
void operator delete(void*) {}
};
8XQBMUU EUDNLC! #XLUHUEFU PCEFSCUB HFV\ EUQDOH\DO SCVFEEXY BCDBOR, C OQROJOZLUEFU [MOFQYOLFB
SGEORUEEO. 0OEUWEO, ]BOB DOL EU PCROIUB [MFPC EC OHFS[FCLU [O .++, EO K RFLUH, DCD OE RQUGO PC
EUQDOH\DO WCQOR MCJOBX Q[CQCH [MOUDBX Q QUM\UPEXSF [MOJHUSCSF JXQBMOLU_QBRFK. 0CD SFEFSNS, OE
[OSOZUB O[MULUHFB\, EC WBO HNWVU EC[MCRFB\ NQFHFK [O O[BFSFPC^FF, [OQDOH\DN RXLUHUEFU F
OQROJOZLUEFU [CSKBF FQDHIWCUBQK FP MCQQSOBMUEFK. 5OQHULORCBUH\EO [MFSUEKK UGO D MCPEXS DHCQQCS,
RX QSOZUBU NQBCEORFB\, Q DCDFSF DHCQQCSF QRKPCEX OQEOREXU PCBMNLEUEFK.
)JMCBFBU REFSCEFU, WBO LHK RXLUHUEFK JHODOR RSUQBO O[UMCBOMEO_ `NED^FF ::operator new
FQ[OH\PNUBQK `NED^FK calloc(). 8OH\VFEQBRO DOS[FHKBOMOR .++ RXLUHKUB JOH\VO_ JHOD Q [OSOT\I
`NED^FF calloc() (FHF `NED^FF O[UMC^FOEEO_ QFQBUSX), C PCBUS N[MCRHKUB OJaUDBCSF R [OHNWUEEOS
JHODU. %QHF FQ[OH\PORCB\ ::operator new LHK RXLUHUEFK JHODOR, QDOMUU RQUGO, LUHO DOEWFBQK
LRO_EXSF PCBMCBCSF F LRO_EO_ `MCGSUEBC^FU_, [OQDOH\DN ]BF JHODF JNLNB QNTUQBRORCB\ R
QBCELCMBEXY JHODCY SUEULZUMC [CSKBF. 5MF ECVU_ QBMCBUGFF HNWVU OJO_BF ::operator new.
)[FQCEECK QBMCBUGFK BCDZU YOMOVO MCJOBCUB R [MOGMCSSCY Q JOHUU [MOLOHZFBUH\EXS QMODOS ZFPEF,
DOBOMXU FPECWCH\EO QOPLCIB SEOZUQBRO OJaUDBOR EUDOBOMOGO DHCQQC, EO NLCHKIB FY OBEOQFBUH\EO
MULDO (UQHF ROOJTU NLCHKIB). %QHF O[UMCBOMX new F delete [UMUGMNZCIBQK EC NMOREU DHCQQOR, BO
O[BFSFPC^FI SOZEO OGMCEFWFB\ DHCQQCSF, OJHCLCITFSF NDCPCEEXS QRO_QBROS.
Copka rycopa ua ypoeue nokoneuu
6EOGFU CHGOMFBSX RXGHKLKB [MFSUMEO BCD:
void Eval(Structure s)
{
// F'-0$*, #'&$#,(<" ';E"&*<
Eval(s.SomePart()); // =7'/-4")*/ 4<./)#"(/% 0#% 5'0)*73&*37<
// H0$#/*, #'&$#,(<" ';E"&*<
}
207
)JYOL LUMUR\UR, RXWFQHUEFU MUDNMQFREXY RXMCZUEF_ R KPXDCY BF[C Prolog ]BF F SEOGFU LMNGFU
MUDNMQFREXU CHGOMFBSX FSUIB [ODCPCEENI QBMNDBNMN. (CPSUTUEFU HODCH\EXY OJaUDBOR R QBUDU SOZUB
NQDOMFB\ RXLUHUEFU F OQROJOZLUEFU [CSKBF, EO ]BOB RCMFCEB WCQBO EU[MCDBFWUE. -H\BUMECBFREX_
RCMFCEB QOPLCB\ [NH, HODCH\EX_ LHK Eval(), F NEFWBOZFB\ UGO ^UHFDOS [MF RXYOLU FP Eval(). #
OJHCQBF LU_QBRFK Eval() RQU RMUSUEEXU OJaUDBX MCPSUTCIBQK R ]BOS [NHU.
void* operator new(size_t size, Pool* p)
{
return p->Allocate(size);
}
template <class Type>
class PoolP { // H&$-$*"#,, /)5'#,-3>K/? 53#
private:
Type* pointee;
public:
PoolP(Pool* p) : pointee(new(p) Type) {}
~PoolP { pointee->Type::~Type(); }
// G)" ')*$#,('" 0#% 4"03K/C 3&$-$*"#"?
};
void Eval(Structure s)
{
Pool p; // L;E%4#%"*)% 4 )*"&"!
PoolP<Foo> foo(&p); // D)5'#,-3"* 53#
Eval(s.SomePart()); // D)5'#,-3"* )4'? )';)*4"((<? 53#
f(p, s); // G2")*' f(s); f ;30"* /)5'#,-'4$*, *'* 1" 53#
// :")*73&*'7 p 3(/.*'1$"* 4)" )7$-3
}
Pool SOZUB [MULQBCRHKB\ QOJO_ HIJNI MCPEORFLEOQB\ [NHC [CSKBF. .DOMUU RQUGO, ]BO BN[O_ [NH,
DOBOMX_ [MOQBO RXLUHKUB [CSKB\ QEFPN RRUMY F EU JUQ[ODOFBQK O ROPRMCTUEFF [CSKBF. 4SEX_
NDCPCBUH\ PoolP RXPXRCUB LUQBMNDBOM NDCPXRCUSOGO OJaUDBC, EO EU OQROJOZLCUB UGO [CSKB\. $C ]BN
BUSN QNTUQBRNUB SEOZUQBRO RCMFCEBOR:
)JO_BFQ\ JUP PoolP. 'FJO [NQB\ [NH QCS RXPXRCUB LUQBMNDBOMX QOLUMZCTFYQK R EUS OJaUDBOR
FP QROUGO QOJQBRUEEOGO LUQBMNDBOMC (LHK ]BOGO RQU OEF LOHZEX FSUB\ OJTF_ JCPORX_ DHCQQ F
RFMBNCH\EX_ LUQBMNDBOM), HFJO ROOJTU EU RXPXRC_BU LUQBMNDBOMX. () GOQ[OLF! $UNZUHF K
QDCPCH J"%? $O LOROH\EO WCQBO BCDO_ RCMFCEB 6+/%"+#"; GHCREOU EU YRCQBC_BUQ\ ]BFS
[OLRFGOS EC QUSFECMCY [O .++.)
$CPECWFB\ BUDNTF_ [NH R GHOJCH\EO_ [UMUSUEEO_ FHF QBCBFWUQDO_ [UMUSUEEO_ DHCQQC, C
PCBUS [UMUGMNPFB\ O[UMCBOM new LHK FQ[OH\PORCEFK BUDNTUGO [NHC, DCDFS JX OE EF JXH. 5MF
]BOS RCS EU [MFLUBQK [UMULCRCB\ BUDNTF_ [NH RQUS [OL`NED^FKS RMOLU N[OSFECRVU_QK RXVU
f().
5MULOQBCRFB\ QMULQBRC LHK [UMUSUTUEFK FHF DO[FMORCEFK OJaUDBOR FP HODCH\EOGO [NHC R BO
SUQBO, GLU OEF QSOGNB ZFB\ REU OJHCQBF LU_QBRFK Eval(). 3BC BUSC RXYOLFB PC MCSDF LCEEO_
GHCRX, C ROPSOZEO, F DEFGF, EO LHK EUU SOZEO [MFQ[OQOJFB\ SUBOLFDN LUQDMF[BOMOR FP
QHULNITU_ GHCRX.
5OQHULEF_ RCMFCEB FQ[OH\PNUBQK R QBMCBUGFKY N[MCRHUEFK [CSKB\I ECQBOH\DO QHOZEXY, WBO GOHORC
ECWFECUB JOHUB\ 9+6+*##, UTU LO [OLMOJEOGO PECDOSQBRC Q BUSO_. 0 QWCQB\I, RQU BMNLEOQBF
OJNQHORHUEX EUOJYOLFSOQB\I RXJOMC QBOFB FHF EU QBOFB [UMUSUTCB\ OJaUDBX FP-PC ROPSOZEXY
OJMCTUEF_ D EFS QO QBOMOEX WUGO-BO, [UMUZFRVUGO LCEEX_ JHOD. 3BOB RO[MOQ EU FP OJHCQBF .++, OE
QDOMUU OBEOQFBQK D CHGOMFBSCS F QBMNDBNMCS LCEEXY.
208
Ckpufan uuqoprauun
6EOGFU SUEULZUMX [CSKBF RXLUHKIB EUQDOH\DO LO[OHEFBUH\EXY JC_B R O[UMCBOMU new, WBOJX [MF
RXPORU O[UMCBOMC delete JXH FQ[OH\PORCE [MCRFH\EX_ MCPSUM EUPCRFQFSO OB BOGO, KRHKUBQK
LUQBMNDBOM RFMBNCH\EXS FHF EUB.
void* Foo::operator new(size_t bytes)
{
size_t real_bytes = bytes + sizeof(size_t);
unsigned char* space = (unsigned char*)::operator new(real_bytes);
((size_t)space) = real_bytes;
return space + sizeof(size_t);
}
+U[UM\ FE`OMSC^FI O MCPSUMU SOZEO FQ[OH\PORCB\ R O[UMCBOMU delete FHF R HIJOS LMNGOS SUQBU, GLU
RCS PCYOWUBQK NPECB\ ECQBOKTF_ MCPSUM. +US EU SUEUU, [MF ]BO_ QBMCBUGFF EUOJYOLFSO NWUQB\ MKL
OJQBOKBUH\QBR.
Puuuue safpafu
# PCRFQFSOQBF OB DOS[FHKBOMC F O[UMC^FOEEO_ QFQBUSX ]BC SUBOLFDC NZU SOZUB FQ[OH\PORCB\QK
EUPCSUBEO LHK RCQ. %QHF RX QCSOQBOKBUH\EO LOJCRFBU FE`OMSC^FI O MCPSUMU, OEC SOZUB
[MOLNJHFMORCB\ NZU YMCEKTFUQK QRULUEFK. .DOMUU RQUGO, ]BO [MOFPO_LUB [MF LUHUGFMORCEFF
::operator new EC NMOREU OJaUDBOR (QS. RXVU). +CDCK SUBOLFDC [MFEOQFB ECFJOH\VNI [OH\PN R
QOWUBCEFF Q JHOWEXSF QYUSCSF RXLUHUEFK [CSKBF, OEC QODMCTCUB PCBMCBX ::operator new FHF
calloc LHK JHODC, C EU LHK OBLUH\EOGO OJaUDBC.
Onfurusauun pasrepa keaufa
8OH\VOU [MUFSNTUQBRO ]BO_ SUBOLFDF PCDHIWCUBQK R BOS, WBO RX SOZUBU RXLUHFB\ JOH\VU SUQBC, WUS
JXHO PC[MOVUEO. 0CD ]BO? 6OZUB HF [MFEUQBF [OH\PN RXLUHUEFU HFVEU_ EUFQ[OH\PNUSO_ [CSKBF? $C
QCSOS LUHU SOZUB, UQHF [OLO_BF D ]BOSN MCPNSEO. )LFE FP ROPSOZEXY RCMFCEBOR RQUGLC RXLUHKB\
[CSKB\ Q [MFMCTUEFUS R n JC_B, GLU SFEFSCH\EOU PECWUEFU n MCREO 4. 5MF ]BO [ORXVCUBQK RUMOKBEOQB\
BOGO, WBO [OQHU NLCHUEFK /7-JC_BOROGO OJaUDBC PCEFSCUSOU FS SUQBO NLCQBQK FQ[OH\PORCB\, QDCZUS, LHK
/8- FHF /9-JC_BOROGO OJaUDBC. 8OHUU FPOTMUEEX_ [OLYOL QOQBOFB R RXLUHUEFF [CSKBF [O QBU[UEKS 2,
FHF, UQHF RX OBEOQFBUQ\ D WFQHN FQBFEEXY GNMSCEOR N[MCRHUEFK [CSKB\I, [O WFQHCS :FJOECWWF.
+CDFU QFQBUSX ECPXRCIBQK .(."#,+,( *+>+6*($%& (buddy systems), [OQDOH\DN LHK DCZLOGO
RXLUHUEEOGO JHODC RX QSOZUBU EC_BF UGO EC[CMEFDC (BO UQB\ LMNGNI [OHORFEDN JOH\VOGO JHODC, FP
DOBOMOGO OE JXH RXLUHUE) FQDHIWFBUH\EO [O MCPSUMN F ECWCH\EOSN CLMUQN. 5OKRHKUBQK ROPSOZEOQB\
]``UDBFREOGO ROQQOULFEUEFK QOQULEFY OQROJOZLUEEXY JHODOR. %QHF RX FEBUMUQNUBUQ\ [OLOJEXSF
RUTCSF, R GHCRU /6 MCQQSCBMFRCIBQK OQEORX QFQBUSX EC[CMEFDOR LHK QBU[UEU_ 2 R DOEBUDQBU
CRBOSCBFWUQDO_ QJOMDF SNQOMC.
pyran uuqoprauun
0MOSU MCPSUMC JHODC SOZUB QOYMCEKB\QK F LMNGCK FE`OMSC^FK, EC[MFSUM:
CLMUQ OJaUDBC DHCQQC LHK LCEEOGO OJaUDBC;
`HCGF JHODC (EC[MFSUM, `HCG POSJF, O DOBOMOS JNLUB MCQQDCPCEO EFZU);
QBCBFQBFWUQDCK FE`OMSC^FK EC[MFSUM, RMUSK QOPLCEFK OJaUDBC.
Cnucku ceoopuux nokoe
4[MOTUEEX_ Q[FQOD QROJOLEXY JHODOR, [MFRULUEEX_ R [MULXLNTU_ GHCRU, SOZUB FQ[OH\PORCB\QK
BOH\DO LHK OJaUDBOR [OQBOKEEOGO MCPSUMC. $C[MFSUM, OE EU JNLUB EOMSCH\EO MCJOBCB\ Q [MOFPROLEXSF
DHCQQCSF, R DOBOMXY LOJCRHKIBQK EORXU [UMUSUEEXU, [OQDOH\DN OEF JNLNB FSUB\ LMNGO_ MCPSUM. .CS
Q[FQOD BOZU OGMCEFWFRCHQK OLEFS MCPSUMOS; LHK [UMULCWF O[UMCBOMN delete [MCRFH\EOGO MCPSUMC
BMUJORCHFQ\ RFMBNCH\EXU LUQBMNDBOMX. #[MOWUS, QOPLCB\ JOHUU NEFRUMQCH\EXU Q[FQDF NZU EU BCD NZ
BMNLEO.
209
)LEO FP EUQHOZEXY NQORUMVUEQBRORCEF_ PCDHIWCUBQK R BOS, WBOJX YMCEFB\ R DCZLOS NPHU Q[FQDC EU
BOH\DO CLMUQ QHULNITUGO NDCPCBUHK R Q[FQDU, EO F MCPSUM JHODC. 3BO [OPROHFB YMCEFB\ R OLEOS Q[FQDU
JHODF MCPEXY MCPSUMOR. 5MF RXLUHUEFF [CSKBF SX [MOQSCBMFRCUS Q[FQOD, [ODC EU ECYOLFS JHOD,
MCPSUMX DOBOMOGO LOQBCBOWEX LHK ECVFY ^UHU_. *HK ]BOGO [MFLUBQK YMCEFB\ QDMXBNI FE`OMSC^FI O
MCPSUMU JHODC LCZU [OQHU UGO RXLUHUEFK, WBOJX [MF NEFWBOZUEFF OJaUDBC ROQQBCECRHFRCB\ RUQ\ JHOD.
.BMCBUGFK, [MKSO QDCZUS, BN[CK F [OLYOLFB MCPRU WBO LHK OWUE\ SCHUE\DFY Q[FQDOR, [OQDOH\DN RMUSK
[OFQDC ROPMCQBCUB HFEU_EO Q MCPSUMOS Q[FQDC. #[MOWUS, OEC [OQHNZFB OB[MCREO_ BOWDO_ LHK ECVUGO
OJQNZLUEFK.
8OHUU ]``UDBFREOU [MULQBCRHUEFU DOHHUD^FK Q[FQDOR QROJOLEO_ [CSKBF, R DOBOMO_ DCZLX_ Q[FQOD
[MULQBCRHKUB JHODF O[MULUHUEEOGO MCPSUMC. $FZU [ODCPCEC NMOTUEECK, EO [OHUPECK MUCHFPC^FK.
class MemManager {
private:
struct FreeList { // F5/)'& ) ;#'&$2/ '57"0"#"(('8' 7$-2"7$
FreeList* next; // F#"03>K/? FreeList
void* top_of_list; // G"7C *"&3K"8' )5/)&$
size_t chunk_size; // O$-2"7 &$10'8' )4';'0('8' ;#'&$
FreeList(FreeList* successor, size_t size) : next(successor),
top_of_list(NULL), chunk_size(size) {}
};
FreeList* all_lists; // F5/)'& 4)"C FreeList
public:
MemManager() : all_lists(NULL) {}
void* Allocate(size_t bytes);
void Deallocate(void* space, size_t bytes);
};
void* MemManager::Allocate(size_t bytes)
{
for (FreeList* fl = all_lists;
fl != NULL && fl->chunk_size != bytes;
fl = fl->next)
{
if (fl->top_of_list != NULL)
{
void* space = fl->top_of_list;
fl->top_of_list = *((void**)(fl->top_of_list));
return space;
}
return ::operator new(bytes); // =3)*'? )5/)'&
}
return ::operator new(bytes); // A$&'8' )5/)&$ ("*
}
void MemManager::Deallocate(void* space, size_t bytes)
{
FreeList* fl = NULL;
for (fl = all_lists; fl != NULL; fl = fl->next)
if (fl->chunk_size == bytes) break;
if (fl == NULL) // F5/)&$ 0#% *$&'8' 7$-2"7$ ("*
{
fl = new FreeList(all_lists, bytes);
all_lists = fl;
2.0
}
*((void**)space) = fl->top_of_list;
fl->top_of_list = space;
}
:NED^FF Allocate() F Deallocate() RXPXRCIBQK FP [UMUGMNZUEEXY O[UMCBOMOR new F delete
QOOBRUBQBRUEEO. +CDO_ [OLYOL [MULUH\EO N[MOTUE, EO MCJOBCUB OE EU[HOYO. #X SOZUBU
ROQ[OH\PORCB\QK FS LHK HIJOGO QOWUBCEFK DHCQQOR, F OE JNLUB MCJOBCB\ Q [MOFPROLEXSF DHCQQCSF, R
DOBOMXY LOJCRFHFQ\ EORXU [UMUSUEEXU. )E BCDZU SOZUB FQ[OH\PORCB\QK R QYUSU N[MCRHUEFK [CSKB\I
EC JCPU RULNTFY NDCPCBUHU_. .NTUQBRNIB SEOGOWFQHUEEXU NQORUMVUEQBRORCEFK, DOBOMXU SOZEO
REUQBF R [ODCPCEENI OQEORN:
)GMCEFWFB\ MCPSUMX JHODOR WFQHCSF, DMCBEXSF EUDOBOMOSN WFQHN JC_B, QBU[UEKSF 2 FHF
WFQHCSF :FJOECWWF.
#OQ[OH\PORCB\QK JOHUU ]``UDBFREO_ QBMNDBNMO_ LCEEXY, WUS QRKPCEEX_ Q[FQOD Q[FQDOR
ROPSOZEO, JFECMEXS LUMUROS FHF LCZU SCQQFROS, UQHF LFC[CPOE MCPSUMOR EURUHFD.
5MULOQBCRFB\ `NED^FI Flush(), DOBOMCK [MF EUYRCBDU [CSKBF NLCHKUB RQU QOLUMZFSOU
Q[FQDOR.
# `NED^FF Allocate() [MF OBQNBQBRFF R Q[FQDU QROJOLEOGO SUQBC PCLCEEOGO MCPSUMC RXLUHFB\
[CSKB\ [OL SCQQFR JHODOR ]BOGO MCPSUMC RSUQBO OLEOGO JHODC.
Ropcef ccunok
5OLQWUB QQXHOD OQEORCE EC [MOQBO_ FLUU SX QHULFS PC DOHFWUQBROS NDCPCBUHU_, QQXHCITFYQK EC
OJaUDB. 0OGLC QWUBWFD QBCEORFBQK MCREXS 0, OJaUDB NLCHKUBQK. "RNWFB [MOQBO, EU [MCRLC HF? #
O[MULUHUEEXY NQHORFKY RQU LU_QBRFBUH\EO [MOQBO, EO [OLQWUB QQXHOD OJHCLCUB LOROH\EO ZUQBDFSF
OGMCEFWUEFKSF, DOBOMXU QEFZCIB UGO [MCDBFWUQDNI ^UEEOQB\.
Easoeu knacc c nopcefor ccunok
$CWEUS Q CJQBMCDBEOGO JCPOROGO DHCQQC, OB DOBOMOGO SOZEO QOPLCB\ [MOFPROLEX_ DHCQQ Q [OLQWUBOS
QQXHOD. 8CPORX_ DHCQQ QOLUMZFB [UMUSUEENI, R DOBOMO_ YMCEFBQK DOHFWUQBRO RXPOROR `NED^FF
Grab() PC RXWUBOS DOHFWUQBRC RXPOROR `NED^FF Release().
class RefCount {
private:
unsigned long count; // F."*./& ))<#'&
public:
RefCount() : count(0) {}
RefCount(const RefCount&) : count(0) {}
RefCount& operator=(const RefCount&)
{ return *this; } // +" /-2"(%"* )."*./&
virtual ~RefCount() {} // T$8'*'4&$
void Grab() { count++; }
void Release()
{
if (count > 0) count --;
if (count == 0) delete this;
}
};
5ODC DHFUEBQDF_ DOL [MCRFH\EO RXPXRCUB `NED^FF Grab() F Release(), RQU MCJOBCUB CJQOHIBEO
ECLUZEO. 0CZLX_ MCP, DOGLC DHFUEB [OHNWCUB FHF DO[FMNUB CLMUQ OJaUDBC, [MOFPROLEOGO OB RefCount,
OE RXPXRCUB Grab(). 0OGLC DHFUEB GCMCEBFMNUB, WBO CLMUQ JOH\VU EU FQ[OH\PNUBQK, OE RXPXRCUB
Release(). %QHF QWUBWFD [CLCUB LO 0 JC^! $UB JOH\VU OJaUDBC!
2..
$ULOQBCBOD BCDO_ SUBOLFDF OWURFLUE OEC QHFVDOS [OHCGCUBQK EC QOJHILUEFU RQUY [MCRFH
[MOGMCSSFQBOS. 6OZEO QLUHCB\ [OHNWVU.
Yksafenu c nopcefor ccunok
*CRC_BU NQORUMVUEQBRNUS JCPORX_ DHCQQ RefCount F QOPLCLFS SOLF`F^FMORCEEX_ VCJHOE NSEOGO
NDCPCBUHK LHK HIJXY DHCQQOR, [MOFPROLEXY OB RefCount.
template <class Type>
class CP { // H&$-$*"#, ) 5'0)."*'2 ))<#'&
private:
Type* pointee;
public:
CP(Type* p) : pointee(p) { pointee->Grab(); }
CP(const CP<Type>& cp) : pointee(cp.pointee)
{ pointee->Grab(); }
~CP() { ponintee->Release(); }
CP<Type>& operator=(const CP<Type>& cp)
{
if (this == &cp) return *this;
pointee->Release();
pointee = cp.pointee;
pointee->Grab();
return *this;
}
Type* operator->() { return pointee; }
};
%QHF RUQ\ DHFUEBQDF_ DOL JNLUB OJMCTCB\QK D DHCQQCS Q [OLQWUBOS QQXHOD WUMUP ]BOB FHF CECHOGFWEX_
VCJHOE, [OLQWUB QQXHOD OQNTUQBRHKUBQK CRBOSCBFWUQDF. 5MF DCZLOS QOPLCEFF EORO_ DO[FF NDCPCBUHK
[MOFQYOLFB CRBOSCBFWUQDF_ RXPOR Grab(). 5MF DCZLOS NEFWBOZUEFF NDCPCBUHK UGO LUQBMNDBOM
NSUE\VCUB PECWUEFU QWUBWFDC. %LFEQBRUEECK O[CQEOQB\ PCDHIWCUBQK R BOS, WBO DHFUEB OJO_LUB NSEX_
NDCPCBUH\. . ]BO_ [MOJHUSO_ SOZEO Q[MCRFB\QK Q [OSOT\I [MOFPROLKTFY `NED^F_ ^UHUROGO DHCQQC.
class Foo : public RefCount {
private:
Foo(); // G2")*" ) 0738/2/ &'()*73&*'7$2/
public:
static CP<Foo> make(); // F'-0$"2 Q&-"25#%7
// :$#"" )#"03"* /(*"7@"?) Foo
};
+US QCSXS SX GCMCEBFMNUS, WBO LOQBN[ D Foo JNLUB OQNTUQBRHKB\QK BOH\DO WUMUP NDCPCBUH\ Q
[OLQWUBOS QQXHOD. )JMCBFBU REFSCEFU: ]BO EU RULNTF_, C QCSX_ OJXWEX_ NSEX_ NDCPCBUH\.
Bepyue ykasafenu c nopcefor ccunok
*CZU UQHF RX EU YOBFBU SOLF`F^FMORCB\ DOEDMUBEX_ DHCQQ, WBOJX QLUHCB\ UGO [MOFPROLEXS OB
RefCount (EC[MFSUM, UQHF OE FSUUB DMFBFWUQDFU BMUJORCEFK [O JXQBMOLU_QBRFI F OJaUSN FHF RYOLFB
R DOSSUMWUQDNI JFJHFOBUDN DHCQQOR), EU OBWCFRC_BUQ\. 5OLQWUB QQXHOD SOZEO [UMUSUQBFB\ R RULNTF_
NDCPCBUH\.
template <class Type>
class CMP { // G"03K/? 3&$-$*"#, ) 5'0)."*'2 ))<#'&
private:
Type* pointee;
unsigned long count;
2.2
public:
CMP() : pointee(new Type), count(0) {}
CMP(const CMP<Type>& cmp)
: pointee(new Type(*(cmp.pointee))), count(0) {}
~CMP() { delete pointee; } // +"-$4/)/2' '* )."*./&$
CMP<Type>& operator=(const CMP<Type>& cmp)
{
if (this == &cmp) return *this;
delete pointee;
pointee = new Type(*(cmp.pointee));
return *this;
}
Type* operator->() const { return pointee; }
void Grab() { count++; }
void Release()
{
if (count > 0) count--;
if (count <= 0)
{
delete pointee;
delete this;
}
}
};
# QNTEOQBF, ]BO MCREOQFH\EO OJaULFEUEFI QBCMOGO VCJHOEC RULNTUGO NDCPCBUHK Q JCPORXS DHCQQOS
RefCount. 5OLQWUB QQXHOD NZU EU RXLUHKUBQK R OBLUH\EX_ DHCQQ, EO PCBO ECS QEORC [MFYOLFBQK
[OHCGCB\QK EC [MCRFH\EOU [ORULUEFU [MOGMCSSFQBOR QNTUQBR, D QOZCHUEFI, EUQORUMVUEEXY.
eckpunfopu c nopcefor ccunok
$C Q^UEN RXYOLFB EUWBO EOROU: LUQDMF[BOM (handle) Q [OLQWUBOS QQXHOD. 5O OBEOVUEFI D VCJHOEN CMP
OE QBCEUB BUS ZU, WUS CP JXH LHK RefCount, BO UQB\ OE CRBOSCBFWUQDF RXPXRCUB `NED^FF Grab() F
Release() R QROFY DOEQBMNDBOMCY, LUQBMNDBOMU F O[UMCBOMU =.
template <class Type>
class CH { // :")&7/5*'7 ) 5'0)."*'2 ))<#'&
private:
CMP<Type>* pointee;
public:
CH(CMP<Type>* p) : pointee(p) { pointee->Grab(); }
CH(const CH<Type>& ch) : pointee(ch.pointee) { pointee->Grab(); }
~CH() { pointee->Release(); }
CH<Type>& operator=(const CH<Type>& ch)
{
if (this == &ch) return *this;
if (pointee == ch.pointee) return *this;
pointee->Release();
pointee = ch.pointee;
pointee->Grab();
return *this;
}
2.3
CMP<Type> operator->() { return *pointee; }
};
%QHF FQ[OH\PORCB\ LUQDMF[BOMX R QOWUBCEFF Q RULNTFSF NDCPCBUHKSF, SOZEO RXJMCB\, LHK DCDFY
]DPUS[HKMOR DHCQQC QHULNUB [OLQWFBXRCB\ QQXHDF, C DCDFU ]DPUS[HKMX LOHZEX N[MCRHKB\QK LMNGFS
Q[OQOJOS.
Tpypuocfu nopcefa ccunok
#QU RXGHKLFB BCD [MOQBO; OLECDO JUP HOZDF LUGBK LUHO RQU ZU EU OJYOLFBQK. 5OLQWUB QQXHOD OJHCLCUB
OLEFS OWUE\ MCQ[MOQBMCEUEEXS EULOQBCBDOS PC^FDHFRCEFUS. 5MULQBCR\BU QUJU QFBNC^FI: OJaUDB -
PCYRCBFH OJaUDB # (BO UQB\ RXPRCH LHK EUGO `NED^FI Grab()), C OJaUDB # QLUHCH BO ZU QCSOU LHK
OJaUDBC -. $F EC -, EF EC # LMNGFU OJaUDBX EU QQXHCIBQK. "LMCRX_ QSXQH [OLQDCPXRCUB, WBO - QHULNUB
NLCHFB\ RSUQBU Q #, EO OEF [MOLOHZCIB QNTUQBRORCB\, [OQDOH\DN FY QWUBWFDF QQXHOD BCD F EU
OJENHKIBQK. )JFLEO, LC?
5OLOJEOU PC^FDHFRCEFU ROPEFDCUB Q[HOV\ F MKLOS. )EO SOZUB OBEOQFB\QK EU BOH\DO D [CMCS OJaUDBOR,
EO F ^UHXS [OLGMC`CS. A -> B -> C -> D -> A, EO EFDBO PC [MULUHCSF ]BO_ GMN[[X EU QQXHCUBQK EF EC
OLFE FP ]BFY OJaUDBOR. ,MN[[C QHOREO [HXRUB EC 'UBNWUS ,OHHCEL^U, [OQBMOUEEOS R ][OYN RXQODFY
BUYEOHOGF_ F OJMUWUEEOS EC RUWEXU QDFBCEFK R [CSKBF. .NTUQBRNUB EUQDOH\DO QBMCBUGF_ JOM\JX Q
PC^FDHFRCEFKSF. #QU OEF EU OJHCLCIB OQOJO_ NEFRUMQCH\EOQB\I, F R RCVU_ DOEDMUBEO_ QFBNC^FF ]BO
SOZUB [MFRUQBF D OBDCPN OB [OLQWUBC QQXHOD. 0CD [MCRFHO, RQBMUWCKQ\ Q [MOJHUSO_ ^FDHFWUQDFY
QQXHOD, QBOFB MCQQSOBMUB\ JOHUU YFBMONSEXU [MFUSX, O[FQCEEXU R LRNY [OQHULEFY GHCRCY. 0CD RFLFBU,
SXQH\ OJ OBDCPU OB [OLQWUBC QQXHOD [MFYOLFB LOROH\EO JXQBMO.
ekornosuuun
5MUL[OHOZFS, - PCYRCBXRCUB #, C PCBUS # PCYRCBXRCUB EUDOBOMX_ DOS[OEUEB -:
class A {
private:
Foo* foo;
B* b;
};
%QHF QLUHCB\ BCD, WBOJX # RX[OHEKH PCYRCB R `NED^FF foo, [MOJHUS EU ROPEFDCUB. 0OGLC [OQHULEKK
QQXHDC EC A HFDRFLFMNUBQK, UGO QWUBWFD QBCEORFBQK MCREXS 0, [OQDOH\DN # UGO EU NRUHFWFRCUB. *HK
]BOGO [MFLUBQK [MOKRFB\ EUDOBOMNI FPMKLENI FPOJMUBCBUH\EOQB\ [MF DOLFMORCEFF, D BOSN ZU LFPC_E
QFH\EO PCRFQFB OB OQOJUEEOQBU_ DOEDMUBEXY OJaUDBOR, EO EC NLFRHUEFU WCQBO OE MUVCUB [MOJHUSN
PC^FDHFRCEFK.
Cunuuue u cnaue peckpunfopu
5MUL[OHOZFS, QQXHDC - EC # QOPLCRCHCQ\ WUMUP Grab(), C QQXHDC # EC - EUB. # BOB SOSUEB, DOGLC
FQWUPEUB [OQHULEKK QQXHDC EC - FP REUVEUGO SFMC, [OLQWUB QQXHOD LHK OJOFY OJaUDBOR [CMX [MUDMCBFB
FY QNTUQBRORCEFU. $C ]BO_ FLUU OQEORCEO MCPHFWFU SUZLN .(2;*',( (strong) F .2+/',( (weak)
LUQDMF[BOMCSF FHF NDCPCBUHKSF Q [OLQWUBOS QQXHOD. )[FQCEEX_ RXVU VCJHOE CH JNLUB OBEOQFB\QK D
QFH\EXS LUQDMF[BOMCS, [OQDOH\DN [OLLUMZFRCUB QWUBWFD QQXHOD. )JXWEX_ VCJHOE LUQDMF[BOMC (JUP
RXPORC Grab F Release) JNLUB OBEOQFB\QK D QHCJXS. %QHF Q[MOUDBFMORCB\ CMYFBUDBNMN OJaUDBOR BCD,
WBOJX EU QNTUQBRORCHO ^FDHFWUQDFY [OLGMC`OR, QOLUMZCTFY FQDHIWFBUH\EO QFH\EXU LUQDMF[BOMX, BO
RQK QYUSC [OLQWUBC QQXHOD QEORC ROPRMCTCUBQK R FGMN. .CSCK MCQ[MOQBMCEUEECK QFBNC^FK Q BCDFS
MUVUEFUS FUMCMYFK ^UHOU/WCQB\, R DOBOMO_ [CMX NLCHKIBQK [MF NLCHUEFF ^UHOGO. ;UHXU
[OLLUMZFRCIB QFH\EXU QQXHDF, WCQBF QHCJXU.
Ropcef ccunok u eepyue ykasafenu
)LEO FP QCSXY MCQ[MOQBMCEUEEXY F [OHUPEXY [MFSUEUEF_ [OLQWUBC QQXHOD PCDHIWCUBQK R N[MCRHUEFF
RULNTFSF NDCPCBUHKSF. # [MULXLNTFY GHCRCY ]BC BUSC N[OSFECHCQ\ EUOLEODMCBEO. *UQDMF[BOMX
ZFRNB R QBUDU F [OBOSN CRBOSCBFWUQDF NEFWBOZCIBQK [MF QJOMDU SNQOMC, RX[OHEKUSO_ DOS[FHKBOMOS.
)LECDO RULNTFU NDCPCBUHF ([O BUS ZU [MFWFECS, WBO F OJaUDBX) OJXWEO [MFYOLFBQK QOPLCRCB\ R DNWU.
0CD NPECB\, DOGLC QHULNUB NLCHKB\ RULNTF_ NDCPCBUH\? 5OLQWUB QQXHOD N[MOTCUB ]BN PCLCWN.
2.4
5MOJHUS Q PC^FDHFRCEFUS EU JNLUB: [OQDOH\DN RULNTF_ NDCPCBUH\ EU YMCEFB QQXHOD EC QROF
LUQDMF[BOMX, QRKP\ KRHKUBQK OLEOQBOMOEEU_. 0O[FMNUSXU F [UMULCRCUSXU LUQDMF[BOMX QOYMCEKIB
LHFEN R WUBXMU JC_BC JUP RFMBNCH\EXY `NED^F_, C HFV\ BMFRFCH\EXSF [OLQBCRHKUSXSF `NED^FKSF.
Grab F Release QaULCIB EUQDOH\DO LO[OHEFBUH\EXY SCVFEEXY BCDBOR, EO ]BO SUHOWF [O QMCREUEFI Q
BUS, WBO RCS [MFVHOQ\ JX [MOLUHXRCB\ LHK N[MCRHUEFK RULNTFSC NDCPCBUHKSF JUP EFY. $UQDOH\DO
HFVEFY JC_B LHK QWUBWFDC R RULNTFS NDCPCBUHU EU FGMCIB OQOJO_ MOHF; D BOSN ZU OEF RXLUHKIBQK R
DNWU, QBU[UE\ LUBCHFPC^FF DOBOMO_ OJXWEO PCSUBEO [MURXVCUB WUBXMU JC_BC.
#OPSOZEO, RCS QBOFB RUMENB\QK D [MULXLNTFS GHCRCS F [OLNSCB\, DCD FQ[OH\PORCB\ [ODCPCEENI QYUSN
[OLQWUBC QQXHOD RUPLU, GLU RQBUWCIBQK RULNTFU NDCPCBUHF. 3BO QBCEUB DHIWOS D EUBMFRFCH\EOSN
N[MCRHUEFI [CSKB\I R LCH\EU_VFY GHCRCY.
Rpocfpaufcea narnfu
#QU ]BF `ODNQX OJMCPNIB `NELCSUEB LHK LCH\EU_VUGO QBMOFBUH\QBRC, EO OBEOQFB\ FY D CMYFBUDBNMU
JXHO JX EURUMEO. *HK LU_QBRFBUH\EO EUBMFRFCH\EOGO N[MCRHUEFK [CSKB\I [OECLOJKBQK EUBMFRFCH\EXU
OMGCEFPC^FOEEXU DOE^U[^FF. # [MOQBU_VUS QHNWCU RQK LOQBN[ECK [CSKB\ MCQQSCBMFRCUBQK DCD OLFE
JOH\VO_ JHOD, FP DOBOMOGO RXLUHKIBQK JHODF SUE\VUGO MCPSUMC. *HK ]BOGO SOZEO HFJO EC[MKSNI
OJMCBFB\QK D O[UMC^FOEEO_ QFQBUSU Q BMUJORCEFUS RXLUHFB\ JOH\VO_ JHOD [CSKBF [MF PC[NQDU, HFJO
DOQRUEEO, R DOEUWEOS QWUBU [UMU[OMNWCK MCJOBN O[UMCBOMEXS `NED^FKS ::operator new F
::operator delete.
# LRNY [OQHULEFY GHCRCY SX RPGHKEUS EC [MOJHUSN Q EUBMFRFCH\EXY [OPF^F_ F [OLUHFS LOQBN[ENI
[CSKB\ EC >6%."6+*."&+ (memory spaces). 5MOQBMCEQBRC [CSKBF ]BO DOE^U[^FK; UU SOZEO
MUCHFPORCB\ EC OQEORU [MCDBFWUQDF HIJO_ O[FQCEEO_ RXVU JHOWEO-OMFUEBFMORCEEO_ QYUSX
N[MCRHUEFK [CSKB\I. $C[MFSUM, R OLEOS [MOQBMCEQBRU [CSKBF SOZUB FQ[OH\PORCB\QK QFQBUSC
EC[CMEFDOR, C R LMNGOS Q[FQDF QROJOLEO_ [CSKBF. 0OE^U[^FK [MULQBCRHUEC R QHULNITUS
CJQBMCDBEOS JCPOROS DHCQQU:
class MemSpace {
public:
void* Allocate(size_t bytes) = 0;
void Deallocate(void* space, size_t bytes) = 0;
};
(%QHF RCV DOS[FHKBOM [OLLUMZFRCUB OJMCJOBDN FQDHIWUEF_, [MF OJaKRHUEFF OJOFY `NED^F_ QHULNUB
NDCPCB\ ROPSOZEOQB\ FEF^FFMORCEFK FQDHIWUEF_.) $UDOBOMXS [MOQBMCEQBRCS [CSKBF SOZEO EU
QOOJTCB\ R `NED^FF Deallocate() MCPSUM ROPRMCTCUSXY JHODOR; LHK DOEDMUBEXY QYUS SOGNB
[OKRFB\QK LMNGFU `NED^FF, EO SFEFSCH\EX_ FEBUM`U_Q RXGHKLFB FSUEEO BCD. #OPSOZEO, BCDZU JNLUB
[OLLUMZFRCB\QK GHOJCH\ECK QBMNDBNMC LCEEXY DOHHUD^FK RQUY MemSpace ([MFWFEX
MCQQSCBMFRCIBQK EFZU). 0OHHUD^FK LOHZEC ]``UDBFREO OBRUWCB\ EC RO[MOQ: 0CDOSN [MOQBMCEQBRN
[CSKBF [MFECLHUZFB LCEEX_ CLMUQ? 5O FSUITUSNQK CLMUQN OJaUDBC RX O[MULUHKUBU [MOQBMCEQBRO
[CSKBF, R DOBOMOS OE ZFRUB.
# MUCHFPC^FF [MOQBMCEQBR [CSKBF SOGNB JXB\ FQ[OH\PORCEX HIJXU SUBOLFDF, O[FQCEEXU R
[MULXLNTU_ GHCRU:
,HOJCH\ECK [UMUGMNPDC O[UMCBOMOR new F delete (OJXWEO EU MUDOSUELNUBQK).
5UMUGMNPDC O[UMCBOMOR new F delete EC NMOREU DHCQQC.
!Q[OH\PORCEFU O[UMCBOMC new Q CMGNSUEBCSF [OL MNDOROLQBROS DHFUEBC.
!Q[OH\PORCEFU O[UMCBOMC new Q CMGNSUEBCSF EC JCPU RULNTFY NDCPCBUHU_.
.NTUQBRNUB EUSCHO [MFWFE LHK LUHUEFK [CSKBF EC [MOQBMCEQBRC. $FZU O[FQCEX EUDOBOMXU
MCQ[MOQBMCEUEEXU QBMCBUGFF RXJOMC OJaUDBOR, DOBOMXU LOHZEX ECYOLFB\QK R OLEOS [MOQBMCEQBRU
[CSKBF.
eneuue no knaccar
# [MULXLNTFY GHCRCY SX GOROMFHF OJ OJaUDBCY DHCQQOR, EO BCD F EU OBRUBFHF EC[MKSNI EC RO[MOQ: DCD
O[MULUHFB\ DHCQQ OJaUDBC LHK FSUITUGOQK OJaUDBC? 5MOQBU_VUU MUVUEFU LOJCRFB\ [UMUSUEENI,
2.5
DOBOMCK QQXHCUBQK EC OJaUDB DHCQQC. 0 QOZCHUEFI, OEO QRKPCEO Q PCSUBEXSF PCBMCBCSF DCD [O [CSKBF,
BCD F DOLC DOEQBMNDBOMC. )LECDO QNTUQBRNIB LRC LMNGFY RCMFCEBC:
/. >MCEFB\ NDCPCBUH\ EC OJaUDB DHCQQC R RULNTUS NDCPCBUHU. 5OHNWCUS BU ZU PCBMCBX, EO Q
NHNWVUEEO_ FEDC[QNHK^FU_.
2. #XLUHFB\ RQU ]DPUS[HKMX EUDOBOMOGO DHCQQC R OLEO [MOQBMCEQBRO [CSKBF F YMCEFB\ NDCPCBUH\
EC OJaUDB DHCQQC R ECWCHU [MOQBMCEQBRC (QS. MFQNEOD).

Knacc
OLekf
Rpocfpaucfeo
narnfu

#BOMO_ RCMFCEB QNTUQBRUEEO QEFZCUB PCBMCBX [MF NQHORFF, WBO [O CLMUQN OJaUDBC SOZEO ]``UDBFREO
O[MULUHFB\ ECWCHO CLMUQEOGO [MOQBMCEQBRC [CSKBF, DOBOMOSN OE [MFECLHUZFB (ROPSOZEO, Q [OSOT\I
N[OSKENBO_ RXVU DOHHUD^FF [MOQBMCEQBR [CSKBF).
$C [UMRX_ RPGHKL DCZUBQK, WBO NQBMCFRCB\ BCDNI QNUBN RODMNG [MOQBU_VU_ [MOJHUSX GHN[O. 5OWUSN JX
[MOQBO EU LOJCRFB\ LO[OHEFBUH\ENI [UMUSUEENI, QQXHCITNIQK EC OJaUDB DHCQQC? 5MFRULN [O
DMC_EU_ SUMU LRU [MFWFEX:
/. 0HCQQ, Q DOBOMXS RX MCJOBCUBU, SOZUB RYOLFB\ R DOSSUMWUQDNI JFJHFOBUDN, LHK DOBOMO_ N RCQ
EUB FQYOLEXY BUDQBOR, FHF UGO SOLF`FDC^FK EUZUHCBUH\EC [O LMNGFS [MFWFECS.
2. 0HCQQ SOZUB [MULQBCRHKB\ QOJO_ BMFRFCH\ENI OJaUDBEO-OMFUEBFMORCEENI OJOHOWDN LHK
[MFSFBFREOGO BF[C LCEEXY (QDCZUS, int). 'FVEFU JC_BX LHK NDCPCBUHK EC OJaUDB DHCQQC (EU
GOROMK NZU O v-BCJHF^U, DOBOMCK EUFPJUZEO [OBMUJNUBQK LHK RFMBNCH\EXY `NED^F_ LOQBN[C D
EUSN) SOGNB ODCPCB\QK RUQ\SC QNTUQBRUEEXSF.
eneuue no pasrepy
#[OHEU MCPNSEO OJaULFEFB\ RQU OJaUDBX OLFECDOROGO MCPSUMC (FHF [MFECLHUZCTFU OLEOSN LFC[CPOEN
MCPSUMOR) R OLEO [MOQBMCEQBRO [CSKBF LHK O[BFSFPC^FF QOPLCEFK F NEFWBOZUEFK. 6EOGFU QBMCBUGFF
N[MCRHUEFK [CSKB\I MCJOBCIB LHK OLEFY LFC[CPOEOR HNWVU, WUS LHK LMNGFY. $C[MFSUM, [MF QOPLCEFF
SEOZUQBRC JOH\VFY, QFH\EO MCPHFWCITFYQK [O MCPSUMCS OJaUDBOR QYUSC QO QBU[UEKSF 2 ECRUMEKDC
OQBCRFB SEOGO EUFQ[OH\PORCEEXY `MCGSUEBFMORCEEXY JHODOR. )LECDO LHK OJaUDBOR OBEOQFBUH\EO
SCHXY (FHF JHFPDFY [O MCPSUMN D QBU[UEKS 2) BCDCK QYUSC MCJOBCUB [MOQBO PCSUWCBUH\EO. # DMC_EFY
QHNWCKY RQU [MOQBMCEQBRO [CSKBF SOZUB PC[OHEKB\QK OJaUDBCSF OLFECDOROGO MCPSUMC. +CDFU
[MOQBMCEQBRC OJHCLCIB WMUPRXWC_EO ]``UDBFREXS [MULQBCRHUEFUS F HUGDO N[MCRHKIBQK.
eneuue no cnocoy ucnonusoeauun
%TU OLFE ROPSOZEX_ RCMFCEB LUHFB\ OJaUDBX R QOOBRUBQBRFF QO Q[OQOJOS FY FQ[OH\PORCEFK.
$C[MFSUM, LHK SEOGO[OBOWEOGO [MFHOZUEFK-QUMRUMC OJaUDBX SOZEO MCPLUHFB\ [O DHFUEBCS. (ULDO
FQ[OH\PNUSXU OJaUDBX SOGNB ECYOLFB\QK R OLEOS [MOQBMCEQBRU, C WCQBO FQ[OH\PNUSXU R LMNGOS.
)JaUDBX, D]VFMNUSXU EC LFQDU, SOGNB OBLUHKB\QK OB OJaUDBOR, [OQBOKEEO ECYOLKTFYQK R [CSKBF.
*UHUEFU SOZUB OQNTUQBRHKB\QK DCD EC NMOREU DHCQQOR, BCD F EC NMOREU OBLUH\EXY OJaUDBOR.
eneuue no cpepcfear pocfyna
*MNGCK RCZECK [MFWFEC LHK MCPLUHUEFK [O [MOQBMCEQBRCS [CSKBF PCDHIWCUBQK R BOS, WBOJX YMCEFB\ [O
OBLUH\EOQBF OJaUDBX, LOQBN[ D DOBOMXS OQNTUQBRHKUBQK FP QBUDC, FP LMNGFY [MO^UQQOR FHF WFQBO
2.6
RENBMUEEFU FP DNWF. 0CD JNLUB [ODCPCEO R [OQHULEFY GHCRCY, ]BO FGMCUB RCZENI MOH\ R QYUSCY
N[HOBEUEFK F QJOMDF SNQOMC.
# LRNY QHULNITFY GHCRCY ]BC SUBOLFDC JNLUB [MFSUEKB\QK LOROH\EO WCQBO. 5UMUSUTCUSXU OJaUDBX
OBLUHKIBQK OB OJaUDBOR, OQBCITFYQK EC OLEOS SUQBU. #ULNTFU NDCPCBUHF, LOQBN[EXU FP QBUDC,
ECYOLKBQK R OLEOS [MOQBMCEQBRU [CSKBF, C LOQBN[EXU FP LMNGFY [MO^UQQOR R LMNGOS.
Rpocfpaucfea cfeka u kyu
$CDOEU^, QCS QBUD BOZU SOZEO QWFBCB\ MCPEORFLEOQB\I [MOQBMCEQBRC [CSKBF, C RXLUHKUSXU R QBUDU
[NHX FY WCQBEXS QHNWCUS. 3BOB [OLYOL [MFSUEKHQK MCEUU R ]BO_ GHCRU LHK [NHOR, HODCH\EXY [O
OBEOVUEFI D OJHCQBF LU_QBRFK DOEDMUBEO_ `NED^FF. 3BC OQOJCK FEBUM[MUBC^FK QBUDC N[OSFECUBQK F R
LRNY [OQHULNITFY GHCRCY.
Ynnofueuue
narnfu
5MULQBCR\BU QUJU OJXWEOU N[MCRHUEFU [CSKB\I R .++: RX PCZFGCUBU JHCGOROEFK, [MFEOQFBU ZUMBRN
JOZUQBRCS O[UMC^FOEEO_ QFQBUSX F NLCHKUBU OJaUDB. %QHF RQU FLUB EOMSCH\EO, OJaUDB JNLUB LOHZEXS
OJMCPOS LUFEF^FCHFPFMORCE F NEFWBOZUE F EFDBO EFDOGLC EU [O[XBCUBQK FS ROQ[OH\PORCB\QK. >C!
#QUS FPRUQBEO, WBO R MUCH\EO_ ZFPEF BCD EU JXRCUB.
)LEC FP GHCREXY LOQBO[MFSUWCBUH\EOQBU_ LFECSFWUQDFY KPXDOR BCDFY DCD SmallTalk F Lisp EU
FSUUB EFDCDOGO OBEOVUEFK D QCSOSN KPXDN, C HFV\ D BOSN, WBO OE NLCHKUB OJaUDBX PC RCQ,
CRBOSCBFWUQDF F ECLUZEO. #XYOLFB [OBMKQCITCK ]DOEOSFK RMUSUEF F ]EUMGFF, EU GOROMK NZU O
JHCGOROEFKY F ZUMBRCY. 6OZEO HF BO ZU QCSOU QLUHCB\ EC .++? #SUQBO [MKSOHFEU_EOGO LC FHF
EUB K OBRUWN: #QU PCRFQFB OB BOGO, QDOH\DO BMNLC RX YOBFBU RHOZFB\ R MUVUEFU.
# ]BO_ GHCRU ECWFECUBQK ECQBOKTUU RUQUH\U RX NRFLFBU, DCD [UMUSUTCB\ OJaUDBX R [CSKBF, WBOJX
QRUQBF D SFEFSNSN `MCGSUEBC^FI QROJOLEO_ [CSKBF. $CLUIQ\, [MF RFLU SOFY CHGOMFBSOR EFDBO EU
JNLUB DCBCB\QK [O [OHN OB QSUYC. "COLEO SX [OLGOBORFS Q^UEN LHK [OHEO^UEEXY CHGOMFBSOR QJOMDF
SNQOMC, O DOBOMXY MUW\ [O_LUB R QHULNITU_ GHCRU.
Rouck ykasafene
5OSFSO [OLQWUBC QQXHOD F EUQBCELCMBEXY O[UMCBOMOR new F delete R JOH\VFEQBRU QBMCBUGF_
N[MCRHUEFK [CSKB\I QOWUBCIBQK LRU SUBOLFDF: O[MULUHUEFU SOSUEBC, DOGLC LOQBN[ D OJaUDBN
QBCEORFBQK EUROPSOZEXS, LHK UGO CRBOSCBFWUQDOGO NEFWBOZUEFK (QJOMDC SNQOMC) F [UMUSUTUEFU
OJaUDBOR R [CSKBF (N[HOBEUEFU). # QROI OWUMUL\, ]BF QBMCBUGFF PCRFQKB OB BOGO, WBO R LMNGFY KPXDCY
LUHCUBQK HUGDO F [MOQBO, EO ODCPXRCUBQK L\KROH\QDF QHOZEXS R .++ OB PCLCWF [OFQDC RQUY
NDCPCBUHU_ EC OJaUDBX.
5OFQD NDCPCBUHU_ R [MOGMCSSU EC .++ WMUPRXWC_EO QHOZUE, [OQDOH\DN DOS[FHKBOM EU OQBCRHKUB
EFDCDFY FEQBMND^F_ EC ]BOB QWUB. 8OHUU BOGO, R .++ [MOGMCSSC SOZUB [OHNWFB\ CLMUQ WCQBF OJaUDBC,
[O]BOSN EUDOBOMXU NDCPCBUHF SOGNB QQXHCB\QK EC QUMULFEN JOH\VOGO OJaUDBC.
Mara, ofkypa epyfcn ykasafenu?
# .++ QNTUQBRNIB EURUMOKBEO MCPEOOJMCPEXU Q[OQOJX [OHNWUEFK NDCPCBUHU_. )LEF QRKPCEX Q
DOEDMUBEXS [MULQBCRHUEFUS OJaUDBOR R [CSKBF, LMNGFU Q ECQHULORCEFUS, BMUB\F Q [UMUSUEEXSF
DHCQQOR. 0OEUWEO, QCSX_ OWURFLEX_ Q[OQOJ ]BO ECYOZLUEFU CLMUQC. - BU[UM\ LCRC_BU MCQQSOBMFS
LMNGFU, EU QBOH\ BMFRFCH\EXU Q[OQOJX.
Appeca nepereuuux knacca
!SUK OJaUDB, RX SOZUBU [OHNWFB\ CLMUQ [UMUSUEEO_ DHCQQC, [OQ[OH\PORCB\QK FS FHF [UMULCB\ LMNGOSN
OJaUDBN.
class Foo {
private:
int x;
String y;
.5
2.8
public:
int& X() { return x; } // F)<#&$ ($ x
String* Name() { return &y; } // N07") y
};
0CZLX_ ]DPUS[HKM Foo RXGHKLFB [MFSUMEO BCD, DCD [ODCPCEO EC [MULQBCRHUEEO_ EFZU LFCGMCSSU
(ROOJTU GOROMK, RQU PCRFQFB OB DOS[FHKBOMC, EO R JOH\VFEQBRU DOS[FHKBOMOR LUHO OJQBOFB FSUEEO
BCD):
vtable
x
y
Foo*
x&
y*

0CD [MCRFHO, EUQDOH\DO [UMRXY JC_B PCEFSCUB NDCPCBUH\ EC v-BCJHF^N LHK DHCQQC LCEEOGO OJaUDBC. "C
EFS QHULNIB [UMUSUEEXU DHCQQC R [OMKLDU FY OJaKRHUEFK. %QHF RX [OHNWCUBU CLMUQ [UMUSUEEO_ DHCQQC
R RFLU QQXHDF FHF NDCPCBUHK, ROPEFDCUB NDCPCBUH\ EC QUMULFEN OJaUDBC.
Appeca asoeux knaccoe
$CQHULORCEFU BCDZU SOZUB RXPRCB\ SCQQN [OHOZFBUH\EXY ]SO^F_.
class A {...}; // L0/( ;$-'4<? &#$))
class B {...}; // :738'? ;$-'4<? &#$))
class C : public A, public B {...}; // 9('1")*4"(('" ($)#"0'4$(/"
5MF OLFEOWEOS ECQHULORCEFF [MUOJMCPORCEFU OB derived* D base* (GLU base JCPORX_, C derived
[MOFPROLEX_ DHCQQ) CLMUQ OQBCUBQK [MUZEFS, LCZU UQHF DOS[FHKBOM [OHCGCUB, WBO BF[ FPSUEFHQK.
5MF SEOZUQBRUEEOS ECQHULORCEFF LUHO OJQBOFB EUQDOH\DO QHOZEUU.
C* c = new C;
A* a = c; // =7"';7$-'4$(/" '* 57'/-4'0('8' & 5"74'23 ;$-'4'23 &#$))3
B* b = c; // =7"';7$-'4$(/" '* 57'/-4'0('8' &' 4*'7'23 ;$-'4'23 &#$))3
cout << c << endl;
cout << a << endl;
cout << b << endl;
#MOLU JX RQU [MOQBO, EO R LU_QBRFBUH\EOQBF DOS[FHKBOM [MOLUHXRCUB LOROH\EO-BCDF YFBMX_ `ODNQ.
5MF [MUOJMCPORCEFF C* D A* NDCPCBUH\ OQBCUBQK [MUZEFS. )LECDO [MF [MUOJMCPORCEFF C* D B*
DOS[FHKBOM LU_QBRFBUH\EO (9,#*4#" +)6#.. 3BO QRKPCEO Q BUS, DCD OJaUDB YMCEFBQK R [CSKBF
(QBMNDBNMC OJaUDBOR PCRFQFB OB DOS[FHKBOMC, EO QDCPCEEOU OBEOQFBQK DO RQUS DOS[FHKBOMCS, Q
DOBOMXSF K MCJOBCH).
A
B
C
C*, A*
B*

0OS[FHKBOM QBMOFB OJaUDB R [OMKLDU [OKRHUEFK JCPORXY DHCQQOR, PC DOBOMXSF QHULNUB [MOFPROLEX_
DHCQQ. 0OGLC DOS[FHKBOM [MUOJMCPNUB C* D A*, OE QHOREO ECJMCQXRCUB WUMEOU [ODMXRCHO EC
QOQBCRHKITFU B F C F NJUZLCUB DHFUEBQDF_ DOL, WBO BOB FSUUB LUHO Q QCSXS ECQBOKTFS A.
A
A*(c)

2.9
(CPSUTUEFU v-BCJHF^X R ECWCHU OJaUDBC [MFROLFB D BOSN, WBO [MFECLHUZCTFU C MUCHFPC^FF
RFMBNCH\EXY `NED^F_, OJaKRHUEEXY R A, OQBCENBQK LOQBN[EXSF, EO JNLNB FSUB\ BU ZU QSUTUEFK, WBO F
LHK A. (CJOBCK Q C*, DOS[FHKBOM PECUB [OHENI QBMNDBNMN RQUGO OJaUDBC F SOZUB OJMCTCB\QK D WHUECS A,
B F C EC FY PCDOEEXY SUQBCY. $O DOGLC DOS[FHKBOM RX[OHEKUB [MUOJMCPORCEFU DO RBOMOSN FHF OLEOSN
FP QHULNITFY DHCQQOR R Q[FQDU SEOZUQBRUEEOGO ECQHULORCEFK, CLMUQ FPSUEKUBQK DHFUEBQDF_ DOL
JNLUB QWFBCB\, WBO OE FSUUB LUHO Q B.
B
B*(c)

$C QCSOS LUHU v-BCJHF^ LRU. )LEC ECYOLFBQK R ECWCHU OJaUDBC F QOLUMZFB RQU RFMBNCH\EXU `NED^FF,
[UMROECWCH\EO OJaKRHUEEXU R A FHF C, C LMNGCK R ECWCHU DOS[OEUEBC B F QOLUMZFB RFMBNCH\EXU
`NED^FF, OJaKRHUEEXU R B. 3BO OPECWCUB, WBO [MUOJMCPORCEFU BF[C OB [MOFPROLEOGO D JCPOROSN DHCQQN
R .++ SOZUB [MF EUDOBOMXY OJQBOKBUH\QBRCY [OMOLFB\ NDCPCBUH\ EC QUMULFEN OJaUDBC ([O CECHOGFF Q
NDCPCBUHKSF EC [UMUSUEEXU DHCQQC, O DOBOMXY GOROMFHOQ\ RXVU). 0MOSU BOGO, R .++ OBDMXRCUBQK
ROPSOZEOQB\ LNMC^DFY `ODNQOR:
C* anotherC = C*(void*(B*(c)));
anotherC->MemberOfC();
#FLFBU, R WUS [MOJHUSC? 5MUOJMCPORCEFU B*(c) QSUTCUB NDCPCBUH\. "CBUS OE [MUOJMCPNUBQK D BF[N
void*. *CHUU QHULNUB OJMCBEOU [MUOJMCPORCEFU D C* F ECVC [MOGMCSSC JNLUB NRUMUEC, WBO C
ECWFECUBQK Q EURUMEOGO CLMUQC. 8UP [MUOJMCPORCEFK D void* RQU MCJOBCUB, [OQDOH\DN DOS[FHKBOM SOZUB
O[UMULUHFB\ QSUTUEFU B* R C*. # QNTEOQBF, [MUOJMCPORCEFU OB base* D derived* (GLU base
JCPORX_, C derived [MOFPROLEX_ DHCQQ) RX[OHEKUBQK DCZLX_ MCP, DOGLC DHFUEB RXPXRCUB
RFMBNCH\ENI `NED^FI B, [UMUO[MULUHUEENI R C. $O DOGLC [MOFQYOLFB [MUOJMCPORCEFU OB void* D C*,
DOS[FHKBOM HFV\ ECFREO [OHCGCUB, WBO [MOGMCSSFQB LU_QBRNUB QOPECBUH\EO.
"C[OSEFBU: DCZLX_ [MOGMCSSFQB EC .++ PC QROI DCM\UMN [MOROLFB DCD SFEFSNS OLEN JUQQOEENI EOW\,
[XBCKQ\ [OEKB\, [OWUSN UGO OJaUDB JMULFB. 5OBOS [MFYOLFB DCDO_-EFJNL\ GNMN, Q YOLN QBCRFB LFCGEOP
QFELMOS DHCQQ-void-DHCQQ [MFBOS BCD, WBOJX QHXVCHF ODMNZCITFU F MCPMCZCUBQK PHOMCLEXS
QSUYOS. #[MOWUS, K OBDHOEFHQK OB BUSX.
Bupfyanuuue asoeue knaccu
%QHF RX [OH\PNUBUQ\ RFMBNCH\EXSF JCPORXSF DHCQQCSF, [O[MOTC_BUQ\ QO RQUSF QYUSCSF N[HOBEUEFK F
QJOMDF SNQOMC, BMUJNITFSF [UMUSUTUEFK OJaUDBOR R [CSKBF. $FZU [MFRULUE `MCGSUEB [MOGMCSSX F
[ODCPCEO, DCD OJaUDB [MULQBCRHUE R [CSKBF.
class Base {...};
class A : virtual public Base {...};
class B : virtual public Base {...};
class Foo : public A, public B {...};
+\`N. 0OS[FHKBOMN BCD QBXLEO, WBO Base [MFYOLFBQK MUCHFPORXRCB\ DCD RFMBNCH\EX_ JCPORX_ DHCQQ,
WBO OE [MKWUB UGO DCD SOZEO LCH\VU, [OL Foo. A F B QOLUMZCB NDCPCBUHF EC ]DPUS[HKM Base LC, RQU
RUMEO, NDCPCBUHF, BO UQB\ EU[OQMULQBRUEEXU CLMUQC R [CSKBF. #X EU FSUUBU LOQBN[C D ]BFS NDCPCBUHKS
F, QHULORCBUH\EO, EU QSOZUBU OJEORFB\ FY [MF [UMUSUTUEFF OJaUDBC R [CSKBF.
B
A
Foo
Base

220
Ykasafenu ua nepereuuyk knacca
!LUK NDCPCBUHK EC [UMUSUEENI DHCQQC PCDHIWCUBQK R BOS, WBO [UMUSUEENI SOZEO OLEOPECWEO
FLUEBF`F^FMORCB\ EU [O UU EU[OQMULQBRUEEOSN CLMUQN, EO [O CLMUQN QOLUMZCTUGO UU OJaUDBC F
QSUTUEFI [UMUSUEEO_ RENBMF OJaUDBC. %QHF RX EFDOGLC EU [OH\PORCHFQ\ NDCPCBUHKSF EC [UMUSUEEXU
DHCQQC, FPNWFBU QHULNITF_ `MCGSUEB DCD SOZEO REFSCBUH\EUU.
class Foo {
private:
int x;
public:
static int& Foo::*X() { return &Foo::x; }
};
Foo f = new Foo; // F'-0$*, Q&-"25#%7
int& Foo::*pm = Foo::X(); // G<./)#/*, )2"K"(/" int
int& i = f->*pm; // =7/2"(/*, )2"K"(/" & Q&-"25#%73
:NED^FK X() ROPRMCTCUB EU QQXHDN EC int, C QSUTUEFU EUDOBOMOGO int R ]DPUS[HKMCY DHCQQC Foo.
:NED^FK Foo::X() OJaKRHUEC QBCBFWUQDO_, [OQDOH\DN OBEOQFBQK EU D DOEDMUBEOSN ]DPUS[HKMN, C D
DHCQQN R ^UHOS. 0OSCELC return &Foo::x; O[MULUHKUB QSUTUEFU DOEDMUBEO_ [UMUSUEEO_, x. # QBMODU
int& Foo::*pm = Foo::X(); OJaKRHKUBQK [UMUSUEECK pm, DOBOMCK QOLUMZFB QSUTUEFU [UMUSUEEO_
int DHCQQC Foo. )EC FEF^FCHFPFMNUBQK QSUTUEFUS, [OHNWUEEXS OB Foo::X(). $CDOEU^, R QBMODU int&
i = f->*pm; QSUTUEFU [MFSUEKUBQK D DOEDMUBEOSN ]DPUS[HKMN LHK RXWFQHUEFK CLMUQC DOEDMUBEOGO
int. )JMCBFBU REFSCEFU: PECWUEFU pm QCSO [O QUJU JUQ[OHUPEO LO BUY [OM, [ODC RX EU [MFSUEFU UGO D
OJaUDBN.
#QU ]BF int& Q BCDFS ZU NQ[UYOS SOZEO PCSUEFB\ EC int*. # HIJOS QHNWCU RQU PCRUMVCUBQK
DOQRUEEXS [OHNWUEFUS CLMUQC EUDOBOMO_ WCQBF OJaUDBC BCD, QHOREO RX [OHNWFHF KREX_ CLMUQ
[UMUSUEEO_ DHCQQC. 4DCPCBUHF EC WHUEX DHCQQOR BCDZU SOGNB [MFSUEKB\QK LHK DOQRUEEXY QQXHOD EC
`NED^FF, C EU EC [UMUSUEEXU DHCQQC, EO ]BO EU OBEOQFBQK D ECVU_ BUSU N[MCRHUEFU [CSKB\I. 0 BOSN
ZU K EU YOWN RPRCHFRCB\ EC QUJK HFVEII GOHORENI JOH\.
vtable
x
y
f
pm = Foo::X()
F->*pm

Rocnepcfeun
#QU QDCPCEEOU OJHCLCUB `NELCSUEBCH\EXSF [OQHULQBRFKSF LHK N[MCRHUEFK [CSKB\I. 1BOJX
[UMUSUQBFB\ OJaUDB R [CSKBF, RCS [MFLUBQK [MOQHULFB\ PC BUS, WBOJX [UMUSUTCHQK RSUTCITF_ OJaUDB
RUMYEUGO NMOREK, C EU EUDOBOMX_ RHOZUEEX_ OJaUDB, CLMUQ DOBOMOGO N RCQ FSUUBQK. 8OHUU BOGO, [MF
[UMUSUTUEFF OJaUDBC [MFLUBQK OJEORHKB\ &.# NDCPCBUHF EU BOH\DO EC QCS OJaUDB, EO F EC RQU
RHOZUEEXU OJaUDBX F JCPORXU DHCQQX.
%QHF RX YOBFBU NPECB\, QNTUQBRNIB HF QQXHDF EC EUDOBOMX_ OJaUDB, [MFLUBQK FQDCB\ NDCPCBUHF EU
BOH\DO EC ECWCHO OJaUDBC, EO F EC RQU UGO [UMUSUEEXU F JCPORXU DHCQQX.
Rouck ykasafene
!BCD, BU[UM\ SX PECUS, Q DCDFSF MCPEXSF NDCPCBUHKSF ECS [MFLUBQK FSUB\ LUHO. 0CD ZU OBXQDCB\ FY
RQU? 1BOJX [UMUSUQBFB\ OJaUDB, ECS [MFLUBQK OJEORFB\ RQU NDCPCBUHF EC EUGO. 1BOJX [OEKB\, LOQBN[UE
HF OJaUDB, [MFLUBQK QOJMCB\ RQU NDCPCBUHF.
Cneuuanusupoeauuue npocfpaucfea narnfu pnn ykasafene
)LEO FP QFHORXY MUVUEF_ QHOZFB\ RQU NDCPCBUHF R OLEO SUQBO, GLU FY JNLUB HUGDO EC_BF. # QROI
OWUMUL\, ]BO [OLMCPNSURCUB, WBO RQU NDCPCBUHF LOHZEX JXB\ NSEXSF F YMCEFB\QK R Q[U^FCH\EXY
[MOQBMCEQBRCY [CSKBF. 3BF [MOQBMCEQBRC LOHZEX JXB\ OMGCEFPORCEX BCD, WBOJX RX SOGHF [UMUJMCB\ FY
22.
QOLUMZFSOU (BO UQB\ QOPLCB\ FBUMC^FI LHK ECJOMC NSEXY NDCPCBUHU_). # DHCQQCY RQU ]BF *-NDCPCBUHF
PCSUEKIBQK LUQDMF[BOMCSF FHF QQXHDCSF EC NSEXU NDCPCBUHF, [OQDOH\DN QCSF NDCPCBUHF LOHZEX
ECYOLFB\QK R OBLUH\EOS [MOQBMCEQBRU. # QHULNITUS `MCGSUEBU [MOGMCSSX P F H [MULQBCRHKIB QOJO_
QBCELCMBEXU NDCPCBUHF F LUQDMF[BOMX QOOBRUBQBRUEEO, PC FQDHIWUEFUS BOGO, WBO P QOYMCEKUB
]DPUS[HKMX NDCPCBUHU_ R Q[U^FCH\EOS [MOQBMCEQBRU [CSKBF. 3BC SUBOLFDC YOMOVO [OLO_LUB F LHK
EURFLFSXY NDCPCBUHU_, UQHF LHK FY QOYMCEUEFK R ECLUZEOS, YOMOVO FPRUQBEOS SUQBU JNLUB
FQ[OH\PORCEC OLEC FP SUBOLFD EUQBCELCMBEXY [MOQBMCEQBR [CSKBF. 4DCPCBUH\ P OJXWEO KRHKUBQK
RULNTFS, EO ]BO EU OJKPCBUH\EO.
template <class Type>
class P { // H&$-$*"#,
private:
Type* pointee;
public:
void* operator new(size_t); // D)5'#,-3"* )5"B/$#,('"
// 57')*7$()*4' 5$2%*/
void operator delete(void*); // D)5'#,-3"* )5"B/$#,('"
// 57')*7$()*4' 5$2%*/
// G)" 0#% 32(<C 3&$-$*"#"?
};
template <class Type>
class H { // :")&7/5*'7
private:
P<Type>* ptr;
public:
// G)" 0#% 0")&7/5*'7'4
};
class Foo {
private:
P<Bar>& bar; // F)<#&$ ($ 32(<? 3&$-$*"#, ($ Bar
// DWD
H<Bar>& bar; // :")&7/5*'7 Bar
};
# [UMROS RCMFCEBU SX YMCEFS QQXHDN EC NSEX_ NDCPCBUH\, [MFWUS QCS NDCPCBUH\, RUMOKBEO, YMCEFBQK
GLU-BO R LMNGOS SUQBU. #O RBOMOS RCMFCEBU SX FQ[OH\PNUS FLFOSN LUQDMF[BOMC NSEOGO NDCPCBUHK EC
NSEX_ NDCPCBUH\. .CS LUQDMF[BOM ECYOLFBQK R OJaUDBU, EO NDCPCBUH\, EC DOBOMX_ OE QQXHCUBQK, R
Q[U^FCH\EOS [MOQBMCEQBRU NDCPCBUHU_, FQ[OH\PNUSOS O[UMCBOMCSF new F delete DHCQQC P. %QHF
[MOQBMCEQBRO NDCPCBUHU_ JNLUB MUCHFPORCEO BOHDORO, RQU NDCPCBUHF SOZEO JNLUB [UMUJFMCB\ [MKSO FP
EUGO. # ]BO QHNWCU PCLCWC [UMUSUTUEFK OJaUDBC EUQDOH\DO N[MOTCUBQK (YOBK F EU QBCEORFBQK [MOQBO_),
[OQDOH\DN RQU NDCPCBUHF EC EUGO SOZEO EC_BF R [MOQBMCEQBRU NDCPCBUHU_. 5OHECK MUCHFPC^FK ]BO_
SUBOLFDF [MFRULUEC EFZU R ]BO_ GHCRU.
Ckpufue konnekuuu ykasafene
*MNGOU ROPSOZEOU MUVUEFU [OLLUMZCB\ QDMXBXU DOHHUD^FF NSEXY NDCPCBUHU_.
template <class Type>
class P {
private:
static P<Type>* head; // +$.$#' )5/)&$ MP
static P<Type>* tail; // I'("B )5/)&$
P<Type>* next; // F#"03>K/? Q#"2"(* )5/)&$
P<Type>* previous; // =7"0<03K/? Q#"2"(* )5/)&$
Type* pointee;
222
public:
P(); // T$(")*/ this 4 )5/)'&
P(const P<Type>& p); // T$(")*/ this 4 )5/)'&
~P(); // H0$#/*, this /- )5/)&$
P<Type>& operator=(const P<Type>& p); // +" /-2"(%% )5/)'&,
// )&'5/7'4$*, p.pointee
// G)" 0#% 32(<C 3&$-$*"#"?
};
#CS [MFLUBQK QOJHILCB\ OQBOMOZEOQB\ [MF RX[OHEUEFF O[UMC^F_ QO Q[FQDOS R DOEQBMNDBOMU DO[F_ F
O[UMCBOMU =, EO RO RQUS OQBCH\EOS MUCHFPC^FK LOQBCBOWEO BMFRFCH\ECK. !Q[OH\PNK ]BOB VCJHOE, DHCQQ
OJYOLFBQK JUP YMCEUEFK QQXHOD EC NSEXU NDCPCBUHF; OE YMCEFB FY EU[OQMULQBRUEEO.
class Foo {
private:
P<Bar> bar; // H&$-$*"#, $4*'2$*/.")&/ -$(')/*)% 4 )&7<*3> &'##"&B/>
};
5MF DOEQBMNFMORCEFF Foo RXPXRCUBQK QOOBRUBQBRNITF_ DOEQBMNDBOM P, DOBOMX_ CRBOSCBFWUQDF
PCEOQFB bar R QDMXBNI DOHHUD^FI. 5MF NEFWBOZUEFF Foo RXPXRCUB LUQBMNDBOM P, DOBOMX_ NLCHKUB
bar FP DOHHUD^FF. (CPNSUUBQK, RSUQBO LRNQRKPEOGO Q[FQDC SOZEO ROQ[OH\PORCB\QK LMNGFSF
QBMNDBNMCSF LCEEXY. 0MOSU BOGO, DCD RX RQDOMU NJULFBUQ\, LHK RQUY ]BFY Q[U^FCHFPFMORCEEXY
NDCPCBUHU_ QBOFB QOPLCB\ OJTF_ JCPORX_ DHCQQ F QOYMCEFB\ FY RQU R OLEO_ DOHHUD^FF. # [MFRULUEEOS
RXVU `MCGSUEBU LHK DCZLOGO BF[C NDCPCBUHK QOPLCUBQK OBLUH\ECK DOHHUD^FK.
Auanus sksernnnpoe
8OHUU MCLFDCH\EX_ [OLYOL FQ[OH\PORCB\ QCSXU OJXWEXU NDCPCBUHF F [MULNQSOBMUB\ QMULQBRC LHK
[UMUJOMC RQUY NDCPCBUHU_, REULMUEEXY R ]DPUS[HKM.
class Foo {
private:
Bar* bar;
};
# LCEEO_ QYUSU ]BO MCPMUVCUBQK, [MF NQHORFF, WBO DCDCK-BO OWUE\ QHOZECK CMYFBUDBNMC QSOZUB
O[MULUHFB\ Bar* [O FSUITUSNQK Foo. 1BOJX MUCHFPORCB\ UU, ECS [OECLOJFBQK DOL, DOBOMX_ PECUB
QBMNDBNMN DCZLOGO ]DPUS[HKMC (C BOWEUU, NSUUB ECYOLFB\ [UMUSUEEXU DHCQQC, DOBOMXU KRHKIBQK
CLMUQCSF FHF SOGNB QOLUMZCB\ CLMUQC [OQMULQBROS MUDNMQFF), F ROPSOZEOQB\ BOWEO O[MULUHFB\ BF[
NDCPXRCUSOGO OJaUDBC. $C[MFSUM, NQ[UVEO EC_LUEEX_ bar EU [OSOZUB, UQHF RX EU PECUBU, Q WUS
FSUUBU LUHO Q ECQBOKTFS Bar FHF DCDFS-BO DHCQQOS, [MOFPROLEXS OB Bar. # [MOFPROLEOS DHCQQU
SOGNB [OKRFB\QK LO[OHEFBUH\EXU NDCPCBUHF, OBQNBQBRNITFU R Bar.
6X UTU RUMEUSQK D ]BOSN MUVUEFI, EO UQHF JX ]BO JXHC MUDHCSC CRBOSOJFHK, BO R EFZEU_ WCQBF
]DMCEC RX JX NRFLUHF [MULN[MUZLUEFU: 5MO`UQQFOECH\EX_ DCQDCLUM EC PCDMXBOS BMUDU. $U
[XBC_BUQ\ [ORBOMFB\ R LOSCVEFY NQHORFKY. +US EU SUEUU, RO SEOGFY QFBNC^FKY [MOQBXU MUVUEFK EU
MCJOBCIB, [O]BOSN R QHULNITU_ GHCRU SX Q GOHORO_ EXMEUS R ]BN QYUSN.
Cfekoeue nepereuuue
0OEUWEO, EU RQU NDCPCBUHF KRHKIBQK WHUECSF OJaUDBOR. $UDOBOMXU FP EFY OJXWEXU [UMUSUEEXU,
ECYOLKTFUQK R QBUDU. (CPNSUUBQK, MUVUEFU QO Q[U^FCH\EXSF [MOQBMCEQBRCSF LHK QBUDORXY [UMUSUEEXY
EU [OLO_LUB, UQHF BOH\DO OEF EU KRHKIBQK LUQDMF[BOMCSF FHF QQXHDCSF EC NSEXU NDCPCBUHF,
YMCEKTFUQK R LMNGOS SUQBU. .DMXBXU DOHHUD^FF Q BUS ZU NQ[UYOS JNLNB MCJOBCB\ LHK NDCPCBUHU_,
YMCEKTFYQK R QBUDU FHF DNWU [MF NQHORFF, WBO RX OMGCEFPNUBU OJMCJOBDN FQDHIWUEF_, DOBOMCK JNLUB
[MCRFH\EO MCQDMNWFRCB\ QBUD. )QOJOGO OJMCTUEFK BMUJNUB HFV\ OLEC [UMUSUEECK this, PECWUEFU
DOBOMO_ PCLCUBQK DOS[FHKBOMOS, C EU RCVFS DOLOS, MCJOBCITFS Q NSEXSF NDCPCBUHKSF. .BUDORXU
[UMUSUEEXU PECWFBUH\EO NQHOZEKIB MUVUEFU Q CECHFPOS ]DPUS[HKMOR, [OQDOH\DN RCS BCDZU [MFLUBQK
MCPMCJCBXRCB\ OBLUH\ENI QYUSN OJECMNZUEFK FHF YOBK JX [MULOBRMCTUEFK DOHHFPF_.
223
eckpunfopu, noeckpy peckpunfopu
)LEC FP QBMCBUGF_ N[HOBEUEFK F QJOMDF SNQOMC R .++, DOBOMCK PCFSQBRNUB DOU-WBO FP LFECSFWUQDFY
KPXDOR QQXHCB\QK EC RQU OJaUDBX BOH\DO WUMUP LUQDMF[BOMX.
class Foo {
private:
H<Bar> bar; // :")&7/5*'7 Bar
public:
H<Bar> GetBar() { return bar; }
};
"LUQ\ H VCJHOE LUQDMF[BOMC (RMOLU BUY, DOBOMXU SX MCQQSCBMFRCHF R [MULXLNTFY GHCRCY). 0CZLX_
H<Bar> [MULQBCRHKUB QOJO_ NSEX_ NDCPCBUH\ EC RULNTF_ NDCPCBUH\ EC Bar. :NED^FF, DOQRUEEO
OBDMXRCITFU [UMUSUEEXU DHCQQC (BCDFU DCD GetBar()), ROPRMCTCIB DO[FI LUQDMF[BOMC. #QU RULNTFU
NDCPCBUHF ([O DMC_EU_ SUMU, R ]BO_ RUMQFF) ZFRNB R Q[U^FCH\EOS [MOQBMCEQBRU [CSKBF, [O]BOSN EC_BF
FY EUQHOZEO.
$FZU O[FQXRCUBQK OLEC FP EUQHOZEXY MUCHFPC^F_ N[HOBEUEFK Q [MFSUEUEFUS LUQDMF[BOMOR. 0OEUWEO,
ROPSOZEX F LMNGFU RCMFCEBX.
Oee onucauue apxufekfypu
# OJTFY WUMBCY ECVC CMYFBUDBNMC QBMOFBQK EC QHULNITFY [MFE^F[CY:
5OQDOH\DN MCPHFWEXU BF[X OJaULFEKIBQK R OLFE ECJOM RULNTFY NDCPCBUHU_, SX ROQ[OH\PNUSQK
CJQBMCDBEXS JCPORXS DHCQQOS VoidPtr LHK RULNTFY NDCPCBUHU_. 0OEDMUBEXU RULNTFU
NDCPCBUHF JNLNB QOPLCRCB\QK [O VCJHOEN, [MOFPROLFSOSN OB ]BOGO JCPOROGO DHCQQC.
#ULNTFU NDCPCBUHF ECYOLKBQK R Q[U^FCH\EOS [MOQBMCEQBRU, OJUQ[UWFRCITUS [MOQBO_ [UMUJOM
NDCPCBUHU_.
0CZLX_ RULNTF_ NDCPCBUH\ OJUQ[UWFRCUB [OLQWUB QQXHOD F NLCHKUB QUJK, DOGLC QWUBWFD
[UMUYOLFB OB / D 0. # QROI OWUMUL\, UGO LUQBMNDBOM RXPXRCUB LUQBMNDBOM NDCPXRCUSOGO OJaUDBC
F, R PCRFQFSOQBF OB FQ[OH\PNUSXY CHGOMFBSOR, [XBCUBQK (FHF EU [XBCUBQK) RUMENB\ PCEFSCUSNI
OJaUDBOS [CSKB\.
#O RQUY [UMUSUEEXY DHCQQOR F OJXWEXY [UMUSUEEXY FQ[OH\PNIBQK LUQDMF[BOMX RULNTFY
NDCPCBUHU_ RSUQBO [MKSXY NDCPCBUHU_ EC LMNGFU OJaUDBX.
5CSKB\ ROPRMCTCUBQK HFV\ R [MO^UQQU N[HOBEUEFK N[MCRHKUSO_ WCQBF DNWF. !ECWU GOROMK, UQHF
ECS [OECLOJFBQK JOH\VU [CSKBF, SX ECWFECUS Q[NQDCB\ CDBFREXU OJaUDBX REFY [O DNWU, WBOJX
OQROJOLFB\ SUQBO ECRUMYN. #XLUHUEFU [CSKBF RQUGLC [MOFQYOLFB QEFPN RRUMY.
)[FQCEC HFV\ OLEC FP ROPSOZEXY CMYFBUDBNM N[HOBEUEFK. 6X EU [XBCUSQK EF MUVFB\ [MOJHUSX
PC^FDHFRCEFK, EF NLCHFB\ OJaUDBX, QBCRVFU EULOQBN[EXSF, EO UTU EU NLCHUEEXU. )J ]BOS MUW\ [O_LUB
R QHULNITU_ GHCRU.
Bepyue ykasafenu
0CD F RO SEOGFY LMNGFY QBMCBUGFKY N[MCRHUEFK [CSKB\I, ECS [MFLUBQK YMCEFB\ SEOZUQBRO MCPHFWEXY
RULNTFY NDCPCBUHU_ R OLEO_ QBMNDBNMU Q ROPSOZEOQB\I [UMUJOMC. $C[MCVFRCUBQK OJTF_ CJQBMCDBEX_
JCPORX_ DHCQQ LHK RQUY RULNTFY NDCPCBUHU_. 0 ECVFS RULNTFS NDCPCBUHKS [MULaKRHKIBQK QHULNITFU
BMUJORCEFK:
/. #ULUEFU QWUBWFDC QQXHOD.
2. >MCEUEFU FY R Q[U^FCH\EOS [MOQBMCEQBRU [CSKBF Q [OLLUMZDO_ [UMUJOMC.
3. #XPOR LUQBMNDBOMC NDCPXRCUSOGO OJaUDBC R LUQBMNDBOMU NDCPCBUHK. # PCRFQFSOQBF OB
FQ[OH\PNUSOGO CHGOMFBSC QJOMDF SNQOMC SX OLEORMUSUEEO [XBCUSQK (FHF EU [XBCUSQK)
RUMENB\ PCEFSCUSNI OJaUDBOS [CSKB\. # ECVUS [MFSUMU EU QBOFB JUQ[ODOFB\QK O ROPRMCBU
[CSKBF OJaUDBC.
224
Easoeu knacc VoidPtr
$FZU [ODCPCE CJQBMCDBEX_ JCPORX_ DHCQQ, NLORHUBROMKITF_ ]BFS BMUJORCEFKS.
class VoidPtrPool; // D)5'#,-3"*)% 0#% )'-0$(/%, 3(/.*'1"(/%
// / 5"7";'7$ VoidPtr
class VoidPtr {
friend class VoidPtrPool;
private:
unsigned long refcount; // F."*./& ))<#'&
protected:
void* address; // N07") 3&$-<4$"2'8' ';E"&*$
size_t size; // O$-2"7 3&$-<4$"2'8' ';E"&*$ 4 ;$?*$C
VoidPtr() : address(NULL), size(0), refcount(0) {}
VoidPtr(void* adr, size_t s) : address(adr), size(s), refcount(0) {}
public:
static VoidPtrPool* pool;
virtual ~VoidPtr() { size = 0; address = NULL; }
void* operator new(size_t)
{
if (pool == NULL)
pool = new VoidPtrPool;
return pool->Allocate();
}
void operator delete(void* space)
{ pool->Deallocate((VoidPtr*)space); }
void Grab() { refcount++; }
void Release()
{
if (refcount > 0) refcount--;
if (refcount <= 0) delete this;
}
};
Lanou eepyero ykasafenn
$CV RULNTF_ NDCPCBUH\ [MULQBCRHKUB QOJO_ VCJHOE, [MOFPROLEX_ OB VoidPtr. )E QNTUQBRNUB R
OQEOREOS LHK BOGO, WBOJX MUCHFPORCB\ O[UMCBOM -> F RFMBNCH\EX_ LUQBMNDBOM, DOBOMX_ PECUB, DCDO_
LUQBMNDBOM LOHZUE RXPXRCB\QK LHK NDCPXRCUSOGO OJaUDBC. & MUVFH PC[MUBFB\ DO[FMORCEFU F
[MFQRCFRCEFU. 5MF DO[FMORCEFF LUQDMF[BOMC LOHZUE DO[FMORCB\QK CLMUQ RULNTUGO NDCPCBUHK, C EU QCS
RULNTF_ NDCPCBUH\ FHF NDCPXRCUSX_ OJaUDB. .HULORCBUH\EO, EUB OQOJO_ EUOJYOLFSOQBF [OLLUMZFRCB\
DO[FMORCEFU F [MFQRCFRCEFU LHK RULNTFY NDCPCBUHU_. 0CD OJXWEO, QNTUQBRNUB SEOZUQBRO RCMFC^F_ EC
BUSN DOEQBMNDBOMOR. # LCEEOS QHNWCU K RXJMCH BN, R DOBOMO_ DOEQBMNDBOM RULNTUGO NDCPCBUHK QOPLCUB
NDCPXRCUSX_ OJaUDB.
template <class Type>
class MP : public VoidPtr {
private: // S*';< -$57"*/*, &'5/7'4$(/" / 57/)4$/4$(/"
MP(const MP<Type>&) {}
MP<Type>& operator=(const MP<Type>&) { return this; }
public:
MP() : VoidPtr(new Type, sizeof(Type)) {}
virtual ~MP() { ((Type*)address)->Type::~TypeOf(); }
225
Type* operator->() { return (Type*)address; }
};
Lanou peckpunfopa
3BO NZU PECDOSX_ ECS VCJHOE LUQDMF[BOMC Q [OLQWUBOS QQXHOD FP [MULXLNTU_ GHCRX.
template <class Type>
class Handle {
private:
MP<Type>* pointer;
public:
Handle() : pointer(new MP<Type>) { pointer->Grab(); }
Handle(const Handle<Type>& h) : pointer(h.pointer)
{ pointer->Grab(); }
Handle<Type>& operator=(const Handle<Type>& h)
{
if (this == &h) return *this;
if (pointer == h.pointer) return *this;
pointer->Release();
h.pointer->Grab();
return *this;
}
MP<Type>& operator->() { return *pointer; }
};
# [MOGMCSSU OE FQ[OH\PNUBQK LHK [UMUSUEEXY, QQXHCITFYQK EC OJaUDBX.
class Bar {
private:
H<Foo> foo;
public:
void f();
};
void Bar::f()
{
Handle<Foo> f; // Y&4/4$#"(*(' Foo* f = new Foo;
f = foo; // D)5'#,-3"* operator=(Handle<Type>(foo));
foo = f; // D)5'#,-3"* '5"7$*'7 H<Type>(f)
}
Ryn eepyux ykasafene
5MOQBOBX MCLF SX [MUL[OHOZFS, WBO DHCQQX, [MOFPROLEXU OB VoidPtr, QOR[CLCIB [O MCPSUMN Q QCSFS
VoidPtr; FECWU GOROMK, R EFY EU LOJCRHKIBQK EORXU [UMUSUEEXU. $CVC PCLCWC N[MOTCUBQK;
VoidPtrPool BU[UM\ SOZUB JXB\ [MOQBXS QRKPCEEXS Q[FQDOS SCQQFROR VoidPtr. .BMNDBNMC SCQQFRC
ECPXRCUBQK VoidPtrBlock.
struct VoidPtrBlock {
VoidPtrBlock* next; // F#"03>K/? ;#'& 4 )5/)&"
VoidPtr slots[BLOCKSIZE]; // 9$))/4 5'-/B/?
VoidPtrBlock(VoidPtrBlock* next_in_list) : next(next_in_list)
{
// L78$(/-'4$*, ('4<" 5'-/B// 4 )4%-$((<? )5/)'&
for (int i = 0; i < BLOCKSIZE - 1; i++)
226
slots[i].address = &slots[i + 1];
slots[BLOCKSIZE - 1].address = NULL;
}
~VoidPtrBlock() { delete next; }
}
class VoidPtrPool {
private:
VoidPtr* free_list; // F5/)'& )4';'0(<C VoidPtr
VoidPtrBlock* block_size; // +$.$#' )5/)&$ ;#'&'4
public:
VoidPtrPool() : block_list(NULL), free_list(NULL) {}
~VoidPtrPool() { delete block_list; }
VoidPtr* Allocate();
void Deallocate(VoidPtr* vp);
};
VoidPtr* VoidPtrPool::Allocate()
{
if (free_list == NULL) // G<0"#/*, 0'5'#(/*"#,(<? ;#'&
{
block_list = new VoidPtrBlock(block_list);
// :';$4/*, 4 )5/)'&
block_list->slots[BLOCKSIZE 1].address = free_list;
free_list = &block_list->slots[0];
}
VoidPtr* space = (VoidPtr*)free_list;
free_list = (VoidPtr*)space->address;
return space;
}
void VoidPtrPool::Deallocate(VoidPtr* p)
{
vp->address = free_list;
free_list = (VoidPtr*)vp->address;
vp->size = 0;
}
# OJTUS, EFWUGO YFBMOGO. 5MF RXLUHUEFF EOROGO JHODC SX OMGCEFPNUS UGO [OPF^FF QRKPCEEX_ Q[FQOD
F ROLMNZCUS [ORUMY Q[FQDC QROJOLEXY NDCPCBUHU_. %QHF Q[FQOD QROJOLEXY NDCPCBUHU_ [NQB, C ECS
[OBMUJORCHQK UTU OLFE RULNTF_ NDCPCBUH\, SX RXLUHKUS EORX_ JHOD, C PCBUS JUMUS NDCPCBUH\ FP
Q[FQDC QROJOLEXY, R DOBOMOS D ]BOSN RMUSUEF [OKRFHFQ\ RCDCEQFF.
Hfepafop eepyux ykasafene
*HK [UMUJOMC RQUY RULNTFY NDCPCBUHU_ SX QOPLCLFS DHCQQ FBUMCBOMC Q FSUEUS VoidPtrIterator.
VoidPtrPool ROPRMCTCUB FBUMCBOM, [UMUJFMCITF_ RQU CDBFREXU NDCPCBUHF (BO UQB\ RQU NDCPCBUHF, EU
[MFQNBQBRNITFU R Q[FQDU QROJOLEXY). )E JNLUB OJaKRHUE DCD WFQBO CJQBMCDBEX_ JCPORX_ DHCQQ,
[OQDOH\DN R QHULNITU_ GHCRU BOB ZU FEBUM`U_Q JNLUB FQ[OH\PORCE LHK [UMUJOMC NDCPCBUHU_,
REULMUEEXY R OJaUDBX.
class VoidPtrIterator {
protected:
VoidPtrIterator() {}
public:
virtual bool More() = 0;
227
virtual VoidPtr* Next() = 0;
};
.CS FBUMCBOM MCJOBCUB RUQ\SC [MKSOHFEU_EO. )E [MOQBO [UMUJFMCUB JHODF R ^FDHU F FTUB NDCPCBUHF Q
EUENHURXS PECWUEFUS [UMUSUEEO_ size.
class VoidPtrPoolIterator : public VoidPtrIterator {
private:
VoidPtrBlock* block;
int slot; // +'2"7 5'-/B// 4 *"&3K"2 ;#'&"
virtual void Advance() // +$?*/ )#"03>K3> /)5'#,-3"23> 5'-/B/>
{
while (block != NULL)
{
if (slot >= BLOCKSIZE)
{
block = block->next;
slot = 0;
}
else if (block->slots[slot].size != 0)
break;
slot++;
}
}
public:
VoidPtrPoolIterator(VoidPtrBlock* vpb)
: block(vpb), slot(0), { Advance(); }
virtual bool More() { return block != NULL; }
virtual VoidPtr* Next()
{
VoidPtr* vp = &block->slots[slot];
Advance();
return vp;
}
};
0MOSU BOGO, SX LOJCRFS R VoidPtrPool QHULNITNI `NED^FI:
VoidPtrIterator* iterator()
{ return new VoidPtrPoolIterator(this); }
$CDOEU^, ECS [MFVHOQ\ OJaKRFB\ VoidPtrPoolIterator LMNGOS VoidPtr, WBOJX R [MOGMCSSU SOZEO
JXHO OJMCBFB\QK D UGO [UMUSUEEO_ size. "CJUGCK R[UMUL, QDCZN, WBO R GHCRU /6 SX ROQ[OH\PNUSQK ]BFS
FBUMCBOMOS LHK LMNGFY ^UHU_; [O]BOSN `NED^FK Advance() F OJaKRHUEC RFMBNCH\EO_, WBOJX
[MOFPROLEXU DHCQQX SOGHF LOJCRFB\ QROI QOJQBRUEENI `FH\BMC^FI. %QHF EC_LUEECK [OPF^FK FSUUB
ENHUROU PECWUEFU size, SX [MO[NQDCUS UU. #O RQUS OQBCH\EOS MCJOBC QROLFBQK D [MOQBOSN [UMUJOMN R
SCQQFRCY, OJMCPNITFY JHODF NDCPCBUHU_.
Bapuauuu
5UMUL BUS DCD O[FQXRCB\ QCSF CHGOMFBSX N[HOBEUEFK, LCRC_BU MCQQSOBMFS LMNGFU RCMFCEBX FQYOLEO_
[OQBCEORDF PCLCWF. )EF EU ODCPXRCIB [MFE^F[FCH\EOGO RHFKEFK EC CMYFBUDBNMN FHF CHGOMFBSX, C
BOH\DO EC FLFOSX .++ R FY MUCHFPC^FF.
228
Heeupurue eepyue ykasafenu
1BOJX EU FQ[OH\PORCB\ VCJHOEX LUQDMF[BOMOR F RULNTFY NDCPCBUHU_, SOZEO JXHO OMGCEFPORCB\
SEOZUQBRUEEOU ECQHULORCEFU RULNTFY NDCPCBUHU_ OB VoidPtr F GOSOSOM`EOGO JCPOROGO DHCQQC. !ECWU
GOROMK, RULNTFU NDCPCBUHF QBCEORKBQK EURFLFSXSF, DCD OJaKQEKHOQ\ R [MULXLNTFY GHCRCY. # FGMN
RQBN[CIB RQU SUYCEFPSX, QO[NBQBRNITFU FLFOSU EURFLFSXY NDCPCBUHU_ (EC[MFSUM, [MOFPROLKTFU
`NED^FF).
class Foo {
public:
static Foo* make(); // G'-47$K$"* 5$73 3&$-$*"#,-3&$-<4$"2<? ';E"&*
virtual void Member1() = 0;
// D *.0. 0#% '*&7<*'8' /(*"7@"?)$
};
// G @$?#" foo.cpp
class FooPtr : public Foo, public VoidPtr {
public:
FooPtr(Foo* foo, size_t size) : VoidPtr(foo, size) {}
virtual ~FooPtr() { delete (Foo*)address; }
virtual void Member1()
{ ((Foo*)address)->Member1(); }
// D *.0. 0#% ')*$#,(<C '*&7<*<C @3(&B/?
};
class RealFoo : public Foo { ... };
Foo* Foo::make()
{
return new FooPtr(new RealFoo, sizeof(RealFoo));
}
// G &#/"(*)&'2 &'0"
class Bar {
private:
Foo* foo; // +$ )$2'2 0"#" ("4/0/2<? 3&$-$*"#,
public:
Bar() : foo(Foo::make()) {}
};
+CDOU MUVUEFU NHNWVCUB FEDC[QNHK^FI [MFSUEUEFK RULNTFY NDCPCBUHU_. 0MOSU BOGO, OEO [OPROHKUB
[MOFPROLKTFS `NED^FKS MUVFB\, DCDFU ]DPUS[HKMX LOHZEX N[MCRHKB\QK [OLOJEXS OJMCPOS, C DCDFU
Q [OSOT\I OJXWEXY EURFLFSXY NDCPCBUHU_ FHF LCZU ROOJTU JUP NDCPCBUHU_. #QU [MUDMCQEO
MCJOBCUB, [ODC RX QOJHILCUBU OQBOMOZEOQB\ F RXLUHKUBU R VoidPtrPool LOQBCBOWEO SUQBC LHK
FooPtr. 5OSEFBU, WBO FP-PC SEOZUQBRUEEOGO ECQHULORCEFK [O QMCREUEFI Q VoidPtr MCPSUM
NRUHFWFRCUBQK, [O DMC_EU_ SUMU, EC v-BCJHF^N.
OLekfu knaccoe
#OPSOZUE F LMNGO_ RCMFCEB [OBMUJORCB\, WBOJX RQU OJaUDBX [MOFQYOLFHF OB OJTUGO DHCQQC-[MULDC,
Q[OQOJEOGO ROPRMCBFB\ OJaUDB DHCQQC LHK LCEEOGO OJaUDBC FHF, [O DMC_EU_ SUMU, MCPSUM OJaUDBC. #
]BOS QHNWCU RCS NZU EU [MFLUBQK YMCEFB\ R NDCPCBUHU OJaUDB ]DPUS[HKMC, [OQDOH\DN UGO SOZEO JNLUB
[OHNWFB\ N OJaUDBC DHCQQC. %QHF RX GOBORX QSFMFB\QK Q EUDOBOMXS ECQFHFUS R OBEOVUEFF BF[OR R
LUQDMF[BOMCY, ]BO BCDZU [OPROHFB RCS FPJUZCB\ VCJHOEOR RBOMOGO NMOREK, FQ[OH\PNUSXY LHK GHCREXY
NDCPCBUHU_. #SUQBO void* R VoidPtr SOZEO JNLUB YMCEFB\ CommonBase* (GLU CommonBase OJTF_
JCPORX_ DHCQQ). 6X FPJCRHKUSQK OB [UMUSUEEO_ size, OB EUOJYOLFSOQBF FSUB\ VCJHOE, [MOFPROLEX_ OB
VoidPtr, F OB RFMBNCH\EOGO LUQBMNDBOMC R VoidPtr, F DCD QHULQBRFU OB 4-JC_BOROGO CLMUQC v-
BCJHF^X. . LMNGO_ QBOMOEX, UQHF N[MCRHKUSXU OJaUDBX NZU QOLUMZCB v-BCJHF^X F EU [MFENZLCIB RCQ
D [MFSUEUEFI SEOZUQBRUEEOGO ECQHULORCEFK, LO[OHEFBUH\EXY PCBMCB EU JNLUB.
229
Onfurusauun e ocoux cufyauunx
%QHF CLMUQ [UMUSUEEO_ DHCQQC [OHNWCB\ EU BMUJNUBQK, UU SOZEO YMCEFB\ R RFLU REULMUEEOGO OJaUDBC.
#[MOWUS, DCD [ODCPXRCUB QHULNITF_ `MCGSUEB, QFBNC^FK EU RQUGLC ECYOLFBQK [OL DOEBMOHUS
MCPMCJOBWFDC DHCQQC:
void f(int);
class Foo {
private:
int x; // N07") 5'#3.$*, (" (31(', 5'Q*'23 C7$(/2 ("5')7"0)*4"(('
public:
void F() { f(x); }
};
#XVKLFB R[OHEU JUPO[CQEO, EU [MCRLC HF? - BU[UM\ [MUL[OHOZFS, WBO CRBOM `NED^FF f() [MFRUH UU
FEBUM`U_Q D QHULNITUSN RFLN:
void f(int&);
! ROB RQK BTCBUH\EO Q[MOUDBFMORCEECK O[BFSFPC^FK OJMNVFRCUBQK RCS EC GOHORN. 4 REULMUEEXY
OJaUDBOR UQB\ UTU OLEC [MOJHUSC: RX LOHZEX [MOQHULFB\ EU BOH\DO PC BUS, WBOJX EFDOGLC EU [OHNWCB\
CLMUQ OJaUDBC, EO F PC BUS, WBOJX EFDOGLC EU [OHNWCB\ CLMUQOR MUDNMQFREO REULMUEEXY WHUEOR.
class Bar {
private:
Foo foo;
};
*O[NQBFS, RX QSOZUBU LODCPCB\, WBO EF OLEC FP `NED^F_ Bar EU [OHNWCUB CLMUQ foo. $O RCS [MFLUBQK
QLUHCB\ QHULNITF_ VCG F [MOQHULFB\ UTU F PC BUS, WBOJX RQU `NED^FF Foo BOZU JXHF JUPO[CQEXSF.
+C ZU HOGFDC OBEOQFBQK F D JCPORXS DHCQQCS. #CZEO [OEFSCB\, WBO BCDCK O[BFSFPC^FK LOHZEC
OQNTUQBRHKB\QK EC NMOREU RQU_ [MOGMCSSX, C EU BOH\DO [MOUDBFMNUSOGO DHCQQC.
Anropufr Eekepa
)LFE FP CHGOMFBSOR N[HOBEUEFK ZUMBRNUB EUFSORUMEXS DOHFWUQBROS (C BOWEUU, [OHORFEO_) [CSKBF R
FEBUMUQCY QDOMOQBF. 5MO^UQQ N[HOBEUEFK [OEUSEOGN R[HUBCUBQK R OJXWENI MCJOBN [MOGMCSSX. 3BOB
CHGOMFBS ECPXRCUBQK +27%6(",%, T#3$#6+ (Bakers Algorithm).
5NH [CSKBF LUHFBQK EC LRU [OHORFEX, A F B. # HIJO_ SOSUEB RMUSUEF OLEC FP ]BFY [OHORFE KRHKUBQK
+$"(&*%3 (BO UQB\ R EU_ QOPLCIBQK EORXU OJaUDBX). 5CSKB\ RXLUHKUBQK QEFPN RRUMY, C R SOSUEB
NLCHUEFK OJaUDBC EU LUHCUBQK EFDCDFY [O[XBOD RUMENB\ PCEFSCUSNI FS [CSKB\. #MUSK OB RMUSUEF RQU
CDBFREXU OJaUDBX DO[FMNIBQK FP OLEO_ [OHORFEX [CSKBF R LMNGNI. # [MO^UQQU DO[FMORCEFK
CRBOSCBFWUQDF [MOFQYOLFB N[HOBEUEFU EFZEU_ WCQBF EORO_ CDBFREO_ [OHORFEX. -DBFREXS ECPXRCUBQK
OJaUDB, LHK DOBOMOGO R QBCEU RULNTFY NDCPCBUHU_ EC_LUBQK QQXHCITF_QK EC EUGO RULNTF_ NDCPCBUH\ (R
ECVUS QHNWCU VoidPtr).
Rpocfpaucfea oLekfoe
5OHORFEX [MULQBCRHUEX R RFLU [MOQBMCEQBR [CSKBF LHK QOPLCEFK OJaUDBOR. 0HCQQ HalfSpace
FPOJMCZCUB OLEN [OHORFEN, C Space RQI [CSKB\, RFLFSNI DHFUEBCS.
Knacc HalfSpace
0CZLCK [OHORFEC [O OBLUH\EOQBF RXGHKLFB DCD OJXWEOU [MOQBMCEQBRO [CSKBF QO Q[U^FCHFPFMORCEEO_
`NED^FU_ Allocate(). 5CMECK `NED^FK Deallocate() EU [OECLOJFBQK.
class HalfSpace {
private:
unsigned long next_byte; // F#"03>K/? 4<0"#%"2<? ;$?*
unsigned char bytes[HALFSIZE];
public:
230
HalfSpace() : next_byte(0) {}
void* Allocate(size_t size);
void Reinitialize() { next_byte = 0; }
};
void* HalfSpace::Allocate(size_t size)
{
// G<7'4(%*, 0' 87$(/B< )#'4$
size = ROUNDUP(size);
if (next_byte + size >= HALFSIZE)
return NULL; // +" C4$*$"* 5$2%*/
void* space = &bytes[next_byte];
next_byte += size;
return space;
}
Knacc Space
)JTF_ [NH [MULQBCRHKUB QOJO_ QORODN[EOQB\ LRNY [OHORFE. )E BCDZU FSUUB `NED^FI Allocate(),
DOBOMCK R OJXWEXY QFBNC^FKY [MOQBO [OMNWCUB MCJOBN CDBFREO_ [OHORFEU. %QHF R CDBFREO_ [OHORFEU
EU EC_LUBQK LOQBCBOWEO [CSKBF, [MOFQYOLFB [UMUDHIWUEFU [OHORFE F DO[FMORCEFU CDBFREXY OJaUDBOR
R LMNGNI [OHORFEN `NED^FU_ Swap(). 3BC QYUSC OQEORCEC EC [MULXLNTUS SCBUMFCHU
Q[U^FCHFPFMORCEEOS [NHU VoidPtr QO QMULQBRCSF [UMUJOMC.
class Space {
private:
HalfSpace A, B;
HalfSpace* active;
HalfSpace* inactive;
void Swap(); // ="7"&#>./*, $&*/4(3> 5'#'4/(3, )&'5/7'4$*, ';E"&*<
public:
Space() : active(&A), inactive(&B) {};
void* Allocate(size_t size);
};
void* Space::Allocate(size_t size)
{
void* space = active->Allocate(size);
if (space != NULL) return space;
Swap();
Space = active->Allocate(size);
if (space == NULL)
// D)&#>."(/" ("C4$*&$ 5$2%*/
return space;
}
void Space::Swap()
{
if (active == &A)
{
active = &B;
inactive = &A;
}
else
23.
{
active = &A;
inactive = &B;
}
active->Reinitialize();
// ="7";7$*, 4)" VoidPtr / ($?*" $&*/4(<" ';E"&*<
VoidPtrIterator* iterator = VoidPtr::pool->iterator();
while (iterator->More())
{
VoidPtr* vp = iterator->Next();
if (vp->address >= inactive &&
vp->address < inactive + sizeof(*inactive))
{
void* new_space = active->Allocate(vp->size);
if (new_space == NULL)
// D)&#>."(/" ("C4$*&$ 5$2%*/
memcpy(new_space, vp->address, vp->size);
vp->address = new_space;
}
}
delete iterator;
}
#QU QNTUQBRUEEOU [MOFQYOLFB R ^FDHU while `NED^FF Space::Swap(). 0CZLX_ OJaUDB R
[MULXLNTU_, MCEUU CDBFREO_ [OHORFEU DO[FMNUBQK R EORNI CDBFRENI [OHORFEN. #QDOMU RX [O_SUBU,
PCWUS SX [MORUMKUS, [MFECLHUZFB HF CLMUQ QBCMO_ [OHORFEU.
Onepafop new
0OEUWEO, N ECQ [OKRHKUBQK [UMUGMNZUEEX_ O[UMCBOM new, DOBOMX_ FQ[OH\PNUB ]BN QBMNDBNMN.
void* operator new(size_t size, Space* space)
{
return space->Allocate(size);
}
Bepyue ykasafenu
$CDOEU^, RULNTFU NDCPCBUHF LOHZEX FQ[OH\PORCB\ ]BO [MOQBMCEQBRO [MF QOPLCEFF OJaUDBOR.
template <class Type>
class BMP : public VoidPtr {
private: // T$57"*/*, &'5/7'4$(/" / 57/)4$/4$(/" 3&$-$*"#"?
BMP(const MP<Type>&) {}
BMP<Type>& operator=(const BMP<Type>&) { return *this; }
public:
BMP() : VoidPtr(new(object_space) Type, sizeof(Type)) {}
virtual ~BMP() { ((Type*)address->Type::~Type(); }
Type* operator->() { return (Type*)address; }
};
"LUQ\ object_space GHOJCH\ECK [UMUSUEECK (C SOZUB JXB\, QBCBFWUQDCK [UMUSUEECK DHCQQC
VoidPtr), DOBOMCK QQXHCUBQK EC MCJOWUU [MOQBMCEQBRO Space.
232
Rocnepoeafenuuoe konupoeauue
:NED^FK Swap() RXPXRCUBQK R [MOFPROH\EXU SOSUEBX F, QDOMUU RQUGO, JNLUB MCJOBCB\ R BUWUEFU
EUDOBOMOGO RMUSUEF. # MCJOBU [MOGMCSSX ROPEFDCIB EU[MULQDCPNUSXU PCBKZDF, C ]BO JUQFB
[OH\PORCBUHU_ ULRC HF EU JOH\VU, WUS C[[CMCBEXU QJOF. 0 QWCQB\I, CHGOMFBS 8U_DUMC HUGDO
SOLF`F^FMORCB\, WBOJX DO[FMORCEFU RX[OHEKHOQ\ [O]BC[EO R `OEOROS MUZFSU.
$C SOQBN 8U_-8MFLZ R .CE-:MCE^FQDO [OQBOKEEO MCJOBCUB JMFGCLC SCHKMOR. )EC ECWFECUB DMCQFB\
SOQB Q OLEOGO DOE^C F WUMUP [CMN HUB NQ[UVEO LODMCVFRCUB LO LMNGOGO. 0 ]BOSN RMUSUEF SOZEO
ECWFECB\ DMCQFB\ PCEORO, R LMNGNI QBOMOEN. (CJOBC FLUB [OQBOKEEO, EU QWFBCK MULDFY [UMUMXROR FP-PC
PUSHUBMKQUEF_ FHF LUSOEQBMC^F_ [MOBUQBC. # QNTEOQBF, FSUEEO BCD CHGOMFBS 8U_DUMC [MURMCTCUBQK R
QYUSN [OQHULORCBUH\EOGO N[HOBEUEFK.
$CWFECUS QHULNITF_ PCYOL EC DHCQQ Space. :NED^FK Swap() LUHFBQK EC LRU WCQBF, OLEC FP DOBOMXY
[UMUDHIWCUB CDBFREXU [OHORFEX, C LMNGCK SEOGODMCBEO RXPXRCUBQK F [MF DCZLOS RXPORU DO[FMNUB [O
OLEOSN OJaUDBN.
class Space {
private:
VoidPtrIterator* iterator; // D(@'72$B/% ' &'5/7'4$(//
HalfSpace A, B;
HalfSpace* active;
HalfSpace* inactive;
void Swap(); // ="7"&#>./*, $&*/4(3> 5'#'4/(3, )&'5/7'4$*, ';E"&*<
public:
Space() : active(&A), inactive(&B), iterator(NULL) { Swap(); }
void* Allocate(size_t size);
void Copy1();
};
void* Space::Allocate(size_t size)
{
void* space = active->Allocate(size);
if (space != NULL)
// D)&#>."(/" ("C4$*&$ 5$2%*/
return space;
}
void Space::Swap()
{
if (active == &A)
{
active = &B;
inactive = &A;
}
else
{
active = &A;
inactive = &B;
}
active->Reinitialize();
delete iterator;
iterator = VoidPtr::pool->iterator();
}
void Space::Copy1()
233
{
if (!iterator->More())
Swap(); // +$.$*, 7$;'*3 4 07383> )*'7'(3
else
{
VoidPtr* vp = iterator->Next();
if (vp->address >= inactive &&
vp->address < inactive + sizeof(*inactive))
{
void* new_space = active->Allocate(size);
if (new_space == NULL)
throw(OutOfMemory());
memcpy(new_space, vp->address, vp->size);
vp->address = new_space;
}
}
}
:NED^FI Copy1() EUOJYOLFSO RXPXRCB\ DCD SOZEO WCTU, OLECDO LUHCB\ ]BO SOZEO R YOLU
EOMSCH\EO_ MCJOBX [MOGMCSSX. $ORXU OJaUDBX MCPSUTCIBQK R CDBFREO_ [OHORFEU, QSUVFRCIBQK QO
QDO[FMORCEEXSF OJaUDBCSF, EO ]BO EU [MFEOQFB RMULC. 5OQDOH\DN [UMUL DO[FMORCEFUS SX
NJUZLCUSQK, WBO OJaUDB R LCEEX_ SOSUEB ECYOLFBQK R EUCDBFREOS [MOQBMCEQBRU, QOPLCEEXU R CDBFREO_
[OHORFEU OJaUDBX OQBCIBQK JUP FPSUEUEF_.
Bueuuue oLekfu
5MUL[OHOZFS, CLMUQ OJaUDBC [MFVHOQ\ [UMULCB\ QFQBUSEO_ `NED^FF, DOBOMCK EFWUGO EU PECUB EF O
LUQDMF[BOMCY, EF O RULNTFY NDCPCBUHKY. +CDOSN OJaUDBN HNWVU OQBCRCB\QK EC QROUS SUQBU, [ODC
QFQBUSECK `NED^FK EU PCRUMVFB QROI MCJOBN!
SystemCall(&aString); // aString (" )#"03"* 5"7"2"K$*, 0' *"C 5'7,
// 5'&$ "8' $07") ')*$"*)% 4 7$)5'7%1"(// )/)*"2<
5MUZLU RQUGO, QORUMVUEEO EUOWURFLEO, DCD [OHNWFB\ CLMUQ OJaUDBC, [OQDOH\DN MCQQSCBMFRCRVFUQK LO
ECQBOKTUGO SOSUEBC RULNTFU NDCPCBUHF F LUQDMF[BOMX EU [MULOQBCRHKHF [MKSOGO LOQBN[C D CLMUQCS
OJaUDBOR. $O LCZU UQHF [MUL[OHOZFB\, WBO BCDCK Q[OQOJEOQB\ JXHC LOJCRHUEC, [MFYOLFBQK LU_QBRORCB\
OQBOMOZEO. 5UMROU [OJNZLUEFU RDHIWFB\ R RULNTF_ NDCPCBUH\ `HCG, [ODCPXRCITF_, WBO OJaUDB EU
LOHZUE [UMUSUTCB\QK. $O BUS QCSXS RX VRXMEUBU GEFHO_ [OSFLOM R CHGOMFBS N[HOBEUEFK; RCS
[MFLUBQK BTCBUH\EO OJYOLFB\ ]BOB OJaUDB, WBOJX EU QDO[FMORCB\ WBO-EFJNL\ [ORUMY EUGO. 8OHUU
NLCWEX_ RXYOL NJMCB\ OJaUDB FP QZFSCUSOGO [MOQBMCEQBRC EC RQU RMUSK, [ODC OE LOHZUE OQBCRCB\QK
EC `FDQFMORCEEOS SUQBU.
class Space {
public:
void Externalize(VoidPtr* vp)
{
void* space = ::operator new(vp->size);
memcpy(space, vp->address, vp->size);
vp->address = space;
}
void Internalize(VoidPtr* vp)
{
void* space = Allocate(vp->size);
memcpy(space, vp->address, vp->size);
::operator delete(vp->address);
vp->address = space;
234
}
}
:NED^FK Externalize() [UMUSUTCUB OJaUDB PC [MULUHX QZFSCUSOGO [MOQBMCEQBRC; Internalize()
ROPRMCTCUB UGO OJMCBEO. -HGOMFBS Copy1() JNLUB EOMSCH\EO MCJOBCB\, [OQDOH\DN EU [XBCUBQK
[UMUSUTCB\ OJaUDBX REU EUCDBFREO_ [OHORFEX.
3BOB Q[OQOJ BCDZU SOZUB [MFSUEKB\QK LHK [UMULCWF CLMUQC [UMUSUEEO_ DHCQQC FHF this (QS. EFZU)
EUDOBOMO_ `NED^FF DHCQQC FHF GHOJCH\EO_ `NED^FF. *O[NQBFS, RCS [OBMUJORCHOQ\ OMGCEFPORCB\
RPCFSOLU_QBRFU QROFY DHCQQOR Q DOSSUMWUQDO_ JFJHFOBUDO_, DOBOMCK [OEKBFK EU FSUUB O RCVFY
YFBMONSEXY [MCRFHCY N[HOBEUEFK.
5OSFSO EUOJYOLFSOQBF NPECRCB\, DOGLC REUVEF_ DOL [UMUQBCH [OH\PORCB\QK RCVFS OJaUDBOS, ]BOB
RCMFCEB SOZUB RXPRCB\ [MOJHUSX F [MF WCQBO_ [UMULCWU CLMUQOR REUVEFS `NED^FKS, [OQDOH\DN
DO[FMORCEFU ^UHOGO OJaUDBC FP [MOQBMCEQBRC [CSKBF F OJMCBEO SOZUB OJYOLFB\QK LOROH\EO LOMOGO.
Anropufr Eekepa: yxop u koprneuue e C++
5MCDBFWUQDOU FQ[OH\PORCEFU O[FQCEEXY RXVU CHGOMFBSOR BMUJNUB EUQDOH\DFY ZUQBDFY OGMCEFWUEF_.
-HGOMFBS 8U_DUMC LHK OJaUDBOR .++ EC[OSFECUB DOBUEDC, DOBOMOGO RCV MUJUEOD [MFEOQFB R LOS F
DHKEUBQK RQUGLC-RQUGLC DOMSFB\ F PCJOBFB\QK. *MNGFSF QHORCSF, RQU QORUMVUEEO FQDMUEEU DHKENBQK
QOJHILCB\ [MCRFHC, C RCS HNWVU ECLURCB\ [UMULEFD F FLBF PC BMK[DO_.
Oepepu onepauu u ykasafenu this
%QHF EC SOSUEB RXPORC Copy1() QNTUQBRNUB NDCPCBUH\ this, BO OJaUDB, EC DOBOMX_ OE QQXHCUBQK,
SOZUB [UMUSUQBFB\QK FP OLEO_ [OHORFEX R LMNGNI. 5MF ]BOS this JNLUB MCLOQBEO QQXHCB\QK EC
QBCMNI DO[FI. 6X [OPCJOBFHFQ\ OJO RQUY OQBCH\EXY QBUDORXY [UMUSUEEXY F [MURMCBFHF FY R
LUQDMF[BOMX. +U[UM\, WBOJX [OHNWFB\ LOQBN[ D OJaUDBN, FS [MFYOLFBQK MCPROMCWFRCB\QK EC /80 F
LU_QBRORCB\ WUMUP RULNTF_ NDCPCBUH\. #OPSOZEO, QFHOROU MUVUEFU, DOBOMOU MCJOBCUB, YOBK F
EUECSEOGO HNWVU [OBMUJORCB\, WBOJX `NED^FK Copy1() RQUGLC RXPXRCHCQ\ R QCSOS DOE^U `NED^F_
DHCQQC:
class Foo {
public:
void Fn()
{
// I'0, &'*'7<? 0"#$"* (".*' ')2<)#"(('"
VoidPtr::pool->Copy1();
}
};
(CPNSUUBQK, RQU JNLUB EOMSCH\EO HFV\ R BOS QHNWCU, UQHF OJaUDB RXPXRCRVF_ Fn(), EN JNLUB
FQ[OH\PORCB\ QRO_ NDCPCBUH\ this [OQHU ROPRMCTUEFK FP Fn(). $U PECI, DCD RX, C HFWEO K [MUL[OWFBCI
Q[CB\ Q[ODO_EO F EU LNSCB\ O BOS, DCD OLFE FP 2435 [MOGMCSSFQBOR, MCJOBCITFY Q SOU_ JFJHFOBUDO_
DHCQQOR, [MFLNSCUB Q[OQOJ RQU FQ[OMBFB\.
8OHUU LOQBO_EOU MUVUEFU QLUHCB\ BCD, WBOJX `NED^FK Copy1() RXPXRCHCQ\ FP EUDOBOMOGO ^FDHC
QOJXBF_ RUMYEUGO NMOREK. $C QCSOS LUHU EUZUHCBUH\EO, WBOJX R SOSUEB RXPORC Copy1() `NED^FF
FQWUPCITFY OJaUDBOR ECYOLFHFQ\ R QBUDU. # MUPNH\BCBU [OHNWCUBQK CMYFBUDBNMC, DOBOMNI K ECPXRCI
%>%.6#)%&+**%3 (inside-out), `NED^FK DHCQQC EU RX[OHEKUB MCJOBN QCSC, C QOPLCUB %/0#$"-%>#6+C(F
(operational object) F EC[MCRHKUB UGO R EUDOBOMNI GHCRENI OWUMUL\. 3BO MCQ[MOQBMCEUEEOU MUVUEFU
RQBMUWCUBQK RO SEOGFY JFJHFOBUDCY DHCQQOR.
class Operation {
friend void MainLoop();
private:
static Queue<Operation> OperationQ;
public:
virtual void DoSomething() = 0;
void Post() { OperationQ.Push(this); }
235
};
void MainLoop()
{
Operation* op;
while ((op = Operation::OperationQ.Pop()) != NULL)
{
op->DoSomething();
object_space->Copy1();
}
}
%QHF BU[UM\ OJaUDB PCYOWUB RX[OHEFB\ DCDOU-EFJNL\ LU_QBRFU, OE EU RX[OHEKUB UGO QCS, C QOPLCUB
DHCQQ, [MOFPROLEX_ OB Operation, F PCEOQFB UGO R OWUMUL\. %QHF OJMCJOBDC QRKPCEC Q FBUMC^FKSF,
OJaUDB Operation [MOLOHZCUB EC[MCRHKB\ QUJK R OWUMUL\ R DOE^U DCZLOGO RXPORC DoSomething() LO
PCRUMVUEFK FBUMC^F_. 5MFRULN DMCBDF_ ECJMOQOD BMCLF^FOEEOGO [OLYOLC F O[OQMULORCEEO_
CMYFBUDBNMX:
// A7$0/B/'((<? )5')'; )0"#$*, .*'-*'
void Foo::SomeOperation()
{
for (...)
OnePass();
}
%QHF O[UMC^FK PCEFSCUB SEOGO RMUSUEF, [UMUL RCSF ROPEFDCIB LRC EUNLOJEXY RCMFCEBC: EU RX[OHEKB\
QJOMDN SNQOMC F N[HOBEUEFU LO PCRUMVUEFK Foo::SomeOperation(), C QHULORCBUH\EO, NBMCBFB\
SEOGFU [MUFSNTUQBRC OB N[MCRHUEFK [CSKB\I; FHF DOQRUEEO RXPRCB\ Copy1() RO RMUSK RXPORC
Foo::SomeOperation(), C ]BO EUJUPO[CQEO. )WUMUL\ O[UMC^F_ [MULOQBCRHKUB LMNGOU MUVUEFU
[MOJHUSX:
// L5')7"0'4$(($% $7C/*"&*37$ ) '."7"0%2/ '5"7$B/?
class FooSomeOperation : public Operation }
public:
virtual void DoSomething();
{
// G<5'#(/*, '0/( 57'C'0
if ("K" (" 8'*'4')
this->Post(); // =')#$*, -$('4' 0#% )#"03>K"8' -$C'0$
delete this;
}
};
void Foo::SomeOperation()
{
Operation* op = new FooSomeOperation(args);
op->Post();
// op->DoSomething 4<5'#(%"* 7$;'*3
}
+U[UM\ `NED^FK Copy1() PCRULOSO EU JNLUB RXPRCEC R SOSUEB ECYOZLUEFK R QBUDU
FooSomeOperation::DoSomething(). 5OLOJEXU OWUMULF O[UMC^F_ BCD WCQBO [MFEOQKB [OH\PN, WBO
KRHKIBQK ULRC HF EU QBCELCMBEO_ ROPSOZEOQB\I OJaUDBEO-OMFUEBFMORCEEXY JFJHFOBUD DHCQQOR.
.DOH\DO JFJHFOBUD QBOH\DO F RCMFC^F_ (QDCZUS, ECPECWUEFU [MFOMFBUBOR O[UMC^F_ FHF
ROPSOZEOQB\ JHODFMORCEFK OLEFY O[UMC^F_ LO PCRUMVUEFK LMNGFY), EO RO RQUY MCPEORFLEOQBKY
RQBMUWCUBQK OLEC OJTCK WUMBC SCDQFSCH\EOU OQROJOZLUEFU QBUDC EC RMUSK [UMFOLFWUQDOGO
RX[OHEUEFK RQ[OSOGCBUH\EXY O[UMC^F_.
236
Appeca nepereuuux knacca
-ECHOGFWECK [MOJHUSC ROPEFDCUB F [MF [OHNWUEFF CLMUQC [UMUSUEEO_ DHCQQC, LCZU UQHF ]BO
[MOFQYOLFB R `NED^FKY DHCQQC, DOBOMXS SX N[MCRHKUS. !SUEEO [O ]BO_ [MFWFEU SX F [OBMUJORCHF,
WBOJX RUPLU [MFSUEKHFQ\ LUQDMF[BOMX. 8HCGOLCMK O[OQMULORCEEO_ SUBOLFDU [MOJHUS EU ROPEFDCUB
[MF NQHORFF, WBO RX [OHNWCUBU CLMUQ [UMUSUEEO_ DHCQQC, FQ[OH\PNUBU F PCJXRCUBU [MO EUGO R BUWUEFU
OLEOGO ^FDHC. #[MOWUS, OB YHO[OB, QRKPCEEXY Q O[OQMULORCEEO_ CMYFBUDBNMO_, SOZEO F OBDCPCB\QK.
%QHF RX CJQOHIBEO NRUMUEX, WBO CLMUQ EU QOYMCEFBQK LO QHULNITUGO RXPORC `NED^FF Copy1(), BO
SOZUBU FPJFMCBUH\EO QEFSCB\ BMUJORCEFU OJKPCBUH\EOGO [MFSUEUEFK LUQDMF[BOMOR.
Muoecfeeuuoe uacnepoeauue
6EOZUQBRUEEOU ECQHULORCEFU JUPO[CQEO [MF NQHORFF QOJHILUEFK RQUY [MFRULUEEXY RXVU
MUDOSUELC^F_ [O NYOLN F DOMSHUEFI NDCPCBUHK this. +O OJQBOKBUH\QBRO, WBO this [HKVUB R [CSKBF
[MF RXPORU `NED^F_ RBOMOGO F BMUB\UGO JCPOROGO DHCQQC, EU RXPORUB EORXY [MOJHUS ]BO RQU BC ZU
[MOJHUSC Q this, BOH\DO PCSCQDFMORCEECK. 0OEUWEO, RX EFDOGLC EU LOHZEX ROPRMCTCB\ CLMUQ OJaUDBC,
[MUOJMCPORCEEOGO D JCPOROSN DHCQQN, EO [UMULCWC this BOZU EUJUPO[CQEC.
Heycfoueue oLekfu
)JaUDBX, CLMUQC DOBOMXY (R OBHFWFU OB CLMUQOR FY RULNTFY NDCPCBUHU_) [UMULCIBQK PC [MULUHX RCVU_
POEX DOEBMOHK QDCZUS, [MF RXPORU QFQBUSEO_ `NED^FF EUOJYOLFSO QECWCHC RXRUQBF FP
OWFTCUSOGO [MOQBMCEQBRC. .CSOU [MOQBOU MUVUEFU QOPLCB\ OJaUDB-O[UMC^FI, DOBOMCK [UMUSUTCUB
QRO_ OJaUDB F RXPXRCUB QFQBUSENI `NED^FI, DOGLC ODCPXRCUBQK R EOROS JUPO[CQEOS SUQBU.
Ynnofueuue ua recfe
)WURFLEX_ EULOQBCBOD CHGOMFBSC 8U_DUMC PCDHIWCUBQK R EC[MCQEO_ [OBUMU [OHORFEX [CSKBF.
.NTUQBRNUB F LMNGO_, SUEU OWURFLEX_ EULOQBCBOD [MF DCZLOS [MOYOLU RQU OJaUDBX DO[FMNIBQK FP
OLEOGO SUQBC [CSKBF R LMNGOU. +CDOU DO[FMORCEFU SOZUB OBMF^CBUH\EO [ORHFKB\ EC JXQBMOLU_QBRFU
[MOGMCSSX. )JU [MOJHUSX MUVCIBQK R LMNGOS CHGOMFBSU, DOBOMX_ ECPXRCUBQK 8>2%"*#*(#, *+ ,#."#
(compaction in place). #SUQBO LRNY [OHORFE QNTUQBRNUB ULFEOU [MOQBMCEQBRO, C R [MO^UQQU N[HOBEUEFK
RQU OJaUDBX QSUTCIBQK REFP. $C QHULNITU_ LFCGMCSSU [ODCPCEO QOQBOKEFU [CSKBF LO F [OQHU
N[HOBEUEFK.
o Rocne

0O[FMORCEFU OJaUDBOR LOHZEO [MOFQYOLFB\ R [MCRFH\EOS [OMKLDU, QEFPN RRUMY, R [MOBFREOS QHNWCU
OJaUDBX JNLNB ECDHCLXRCB\QK LMNG EC LMNGC. 3BOGO SOZEO LOJFB\QK LRNSK Q[OQOJCSF: OBQOMBFMORCB\
RULNTFU NDCPCBUHF [UMUL ECWCHOS [UMUJOMC FHF FPECWCH\EO YMCEFB\ FY R OBQOMBFMORCEEOS [OMKLDU.
>MCEFB\ RULNTFU NDCPCBUHF R LRNQRKPEOS Q[FQDU, OBQOMBFMORCEEOS [O CLMUQN NDCPXRCUSOGO OJaUDBC,
LOROH\EO [MOQBO [MF NQHORFF, WBO RX GOBORX [OBMCBFB\ HFVEII [CMN QHOR LHK NDCPCBUHU_ EC
QHULNITF_ F [MULXLNTF_ ]HUSUEB. <CJHOE RULNTUGO NDCPCBUHK F LUQDMF[BOMX CECHOGFWEX BUS,
DOBOMXSF SX [OH\PORCHFQ\ LO ECQBOKTUGO SOSUEBC. 8CPORX_ DHCQQ VoidPtr JXH NQORUMVUEQBRORCE
LHK YMCEUEFK ]DPUS[HKMOR R QRKPCEEOS Q[FQDU.
Easoeu knacc VoidPtr
5CSKB\ [OL OJaUDBX RQUGLC RXLUHKUBQK QEFPN RRUMY. %QHF EORXU OJaUDBX VoidPtr RQUGLC JNLNB
LOJCRHKB\QK R DOEU^ QRKPCEEOGO Q[FQDC, BO Q[FQOD RQUGLC JNLUB OBQOMBFMORCE [O ROPMCQBCEFI CLMUQOR
237
NDCPXRCUSXY OJaUDBOR. 0OEQBMNDBOMX (QS. LCHUU) EC[MKSNI MCJOBCIB Q [UMUSUEEO_
VoidPtrPool::tail. *UQBMNDBOM FQDHIWCUB ]DPUS[HKM FP Q[FQDC. #O RQUS OQBCH\EOS DHCQQ VoidPtr
OQBCHQK [MUZEFS. $FZU [ODCPCEX FPSUEUEFK R VoidPtr.
class VoidPtr {
private:
// +'4<" 5"7"2"((<" 0#% 4"0"(/% )5/)&$
VoidPtr* next; // F#"03>K/? Q#"2"(* )5/)&$
VoidPtr* previous; // =7"0<03K/? Q#"2"(* )5/)&$
protected:
// D-2"(/4M/")% &'()*73&*'7<
VoidPtr() : address(NULL), size(0), refcount(0),
next(NULL), previous(NULL) {}
VoidPtr(void* addr, size_t s) : address(addr), size(s), refcount(0),
next(NULL), previous(pool->tail->previous)
{
pool->tail->next = this;
pool->tail = this;
}
public:
// D-2"("((<? 0")*73&*'7
virtual ~VoidPtr()
{
if (size != 0) // N&*/4(<? 3&$-$*"#, /)&#>./*, /- )5/)&$
{
if (previous != NULL)
previous->next = next;
if (next != NULL)
next->previous = previous;
if (pool->tail == this)
pool->tail = previous;
}
size = 0;
address = NULL;
}
};
Ryn eepyux ykasafene
!PSUEUEFK R [NHU RULNTFY NDCPCBUHU_ VoidPtrPool BCDZU RUQ\SC BMFRFCH\EX.
class VoidPtrPool { // I$& / 57"10", 5#>) )#"03>K""
friend class VoidPtr; // L;")5"./4$"* 0')*35 & tail
private:
// +'4<" 5"7"2"((<" 0#% 4"0"(/% )5/)&$
VoidPtr head; // J/&*/4(<? VoidPtr, &'*'7<? ))<#$"*)%
// ($ )5/)'& $&*/4(<C 3&$-$*"#"?
VoidPtr* tail; // I'("B )5/)&$
public:
// +'4$% 4"7)/% &'()*73&*'7$
VoidPtrPool() : block_list(NULL), free_list(NULL), tail(&head) {}
};
238
0HCQQ VoidPtrPool FLUEBFWUE BOSN, DOBOMX_ FQ[OH\PORCHQK R CHGOMFBSU 8U_DUMC, Q LOJCRHUEFUS
QRKPCEEOGO Q[FQDC CDBFREXY VoidPtr.
Hfepafop eepyux ykasafene
!BUMCBOM RULNTFY NDCPCBUHU_ NQBMOUE ]HUSUEBCMEO. )E [MOQBO [UMUJFMCUB ]HUSUEBX Q[FQDC OB ECWCHC
D DOE^N FECWU GOROMK, OB EFZEFY CLMUQOR [CSKBF D RUMYEFS.
class VoidPtrPoolIterator : public VoidPtrIterator {
private:
VoidPtr* next;
public:
VoidPtrIterator(VoidPtr* first) : next(first) {}
virtual bool More() { return next != NULL; }
virtual VoidPtr* Next()
{
VoidPtr* vp = next;
next = next->next;
return vp;
}
};
VoidPtrIterator* VoidPtrPool::iterator()
{
return new VoidPtrPoolIterator(&head.next);
}
Anropufr ynnofueuun
-HGOMFBS N[HOBEUEFK RXGHKLFB BCD [MOQBO, WBO UGO SOZEO JXHO JX F EU [MFROLFB\.
class Space {
private:
unsigned long next_byte;
unsigned char bytes[SPACESIZE];
public:
Space() : next_byte(0) {}
void* Allocate(size_t size);
void Compact();
};
void* Space::Allocate(size_t size)
{
// G<7'4(%*, ($ 87$(/B3 )#'4$
size = ROUNDUP(size);
if (next_byte + size > SPACESIZE)
{
Compact();
if (next_byte + size > SPACESIZE)
// D)&#>."(/" ("C4$*&$ 5$2%*/
}
void* space = &bytes[next_byte];
next_byte += size;
return space;
}
239
void Space::Compact()
{
next_byte = 0;
VoidPtrIterator* iterator = VoidPtrPool::iterator();
while (iterator->More())
{
VoidPtr* vp = iterator->Next();
void* space = Allocate(vp->size);
if (space < vp->address) // =7'4"7/*,, .*' ';E"&* 5'2")*/*)%
}
delete iterator;
}
Onfurusauun
.NTUQBRNUB SEOGO ROPSOZEOQBU_ [ORXQFB\ ]``UDBFREOQB\ ]BO_ QYUSX LHK MKLORXY DHCQQOR. )LFE FP
[MOQBU_VFY RFLOR O[BFSFPC^FF YMCEUEFU *(D*#7% 86%&*4, DOBOMX_ O[MULUHKUB QCSX_ EFZEF_
NLCHUEEX_ OJaUDB. $FZEF_ NMORUE\ [MULQBCRHKUB QOJO_ QCSX_ EFZEF_ VoidPtr FP CDBFREOGO Q[FQDC,
EFZU DOBOMOGO NLCHUEEXY OJaUDBOR EUB. )E YMCEFBQK R RFLU [UMUSUEEO_ DHCQQC VoidPtr* RSUQBU Q
ECWCHOS F DOE^OS Q[FQDC. *UQBMNDBOM VoidPtr [MORUMKUB, ECYOLFBQK HF CLMUQ NDCPXRCUSOGO OJaUDBC
EFZU BUDNTUGO EFZEUGO NMOREK; UQHF LC, OE PCSUEKUB EFZEF_ NMORUE\ EORXS PECWUEFUS. 4[HOBEUEFU
ECWFECUBQK Q EFZEUGO NMOREK, [OQDOH\DN EFZU EUGO [UMUSUTCB\ EFWUGO EU BMUJNUBQK. !ECWU GOROMK, SX
ECWFECUS EU Q ECWCHC Q[FQDC, C GLU-BO Q QUMULFEX Q EFZEUGO NMOREK.
3BOB [MFUS OQOJUEEO [OHUPUE, UQHF NWFBXRCB\ Q[U^F`FDN N[HOBEUEFK EC SUQBU. 8XHO PCSUWUEO, WBO WUS
QBCMVU QBCEORFBQK OJaUDB, BUS SUE\VU RUMOKBEOQB\ BOGO, WBO OE JNLUB NLCHUE R JHFZC_VUU RMUSK.
.BCMXU OJaUDBX R ]BO_ QYUSU GMN[[FMNIBQK R EFZEU_ WCQBF [NHC. #OPEFDCUB JOH\VO_ JHOD OJaUDBOR,
DOBOMXU [MCDBFWUQDF EU [UMUSUTCIBQK, [OQDOH\DN EFZEF_ NMORUE\ RQUGLC ECYOLFBQK ECL EFSF.
*MNGO_ [MFUS O[BFSFPC^FF OJaULFEKB\ EUQDOH\DO QSUZEXY OJaUDBOR R OLEO_ O[UMC^FF
[UMUSUTUEFK. 3DOEOSFK EU BCD NZ RUHFDC, EO EUQDOH\DO BCDBOR RQU ZU NLCUBQK Q]DOEOSFB\.
Rocnepoeafenuuoe ynnofueuue ua recfe
-HGOMFBS N[HOBEUEFK EC SUQBU EUBMNLEO [MFQ[OQOJFB\ LHK NQHORF_ [OQHULORCBUH\EOGO N[HOBEUEFK R
`OEOROS MUZFSU. #QU [MOQBO: SX QOYMCEKUS VoidPtrIterator R RFLU [UMUSUEEO_ DHCQQC Space F
FQ[OH\PNUS UGO, WBOJX QSUTCB\ REFP OLFE OJaUDB [MF DCZLOS RXPORU `NED^FF Copy1(). (UCHFPC^FK
[MOQBC F [MKSOHFEU_EC, EUOJYOLFSO HFV\ QOJHILCB\ OQBOMOZEOQB\ Q NLCHUEFUS RO RMUSK N[HOBEUEFK.
5OSEFBU, WBO R [MO^UQQU [UMUJOMC Q[FQDC VoidPtr NLCHKUBQK OLFE FP UGO ]HUSUEBOR. 3BO [MOQBO_
WCQBEX_ QHNWC_ [MOJHUSX ECLUZEOQBF FBUMCBOMOR, DOBOMNI SX OJQNZLCHF R GHCRU 8.
#QU, WBO GOROMFHOQ\ OJ CHGOMFBSU 8U_DUMC R DOEBUDQBU REUVEFY OJaUDBOR, R MCREO_ QBU[UEF OBEOQFBQK
F D N[HOBEUEFI EC SUQBU. -LMUQC, EC DOBOMXU QQXHCIBQK VoidPtr, QHULNUB [MORUMKB\ [O FEBUMRCHCS
CLMUQOR R [MOQBMCEQBRU N[HOBEUEFK, F OJaUDBX SOGNB QROJOLEO [UMUSUTCB\QK FP [MOQBMCEQBRC [CSKBF F
R EUGO.
,HCRC [OHNWFHCQ\ OWUE\ LHFEEO_, C [OLOJECK QYUSC N[HOBEUEFK MULDO [MFSUEKUBQK EC [MCDBFDU.
5OLMOJEOQBF OQBCRHKI WFBCBUHI R DCWUQBRU QCSOQBOKBUH\EXY N[MCZEUEF_.
Repcnekfueu
5MOGMCSSFQBCS EC .++ OJXWEO EU BCD NZ WCQBO [MFYOLFBQK JUQ[ODOFB\QK OJ N[HOBEUEFF, [O]BOSN RQU
QDCPCEEOU QBOFB ROQ[MFEFSCB\ QO PLOMORXS QDU[QFQOS. %QHF RCS NLCQBQK OMGCEFPORCB\ EOMSCH\EX_
[OLQWUB QQXHOD, N[HOBEUEFU SOZUB ODCPCB\QK [MFKBEXS LO[OHEUEFUS, EO R ^UHOS ]BC GHCRC GOBORFB
[OWRN LHK [MFUSOR QJOMDF SNQOMC, MCQQSOBMUEEXY R QHULNITU_ GHCRU. 0MOSU BOGO, OEC [OSOGCUB
OWUMBFB\ REUVEFU GMCEF^X KPXDC, [OQDOH\DN .++ [O QROU_ QNBF EU MCQQWFBCE EC QROJOLEOU
[UMUSUTUEFU OJaUDBOR R [CSKBF.
240
# QHULNITU_ GHCRU SX RUMEUSQK D QBMCBUGFF LUQDMF[BOMOR [ORQILN. 0OEUWEO, OMGCEFPORCB\
NEFRUMQCH\EO N[HOBEUEFU [CSKB\I LHK [MOFPROLEXY DOSSUMWUQDFY DHCQQOR EUROPSOZEO. $O [O
DMC_EU_ SUMU RX NRFLFBU, DCD LCHUDO SOZEO PC_BF R .++, [MUZLU WUS [OLEKB\ MNDF, QRULUEEXU
QNLOMOGO_ OB LOHGOGO QFLUEFK PC DHCRFCBNMO_.
Copka rycopa
#X OBDMXHF [OQHULEII GHCRN DEFGF. %QHF LO QFY [OM RX UU EU OBJMOQFHF [MFSFBU SOF ROQYFTUEFU
F QOWNRQBRFU. #UMOKBEO, K EC RQI ZFPE\ OBJFH N RCQ RDNQ D HIJXS MUCH\EXS [MOUDBCS, DMOSU [MOGMCSS
N[MCRHUEFK KLUMEXSF MUCDBOMCSF F [OHUBOR EC 6CMQ. !BCD, UQHF DOSN-EFJNL\ FP WFBCBUHU_
[OBMUJNUBQK OMGCEFPORCB\ R .++ QJOMDN SNQOMC, ]BC GHCRC NDCZUB FS [NB\. - LHK OQBCH\EXY OEC QBCEUB
OWUMULEO_ FEBUHHUDBNCH\EO_ [MOJUZDO_ [O OJVFMEXS [OHKS FLFOS F N[MCRHUEFK [CSKB\I R .++.
ocfynuocfu
5UMROU, WBO OB ECQ [OBMUJNUBQK O[MULUHFB\, DCDFU OJaUDBX LOQBN[EX, C DCDFU EUB. .MCPN ZU
ROPEFDCUB RO[MOQ: LOQBN[EX %"$8)+? # ]BOS MCPLUHU O[FQCEX OQEOREXU RCMFCEBX [UMUSUTUEFK RENBM\
OB DOEDMUBEOGO [UMFSUBMC. "C EFSF QHULNIB LRU DOEDMUBEXU CMYFBUDBNMX QJOMDF SNQOMC, R DOBOMXY
FQ[OH\PNIBQK O[FQCEEXU [MFUSX.
Repurefp
'IJCK SUBOLFDC QJOMDF SNQOMC, EU QRKPCEECK Q [OLQWUBOS QQXHOD, LOHZEC ECWFECB\QK Q EUDOBOMOGO
REUVEUGO [UMFSUBMC GMC`C OJaUDBOR. 5MOWUS, LCZU O[MULUHFB\ ]BOB [CMCSUBM [OMO_ ODCPXRCUBQK
EU[MOQBO.
Cfekoeue nepereuuue
%QHF QBMKYENB\ Q [MOGMCSSX EC .++ RQI OJaUDBEO-OMFUEBFMORCEENI VUHNYN, N RCQ OQBCENBQK
`MCGSUEBX DOLC. # ]BFY `MCGSUEBCY QOPLCIBQK HODCH\EXU [UMUSUEEXU, DOBOMXU WCTU RQUGO
FQ[OH\PNIBQK LHK OJMCTUEF_ D OJaUDBCS.
void f()
{
Foo* foo = new Foo; // L;E"&* foo 0')*35"(
}
.BUDORXU [UMUSUEEXU SOGNB EU[OQMULQBRUEEO (BO UQB\ JUP NWCQBFK LMNGOGO OJaUDBC) OJMCBFB\QK D
OJaUDBN EUQDOH\DFSF Q[OQOJCSF:
4DCPCBUH\ this KRHKUBQK EUKREXS NDCPCBUHUS EC OJaUDB, LOQBN[EXS FP DOLC `NED^FF DHCQQC.
5UMUSUEECK SOZUB QOLUMZCB\ NDCPCBUH\ (*) FHF QQXHDN (&) EC OJaUDB.
5UMUSUEECK SOZUB JXB\ OJaUDBOS.
5UMUSUEECK SOZUB QOLUMZCB\ FE`OMSC^FI, EUOJYOLFSNI LHK OJMCTUEFK D OJaUDBN.
0MOSU BOGO, WUMUP QBUDORNI [UMUSUEENI D OJaUDBN SOZEO OJMCBFB\QK F DOQRUEEO. $C[MFSUM, UQHF this
QOLUMZFB [UMUSUEENI Bar*, BO Bar JNLUB DOQRUEEO LOQBN[UE FP HIJO_ `NED^FF this.
Bueuuue ykasafenu
%QHF CLMUQ OJaUDBC FHF UGO [UMUSUEEO_ [UMULCUBQK QFQBUSEO_ `NED^FF, [CMCHHUH\EOSN [MO^UQQN FHF
DNLC NGOLEO PC [MULUHX RCVUGO BTCBUH\EO [MOLNSCEEOGO DOLC QJOMDF SNQOMC, BCDO_ OJaUDB BCDZU
QBCEORFBQK EU[OQMULQBRUEEO LOQBN[EXS.
.6
242
class String {
private:
char* str;
public:
operator char*() { return str; }
};
strcpy(aString, bString); // D)5'#,-3"* '5"7$*'7 char*
*HK RXPORC strcpy(char*, char*) FQ[OH\PNUBQK O[UMCBOM [MUOJMCPORCEFK. #O RMUSK RX[OHEUEFK
strcpy OJU QBMODF EU[OQMULQBRUEEO LOQBN[EX FP DOLC `NED^FF strcpy, DOBOMXU RCSF EU
DOEBMOHFMNIBQK. ! ]BO UTU OBEOQFBUH\EO EU[HOYO, [OQDOH\DN strcpy SOZEO QWFBCB\ CBOSCMEO_
O[UMC^FU_. >NZU, UQHF RX [UMULCLFBU QQXHDN EC `NEDBOM, QDCZUS, `NED^FF JCPX LCEEXY DCD OJaUDBO-
OMFUEBFMORCEENI `NED^FI OJMCBEOGO RXPORC (callback). #X SOZUBU PCEFSCB\QK QROFSF LUHCSF, [ODC
EU PCPRUEFB PROEOD, EO LO BUY [OM EU QSU_BU NEFWBOZCB\ `NEDBOM!
Hupekcupoeauuue konnekuuu
#UQ\SC Q[U^F`FWUQDF_ QHNWC_. 5MUL[OHOZFS, DOHHUD^FK OJaUDBOR FELUDQFMNUBQK OWUE\ JOH\VFS
^UHXS WFQHOS.
template <class Type>
class Array {
public:
Type* operator[] (LargeInt);
};
0OEUWEO, SOZEO PCKRFB\, WBO RQU OJaUDBX DOHHUD^FF LOQBN[EX, UQHF LOQBN[EC QCSC DOHHUD^FK, EO
BCDOU MUVUEFU EU RQUGLC NLORHUBROMFBUH\EO. *OROH\EO WCQBO BMUJNUBQK NPECB\, SOZEO HF D OJaUDBN
DOHHUD^FF OJMCBFB\QK [O FELUDQN; BO UQB\ FSUUB HF DCDO_-EFJNL\ OJaUDB, DMOSU QCSO_ DOHHUD^FF,
FELUDQ OJaUDBC X? %QHF EUB PECWFB, CLMUQ X FSUUBQK BOH\DO N DOHHUD^FF, F OB EUGO ZUHCBUH\EO
FPJCRFB\QK. 6X EU JNLUS NGHNJHKB\QK R ]BN BUSN F HFV\ SUH\DOS OJMCBFS REFSCEFU EC [MOJHUSN.
1CTU RQUGO OEC ROPEFDCUB [MF D]VFMORCEFF OJaUDBOR EC LFQDU F R MCQ[MULUHUEEXY OJaUDBXY QFQBUSCY.
Buyfpu nepurefpa
5OQHU BOGO DCD JNLNB O[MULUHUEX RQU EU[OQMULQBRUEEO LOQBN[EXU OJaUDBX, ROPEFDCUB QHULNITCK
[MOJHUSC: FLUEBF`F^FMORCB\ OJaUDBX, D DOBOMXS ROPSOZEX DOQRUEEXU OJMCTUEFK RENBMF [UMFSUBMC.
+UOMUBFWUQDF DCZLX_ OJaUDB SOZUB OJMCBFB\QK D HIJOSN LMNGOSN OJaUDBN. +US EU SUEUU, OJaUDBX
QQXHCIBQK LMNG EC LMNGC OGMCEFWUEEXS WFQHOS Q[OQOJOR.
Repereuuue knaccoe
)LFE OJaUDB SOZUB JXB\ REULMUE R LMNGO_ DCD [UMUSUEECK DHCQQC, FHF ZU [UMUSUEECK DHCQQC SOZUB
[MULQBCRHKB\ QOJO_ NDCPCBUH\ FHF QQXHDN EC LMNGO_ OJaUDB.
Apryreufu qyukuu knaccoe
)LFE OJaUDB SOZUB [OHNWFB\ LOQBN[ D LMNGOSN WUMUP CMGNSUEBX QROFY `NED^F_. $C QCSOS LUHU ]BO
HFV\ WCQBEX_ QHNWC_ MCQQSOBMUEEXY RXVU QBUDORXY [UMUSUEEXY.
void Foo::f(Bar* b)
{
b->member_of_Bar();
}
Easoeue knaccu
8CPORX_ DHCQQ R .++ FEBUM[MUBFMNUBQK BCD, QHOREO OE KRHKUBQK REULMUEEXS OJaUDBOS. 0CD JXHO
[ODCPCEO R [MULXLNTU_ GHCRU, ]BO OQOJUEEO Q[MCRULHFRO LHK SEOZUQBRUEEOGO ECQHULORCEFK F
RFMBNCH\EXY JCPORXY DHCQQOR. 5O CLMUQN OLEOGO OJaUDBC RX SOZUBU QOQHCB\QK EC EUQDOH\DO MCPEXY
243
HOGFWUQDFY OJaUDBOR RENBMF EUGO OLEF KRHKIBQK [UMUSUEEXSF DHCQQC, C LMNGFU JCPORXSF
DHCQQCSF. 0CD [MCRFHO, CLMUQC ]BFY OJaUDBOR OBHFWEX OB BOGO OJaUDBC, DOBOMOSN OEF [MFECLHUZCB.
Auanus sksernnnpoe
-HGOMFBSX QJOMDF SNQOMC OJXWEO ECWFECIB QROI MCJOBN Q [UMFSUBMC. *HK DCZLOGO OJaUDBC [UMFSUBMC
QOQBCRHKUBQK Q[FQOD OJaUDBOR, DOBOMXU OE QOLUMZFB F EC DOBOMXU QQXHCUBQK. "CBUS LHK DCZLOGO BCDOGO
OJaUDBC QOQBCRHKUBQK EORX_ Q[FQOD F B.L. (UDNMQFREX_ [UMUJOM [MOLOHZCUBQK LO BUY [OM, [ODC NLCUBQK
ECYOLFB\ EORXU OJaUDBX. *HK ]BOGO ECS [OECLOJKBQK EUDOBOMXU QMULQBRC, DOBOMXU [OPROHKIB LHK
LCEEOGO OJaUDBC EC_BF RQU UGO REULMUEEXU OJaUDBX F NDCPCBUHF/QQXHDF.
# SmallTalk F LMNGFY LFECSFWUQDFY KPXDCY O[FQCEFU QBMNDBNMX ]DPUS[HKMC KRHKUBQK PCLCWU_ OJaUDBC
DHCQQC. # .++ QNTUQBRNUB EUQDOH\DO RCMFCEBOR. 5UMRXU LRC MUVUEFK (QS. EFZU) R[OHEU [MCDBFWEX, C
BMUB\U OBWCKEECK SUMC, DOBOMCK [OLYOLFB BOH\DO LHK [MO`UQQFOECH\EXY DCQDCLUMOR EC PCDMXBXY
BMUDCY.
Bupfyanuuue qyukuuu
%QHF RQU OJaUDBX [MOFQYOLKB OB OLEOGO OJTUGO JCPOROGO DHCQQC, R ]BOS JCPOROS DHCQQU SOZEO
OJaKRFB\ RFMBNCH\ENI `NED^FI LHK [UMUWFQHUEFK NDCPCBUHU_ F REULMUEEXY OJaUDBOR. 3BC `NED^FK
[UMUO[MULUHKUBQK R DCZLOS DHCQQU, DOBOMX_ LOJCRHKUB EORXU [UMUSUEEXU FHF OJaULFEKUB JCPORXU
DHCQQX [OQMULQBROS SEOZUQBRUEEOGO ECQHULORCEFK.
OLekfu knaccoe
#X BCDZU SOZUBU QOPLCB\ QROF QOJQBRUEEXU OJaUDBX DHCQQOR, DCD JXHO [ODCPCEO R [MULXLNTFY GHCRCY,
F ECNWFB\ FY [UMUWFQHKB\ REULMUEEXU OJaUDBX F NDCPCBUHF R ]DPUS[HKMCY.
Oceeporneuuue ykasafenu
# DMC_EUS QHNWCU SOZEO ROQ[OH\PORCB\QK NSEXSF NDCPCBUHKSF F OJMCTCB\QK D EFS Q [MOQ\JO_ O[FQCB\
OJaUDB.
class Foo {
private:
Bar* bar;
};
class PFoo { // H2(<? 3&$-$*"#, ($ Foo
private:
Foo* foo;
public:
FunctionThatEnumeratesPointersInFoo();
};
5OWUSN K ECPXRCI ]BOB QHNWC_ DMC_EFS? #X MFQDNUBU BUS, WBO NDCPCBUH\ EURUMEO O[MULUHFB BF[
OJaUDBC, EC DOBOMX_ OE QQXHCUBQK. 0OEUWEO, UQHF PFoo RULNTF_ NDCPCBUH\, SX PECUS, WBO foo
LU_QBRFBUH\EO KRHKUBQK Foo*, EO WBO LUHCB\ Q bar? 0CD NPECB\, WBO ]BO LU_QBRFBUH\EO Bar, C EU WBO-BO
[MOFPROLEOU OB EUGO? %QHF Bar EU FSUUB BOH\DO WBO N[OSFECRVU_QK QCSOO[FQXRCITU_ RFMBNCH\EO_
`NED^FF F EU ROPRMCTCUB OJaUDB DHCQQC, OQBCUBQK OLEO [ORQILN MCQDFLCB\ NSEXU NDCPCBUHF F
ECLUKB\QK EC HNWVUU.
class Bar {
};
class Pbar { // H2(<? 3&$-$*"#, ($ Bar
};
class Foo {
private:
Pbar bar;
};
244
class PFoo { // H2(<? 3&$-$*"#, ($ Foo
private:
Foo* foo;
public:
FunctionThatEnumeratesPointersInFoo();
};
+U[UM\ SX ECWFECUS Q OLEOGO NSEOGO NDCPCBUHK, PFoo, F MUDNMQFREO ECYOLFS LMNGO_, PBar. 0CZLX_ FP
]BFY NSEXY NDCPCBUHU_ MCPJFMCUBQK R OQOJUEEOQBKY QBMOUEFK OJaUDBC, EC DOBOMX_ OE QQXHCUBQK. # ]BOS
OEF [MURPOVHF NSEXU NDCPCBUHF, [O]BOSN K ECPXRCI FY %.&#)%,2#**',( (ingenious), YOBK ^FEFD,
RUMOKBEO, ECPRCH JX FY *#6+..8D)+FL(,(.
Repeop rpaqa oLekfoe
# LCH\EU_VUS SX ROQ[OH\PNUSQK SUBOLFDO_ RFMBNCH\EXY `NED^F_ FP [MFRULUEEOGO RXVU Q[FQDC, YOBK
SCBUMFCH Q BCDFS ZU NQ[UYOS [MFSUEFS F D OJaUDBCS DHCQQOR. 5UMUWFQHUEFU MUCHFPNUBQK LRNSK
OQEOREXSF Q[OQOJCSF: Q [MFSUEUEFUS MUDNMQFREXY `NED^F_ F `NEDBOMOR, C BCDZU Q [MFSUEUEFUS
FBUMCBOMOR.
Pekypcueuue qyukuuu u qyukfopu
5UMRCK UQBUQBRUEECK MUCD^FK: OMGCEFPORCB\ SUYCEFPS DOQRUEEOGO RXPORC, QOPLCB\ `NED^FI FHF
`NEDBOM, RXPXRCUSXU LHK DCZLOGO LOQBN[EOGO OJaUDBC, F [OLOZLCB\, [ODC PCDOEWFBQK MUDNMQFREX_
[UMUJOM.
class Functor { // J3(&B/% ';7$*('8' 4<-'4$
public:
virtual void Apply(MotherOfAllClasses*) = 0;
};
class MotherOfAllClasses {
public:
// =7/2"(/*, fn & &$10'23 0')*35('23 ';E"&*3
virtual void EachObject(Functor& fn);
};
:NED^FK EachObject() RXPXRCUB fn.Apply(this), C PCBUS RXPXRCUB EachObject() LHK DCZLOGO
REULMUEEOGO OJaUDBC FHF OJaUDBC, EC DOBOMX_ NDCPXRCUB [UMUSUEECK DHCQQC. 0MOSU BOGO,
EachObject() RXPXRCUB Base::EachObject() LHK DCZLOGO JCPOROGO DHCQQC, BCDFS OJMCPOS WHUEX
JCPOROGO DHCQQC BOZU RDHIWCIBQK R [UMUWFQHUEFU. # PCRFQFSOQBF OB CHGOMFBSC R
MotherOfAllClasses SOZEO RDHIWFB\ JFB [MFPECDC, [ODCPXRCITF_, WBO OJaUDB JXH MCQQSOBMUE
MCEUU. #[MOWUS, DCD SX RQDOMU NJULFSQK, FEOGLC JUP ]BOGO SOZEO OJO_BFQ\.
Hfepafopu
8OHUU NLCWEOU MUVUEFU OMGCEFPORCB\ ROPRMCTUEFU OJaUDBOS FBUMCBOMC LHK RQUY REULMUEEXY
OJaUDBOR (RDHIWCK JCPORXU DHCQQX), R BOS WFQHU F BUY, EC DOBOMXU EU[OQMULQBRUEEO QQXHCIBQK UGO
[UMUSUEEXU.
class MOAOIterator { // MotherOfAllObjectsIterator
public:
virtual bool More() = 0;
virtual MotherOfAllObjects* Next() = 0;
};
class MotherOfAllObjects {
public:
virtual MOAOIterator* EachObject();
};
245
0OEUWEO, EC ]BOB MCP [OBMUJNUBQK JOHUU YFBMONSEX_ DOL, WUS R RCMFCEBU Q RFMBNCH\EXSF `NED^FKSF FP
[OQHULEUGO MCPLUHC. +US EU SUEUU, SUBOLFDC FBUMCBOMX RQILN OJHCLCUB OLEFS GMOSCLEXS
[MUFSNTUQBROS: OEC [OPROHKUB RX[OHEKB\ LU_QBRFK [OQHULORCBUH\EO. #CMFCEB Q MUDNMQFREXSF
`NED^FKSF EU [OPROHKUB DCZLNI SFHHFQUDNELN FHF ODOHO BOGO LUHCB\ [UMULXVDN F LCRCB\ [OMCJOBCB\
LMNGOSN DOLN. 5MF FQ[OH\PORCEFF FBUMCBOMOR, UQHF QOJHILCB\ OQBOMOZEOQB\, ]BO EU [MOJHUSC. *CHUU
SX JNLUS FQ[OH\PORCB\ FSUEEO ]BOB RCMFCEB.
Copka rycopa no anropufry Eekepa
$CRUMEOU, RCS YOWUBQK PECB\, PCWUS ENZUE CHGOMFBS 8U_DUMC, EU [MCRLC HF? # [MULXLNTU_ GHCRU K
RXLCH UGO PC CHGOMFBS N[HOBEUEFK, EO WBO BOHDN N[HOBEKB\ [CSKB\, UQHF LHK ]BOGO [MFYOLFBQK
ZUMBRORCB\ 50 [MO^UEBCSF UU OJTUGO OJaUSC? +U[UM\ SX NPECUS ECQBOKTNI [MUHUQB\ CHGOMFBSC
8U_DUMC UGO [MFSUEUEFU R CMYFBUDBNMCY QJOMDF SNQOMC.
$C LCEEX_ SOSUEB SX EU JNLUS JUQ[ODOFB\QK OJ OJaUDBCY, LOQBN[EXY FPREU, F QOQMULOBOWFS REFSCEFU
EC [UMFSUBMU QBUDORXY [UMUSUEEXY.
5OQDOH\DN EC ]BOB MCP SX PCEFSCUSQK QJOMDO_ SNQOMC, EUB [MFWFE [OHCGCB\QK RO RQUS EC [OLQWUB
QQXHOD. +US EU SUEUU, [OLQWUB QQXHOD [MOLOHZCUB FGMCB\ RCZENI MOH\: OE [MFSUEKUBQK LHK [OLQWUBC
LUQDMF[BOMOR R QBUDU, QQXHCITFYQK EC DOEDMUBEX_ RULNTF_ NDCPCBUH\. #ULNTF_ NDCPCBUH\, N DOBOMOGO
QWUBWFD QQXHOD JOH\VU 0, EU[OQMULQBRUEEO LOQBN[UE FP QBUDC, C QHULORCBUH\EO, RYOLFB R [UMFSUBM. 6X
ROQ[OH\PNUSQK QFH\EXSF LUQDMF[BOMCSF LHK QBUDORXY [UMUSUEEXY F QHCJXSF LUQDMF[BOMCSF LHK
QQXHOD FP OLEOGO OJaUDBC EC LMNGO_ WUMUP [UMUSUEEXU DHCQQC. VoidPtr F LMNGFU QBMNDBNMX LCEEXY FP
[MULXLNTU_ GHCRX OQBCIBQK JUP FPSUEUEF_, PC OLEFS FQDHIWUEFUS: VoidPtr::Release() EU NLCHKUB
RULNTF_ NDCPCBUH\ [MF OJENHUEFF QWUBWFDC. "C[OSEFBU: ENHURO_ QWUBWFD QQXHOD OPECWCUB EU BO, WBO
OJaUDB ROOJTU EULOQBN[UE, C HFV\ BO, WBO OE EULOQBN[UE EU[OQMULQBRUEEO FP QBUDC.
Lanou cnaoro peckpunfopa
.HCJX_ LUQDMF[BOM NQBMOUE [MOQBO.
template <class Type>
class WH {
friend class Handle<Type>;
private:
BMP<Type>* pointer;
WH() : pointer(new BMP<Type> (new(object_space) Type)) {};
BMP<Type>& operator->() { return *pointer; }
};
)E FQ[OH\PNUBQK R [UMUSUEEXY DHCQQOR, DOBOMXU QQXHCIBQK EC LMNGFU OJaUDBX.
class Foo {
private:
WH<Bar> bar; // =7/ &'()*73/7'4$(// )'-0$"* Bar + MP<Bar>
};
Lanou cunuuoro peckpunfopa
<CJHOE QFH\EOGO LUQDMF[BOMC FLUEBFWUE VCJHOEN QHCJOGO, PC FQDHIWUEFUS BOGO, WBO OE [OLLUMZFRCUB
QWUBWFD QQXHOD LHK NDCPCBUHK.
template <class Type>
class SH {
private:
BMP<Type>* pointer;
public:
SH() : pointer(new BMP<Type>(new Type)) { pointer->Grab(); }
SH(const SH<Type>& h) : pointer(h.pointer) { pointer->Grab(); }
246
SH(const WH<Type>& h) : pointer(h.pointer) { pointer->Grab(); }
operator WH<Type>() { return WH<Type>(pointer); }
SH<Type>& operator=(const SH<Type>& h)
{
if (this == &h) return *this;
if (pointer == h.pointer) return *this;
pointer->Release();
h.pointer->Grab();
return *this;
}
BMP<Type>& operator->() { return *pointer; }
};
<CJHOE FQ[OH\PNUBQK LHK OJXWEXY [UMUSUEEXY (C EU LHK [UMUSUEEXY DHCQQC), QQXHCITFYQK EC
OJaUDBX. 8HCGOLCMK DOEQBMNDBOMN, [MFEFSCITUSN H<Type>, F O[UMCBOMEO_ `NED^FF operator
H<Type>() OE BCDZU SOZUB FQ[OH\PORCB\QK R O[UMC^FKY [MFQRCFRCEFK Q NWCQBFUS [UMUSUEEXY DHCQQOR,
BO UQB\ QHCJXY LUQDMF[BOMOR.
class Bar {
private:
WH<Foo> foo;
public:
void f();
};
void Bar::f()
{
SH<Foo> f; // Y&4/4$#"(*(' Foo* f = new Foo;
f = foo; // D)5'#,-3"* operator=(SH<Type>(foo));
foo = f; // D)5'#,-3"* operator WH<Type>(f);
}
Hfepafopu eepyux ykasafene
5OSEFBU VoidPtrIterator? VoidPtrPool ROPRMCTCUB OLFE FBUMCBOM LHK [UMUJOMC RQUY NDCPCBUHU_ Q
EUENHURXSF QWUBWFDCSF QQXHOD. #QU OQBCUBQK JUP FPSUEUEF_, OLECDO QWUBWFD QQXHOD BU[UM\
FEBUM[MUBFMNUBQK [O-LMNGOSN. (CE\VU EUENHURO_ QWUBWFD QQXHOD OPECWCH, WBO OJaUDB EU QHULNUB
NEFWBOZCB\. +U[UM\ OE FSUUB JOHUU NPDOU PECWUEFU: OJaUDB LOQBN[UE EU[OQMULQBRUEEO FP QBUDC. #QU ]BF
OJaUDBX QOYMCEKIBQK, [OQDOH\DN OEF ECYOLKBQK EC [UMFSUBMU, EO SX BCDZU QOYMCEFS OJaUDBX Q
ENHURXSF QWUBWFDCSF QQXHOD, UQHF OEF LOQBN[EX DOQRUEEO.
*HK OJaUDBOR RENBMF [UMFSUBMC SX LOHZEX [UMUJMCB\ LUQDMF[BOMX DCZLOGO OJaUDBC [UMFSUBMC, C
PCBUS MUDNMQFREO LRFGCB\QK RENBM\ LO BUY [OM, [ODC EU JNLNB [UMUJMCEX RQU LOQBN[EXU OJaUDBX. *HK
]BOGO ECS [MFLUBQK CECHFPFMORCB\ OJaUDBX OLEFS FP O[FQCEEXY RXVU Q[OQOJOR. # LCEEOS [MFSUMU
JNLUB FQ[OH\PORCEO QOWUBCEFU RFMBNCH\EXY `NED^F_/FBUMCBOMOR. *HK ]BO_ ^UHF SOZEO QHUGDC
[UMUMCJOBCB\ QBCMX_ FEBUM`U_Q VoidPtrIterator.
class VoidPtrIterator {
protected:
VoidPtrIterator() {}
public:
virtual bool More() = 0;
virtual VoidPtr* Next() = 0;
};
+U[UM\ [NH LOHZUE [OLLUMZFRCB\ LRC BF[C FBUMCBOMOR. )LFE FBUMCBOM [UMUJFMCUB NDCPCBUHF,
ECYOLKTFUQK EC [UMFSUBMU (BO UQB\ FSUITFU EUENHURXU QWUBWFDF QQXHOD). #BOMO_ NDCPCBUHF EC
247
OJaUDBX, ECYOLKTFUQK R NDCPCEEO_ [OHORFEU. !BUMCBOM VoidPtrPool::iterator() FP GHCRX /5
PCSUEKUBQK QHULNITFS:
// G&#>./*, 4 &#$)) VoidPtrPool
class VoidPtrPool {
public:
VoidPtrIterator* Reachable()
{ return new ReachableIterator(this); }
VoidPtrIterator* InRange(void* low, void* high)
{ return new RangeIterator(this); }
};
Ykasafenu nepurefpa
)LFE FP BF[OR FBUMCBOMOR, ROPRMCTCUSXY [NHOS, [UMUJFMCUB EU[OQMULQBRUEEO LOQBN[EXU NDCPCBUHF
(FSUITFU EUENHURO_ QWUBWFD QQXHOD). # QNTEOQBF, [UMUL ECSF BOB ZU VoidPtrPoolIterator Q OLEO_
FPSUEFRVU_QK QBMODO_ BU[UM\ Advance() [MO[NQDCUB [OPF^FF Q ENHURXS QWUBWFDOS QQXHOD. 0HCQQ
MUCHFPORCE DCD [MOFPROLEX_ OB VoidPtrPoolIterator.
class ReachableIterator : public VoidPtrPoolIterator {
protected:
virtual void Advance() // +$?*/ )#"03>K3> /)5'#,-3"23> 5'-/B/>
{
do
VoidPtrPoolIterator::Advance();
while (block != NULL && block->slots[slot].refcount == 0);
}
public:
ReachableIterator(VoidPtrBlock* vpb) : VoidPtrPoolIterator(vpb) {}
};
Hepocfynuue ykasafenu
# DOE^U ^FDHC SX LOHZEX [MO_BFQ\ [O RULNTFS NDCPCBUHKS F EC_BF RQU BU, DOBOMXU [MOLOHZCIB
QQXHCB\QK EC EUCDBFRENI [OHORFEN. 3BO F JNLNB EULOQBN[EXU OJaUDBX. "CLCWN MUVCUB QHULNITF_
FBUMCBOM, R DOBOMOS FQ[OH\PNUBQK OWUMULEOU BMFRFCH\EOU [UMUO[MULUHUEFU VoidPtrPoolIterator.
class InRange : public VoidPtrPoolIterator {
private:
void* low; // +/1(/? $07") 0/$5$-'($
void* high; // G"7C(/? $07") 0/$5$-'($
virtual void Advance() // +$?*/ )#"03>K3> /)5'#,-3"23> 5'-/B/>
{
do
VoidPtrPoolIterator::Advance();
while (block != NULL &&
(block->slots[slot].address < low ||
block->slots[slot].address >= high));
}
public:
InRange(VoidPtrBlock* vpb, void* low_addr, void* high_addr)
: VoidPtrPoolIterator(vpb), low(low_addr), high(high_addr) {}
};
248
Repeop ykasafene e oLekfax
0CZLX_ OJaUDB ROPRMCTCUB LMNGO_ FBUMCBOM VoidPtrIterator, DOBOMX_ [UMUJFMCUB NDCPCBUHF,
LOQBN[EXU EU[OQMULQBRUEEO FP OJaUDBC. *HK DCZLOGO DHCQQC ]BOB FBUMCBOM LOHZUE JXB\ QROFS. *CHUU
[ODCPCE [MFSUM.
class MotherOfAllObject { // P$-'4<? &#$)) 0#% 4)"C ')*$#,(<C
public:
virtual VoidPtrIterator* Pointers() = 0;
};
template <class Type>
class VoidPtrArrayIterator : public VoidPtrIterator {
private:
VoidPtr* ptrs[Entries];
int next; // F#"03>K$% 5'-/B/% 4 5"7";'7"
public:
VoidPtrArrayIterator() : next(0)
{
for (int i = 0; i < Entries; i++)
ptrs[i] = NULL;
}
VoidPtr*& operator[](uint slot) { return ptrs[slot]; }
virtual bool More() { return next < Entries; }
virtual VoidPtr* Next() { return ptrs[next++]; }
};
// =7/2"7 &#$))$ / /*"7$*'7$
class Foo {
private:
WH<Bar> bar;
public:
virtual VoidPtrIterator* Pointers()
{
new VoidPtrArrayIterator<1>* iterator = new VoidPtrArrayIterato<1>;
iterator[0] = bar.Pointer();
return iterator;
}
};
VoidPtrArrayIterator QLUHCE EC QDOMNI MNDN F R MUCH\EOS [MOUDBU UGO FQ[OH\PORCB\ EU QBOFB, EO [O
DMC_EU_ SUMU OE LUSOEQBMFMNUB OJTF_ [MFE^F[. 0OEUWEO, UGO QHULNUB LO[OHEFB\ [MORUMDCSF
LFC[CPOEOR F FEF^FFMORCEFUS FQDHIWUEF_, UQHF JNLUB PCBMUJORCE VoidPtr* LHK NULL.
Foo::Pointers() [ODCPXRCUB OJTF_ [MFE^F[ FQ[OH\PORCEFK VoidPtrArrayIterator. *HK DCZLOGO
DHCQQC SX FPSUEKUS MCPSUM SCQQFRC, WBOJX OE QOR[CLCH Q DOHFWUQBROS WH<Widget> F LOJCRHKUS LHK
DCZLOGO LUQDMF[BOMC [O OLEO_ QBMODU RFLC iterator(index++) = widget.Pointer(). 3BOB VCJHOE
Q[MCRHKUBQK QO RQUSF [MOQBXSF QHNWCKSF, R DOBOMXY ECS EU [MFYOLFBQK JUQ[ODOFB\QK O JCPORXY
DHCQQCY. %QHF Foo FSUUB JCPORXU DHCQQX, [MFLUBQK OMGCEFPORCB\ RHOZUEFU FBUMCBOMOR LHK UGO
QOJQBRUEEXY NDCPCBUHU_ F NDCPCBUHU_ JCPORXY DHCQQOR.
Repeop ykasafene
$CQBCH SOSUEB QOJMCB\ RQU ROULFEO R CHGOMFBSU [UMUJOMC RQUY LOQBN[EXY OJaUDBOR. #QBMUWCK OJaUDB,
DOBOMX_ R LCEEX_ SOSUEB ECYOLFBQK R EUCDBFREO_ [OHORFEU, SX DO[FMNUS UGO R CDBFRENI [OHORFEN F
FPSUEKUS CLMUQ R RULNTUS NDCPCBUHU EC EORNI DO[FI. %QHF EC_LUEEX_ OJaUDB NZU ECYOLFBQK R
CDBFREO_ [OHORFEU, [MUL[OHCGCUBQK, WBO OE NZU JXH QDO[FMORCE, [O]BOSN SX EU BMCBFS RMUSK EC
249
LCH\EU_VFU SCEF[NHK^FF Q EFS. )JaUDBX, EU [MFECLHUZCTFU EF OLEO_ FP [OHORFE, SX [ODC
FGEOMFMNUS.
!EBUM`U_Q Space QHUGDC OBHFWCUBQK OB BOGO, DOBOMX_ FQ[OH\PORCHQK LHK N[HOBEUEFK. #SUQBO OLEOGO
FBUMCBOMC [MFYOLFBQK [OLLUMZFRCB\ QBUD FBUMCBOMOR, [OQDOH\DN SX [UMUSUTCUSQK [O GMC`N OJaUDBOR.
0MOSU BOGO, [OKRFHCQ\ EORCK `NED^FK Scavenge(), DOBOMCK RXPXRCUBQK R DOE^U DCZLOGO [MOYOLC [O
[OHORFEU. 5MUL[OHCGCUBQK, WBO N ECQ NZU FSUUBQK GOBORX_ VCJHOE QBUDC Stack.
template <class Type>
class Stack {
public:
Push(Type*);
Type* Pop(); // G'-47$K$"* NULL 0#% 53)*'8' )*"&$
};
class Space {
private:
VoidPtrIterator* iterator; // D*"7$*'7 4"7C("8' 37'4(%
Stack<VoidPtrIterator> iterator_stack;
HalfSpace A, B;
HalfSpace* active;
HalfSpace* inactive;
void Scavenge(); // H(/.*'1/*, ("0')*35(<" ';E"&*<
void Swap(); // ="7"&#>./*, $&*/4(3> 5'#'4/(3
public:
Space() : active(&a), inactive(&B), iterator(NULL) { Swap(); }
void* Allocate(size_t size)
{
void* space = active->Allocate(size);
if (space == NULL) throw(OutOfMemory());
return space;
}
void Copy1();
};
+MF DHIWURXU `NED^FF Scavenge(), Swap() F Copy1() EFZU MCQQSCBMFRCIBQK JOHUU [OLMOJEO.
Scavenge
:NED^FK Scavenge() RXPXRCUBQK [OQHU OLEOGO [OHEOGO ^FDHC. )EC [UMUJFMCUB RQU RULNTFU NDCPCBUHF
F FTUB OJaUDBX, OQBCRVFUQK R EUCDBFREO_ [OHORFEU. 3BF OJaUDBX EULOQBN[EX. *HK DCZLOGO OJaUDBC
OEC NLCHKUB NDCPCBUH\, DOBOMX_, R QROI OWUMUL\, RXPXRCUB LUQBMNDBOM OJaUDBC.
void Space::Scanvege()
{
VoidPtrIterator* vpi =
VoidPtr::pool->InRange(inactive, inactive + sizeof(*inactive));
while (vpi->More()) {
VoidPtr* vp = vpi->Next();
delete vp; // G<-<4$"* 0")*73&*'7 3&$-<4$"2'8' ';E"&*$
}
delete vpi;
}
250
Swap
:NED^FK Swap() [UMUDHIWCUB CDBFRENI [OHORFEN. .ECWCHC OEC RXPXRCUB Scavenge() R PCRUMVUEFU
[MULXLNTUGO ^FDHC, C [OBOS QJMCQXRCUB RQU R FQYOLEOU QOQBOKEFU, WBOJX [MF QHULNITUS RXPORU
`NED^FF Copy1() DO[FMORCEFU [OVHO R OJMCBENI QBOMOEN.
void Space::Swap()
{
Scavenge(); // H(/.*'1/*, ';E"&*< 4 ("$&*/4('? 5'#'4/("
if (active == &A)
{
active = &B;
inactive = &A;
}
else
{
active = &A;
inactive = &B;
}
active->Reinitialize();
iterator = VoidPtr::pool->iterator();
}
Copy1
:NED^FK Copy1() MCQQSCBMFRCUB OLFE OJaUDB. %QHF OJaUDB ECYOLFBQK R EUCDBFREO_ [OHORFEU, OE
DO[FMNUBQK R CDBFRENI. %QHF OJaUDBC EUB, BO R MCSDCY BUDNTU_ PCLCWF SX [MUL[OHCGCUS, WBO OE
ECYOLFBQK R CDBFREO_ [OHORFEU, C QHULORCBUH\EO, JXH [UMUSUTUE MCEUU.
void Space::Copy1()
{
if (!iterator->More())
{
// ="7";'7 -$&'(."(, 30$#/*, /*"7$*'7 / 4<*'#&(3*, /- )*"&$
delete iterator;
iterator = iterator_stack.Pop();
if (iterator == NULL) // 6'*'4'!
Swap(); // +$./($"2 04/8$*,)% 4 07383> )*'7'(3
}
else
{
VoidPtr* vp = iterator->Next();
if (vp->address >= &inactive &&
vp->address < &inactive + sizeof(*insactive))
{
// L;E"&* 0')*35"( / "8' (31(' 5"7"2")*/*,
void* new_space = active->Allocate(vp->size);
if (new_space == NULL)
// D)&#>."(/" ("C4$*&$ 5$2%*/
memcpy(new_space, vp->address, vp->size);
vp->address = new_space;
iterator_stack.Push(iterator);
iterator = vp->address->Pointers();
25.
}
// D($." 5"7"2"K"(/" 31" )')*'%#'),
}
}
Onfurusauun
+OH\DO WBO O[FQCEEX_ CHGOMFBS Q[OQOJUE MUPDO BOMSOPFB\ [MOGMCSSN [MF DCZLOS PC[NQDU `NED^FF
Scavenge(). *HK O[BFSFPC^FF [O OBLUH\EOQBF FHF RSUQBU SOGNB FQ[OH\PORCB\QK LRC QHULNITFY
[OLYOLC:
/. :NED^FK Scavenge() MCJOBCUB [O]BC[EO, C EU DCD ULFECK O[UMC^FK. *HK ]BOGO RCS [MFLUBQK
SOLF`F^FMORCB\ Copy1(), WBOJX UU [OQHULORCBUH\EX_ CECHOG RXPXRCHQK LO PCRUMVUEFK
QJOMDF SNQOMC.
2. #ULUEFU OBLUH\EXY Q[FQDOR FQ[OH\PNUSXY RULNTFY NDCPCBUHU_ LHK DCZLO_ [OHORFEX RSUQBO
[UMUJOMC QOLUMZFSOGO VoidPtrPool LHK FY [OFQDC. 5MF [UMUSUTUEFF DCZLOGO OJaUDBC FP
EUCDBFREO_ [OHORFEX R CDBFRENI RULNTF_ NDCPCBUH\ BCDZU [UMUSUTCUBQK FP OLEOGO Q[FQDC R
LMNGO_. # DOE^U ^FDHC N[HOBEUEFK LHK EUCDBFREO_ [OHORFEX OQBCUBQK Q[FQOD HFV\ BUY
RULNTFY NDCPCBUHU_, DOBOMXU LOHZEX JXB\ NEFWBOZUEX.
#MKL HF ]BF RCMFCEBX O[BFSFPC^FF QBOFB [MFSUEKB\ R MUCH\EXY [MOUDBCY OQOJUEEO RBOMO_,
[OQDOH\DN RULUEFU Q[FQDOR [OBMUJNUB PECWFBUH\EO JOH\VFY PCBMCB [CSKBF F JXQBMOLU_QBRFK.
Bueuuue oLekfu
)JaUDBX, DOBOMXU QNTUQBRNIB PC [MULUHCSF [MOQBMCEQBRC QJOMDF SNQOMC, QHUGDC NQHOZEKIB ECVN
PCLCWN. )JaUDBX RENBMF [MOQBMCEQBRC SOGNB QQXHCB\QK EC ]BF REUVEFU OJaUDBX. .CSO [O QUJU ]BO EU
RXPORUB [MOJHUS, [OQDOH\DN [UMUSUTCIBQK BOH\DO OJaUDBX EUCDBFREO_ [OHORFEX. 5MOJHUSX
ROPEFDCIB R QFBNC^FKY, DOGLC REUVEFU OJaUDBX QQXHCIBQK EC RENBMUEEFU. #UMOKBEO, OEF JNLNB
FQ[OH\PORCB\ LUQDMF[BOMX, EO ]BO PCSUBEO [ORXQFB QHOZEOQB\ CHGOMFBSC QJOMDF SNQOMC/N[HOBEUEFK.
5OBMUJNIBQK QHULNITFU FPSUEUEFK:
/. 0CZLX_ REUVEF_ OJaUDB BCDZU LOHZUE OJHCLCB\ QMULQBRCSF [UMUJOMC NDCPCBUHU_ F QOJHILCB\
[MCRFHO LUQDMF[BOMX [ORQILN, [O DMC_EU_ SUMU LHK QQXHOD EC RENBMUEEFU OJaUDBX.
2. 0CZLX_ REUVEF_ OJaUDB RO RMUSK OWUMULEOGO [MOYOLC LOHZUE NSUB\ [OSUWCB\ QUJK DCD
[MOQSOBMUEEX_.
3. %QHF OJaUDB R `NED^FF Copy1() KRHKUBQK REUVEFS F EU[OSUWUEEXS, OE [OSUWCUBQK, C UGO
FBUMCBOM PCEOQFBQK R QBUD, EO QCS OJaUDB [MF ]BOS EU [UMUSUTCUBQK.
Muoecfeeuuue npocfpaucfea
0OGLC JCPORCK QBMNDBNMC JNLUB ECHCZUEC, OJaUDBX R [MOQBMCEQBRU QJOMDF SNQOMC SOZEO JUP OQOJXY
[MOJHUS OJaULFEFB\ Q OJaUDBCSF, N[MCRHKUSXSF LMNGFSF QMULQBRCSF. ,HCREOU WBOJX RQU OJaUDBX
QOBMNLEFWCHF R [MO^UQQU [UMUJOMC NDCPCBUHU_. .[OQOJ N[MCRHUEFK OJaUDBOS HUGDO O[MULUHKUBQK [O UGO
CLMUQN.
Copka rycopa u ynnofueuue ua recfe
(UVUEFK FP [MULXLNTU_ GHCRX, DOBOMXU [OSOGHF ECS [MURMCBFB\ QYUSN LUQDMF[BOMX [ORQILN R
N[HOBEUEFU EC SUQBU, SOZEO [MFSUEFB\ F R LCEEO_ QYUSU. 3BO [OPROHFB OMGCEFPORCB\ QJOMDN SNQOMC EC
SUQBU F OJO_BFQ\ JUP DO[FMORCEFK OJaUDBOR R [CSKBF. .NTUQBRNIB LRC RCMFCEBC ]BO_ QYUSX: Q
N[HOBEUEFUS F JUP. # OJOFY QHNWCKY FQ[OH\PNUBQK CHGOMFBS [OSUBDF F NLCHUEFK EC [UMROS [MOYOLU
O[MULUHKIBQK LOQBN[EXU OJaUDBX, C EC RBOMOS [MOFQYOLFB QJOMDC SNQOMC F [MF EUOJYOLFSOQBF
N[HOBEUEFU. -HGOMFBS [MUL[OHCGCUB, WBO R DHCQQ VoidPtr LOJCRHUE Q[U^FCH\EX_ JFB [OSUBDF:
/. .EKB\ [OSUBDN QO RQUY VoidPtr, OBQNBQBRNITFY R Q[FQDU QROJOLEXY NDCPCBUHU_.
2. 5OSUBFB\ RQU VoidPtr Q EUENHURXS QWUBWFDOS QQXHOD; BO UQB\ [OSUBFB\ OJaUDBX, LOQBN[EXU
EU[OQMULQBRUEEO FP QBUDC.
252
3. *HK DCZLOGO BOH\DO WBO [OSUWUEEOGO VoidPtr [OSUBFB\ RQU VoidPtr, REULMUEEXU R OJaUDBX,
EC DOBOMXU OEF QQXHCIBQK. 5MF ]BOS FQ[OH\PNIBQK BU ZU FBUMCBOMX, WBO F LHK CHGOMFBSC
8U_DUMC.
4. 5ORBOMKB\ VCG 3, [ODC NLCUBQK ECYOLFB\ EORXU [OSUWCUSXU OJaUDBX.
5. 4LCHFB\ RQU VoidPtr, EU [OSUWUEEXU F EU ECYOLKTFUQK R Q[FQDU QROJOLEXY; R QROI OWUMUL\,
]BO [MFRULUB D RXPORN LUQBMNDBOMOR NDCPXRCUSXY OJaUDBOR. %QHF RX EU QOJFMCUBUQ\ RX[OHEKB\
N[HOBEUEFU, QHULNUB RUMENB\ [CSKB\, PCEFSCUSNI ]BFSF OJaUDBCSF.
6. %QHF N[HOBEUEFU RX[OHEKUBQK, [UMUJMCB\ RQU [OSUWUEEXU VoidPtr R [OMKLDU ROPMCQBCEFK
CLMUQOR NDCPXRCUSXY OJaUDBOR F QSUQBFB\ OJaUDBX REFP LHK N[HOBEUEFK `MCGSUEBFMORCEEOGO
[MOQBMCEQBRC.
.LUHCB\ RQU ]BO [O]BC[EO EUQDOH\DO QHOZEUU, EO UQHF LU_QBRORCB\ REFSCBUH\EO, ROPSOZEO F ]BO.
,HCREOU [OSEFB\, WBO OJaUDB, QBCRVF_ EULOQBN[EXS, LOQBN[EXS NZU EU QBCEUB. )JaUDB, DOBOMX_
JXH LOQBN[UE R ECWCHU [MOYOLC, EO QBCH EULOQBN[EXS RO RMUSK EUGO, SOZEO EU NEFWBOZCB\. 5CSKB\
]BOGO OJaUDBC JNLUB ROPRMCTUEC RO RMUSK QHULNITU_ [MOGNHDF [O [CSKBF.
Hyuo nu eusueafu pecfpykfopu?
$NZEO HF RXPXRCB\ LUQBMNDBOMX OJaUDBOR, QBCRVFY EULOQBN[EXSF? $C ]BOB RO[MOQ BMNLEO LCB\
OLEOPECWEX_ OBRUB. >OBFBU HF RX, WBOJX OEF RXPXRCHF `NED^FF LMNGFY OJaUDBOR (LOQBN[EXY FHF
EUB)? 5MUL[OHCGCUBQK, WBO LUQBMNDBOMX EU NLCHKIB LMNGFU OJaUDBX; Q ]BO_ ^UH\I SX F OMGCEFPORCHF
QJOMDN SNQOMC, [O]BOSN EC LOHI LUQBMNDBOMOR OQBCUBQK EU BCD NZ SEOGO. . LMNGO_ QBOMOEX, FEOGLC R
QROFY LUQBMNDBOMCY OJaUDBX LUHCIB WBO-BO LMNGOU EC[MFSUM, OQROJOZLCIB QFQBUSEXU MUQNMQX FHF
PCDMXRCIB `C_HX. # OJTUS, N SUEK EUB GOBOROGO OBRUBC. (UVC_BU QCSF R PCRFQFSOQBF OB QFBNC^FF.
Tonuko pnn npoqeccuouanuuux kackapepoe
$CRUMEKDC RX PCGHKENHF R ]BOB MCPLUH YOBK JX FP HIJO[XBQBRC, EU [MCRLC HF? - SOZUB, RX QBOFBU R
DEFZEOS SCGCPFEU F LNSCUBU, QBOFB HF [ODN[CB\ ]BN DEFGN, F RLMNG [MF [MOQSOBMU OGHCRHUEFK RCS R
GHCPC JMOQFHOQ\ FEBMFGNITUU ECPRCEFU. *C HCLEO, [MFPECRC_BUQ\ K F QCS BCDO_.
#SUQBU Q ECQBOKTFSF QOMRFGOHORCSF, DOBOMXU [MFRXDHF ZFB\ EC GMCEF MFQDC, SX [OQSOBMFS, DCD
OMGCEFPORCB\ N[MCRHUEFU [CSKB\I LHK BMCLF^FOEEXY DHCQQOR (R OBHFWFU OB DHCQQOR, [OQBMOUEEXY [O
[MFE^F[N LUQDMF[BOMX [ORQILN). #UMOKBEO, [MFRULUEEX_ EFZU SCBUMFCH [OECLOJFBQK HFV\ OWUE\
EUSEOGFS WFBCBUHKS, LC F BU LOHZEX OWUE\ YOMOVO [MOGMCSSFMORCB\ EC .++. $N, C UQHF RX RQU UTU
MCPLNSXRCUBU ECL BUS, QBOFB HF [ODN[CB\ DEFGN DN[FBU F [MOWFBC_BU EUQDOH\DO QOBUE [MULXLNTFY
QBMCEF^.
$FZU O[FQCEX EUDOBOMXU DOE^U[^FF QJOMDF SNQOMC, DOBOMXU EU [UMUSUTCIB OJaUDBX R [CSKBF F
BMUJNIB EFDCDFY OQOJXY [MCRFH [MOGMCSSFMORCEFK (PC FQDHIWUEFUS [UMRO_ DOE^U[^FF). &
OGMCEFWFRCIQ\ OJTFSF ECJMOQDCSF, [OQDOH\DN DOL QFH\EO PCRFQFB OB QBMNDBNM LCEEXY, RXJMCEEXY
LHK MUCHFPC^FF CMYFBUDBNMX. # DOE^U DOE^OR, [MURMCTUEFU FLU_ R [MOGMCSSEX_ DOL [MCRO BUY, DBO
EC ]BO Q[OQOJUE.
Kouuenuuu rafepu ecex oLekfoe
$CWEUS Q MUVUEF_, [OQBMOUEEXY EC FLUU SCBUMF RQUY OJaUDBOR (Mother Of All Objects, MOAO).
1BOJX EU ROPRMCTCB\ FBUMCBOM LHK VoidPtr, RFMBNCH\ECK `NED^FK SOZUB ROPRMCTCB\ FBUMCBOM LHK
void*& FHF MOAO*&. #XGHKLFB R[OHEU MCPNSEO, [ODC RX EU OQBCEORFBUQ\ F Q[MOQFBU QUJK C [OWUSN
SX OBDCPCHFQ\ OB LUQDMF[BOMOR [ORQILN? .DOMUU RQUGO, FP-PC BOGO, WBO EU SOGHF R LOQBCBOWEO_
QBU[UEF N[MCRHKB\ FSF. #OPSOZEO, RX NECQHULORCHF (VNBDC FP OJHCQBF .++) JFJHFOBUDN DHCQQOR,
QOPLCEENI DUS-BO LMNGFS, F EU PCYOBUHF [UMU[FQXRCB\ UU [O [MFE^F[N LUQDMF[BOMX, OLEF
LUQDMF[BOMX F EFWUGO, DMOSU LUQDMF[BOMOR. 6OZUB, RX QWFBCUBU, WBO RCVF DHFUEBX F DOHHUGF
[O[MOQBN EU [O_SNB QBOH\ QHOZEO_ CMYFBUDBNMX. - SOZUB, RCS EU YOWUBQK [MURMCTCB\ .++ R EUDOU
[OLOJFU SmallTalk, YOBK JX R OJHCQBF SUZOJaUDBEXY QQXHOD. 0CDFSF JX [MFWFECSF RX EF
MNDOROLQBRORCHFQ\, EUHOGFWEO OBDCPXRCB\QK OB LUQDMF[BOMOR [ORQILN F OQBCRHKB\ LMNGFU
BMUJORCEFK [MOFPROLFB\ RQU OB OJTUGO JCPOROGO DHCQQC, [UMUJFMCB\ NDCPCBUHF F [HKQCB\ RODMNG
CLMUQOR [UMUSUEEXY F JCPORXY DHCQQOR. *CRC_BU-DC HNWVU PC_SUSQK BUS, WBO LOQBO_EO ECQBOKTFY
[MOGMCSSFQBOR.
253
6CBUMFCH, FPHOZUEEX_ LCHUU, LUHFBQK EC WUBXMU BUSX:
/. )MGCEFPC^FK [CSKBF.
2. 5OFQD [UMFSUBMC.
3. 5UMUJOM RENBMF [UMFSUBMC.
4. .JOMDC SNQOMC.
Oprauusauun narnfu
.NTUQBRNUB EUQDOH\DO DHIWURXY RO[MOQOR, EC DOBOMXU RX LOHZEX NSUB\ JXQBMO OBRUWCB\. - LHK ]BOGO
EUOJYOLFSO, WBOJX [CSKB\ ECYOLFHCQ\ R JOHUU-SUEUU OMGCEFPORCEEOS QOQBOKEFF:
/. !PRUQBUE EUDF_ NWCQBOD [CSKBF. >MCEFBQK HF R EUS CLMUQ FHF WBO-BO LMNGOU QDCZUS, EOSUM
JCEDORQDOGO QWUBC?
2. !PRUQBUE CLMUQ. .QXHCUBQK HF OE EC OJaUDB FHF [MOQBO EC QHNWC_EOU SUQBO R [CSKBF?
3. !PRUQBUE CLMUQ OJaUDBC. 0 WUSN OE OBEOQFBQK D RSUTCITUSN OJaUDBN FHF ZU D [UMUSUEEO_
FHF JCPOROSN DHCQQN LMNGOGO OJaUDBC?
Enoku narnfu
4[MCRHKUSX_ JHOD [CSKBF ECWFECUBQK Q DOMOBDOGO PCGOHORDC, R DOBOMOS YMCEFBQK QHULNITCK
FE`OMSC^FK:
`FPFWUQDF_ MCPSUM JHODC;
[MFPECD FQ[OH\PORCEFK JHODC;
HOGFWUQDF_ MCPSUM JHODC.
5UMROECWCH\EO RQK [CSKB\ [MULQBCRHKUB QOJO_ OLFE JOH\VO_ JHOD. 0OGLC JHOD LUHFBQK, OE RQUGLC
LUHFBQK [O[OHCS. (UDNMQFREOU LUHUEFU [MOLOHZCUBQK, [ODC EU JNLUB EC_LUE JHOD, MCPSUM DOBOMOGO
MCRUE SFEFSCH\EO_ QBU[UEF 2, LOQBCBOWEO_ LHK YMCEUEFK QOPLCRCUSOGO OJaUDBC. # [MO^UQQU NLCHUEFK
[O ECWCH\EOSN CLMUQN JHODC F UGO MCPSUMN SOZEO HUGDO O[MULUHFB\ UGO [CMEX_ JHOD; ]BO OJUQ[UWFRCUB
]``UDBFREOU OJaULFEUEFU QSUZEXY QROJOLEXY JHODOR.
- BU[UM\ OBRUBFS EC RO[MOQX, [UMUWFQHUEEXU RXVU.
Hennefcn nu suaeuue appecor?
&RHKUBQK HF EUDOBOMCK WUBMUYJC_BORCK (EC JOH\VFEQBRU DOS[\IBUMOR) RUHFWFEC CLMUQOS [CSKBF?
8NLUS QWFBCB\, WBO KRHKUBQK, UQHF OEC NDCPXRCUB RENBM\ RQUGO N[MCRHKUSOGO [MOQBMCEQBRC (BO UQB\
FQYOLEOGO, EUMCPLUHUEEOGO JHODC).
Hennefcn nu appec appecor oLekfa?
8NLUS QWFBCB\, WBO KRHKUBQK, UQHF CLMUQ HUZFB R HOGFWUQDOS LFC[CPOEU FQ[OH\PNUSOGO JHODC.
'OGFWUQDF_ LFC[CPOE ECWFECUBQK [OQHU PCGOHORDC F PCRUMVCUBQK EC UGO HOGFWUQDOS MCPSUMU.
$CFSUE\VF_ JHOD, QOLUMZCTF_ LCEEX_ CLMUQ, ECYOLFBQK Q [OSOT\I [OFQDC R JFECMEOS LUMURU
[CSKBF. %QHF CLMUQ ECYOLFBQK PC [MULUHCSF N[MCRHKUSO_ [CSKBF F NDCPXRCUB EC EUFQ[OH\PNUSX_ JHOD
FHF EC PCGOHOROD JHODC, OE EU SOZUB JXB\ CLMUQOS OJaUDBC.
Ccunaefcn nu appec ua oLekf eepxuero ypoeun?
%QHF BOWDC, EC DOBOMNI QQXHCUBQK CLMUQ, MCQ[OHOZUEC QMCPN ZU [OQHU PCGOHORDC FQ[OH\PNUSOGO JHODC,
BO CLMUQ QQXHCUBQK EC OJaUDB RUMYEUGO NMOREK. %QHF CLMUQ QQXHCUBQK EC EUDOBOMNI RENBMUEEII BOWDN
OJaUDBC, OE QOOBRUBQBRNUB [UMUSUEEO_ DHCQQC FHF JCPOROSN DHCQQN RSUTCITUGO OJaUDBC.
Eucfpopecfeue
%QHF N[MCRHKUSCK [CSKB\ FSUUB LHFEN N JC_B F RX EFDOGLC EU RXLUHKUBU SUEUU 2
M
JC_B, BO OBRUBX EC
RQU BMF RO[MOQC [OBMUJNIB EU JOHUU N-M [MOQSOBMOR PCGOHORDOR JHODOR. $C[MFSUM, UQHF N=20 (OLFE
SUGCJC_B), C M=4 (SFEFSCH\EX_ MCPSUM JHODC MCRUE /6 JC_BCS), [OBMUJNUBQK EU JOHUU /6 [O[XBOD. 3BO
254
EU BCD NZ SCHO, [O]BOSN RCZEO EC_BF O[BFSCH\EX_ MCPSUM JHODC JOH\VFU JHODF NRUHFWFRCIB
`MCGSUEBC^FI, EO QODMCTCIB DOHFWUQBRO [MOQSOBMOR.
Rouck nepurefpa
.EKBFU OGMCEFWUEFK LUQDMF[BOMX [ORQILN OPECWCUB, WBO JNLUB MCPMUVUE DOL EC[OLOJFU
QHULNITUGO:
class Foo {
private:
Bar* bar;
};
Foo* f = new Foo;
0MOSU BOGO, ]BO OPECWCUB, WBO JNLNB MCPMUVUEX NDCPCBUHF EC JCPORXU DHCQQX ([OSEFBU LNMC^DFU
`ODNQX Q this?) F NDCPCBUHF EC [UMUSUEEXU DHCQQOR. 0OEWUEO, QBCEORFBQK ECSEOGO QHOZEUU
O[MULUHFB\, WBO LOQBN[EO, C WBO EUB, ECWFECK Q [OFQDC [UMFSUBMC. (CQQSOBMFS LRC RCMFCEBC.
Yruue ykasafenu
0CD F [MUZLU, QCSOU ECLUZEOU YMCEFB\ NSEXU NDCPCBUHF R QBUDU, LCZU UQHF OEF F EU KRHKIBQK
LUQDMF[BOMCSF. *HK [UMUJOMC ]BFY NDCPCBUHU_ SOZEO ROQ[OH\PORCB\QK QDMXBO_ DOHHUD^FU_.
0OEQBMNDBOM NSEOGO NDCPCBUHK PCEOQFB UGO R DOHHUD^FI, C LUQBMNDBOM NLCHKUB.
Repeop cfeka
#OPSOZEO, ]BO PRNWFB LOROH\EO QBMCEEO, OLECDO [UMFSUBM SOZEO O[MULUHFB\ [MFJHFZUEEO, Q OVFJDO_
R DOEQUMRCBFRENI QBOMOEN (BO UQB\ Q PC[CQOS). *OQBCBOWEO [MOQBO [MOQDCEFMORCB\ QBUD F EC_BF R EUS
PECWUEFK, QOOBRUBQRNITFU CLMUQCS OJaUDBOR. #QUGLC QNTUQBRNUB RUMOKBEOQB\, WBO BCS EC_LUBQK
[UMUSUEECK Q BUHU`OEOS BUBNVDF 6FHHF FP $UJMCQDF, DOBOMCK [O WFQBO_ QHNWC_EOQBF QOR[CLCUB Q
CLMUQOS EUDOBOMOGO OJaUDBC R [CSKBF. 3BO ECPXRCUBQK (,("+C(#3 8$+9+"#24 (pointer aliasing). #
MUPNH\BCBU OJaUDB [OSUWCUBQK DCD LOQBN[EX_, YOBK R LU_QBRFBUH\EOQBF OE EULOQBN[UE. )JXWEO ]BO EU
FSUUB RMULEXY [OQHULQBRF_, MCPRU WBO EUQDOH\DO EUFQ[OH\PNUSXY JC_B EU JNLNB ROPRMCTUEX R
QFQBUSN. 5OLNSC_BU YOMOVUE\DO QHNWC_EX_ CLMUQ R QBUDU LOHZUE EU BOH\DO QQXHCB\QK EC ENZEOU
SUQBO R [CSKBF, EO F JXB\ #)(*."&#**', NDCPCBUHUS EC EULOQBN[EX_ OJaUDB. # OJTUS, OQOJUEEO
[UMUZFRCB\ EU QBOFB.
Rorefka oLekfoe
!BCD, RX O[MULUHFHF, WBO QBUDORCK RUHFWFEC QQXHCUBQK EC LO[NQBFSX_ OJaUDB. +U[UM\ EUOJYOLFSO
[OSUBFB\ ]BOB OJaUDB. 8FB [OSUBDF LOHZUE JXB\ WCQB\I PCGOHORDC JHODC, [O]BOSN ULFEQBRUEECK
YFBMOQB\ PCDHIWCUBQK R BOS, DCD ]``UDBFREO EC_BF ECFSUE\VF_ QOLUMZCTF_ JHOD. *HK ]BOGO [MFLUBQK
[UMUJFMCB\ LUMURO [CSKBF LO BUY [OM, [ODC EU JNLUB EC_LUE PCGOHOROD ECFSUE\VUGO JHODC.
Repeop euyfpu nepurefpa
5OQHU BOGO DCD RX O[MULUHFBU [UMFSUBM OLEFS FP [UMUWFQHUEEXY RXVU Q[OQOJOR, ROPEFDCUB
QHULNITCK PCLCWC [MO_BFQ\ [O RQUS OJaUDBCS RENBMF [UMFSUBMC. ! QEORC QNTUQBRNIB LRC OQEOREXY
RCMFCEBC: CECHFP OJaUDBC FHF FEBUM[MUBC^FK RQUY PECWUEF_ DCD [OBUE^FCH\EXY NDCPCBUHU_.
Auanus oLekfa
5MOGMCSSN SOZEO RFLOFPSUEFB\, WBOJX R [UMUJOM RDHIWCHFQ\ BOH\DO NDCPCBUHF RENBMF DCZLOGO
OJaUDBC. 5MF ]BOS SOZEO FQ[OH\PORCB\ MUVUEFU Q RFMBNCH\EXSF `NED^FKSF, OJaUDBCSF DHCQQOR FHF
LCZU PCQBCRFB\ NSEXU NDCPCBUHF OMGCEFPORCB\ [UMUJOM NDCPCBUHU_ R BUY OJaUDBCY, EC DOBOMXU OEF
QQXHCIBQK. # HIJOS QHNWCU RCS [MFLUBQK OQEORCBUH\EO [OBMNLFB\QK ECL SOLF`FDC^FU_ DOLC RCVFY
DHCQQOR.
Cunoeoe peueuue
#BOMO_ RCMFCEB [MOQDCEFMORCB\ RUQ\ HOGFWUQDF_ MCPSUM DCZLOGO [OSUWUEEOGO OJaUDBC R [OFQDCY
[OBUE^FCH\EXY CLMUQOR OJaUDBOR. 6X LUHCUS BO ZU QCSOU, WBO LUHCHOQ\ MCE\VU LHK QBUDC, F
255
QBCHDFRCUSQK QO PECDOSO_ [MOJHUSO_ FSFBC^FF NDCPCBUHU_ MCPLMCZCITU_, EO JUPRMULEO_. 0CZLX_
MCP, DOGLC JNLUB EC_LUEO PECWUEFU, QOOBRUBQBRNITUU CLMUQN EUDOBOMOGO OJaUDBC, ]BOB OJaUDB
[OSUWCUBQK F RDHIWCUBQK R MUDNMQFI.
Bueuuue oLekfu
5MF N[MCRHUEFF EUQDOH\DFSF [MOQBMCEQBRCSF [CSKBF SOZEO RQBMUBFB\ OJaUDBX, ECYOLKTFUQK EU R
GHCREOS [MOQBMCEQBRU, R DOBOMOS [MOFQYOLFB QJOMDC SNQOMC, C R LMNGOS [MOQBMCEQBRU [O RCVUSN
RXJOMN. +OB `CDB, WBO OJaUDB KRHKUBQK REUVEFS, EU QEFSCUB Q RCQ OBRUBQBRUEEOQBF OE R[OHEU SOZUB
QQXHCB\QK OJMCBEO, R N[MCRHKUSOU [MOQBMCEQBRO. %QHF ]BO [MOQBMCEQBRO EU JXHO MCQQWFBCEO EC
]``UDBFREX_ [UMUJOM NDCPCBUHU_ (BO UQB\ EU FSUUB PCGOHORDOR OJaUDBOR), LCH\VU RXDMNWFRC_BUQ\
QCSF.
Copka rycopa
!BCD, D DOE^N `CPX [OSUBDF RX O[MULUHFHF LOQBN[EXU OJaUDBX. 1BO ZU LCH\VU? 8UP LUQDMF[BOMOR F
RULNTFY NDCPCBUHU_ N[HOBEUEFU EUO[MCRLCEO, [OQDOH\DN EU QNTUQBRNUB ULFEOGO SUQBC, R DOBOMOS
SOZEO JXHO JX OJEORFB\ CLMUQ [UMUSUTCUSOGO OJaUDBC. +UOMUBFWUQDF SOZEO QLUHCB\ RBOMO_ [MOYOL
[O [CSKBF F OJEORFB\ RQU NDCPCBUHF BUS ZU Q[OQOJOS, DOBOMX_ FQ[OH\PORCHQK [MF [OSUBDU LOQBN[EXY
OJaUDBOR. 5MUZLU WUS ]BO LUHCB\, PCDN[FBU [OJOH\VU CD^F_ [MOFPROLFBUHU_ SOTEXY RISC-
DOS[\IBUMOR: MCJOBX N EFY [MFJCRFBQK. 8OHUU [MCDBFWEOU MUVUEFU OMGCEFPORCB\ QJOMDN SNQOMC EC
SUQBU.
%QHF RX EU SOZUBU GCMCEBFMORCB\, WBO RQU OJaUDBX [MOFQYOLKB OB OJTUGO [MULCD, LUQBMNDBOMX HNWVU
EU RXPXRCB\ (C UQHF SOZUBU, BO PCWUS FQ[OH\PORCB\ BCDNI FPRMCTUEENI F EUECLUZENI CMYFBUDBNMN?).
#[OHEU SOZUB ODCPCB\QK, WBO RX FSUUB LUHO Q int FHF char*; EFDBO EU GCMCEBFMNUB, WBO N RCVUGO
OJaUDBC UQB\ v-BCJHF^C! $U PCJXRC_BU O BOS, WBO .++ ]BO RQU-BCDF EU Lisp F EU SmallTalk.
Rocnepoeafenuuan copka rycopa
-HGOMFBSX [OSUBDF F NLCHUEFK LOROH\EO BMNLEO MUCHFPORCB\ R [OQHULORCBUH\EOS RCMFCEBU, EO [MF
LOHZEOS REFSCEFF ROPSOZEO F ]BO. 0 QOZCHUEFI, [OLMOJEOQBF RXYOLKB PC MCSDF ]BO_ DEFGF, EO OEF
OBEOQKBQK EU D .++, C D RXJMCEEXS RCSF DOEDMUBEXS CHGOMFBSCS.
Hforoeue nepcnekfueu
# LRNY [OQHULEFY GHCRCY K [O[XBCHQK [ODCPCB\, DCD QLUHCB\ EC .++ BO, LHK WUGO OE EU [MULECPECWUE. #
SUBOLFDCY N[MCRHUEFK [CSKB\I QOWUBCUBQK RQU, O WUS GOROMFHOQ\ R DEFGU, OB [MOQBU_VFY NSEXY
NDCPCBUHU_ F GOSOSOM`FPSC LO OJaUDBOR DHCQQOR F [OLQWUBC QQXHOD. $O FSUUB HF RQU QDCPCEEOU DCDOU-
EFJNL\ [MCDBFWUQDOU PECWUEFU FHF KRHKUBQK RXQODOFEBUHHUDBNCH\EXS MCPRHUWUEFUS?
#O-[UMRXY, HNWVF_ Q[OQOJ [OEKB\ GMCEF^X ROPSOZEOQBU_ .++ F MCPOJMCB\QK R UGO FLFOSCY PCHUPB\
R LUJMF N[MCRHUEFK [CSKB\I. *CZU UQHF R RCVFY [MOUDBCY ]BO EU ENZEO, YOMOVUU [OEFSCEFU KPXDORXY
OGMCEFWUEF_ F [MULQBCRHUEFK OJaUDBOR R [CSKBF BOH\DO [O_LUB RCS EC [OH\PN. # DOE^U DOE^OR, ]BO
[ORXQFB RCVN DRCHF`FDC^FI R OBHCLDU, [OQDOH\DN RX JNLUBU LOQDOECH\EO [OEFSCB\, DCD OJaUDBX
YMCEKBQK R [CSKBF.
#O-RBOMXY, R OLFE [MUDMCQEX_ LUE\ [UMUL RCSF SOZUB ROPEFDENB\ PCLCWC: OMGCEFPORCB\ QUM\UPEOU
N[MCRHUEFU [CSKB\I [O [MOSXVHUEEXS QBCELCMBCS. 0OGLC ]BC JULC [MOFPO_LUB, RX JNLUBU D EU_
GOBORX. ! [OSEFBU, WBO ]BF GHCRX EU QOLUMZCB DOEDMUBEXY MUVUEF_, C HFV\ [ODCPXRCIB, DCD
MUCHFPNIBQK EC .++ CHGOMFBSX, RXDO[CEEXU [XHF CDCLUSFWUQDFY FPLCEF_. #QU O[FQCEEXU [MFUSX
[MFGOLKBQK, EO SX HFV\ SFSOYOLOS DOQENHFQ\ ]BO_ OJVFMEO_ BUSX.
#-BMUB\FY, [MULQBCR\BU QUJU RUWUMFEDN [O .++. #X ZLUBU, DOGLC ODMNZCITFU [MFLNB R YOMOVUU
MCQ[OHOZUEFU LNYC, JUMUBU SCMBFEF F [MOFPEOQFBU DHIWURNI `MCPN: 5OSEI, HUBOS 95-GO LUHCHF SX
OLFE [MOUDB EC .++, F ROPEFDHC PCLCWC: MUCHFPORCB\ QYUSN QJOMDF SNQOMC Q N[HOBEUEFUS
(CPRHUDC_BUQ\!
RPHROXEHHE

Java npofue C++
5MF RFLU CZFOBCZC, [OLEKBOGO RODMNG Java, EUROH\EO ROPEFDCUB RO[MOQ: C EU KRHKUBQK HF ]BO OJXWEO_
MUDHCSEO_ VNSFYO_, ULFEQBRUEECK ^UH\ DOBOMO_ PCQBCRFB\ RCQ DN[FB\ OWUMULEO_ KPXD, OJEORFB\
DOS[\IBUM F [MFOJMUQBF DNWN DEFG? #UMKBEO, RCS [MFYOLFHOQ\ RFLUB\, DCD OJOPMURCBUHF R RCVUS
HIJFSOS DOS[\IBUMEOS ZNMECHU ECPXRCIB Java EORO_ RUMQFU_ .++. %QHF ]BO LU_QBRFBUH\EO BCD, BO
QBOFB HF RCS, PECBODN .++, JUQ[ODOFB\QK OJ ]BOS EOROS KPXDU?
Java ]BO [MOQBO )(+2#$" .++. 0OU-DBO ECPXRCUB Java RXWFTUEEXS RCMFCEBOS .++, FP DOBOMOGO
NJMCEX EUDOBOMXU MULDO FQ[OH\PNUSXU F EUHOGFWEXU ROPSOZEOQBF. #XYOLFB, RX [OWBF WBO PECUBU Java,
EU OBDMXR EF OLEO_ DEFGF. +US EU SUEUU, N Java UQB\ O[MULUHUEEXU CQ[UDBX, Q[OQOJEXU [ODOHUJCB\
RCVN NRUMUEEOQB\. # ]BOS [MFHOZUEFF MCQQSCBMFRCIBQK EUDOBOMXU OBHFWFK SUZLN KPXDCSF.
"CJNL\BU O MNWEOS N[MCRHUEFF [CSKB\I, JHCGOLCMK DOBOMOSN EC .++ SOZEO [FQCB\ [MFHOZUEFK,
[MUROQYOLKTFU Java-CECHOGF [O JXQBMOLU_QBRFI F JOHUU ]``UDBFREO MCQYOLNITFU [CSKB\.
(CPMCJOBWFDF Java HFDRFLFMORCHF MNWEOU RXLUHUEFU F OQROJOZLUEFU [CSKBF ([MFSUM /), QBMUSKQ\
QEFPFB\ RUMOKBEOQB\ OVFJOD [MF DOLFMORCEFF.
Rpurep 1
int* pt = new int;
delete pt;
-MF`SUBFWUQDFU O[UMC^FF Q NDCPCBUHKSF R Java OBQNBQBRNIB (QS. [MFSUM 2). 6CQQFRX Java
[MULQBCRHKIB QOJO_ ECQBOKTFU SCQQFRX, C EU NDCPCBUHF, DCD R .++. !Q[OH\PNUSCK R Java SOLUH\
NDCPCBUHU_ `CDBFWUQDF HFDRFLFMNUB QFEBCDQFQ NDCPCBUHU_ .++. !PSUEUEFK JXHF REUQUEX LHK
[MULOBRMCTUEFK QHNWC_EXY ECMNVUEF_ [CSKBF F [OMWF LCEEXY FP-PC OVFJOWEXY QSUTUEF_ R
CMF`SUBFWUQDFY O[UMC^FKY Q NDCPCBUHKSF.
Rpurep 2
char* na = Bob Smith
na++;
Java [MULOBRMCTCUB NBUWDF [CSKBF PC QWUB UU CRBOSCBFWUQDOGO OQROJOZLUEFK QROUGO MOLC
CRBOSCBFWUQDCK QJOMDC SNQOMC.
0MOSU BOGO, MCPSUM RQBMOUEEXY BF[OR LCEEXY R Java EU PCRFQFB OB DOS[FHKBOMC FHF BF[C DOS[\IBUMC,
DCD R .++. +F[X LCEEXY FSUIB `FDQFMORCEEX_ MCPSUM QDCZUS, int R Java RQUGLC KRHKUBQK 32-
MCPMKLEXS WFQHOS (BCJH. /). 0OS[FHKBOM Java GUEUMFMNUB FEQBMND^FF JC_B-DOLC, DOBOMXU ]``UDBFREO
[MUOJMCPNIBQK R ECJOM SCVFEEXY DOSCEL.

258
*ABCDEA .. +F[X LCEEXY Java
Tun Pasuep
int 4 JC_BC
short 2 JC_BC
long 8 JC_B
float 4 JC_BC
double 8 JC_B
0MOSU BOGO, RX EU RQBMUBFBU UTU EUDOBOMXY PECDOSXY DOEQBMND^F_. (CPMCJOBWFDF Java HFDRFLFMORCHF
UTU LRU DOEQBMND^FF, QRKPCEEXU Q N[MCRHUEFUS [CSKB\I QBMNDBNMX (QS. [MFSUM 3) F OJaULFEUEFK.
Java EU [OLLUMZFRCUB ]BFY QFEBCDQFWUQDFY QMULQBR .++.
Rpurep 3
struct name {
char fname[20];
char lname[30];
}
)LEC FP PCLCW Java PCDHIWCHCQ\ R BOS, WBOJX [MULOBRMCBFB\ LFECSFWUQDFU OVFJDF PC QWUB HFDRFLC^FF
FQBOWEFDC MCQ[MOQBMCEUEEXY OVFJOD R .++. .MULF BCDFY OVFJOD O[UMCBOM [MFQRCFRCEFK (=),
[UMU[NBCEEX_ Q O[UMCBOMOS MCRUEQBRC (==). # [MFSUMU 4 [ODCPCEC MCQ[MOQBMCEUEECK OVFJDC .++,
[MULOBRMCTCUSCK DOS[FHKBOMOS Java.
Rpurep 4
if (value = 10)
#X [MORUHF JUQWFQHUEEXU WCQX PC MCPMCJOBDO_ FPOTMUEEO_ FUMCMYFF SEOZUQBRUEEOGO ECQHULORCEFK F
BU[UM\ ZUHCUBU [UMUEUQBF UU R Java? #CQ ZLUB EUDOBOMOU MCPOWCMORCEFU. 5MFE^F[FCH\EOU OBHFWFU
SUZLN Java F .++ PCDHIWCUBQK R BOS, WBO Java EU [OLLUMZFRCUB SEOZUQBRUEEOGO ECQHULORCEFK FP-PC
QHOZEOQBU_ R N[MCRHUEFF FUMCMYFKSF. +US EU SUEUU, R Java QNTUQBRNIB FEBUM`U_QX, DOBOMXU
OJHCLCIB [MUFSNTUQBRCSF SEOZUQBRUEEOGO ECQHULORCEFK JUP BUY PCBMNLEUEF_, DOBOMXU Q EFS QRKPCEX.
)QBUMUGC_BUQ\ DORCMQBRC Java! 3BOB KPXD [OHOE HORNVUD LHK [MOGMCSSFQBOR EC .++. $C[MFSUM DHCQQX
Java [OYOZF EC .++. +US EU SUEUU, RQU `NED^FF R Java (R BOS WFQHU F main) LOHZEX [MFECLHUZCB\
EUDOBOMOSN DHCQQN. # QOOBRUBQBRFF Q BMUJORCEFKSF Java LHK main EUOJYOLFSO QOPLCB\ DHCQQ-OJOHOWDN
(QS. [MFSUM 5). # Java EUB `NED^F_ DHCQQOR, C UQB\ SUBOLX, [O]BOSN main SUBOL, C EU `NED^FK
Rpurep 5
public class ShellClass
{
public static void main(Strings[] args)
{
}
}
(CJOBC QO QBMODCSF R Java EUQDOH\DO PC[NBCEEC. # .++ QBMODC [MULQBCRHKUB QOJO_ SCQQFR QFSROHOR, F
RX SOZUBU SOLF`F^FMORCB\ OBLUH\EXU QFSROHX R QBMODU. # Java LUHO OJQBOFB FECWU. .BMODF Java
JOH\VU EC[OSFECIB NDCPCBUH\ char*. .BMODORXU OJaUDBX Java NLOJEX LHK [MOGMCSSFQBOR, [OQDOH\DN
OEF CRBOSCBFWUQDF RXLUHKIB F OQROJOZLCIB [CSKB\. 3BO [MOFQYOLFB R O[UMCBOMU [MFQRCFRCEFK, R
DOEQBMNDBOMU F LUQBMNDBOMU.
6UBOLX Java [OYOZF EC `NED^FF DHCQQOR .++, EO RQU ZU EU FLUEBFWEX FS. $C[MFSUM, R Java EUB
GHOJCH\EXY `NED^F_ F [MOBOBF[OR `NED^F_. 0OS[FHKBOM Java MCJOBCUB R EUQDOH\DO [MOYOLOR, WBO
259
[OPROHKUB FQ[OH\PORCB\ SUBOLX LO FY O[MULUHUEFK. 8OHUU BOGO, `NED^FF EUH\PK [UMULCB\ CLMUQ
[UMUSUEEO_, [OQDOH\DN CMGNSUEBOR-NDCPCBUHU_ F QQXHOD R Java EU QNTUQBRNUB.
$UDOBOMXU WCQBF Java NPECIBQK Q [UMROGO RPGHKLC. $C[MFSUM, OJaUDBEXU [UMUSUEEXU Java CECHOGFWEX
OJaUDBXS NDCPCBUHKS .++ (QS. [MFSUM 6). )JaUDBX Java ECYOLKBQK R DNWU, C OJaUDB, QOLUMZCTF_
OJaUDBENI [UMUSUEENI LMNGOGO OJaUDBC, EC QCSOS LUHU NDCPXRCUB EC LMNGO_ OJaUDB R DNWU.
Rpurep 6
// Java
MyObject ob1;
// C++
MyObject* ob1;
6UBOLX Java LOHZEX O[MULUHKB\QK RENBMF DHCQQC. #EUVEUU O[MULUHUEFU, DCD R .++, EU LO[NQDCUBQK.
:MCGSUEB, [ODCPCEEX_ R [MFSUMU 7, MCJOBCUB R .++, EO EU R Java. >OBK SUBOLX O[MULUHKIBQK RENBMF
DHCQQC, ]BO EU PECWFB, WBO OEF CRBOSCBFWUQDF QBCEORKBQK [OLQBCRHKUSXSF (inline) `NED^FKSF.
Rpurep 7
class Person
{
};

void Person::Raise()
{
salary *= 1000
}
.BOFB HF JMOQCB\ .++ F [UMUYOLFB\ EC Java? +MNLEO QDCPCB\. Java PCQHNZFRCUB [MFQBCH\EOGO REFSCEFK
[MF MCPMCJOBDU [MFHOZUEF_ LHK Internet, DOM[OMCBFREXY FHF REUVEFY QUBU_. 8FJHFOBUDC Java QOLUMZFB
RQU QMULQBRC, EUOJYOLFSXU LHK MCJOBX Q [MOBODOHCSF TCP/IP, HTTP F FTP. 8HCGOLCMK ]BOSN
OJMCBFB\QK D QUBUROSN OJaUDBN [O URL BCD ZU [MOQBO, DCD F R HODCH\EO_ `C_HORO_ QFQBUSU.
&PXD Java CMYFBUDBNMEO EU_BMCHUE, [OQDOH\DN DO[FHKBOM GUEUMFMNUB OJaUDBEX_ DOL F LUHCUB Java-
[MFHOZUEFK EUPCRFQFSXSF OB MUCHFPC^FF. 3BO OQOJUEEO RCZEO LHK Internet-[MFHOZUEF_. )LECDO R Java
RCS EU NLCQBQK FQ[OH\PORCB\ QMULQBRC N[MCRHUEFK [CSKB\I .++, WBOJX RXZCB\ RQU ROPSOZEOU
JXQBMOLU_QBRFU LHK LCEEO_ [HCB`OMSX. +CD [MFYOLFBQK MCQ[HCWFRCB\QK PC N[MCRHUEFU [CSKB\I,
[UMULCEEOU R MCQ[OMKZUEFU Java.
0CD BOH\DO MUW\ PCYOLFB O SEOGO[OBOWEOQBF, CMYFBUDBNMECK EU_BMCH\EOQB\ Java FQWUPCUB.
6EOGO[OBOWEX_ DOL CMYFBUDBNMEO EU_BMCHUE, EO LHK MUCHFPC^FF SEOGO[OBOWEOQBF Java [MFJUGCUB D
NQHNGCS O[UMC^FOEEO_ QFQBUSX, [OQDOH\DN MUCHFPC^FK [MOGMCSSEXY [OBODOR QNTUQBRUEEO MCPHFWCUBQK
EC MCPEXY [HCB`OMSCY.
5MOFPRULUB HF Java MUROHI^FI R KPXDCY [MOGMCSSFMORCEFK? .BCEUB HF ]BO DOE^OS .++? $U Q[UVFBU
RXJMCQXRCB\ QRO_ DOS[FHKBOM .++. 5MF MCPMCJOBDU [MFHOZUEF_ LHK Internet, C BCDZU DOM[OMCBFREXY F
REUVEFY QUBU_ Java ODCPXRCUBQK JOHUU [MOQBXS F NLOJEXS KPXDOS, WUS .++. ! RQU ZU RO[MOQ O BOS,
NLCQBQK HF Java QBCB\ LU_QBRFBUH\EO RQUQBOMOEEFS KPXDOS F [UMUSCEFB\ EC QROI QBOMOEN
[MOGMCSSFQBOR, OQBCUBQK OBDMXBXS.

You might also like