201 56 2MB
Russian Pages 272 Year 2008
Íîâûå ñëîæíûå çàäà÷è íà C++ 40 новых головоломных задач с решениями
Ãåðá Ñàòòåð
Издательский дом “Вильямс” Москва • Санкт-Петербург • Киев 2008
Стр. 1
Exceptional C++ Style 40 New Engineering Puzzles, Programming Problems, and Solutions
Herb Sutter
ADDISON–WESLEY Boston • San Francisco • New York • Toronto • Montreal London • Munich • Paris • Madrid Capetown • Sydney • Tokyo • Singapore • Mexico • City
Стр. 2
Íîâûå ñëîæíûå çàäà÷è íà Ñ++
Стр. 3
ÁÁÊ 32.973.26-018.2.75 Ñ21 ÓÄÊ 681.3.07 Èçäàòåëüñêèé äîì “Âèëüÿìñ” Çàâ. ðåäàêöèåé Ñ.Í. Òðèãóá Ïåðåâîä ñ àíãëèéñêîãî è ðåäàêöèÿ êàíä. òåõí. íàóê È.Â. Êðàñèêîâà Íàó÷íûé êîíñóëüòàíò êàíä. òåõí. íàóê À.Í. Êðîòîâ Ïî îáùèì âîïðîñàì îáðàùàéòåñü â Èçäàòåëüñêèé äîì “Âèëüÿìñ” ïî àäðåñó: [email protected], http://www.williamspublishing.com Ñàòòåð, Ãåðá. Ñ21 Íîâûå ñëîæíûå çàäà÷è íà C++. : Ïåð. ñ àíãë. – Ì. : ÎÎÎ “È. Ä. Âèëüÿìñ”, 2008. – 272 ñ. : èë. – Ïàðàë. òèò. àíãë. ISBN 978-5-8459-0823-0 (ðóñ.) Äàííàÿ êíèãà ïðåäñòàâëÿåò ñîáîé ïðîäîëæåíèå âûøåäøåé ðàíåå êíèãè Ðåøåíèå ñëîæíûõ çàäà÷ íà C++.  ôîðìå çàäà÷ è èõ ðåøåíèé ðàññìàòðèâàþòñÿ ñîâðåìåííûå ìåòîäû ïðîåêòèðîâàíèÿ è ïðîãðàììèðîâàíèÿ íà C++.  êíèãå ñêîíöåíòðèðîâàí áîãàòûé ìíîãîëåòíèé îïûò ïðîãðàììèðîâàíèÿ íà C++ íå òîëüêî ñàìîãî àâòîðà, íî è âñåãî ñîîáùåñòâà ïðîãðàììèñòîâ íà C++, òàê ÷òî íåêîòîðûå ðåêîìåíäàöèè àâòîðà ìîãóò ïîêàçàòüñÿ íåîæèäàííûìè äàæå îïûòíûì ïðîãðàììèñòàìïðîôåññèîíàëàì. Àâòîð ðàññìàòðèâàåò è êîíêðåòíûå ìåòîäèêè, ïðèåìû è èäèîìû ïðîãðàììèðîâàíèÿ, îäíàêî îñíîâíàÿ òåìà êíèãè – ýòî ñòèëü ïðîãðàììèðîâàíèÿ, ïðè÷åì â ñàìîì øèðîêîì ïîíèìàíèè ýòîãî ñëîâà. Îñîáîå âíèìàíèå âî âñåõ çàäà÷àõ êíèãè óäåëåíî âîïðîñó ïðîåêòèðîâàíèÿ, êîòîðîå äîëæíî îáåñïå÷èòü ìàêñèìàëüíóþ íàäåæíîñòü, áåçîïàñíîñòü, ïðîèçâîäèòåëüíîñòü è ñîïðîâîæäàåìîñòü ñîçäàâàåìîãî ïðîãðàììíîãî îáåñïå÷åíèÿ. Êíèãà ðàññ÷èòàíà â ïåðâóþ î÷åðåäü íà ïðîôåññèîíàëüíûõ ïðîãðàììèñòîâ ñ ãëóáîêèìè çíàíèÿìè ÿçûêà, îäíàêî îíà áóäåò ïîëåçíà ëþáîìó, êòî çàõî÷åò óãëóáèòü ñâîè çíàíèÿ â äàííîé îáëàñòè. ÁÁÊ 32.973.26-018.2.75 Âñå íàçâàíèÿ ïðîãðàììíûõ ïðîäóêòîâ ÿâëÿþòñÿ çàðåãèñòðèðîâàííûìè òîðãîâûìè ìàðêàìè ñîîòâåòñòâóþùèõ ôèðì. Íèêàêàÿ ÷àñòü íàñòîÿùåãî èçäàíèÿ íè â êàêèõ öåëÿõ íå ìîæåò áûòü âîñïðîèçâåäåíà â êàêîé áû òî íè áûëî ôîðìå è êàêèìè áû òî íè áûëî ñðåäñòâàìè, áóäü òî ýëåêòðîííûå èëè ìåõàíè÷åñêèå, âêëþ÷àÿ ôîòîêîïèðîâàíèå è çàïèñü íà ìàãíèòíûé íîñèòåëü, åñëè íà ýòî íåò ïèñüìåííîãî ðàçðåøåíèÿ èçäàòåëüñòâà Addison-Wesley Publishing Company, Inc. Authorized translation from the English language edition published by Addison-Wesley Publishing Company, Inc., Copyright © 2005 All rights reserved. No part of this book may be reproduced or transmitted in any form or by any means, electronic or mechanical, including photocopying, recording or by any information storage retrieval system, without permission from the Publisher. Russian language edition was published by Williams Publishing House according to the Agreement with R&I Enterprises International, Copyright © 2008 ISBN 978-5-8459-0823-0 (ðóñ.) ISBN 0-201-76042-8 (àíãë.)
Стр. 4
© Èçäàòåëüñêèé äîì “Âèëüÿìñ”, 2008 © Pearson Education, Inc., 2004
Оглавление
Ïðåäèñëîâèå
14
Ñòèëü èëè ñóòü?
14
Ìåòîä Ñîêðàòà
15
Êàê ÷èòàòü äàííóþ êíèãó
16
Áëàãîäàðíîñòè
17
Îáîáùåííîå ïðîãðàììèðîâàíèå è ñòàíäàðòíàÿ áèáëèîòåêà C++
19
Çàäà÷à 1. Âåêòîð: ïîòðåáëåíèå è çëîóïîòðåáëåíèå Çàäà÷à 2. Ñòðî÷íûé äâîð. ×àñòü 1: sprintf Çàäà÷à 3. Ñòðî÷íûé äâîð. ×àñòü 2: ñòàíäàðòíûå àëüòåðíàòèâû Çàäà÷à 4. Ôóíêöèè-÷ëåíû ñòàíäàðòíîé áèáëèîòåêè Çàäà÷à 5. Êðàñîòà îáîáùåííîñòè. ×àñòü 1: Àçû Çàäà÷à 6. Êðàñîòà îáîáùåííîñòè. ×àñòü 2: Äîñòàòî÷íî ëè óíèâåðñàëüíîñòè? Çàäà÷à 7. Ïî÷åìó íå ñïåöèàëèçèðóþòñÿ øàáëîíû ôóíêöèé? Çàäà÷à 8. Äðóæåñòâåííûå øàáëîíû Çàäà÷à 9. Îãðàíè÷åíèÿ ýêñïîðòà. ×àñòü 1: îñíîâû Çàäà÷à 10. Îãðàíè÷åíèÿ ýêñïîðòà. ×àñòü 2: âçàèìîñâÿçè, ïðàêòè÷íîñòü è ñîâåòû ïî èñïîëüçîâàíèþ
20 26 30 39 42 45 50 56 64
Âîïðîñû è ïðèåìû áåçîïàñíîñòè èñêëþ÷åíèé
79
Çàäà÷à 11. Ïîïðîáóé ïîéìàé Çàäà÷à 12. Áåçîïàñíîñòü èñêëþ÷åíèé: ñòîèò ëè îâ÷èíêà âûäåëêè? Çàäà÷à 13. Ïðàãìàòè÷íûé âçãëÿä íà ñïåöèôèêàöèè èñêëþ÷åíèé
80 84 87
Ðàçðàáîòêà êëàññîâ, íàñëåäîâàíèå è ïîëèìîðôèçì
95
Çàäà÷à Çàäà÷à Çàäà÷à Çàäà÷à Çàäà÷à Çàäà÷à Çàäà÷à Çàäà÷à Çàäà÷à Çàäà÷à
Стр. 5
14. 15. 16. 17. 18. 19. 20. 21. 22. 23.
Ê ïîðÿäêó! Ïîòðåáëåíèå è çëîóïîòðåáëåíèå ïðàâàìè äîñòóïà Êðåïêî çàêðûò? Èíêàïñóëÿöèÿ Âèðòóàëüíîñòü Íå ìîæåøü – íàó÷èì, íå õî÷åøü – çàñòàâèì! Êîíòåéíåðû â ïàìÿòè. ×àñòü 1: óðîâíè óïðàâëåíèÿ ïàìÿòüþ Êîíòåéíåðû â ïàìÿòè. ×àñòü 2: êàêèå îíè íà ñàìîì äåëå? Íîâûé âçãëÿä íà new. ×àñòü 1: ìíîãîëèêèé îïåðàòîð new Íîâûé âçãëÿä íà new. ×àñòü 2: ïðàãìàòèçì â óïðàâëåíèè ïàìÿòüþ
71
96 99 103 110 118 126 138 142 149 156
Îïòèìèçàöèÿ è ýôôåêòèâíîñòü
163
Çàäà÷à 25. inline Çàäà÷à 26. Ôîðìàòû äàííûõ è ýôôåêòèâíîñòü. ×àñòü 1: èãðû â ñæàòèå. Çàäà÷à 27. Ôîðìàòû äàííûõ è ýôôåêòèâíîñòü. ×àñòü 2: èãðû ñ áèòàìè
168 175 179
Ëîâóøêè, îøèáêè è ãîëîâîëîìêè
185
Çàäà÷à Çàäà÷à Çàäà÷à Çàäà÷à Çàäà÷à Çàäà÷à
186 192 197 200 204 207
Êëþ÷åâûå ñëîâà, íå ÿâëÿþùèåñÿ òàêîâûìè Èíèöèàëèçàöèÿ ëè ýòî? Äâîéíàÿ òî÷íîñòü – âåæëèâîñòü ïðîãðàììèñòîâ Ñóìåðå÷íîå ñîñòîÿíèå... êîäà Íåáîëüøèå î÷åïÿòêè è ïðî÷èå êóðüåçû Îîîîïåðàòîðû
Èçó÷åíèå êîíêðåòíûõ ïðèìåðîâ
211
Çàäà÷à Çàäà÷à Çàäà÷à Çàäà÷à Çàäà÷à Çàäà÷à Çàäà÷à
212 221 228 242 247 254 257
34. 35. 36. 37. 38. 39. 40.
Èíäåêñíûå òàáëèöû Îáîáùåííûå îáðàòíûå âûçîâû Îáúåäèíåíèÿ Îñëàáëåííàÿ ìîíîëèòíîñòü. ×àñòü Îñëàáëåííàÿ ìîíîëèòíîñòü. ×àñòü Îñëàáëåííàÿ ìîíîëèòíîñòü. ×àñòü Îñëàáëåííàÿ ìîíîëèòíîñòü. ×àñòü
1: 2: 3: 4:
âçãëÿä íà std::string ðàçáîð std::string óìåíüøåíèå std::string íîâûé std::string
Ñïèñîê ëèòåðàòóðû
265
Ïðåäìåòíûé óêàçàòåëü
268
6
Стр. 6
28. 29. 30. 31. 32. 33.
Оглавление
Содержание
Стр. 7
Ïðåäèñëîâèå
14
Ñòèëü èëè ñóòü?
14
Ìåòîä Ñîêðàòà
15
Êàê ÷èòàòü äàííóþ êíèãó
16
Áëàãîäàðíîñòè
17
Îáîáùåííîå ïðîãðàììèðîâàíèå è ñòàíäàðòíàÿ áèáëèîòåêà C++
19
Çàäà÷à 1. Âåêòîð: ïîòðåáëåíèå è çëîóïîòðåáëåíèå Âîïðîñ äëÿ íîâè÷êà Âîïðîñ äëÿ ïðîôåññèîíàëà Îáðàùåíèå ê ýëåìåíòó âåêòîðà Óâåëè÷åíèå ðàçìåðà âåêòîðà Ðåçþìå Çàäà÷à 2. Ñòðî÷íûé äâîð. ×àñòü 1: sprintf Âîïðîñ äëÿ íîâè÷êà Âîïðîñ äëÿ ïðîôåññèîíàëà Ðàäîñòè è ïå÷àëè sprintf Çàäà÷à 3. Ñòðî÷íûé äâîð. ×àñòü 2: ñòàíäàðòíûå àëüòåðíàòèâû Âîïðîñ äëÿ ïðîôåññèîíàëà Àëüòåðíàòèâà ¹1: snprintf Àëüòåðíàòèâà ¹2: std::stringstream Àëüòåðíàòèâà ¹3: std::strstream Àëüòåðíàòèâà ¹4: boost::lexical_cast Ðåçþìå Çàäà÷à 4. Ôóíêöèè-÷ëåíû ñòàíäàðòíîé áèáëèîòåêè Âîïðîñ äëÿ íîâè÷êà Âîïðîñ äëÿ ïðîôåññèîíàëà Èãðû ñ mem_fun Èñïîëüçóéòå mem_fun, íî íå ñî ñòàíäàðòíîé áèáëèîòåêîé Èñïîëüçîâàíèå óêàçàòåëåé íà ôóíêöèè-÷ëåíû – íî íå ñî ñòàíäàðòíîé áèáëèîòåêîé Ðåçþìå Çàäà÷à 5. Êðàñîòà îáîáùåííîñòè. ×àñòü 1: Àçû Âîïðîñ äëÿ íîâè÷êà Âîïðîñ äëÿ ïðîôåññèîíàëà Çàäà÷à 6. Êðàñîòà îáîáùåííîñòè. ×àñòü 2: Äîñòàòî÷íî ëè óíèâåðñàëüíîñòè? Âîïðîñ äëÿ ïðîôåññèîíàëà Çàäà÷à 7. Ïî÷åìó íå ñïåöèàëèçèðóþòñÿ øàáëîíû ôóíêöèé? Âîïðîñ äëÿ íîâè÷êà Âîïðîñ äëÿ ïðîôåññèîíàëà Ïåðåãðóçêà è ñïåöèàëèçàöèÿ
20 20 20 20 21 25 26 26 26 27 30 30 30 32 33 35 36 39 39 39 39 40 41 41 42 42 42 45 45 50 50 50 50
Ïðèìåð Äèìîâà-Àáðàìñà Ìîðàëü ñåé áàñíè òàêîâà… Ðåçþìå Çàäà÷à 8. Äðóæåñòâåííûå øàáëîíû Âîïðîñ äëÿ íîâè÷êà Âîïðîñ äëÿ ïðîôåññèîíàëà Èñõîäíàÿ ïîïûòêà  “òåìíûõ óãëàõ” Ïðè÷èíà 1: íå âñåãäà ðàáîòàåò Ïðè÷èíà 2: óäèâëÿåò ïðîãðàììèñòîâ Ïðè÷èíà 3: óäèâëÿåò êîìïèëÿòîðû Îòñòóïëåíèå: ïðîáëåìà â ïðîñòðàíñòâå èìåí Äâà íåâåðíûõ îáõîäíûõ ïóòè Ðåçþìå Çàäà÷à 9. Îãðàíè÷åíèÿ ýêñïîðòà. ×àñòü 1: îñíîâû Âîïðîñ äëÿ íîâè÷êà Âîïðîñ äëÿ ïðîôåññèîíàëà Ðàññêàç î äâóõ ìîäåëÿõ Ïîÿñíåíèå íà ïðèìåðå Èñïîëüçîâàíèå ýêñïîðòà Ïðîáëåìà ïåðâàÿ: îòêðûòûé èñõîäíûé òåêñò Ïðîáëåìà âòîðàÿ: çàâèñèìîñòè è âðåìÿ ïîñòðîåíèÿ Ðåçþìå Çàäà÷à 10. Îãðàíè÷åíèÿ ýêñïîðòà. ×àñòü 2: âçàèìîñâÿçè, ïðàêòè÷íîñòü è ñîâåòû ïî èñïîëüçîâàíèþ Âîïðîñ äëÿ íîâè÷êà Âîïðîñ äëÿ ïðîôåññèîíàëà Íà÷àëî: 1988—1996 ãã. 1996 ã. Îïûò ðàáîòû ñ ýêñïîðòîì Äî ÷åãî äîâîäèò ýêñïîðò Òðóäíîñòü êîððåêòíîãî èñïîëüçîâàíèÿ Ïîòåíöèàëüíûå ïðåèìóùåñòâà ýêñïîðòà Ìîðàëü
52 54 54 56 56 56 57 57 58 58 59 61 62 63 64 64 64 64 65 66 68 69 70
Âîïðîñû è ïðèåìû áåçîïàñíîñòè èñêëþ÷åíèé
79
Çàäà÷à 11. Ïîïðîáóé ïîéìàé Âîïðîñ äëÿ íîâè÷êà Âîïðîñ äëÿ ïðîôåññèîíàëà Ðåçþìå Çàäà÷à 12. Áåçîïàñíîñòü èñêëþ÷åíèé: ñòîèò ëè îâ÷èíêà âûäåëêè? Âîïðîñ äëÿ ïðîôåññèîíàëà Ãàðàíòèè Àáðàìñà Êàêàÿ èìåííî ãàðàíòèÿ íóæíà Çàäà÷à 13. Ïðàãìàòè÷íûé âçãëÿä íà ñïåöèôèêàöèè èñêëþ÷åíèé Âîïðîñ äëÿ íîâè÷êà Âîïðîñ äëÿ ïðîôåññèîíàëà Íàðóøåíèå ñïåöèôèêàöèè
80 80 80 83 84 84 84 84 87 87 87 87
8
Стр. 8
71 71 71 72 73 74 75 75 76 77
Содержание
Ïðèìåíåíèå Ïðîáëåìà ïåðâàÿ – ïðèçðàêè òèïîâ Ïðîáëåìà âòîðàÿ – (íå)ïîíèìàíèå Êîïíåì ïîãëóáæå Ðåçþìå
Ðàçðàáîòêà êëàññîâ, íàñëåäîâàíèå è ïîëèìîðôèçì Çàäà÷à 14. Ê ïîðÿäêó! Âîïðîñ äëÿ íîâè÷êà Âîïðîñ äëÿ ïðîôåññèîíàëà Ðåçþìå Çàäà÷à 15. Ïîòðåáëåíèå è çëîóïîòðåáëåíèå ïðàâàìè äîñòóïà Âîïðîñ äëÿ íîâè÷êà Âîïðîñ äëÿ ïðîôåññèîíàëà Ïðåñòóïíèê ¹1: ôàëüñèôèêàòîð Ïðåñòóïíèê ¹2: êàðìàííèê Ïðåñòóïíèê ¹3: ìîøåííèê Ïåðñîíà ãðàòà ¹4: àäâîêàò Íå íàðóøàé Çàäà÷à 16. Êðåïêî çàêðûò? Âîïðîñ äëÿ ïðîôåññèîíàëà Äîñòóïíîñòü Âèäèìîñòü È ñíîâà äîñòóïíîñòü Ðåçþìå Çàäà÷à 17. Èíêàïñóëÿöèÿ Âîïðîñ äëÿ íîâè÷êà Âîïðîñ äëÿ ïðîôåññèîíàëà Ìåñòî èíêàïñóëÿöèè â îáúåêòíî-îðèåíòèðîâàííîì ïðîãðàììèðîâàíèè Îòêðûòûå, çàêðûòûå èëè çàùèùåííûå äàííûå? Ïðåîáðàçîâàíèå â îáùåì ñëó÷àå Àêòóàëüíûé ìîìåíò Ðåçþìå Çàäà÷à 18. Âèðòóàëüíîñòü Âîïðîñ äëÿ íîâè÷êà Âîïðîñ äëÿ ïðîôåññèîíàëà Îáû÷íûé ñîâåò î äåñòðóêòîðàõ áàçîâûõ êëàññîâ Âèðòóàëüíûé âîïðîñ ¹1: îòêðûòîñòü èëè çàêðûòîñòü? Âèðòóàëüíûé âîïðîñ ¹2: äåñòðóêòîðû áàçîâûõ êëàññîâ Ðåçþìå Çàäà÷à 19. Íå ìîæåøü – íàó÷èì, íå õî÷åøü – çàñòàâèì! Âîïðîñ äëÿ íîâè÷êà Âîïðîñ äëÿ ïðîôåññèîíàëà Íåÿâíî ãåíåðèðóåìûå ôóíêöèè Ñïåöèôèêàöèè èñêëþ÷åíèé íåÿâíî îïðåäåëåííûõ ôóíêöèé Íåÿâíûé êîíñòðóêòîð ïî óìîë÷àíèþ Íåÿâíûé êîïèðóþùèé êîíñòðóêòîð Íåÿâíûé êîïèðóþùèé îïåðàòîð ïðèñâàèâàíèÿ Содержание
Стр. 9
88 89 90 91 92
95 96 96 96 98 99 99 99 100 100 101 101 102 103 103 103 104 107 108 110 110 110 111 112 113 115 117 118 118 118 118 118 122 124 126 126 126 127 127 129 130 130
9
Íåÿâíûé äåñòðóêòîð ×ëåí auto_ptr Ñåìåéíûå ïðîáëåìû Íå õî÷åøü – çàñòàâèì! Ðåçþìå Çàäà÷à 20. Êîíòåéíåðû â ïàìÿòè. ×àñòü 1: óðîâíè óïðàâëåíèÿ ïàìÿòüþ Âîïðîñ äëÿ íîâè÷êà Âîïðîñ äëÿ ïðîôåññèîíàëà Äèñïåò÷åðû ïàìÿòè è èõ ñòðàòåãèè: êðàòêèé îáçîð Âûáîð ñòðàòåãèè Ðåçþìå Çàäà÷à 21. Êîíòåéíåðû â ïàìÿòè. ×àñòü 2: êàêèå îíè íà ñàìîì äåëå? Âîïðîñ äëÿ íîâè÷êà Âîïðîñ äëÿ ïðîôåññèîíàëà ×òî ïîïðîñèøü, òî ïîëó÷èøü? Ïàìÿòü è ñòàíäàðòíûå êîíòåéíåðû: òåîðèÿ Ïàìÿòü è ñòàíäàðòíûå êîíòåéíåðû: ïðàêòèêà Ðåçþìå Çàäà÷à 22. Íîâûé âçãëÿä íà new. ×àñòü 1: ìíîãîëèêèé îïåðàòîð new Âîïðîñ äëÿ íîâè÷êà Âîïðîñ äëÿ ïðîôåññèîíàëà Ðàçìåùàþùèé, îáû÷íûé è íå ãåíåðèðóþùèé èñêëþ÷åíèé îïåðàòîð new Îïåðàòîð new, ñïåöèôè÷íûé äëÿ êëàññà Ñþðïðèç ñîêðûòèÿ èìåí Ðåçþìå Çàäà÷à 23. Íîâûé âçãëÿä íà new. ×àñòü 2: ïðàãìàòèçì â óïðàâëåíèè ïàìÿòüþ Âîïðîñ äëÿ íîâè÷êà Âîïðîñ äëÿ ïðîôåññèîíàëà Èñêëþ÷åíèÿ, îøèáêè è new(nothrow) Òåîðèÿ è ïðàêòèêà ×òî íàäî ïðîâåðÿòü Ðåçþìå
130 131 131 133 135 138 138 138 138 139 141 142 142 142 142 144 146 147 149 149 149 150 151 152 155 156 156 156 156 158 161 162
Îïòèìèçàöèÿ è ýôôåêòèâíîñòü
163
Çàäà÷à 24. Êîíñòàíòíàÿ îïòèìèçàöèÿ Âîïðîñ äëÿ íîâè÷êà Âîïðîñ äëÿ ïðîôåññèîíàëà const: íåíàâÿç÷èâûé ñåðâèñ Êàê const ìîæåò îïòèìèçèðîâàòü Ðåçþìå Çàäà÷à 25. inline Âîïðîñ äëÿ íîâè÷êà Âîïðîñ äëÿ ïðîôåññèîíàëà Êðàòêèé îáçîð Îòâåò À: âî âðåìÿ íàïèñàíèÿ èñõîäíîãî òåêñòà Îòâåò Á: âî âðåìÿ êîìïèëÿöèè Îòâåò Â: âî âðåìÿ êîìïîíîâêè Îòâåò Ã: ïðè èíñòàëëÿöèè ïðèëîæåíèÿ
164 164 164 164 165 167 168 168 168 168 169 170 171 172
10
Стр. 10
Содержание
Стр. 11
Îòâåò Ä: â ïðîöåññå ðàáîòû Îòâåò Å: â íåêîòîðîå äðóãîå âðåìÿ Ðåçþìå Çàäà÷à 26. Ôîðìàòû äàííûõ è ýôôåêòèâíîñòü. ×àñòü 1: èãðû â ñæàòèå. Âîïðîñ äëÿ íîâè÷êà Âîïðîñ äëÿ ïðîôåññèîíàëà Ðàçëè÷íûå ñïîñîáû ïðåäñòàâëåíèÿ äàííûõ Çàäà÷à 27. Ôîðìàòû äàííûõ è ýôôåêòèâíîñòü. ×àñòü 2: èãðû ñ áèòàìè Âîïðîñ äëÿ ïðîôåññèîíàëà BitBuffer, óáèéöà áèòîâ Ïîïûòêà ¹1: èñïîëüçîâàíèå unsigned char Ïîïûòêà ¹2: èñïîëüçîâàíèå ñòàíäàðòíîãî êîíòåéíåðà óïàêîâàííûõ áèòîâ Ïëîòíàÿ óïàêîâêà Ðåçþìå
173 174 174 175 175 175 176 179 179 179 180 182 183 184
Ëîâóøêè, îøèáêè è ãîëîâîëîìêè
185
Çàäà÷à 28. Êëþ÷åâûå ñëîâà, íå ÿâëÿþùèåñÿ òàêîâûìè Âîïðîñ äëÿ íîâè÷êà Âîïðîñ äëÿ ïðîôåññèîíàëà Çà÷åì íóæíû êëþ÷åâûå ñëîâà Êëþ÷åâûå ñëîâà C++ Çàðåçåðâèðîâàííûå êîììåíòàðèè Ðåçþìå Çàäà÷à 29. Èíèöèàëèçàöèÿ ëè ýòî? Âîïðîñ äëÿ íîâè÷êà Âîïðîñ äëÿ ïðîôåññèîíàëà Áàçîâûé ìåõàíèçì çàïîëíåíèÿ Íå èíèöèàëèçàöèÿ Êîððåêòíîå çàïîëíåíèå Ðåçþìå Çàäà÷à 30. Äâîéíàÿ òî÷íîñòü – âåæëèâîñòü ïðîãðàììèñòîâ Âîïðîñ äëÿ íîâè÷êà Âîïðîñ äëÿ ïðîôåññèîíàëà Äâà ñëîâà î float è double Êîëåñî âðåìåíè Î ñóæèâàþùåì ïðåîáðàçîâàíèè òèïîâ Ðåçþìå Çàäà÷à 31. Ñóìåðå÷íîå ñîñòîÿíèå... êîäà Âîïðîñ äëÿ ïðîôåññèîíàëà Ìîòèâàöèÿ Ìàêðîñàì íàïëåâàòü… Ðåçþìå Çàäà÷à 32. Íåáîëüøèå î÷åïÿòêè è ïðî÷èå êóðüåçû Âîïðîñ äëÿ ïðîôåññèîíàëà Çàäà÷à 33. Îîîîïåðàòîðû Âîïðîñ äëÿ íîâè÷êà Âîïðîñ äëÿ ïðîôåññèîíàëà Ïðàâèëî “ìàêñèìàëüíîãî ãëîòêà”
186 186 186 186 188 189 190 192 192 192 192 193 194 196 197 197 197 197 197 198 198 200 200 201 201 203 204 204 207 207 207 207
Содержание
11
Îïåðàòîðíûå øóòêè Çëîóïîòðåáëåíèå îïåðàòîðàìè Äîïîëíèòåëüíûé âîïðîñ Ðåçþìå
207 208 210 210
Èçó÷åíèå êîíêðåòíûõ ïðèìåðîâ
211
Çàäà÷à 34. Èíäåêñíûå òàáëèöû Âîïðîñ äëÿ íîâè÷êà Âîïðîñ äëÿ ïðîôåññèîíàëà Íåáîëüøàÿ ïðîïîâåäü î ÿñíîñòè Ðàçáîð èíäåêñíûõ òàáëèö Èñïðàâëåíèå ìåõàíè÷åñêèõ îøèáîê Óëó÷øåíèå ñòèëÿ Ðåçþìå Çàäà÷à 35. Îáîáùåííûå îáðàòíûå âûçîâû Âîïðîñ äëÿ íîâè÷êà Âîïðîñ äëÿ ïðîôåññèîíàëà Êà÷åñòâà îáîáùåííîñòè Ðàçáîð îáîáùåííûõ îáðàòíûõ âûçîâîâ Óëó÷øåíèå ñòèëÿ Èñïðàâëåíèå ìåõàíè÷åñêèõ îøèáîê è îãðàíè÷åíèé Ðåçþìå Çàäà÷à 36. Îáúåäèíåíèÿ Âîïðîñ äëÿ íîâè÷êà Âîïðîñ äëÿ ïðîôåññèîíàëà Îñíîâíûå ñâåäåíèÿ Ïîñòðîåíèå îáúåäèíåíèé Ðàçáîð êîäà Ýòè õèòðûå èìåíà Èñïîëüçîâàíèå boost::any Ðàçìå÷åííûå îáúåäèíåíèÿ Àëåêñàíäðåñêó Ðåçþìå Çàäà÷à 37. Îñëàáëåííàÿ ìîíîëèòíîñòü. ×àñòü 1: âçãëÿä íà std::string Âîïðîñ äëÿ íîâè÷êà Âîïðîñ äëÿ ïðîôåññèîíàëà Èçáåãàéòå ÷ðåçìåðíî ìîíîëèòíûõ êîíñòðóêöèé Êëàññ string Ðåçþìå Çàäà÷à 38. Îñëàáëåííàÿ ìîíîëèòíîñòü. ×àñòü 2: ðàçáîð std::string Âîïðîñ äëÿ íîâè÷êà Âîïðîñ äëÿ ïðîôåññèîíàëà ×ëåíñòâî – áûòü èëè íå áûòü Îïåðàöèè, êîòîðûå îáÿçàíû áûòü ÷ëåíàìè Îïåðàöèè, êîòîðûå ñëåäóåò ñäåëàòü ÷ëåíàìè Ñïîðíûå îïåðàöèè, êîòîðûå ìîãóò íå áûòü íè ÷ëåíàìè, íè äðóçüÿìè Çàäà÷à 39. Îñëàáëåííàÿ ìîíîëèòíîñòü. ×àñòü 3: óìåíüøåíèå std::string Âîïðîñ äëÿ íîâè÷êà Âîïðîñ äëÿ ïðîôåññèîíàëà
212 212 212 213 213 214 215 218 221 221 221 221 222 222 224 227 228 228 228 229 231 232 236 238 239 241 242 242 242 242 243 246 247 247 247 247 248 249 249 254 254 254
12
Стр. 12
Содержание
Îïåðàöèè, êîòîðûå ìîãóò íå áûòü ÷ëåíàìè resize assign è +=/append/push_back insert Íåáîëüøîé ïåðåðûâ Çàäà÷à 40. Îñëàáëåííàÿ ìîíîëèòíîñòü. ×àñòü 4: íîâûé std::string Âîïðîñ äëÿ íîâè÷êà Âîïðîñ äëÿ ïðîôåññèîíàëà Ïðî÷èå îïåðàöèè, êîòîðûå ìîãóò íå áûòü ÷ëåíàìè Íåáîëüøîé ïåðåðûâ íà êîôå replace Âòîðîé ïåðåðûâ íà êîôå: copy è substr compare find Ðåçþìå
254 254 255 256 256 257 257 257 257 257 258 260 262 262 263
Ñïèñîê ëèòåðàòóðû
265
Ïðåäìåòíûé óêàçàòåëü
268
Содержание
Стр. 13
13
Òèíå, ìîåé æåíå è ëó÷øåìó äðóãó
ПРЕДИСЛОВИЕ Ìåñòî äåéñòâèÿ: Áóäàïåøò. Æàðêèé ëåòíèé âå÷åð. Ìû ñìîòðèì ÷åðåç Äóíàé, íà âîñòî÷íûé áåðåã ðåêè. Íà îáëîæêå êíèãè âû âèäèòå ôîòî, íà êîòîðîì èçîáðàæåíà ýòà ïàñòåëüíàÿ åâðîïåéñêàÿ êàðòèíà. ×òî ïåðâîå áðîñàåòñÿ âàì â ãëàçà? Ïî÷òè íàâåðíÿêà – çäàíèå ïàðëàìåíòà â ëåâîé ÷àñòè ôîòîãðàôèè. Ìàññèâíîå íåîãîòè÷åñêîå çäàíèå ïðèêîâûâàåò âçãëÿä ñâîèì èçÿùíûì êóïîëîì, ìàññîé âû÷óðíûõ øïèëåé, äåñÿòêàìè ñòàòóé è ïðî÷èìè óêðàøåíèÿìè, êîíòðàñòèðóÿ ñ ïðîñòûìè ñòðîãèìè ëèíèÿìè çäàíèé íà íàáåðåæíîé Äóíàÿ. Îòêóäà æå òàêîå îòëè÷èå? Ñòðîèòåëüñòâî çäàíèÿ ïàðëàìåíòà áûëî çàâåðøåíî â 1902 ãîäó, â òî âðåìÿ êàê îñòàëüíûå çäàíèÿ íà íàáåðåæíîé áûëè ïîñòðîåíû â ðàçðóøåííîì Áóäàïåøòå ïîñëå âòîðîé ìèðîâîé âîéíû. “Íó è ÷òî æå, – ñêàæåòå âû, – êàêîå îòíîøåíèå ýòî èìååò ê êíèãå?” Ñòèëü – ýòî âñåãäà íå÷òî áîëüøåå, ÷åì ïðîñòî âíåøíèé âèä, è çà íèì ñêðûâàåòñÿ öåëàÿ ôèëîñîôèÿ è ìèðîâîççðåíèå – áóäü òî â àðõèòåêòóðå ñòðîèòåëüñòâà èëè â àðõèòåêòóðå ïðîãðàììíîãî îáåñïå÷åíèÿ. ß äóìàþ, ÷òî âàì ïîïàäàëèñü ïðîãðàììû, íàïîìèíàþùèå ñâîåé “ïûøíîñòüþ” è ðàçìåðàìè çäàíèå ïàðëàìåíòà, ðàâíî êàê óâåðåí, ÷òî âàì äîâîäèëîñü âèäåòü è ïðîãðàììû, íàïîìèíàþùèå áëî÷íî-ïàíåëüíîå ñòðîèòåëüñòâî.
Стиль или суть? ×òî æå âàæíåå? ×åìó ëó÷øå è ïðàâèëüíåå îòäàòü ïðåäïî÷òåíèå? Âû óâåðåíû, ÷òî çíàåòå òî÷íûé îòâåò íà ýòîò âîïðîñ? Òàê, ïîíÿòèå “ëó÷øå” ëèøåíî ñìûñëà, ïîêà íå îïðåäåëåíà ìåðà, êîòîðîé ñëåäóåò ìåðèòü. Ëó÷øå äëÿ ÷åãî? Ëó÷øå â êàêîé ñèòóàöèè? Ñêîðåå âñåãî, îòâåò íà ýòîò âîïðîñ ïðåäñòàâëÿåò ñîáîé îïðåäåëåííûé êîìïðîìèññ è íà÷èíàåòñÿ ñî ñëîâ “Ýòî çàâèñèò îò…” Ýòî êíèãà î ïîèñêå áàëàíñà ìåæäó ìíîãèìè ìåëêèìè àñïåêòàìè äèçàéíà è ðåàëèçàöèè ïðîãðàìì íà Ñ++. Ãëóáîêîå çíàíèå âàøèõ èíñòðóìåíòîâ è èñõîäíûõ ìàòåðèàëîâ âåñüìà ñïîñîáñòâóåò ïîíèìàíèþ òîãî, êîãäà èõ ñòîèò èñïîëüçîâàòü. Òàê ëó÷øå ëè çäàíèå ïàðëàìåíòà è åãî ñòèëü, ÷åì ó çäàíèé, íàõîäÿùèõñÿ ðÿäîì ñ íèì? Î÷åíü ëåãêî, íå äóìàÿ, îòâåòèòü “äà”. Íî îòâåò äîëæåí îñíîâûâàòüñÿ íå òîëüêî íà ýìîöèÿõ, íî è íà ëîãèêå. Ïðåäñòàâüòå, íàñêîëüêî íå ïðîñòî ïîñòðîèòü òàêîå çäàíèå è ïîääåðæèâàòü åãî â äîëæíîì ñîñòîÿíèè. •
Стр. 14
Ñòðîèòåëüñòâî.  1902 ãîäó, êîãäà çàêîí÷èëîñü åãî ñòðîèòåëüñòâî, ýòî çäàíèå áûëî ñàìûì áîëüøèì â ìèðå çäàíèåì ïàðëàìåíòà. Ýòà ãðàíäèîçíîñòü, êîíå÷íî æå, ñêàçàëàñü íà åãî ñòîèìîñòè, ïðîäîëæèòåëüíîñòè ñòðîèòåëüñòâà è êîëè÷åñòâå çàòðà÷åííûõ óñèëèé. Òàê áûë ñîçäàí “áåëûé ñëîí”, ò.å. íå÷òî èíòåðåñíîå ñàìî ïî ñåáå, íî ñî ñòîèìîñòüþ, êîòîðóþ íå îïðàâäûâàåò íèêàêîé èíòåðåñ. Êàê âû äóìàåòå, ñêîëüêî îáû÷íîãî æèëüÿ, êîòîðîå ïóñòü è íå ïîòðÿñàåò âîîáðàæåíèå,
íî äàåò êðîâ íàä ãîëîâîé, ìîæíî áûëî áû ïîñòðîèòü ïðè òåõ æå êàïèòàëîâëîæåíèÿõ? Íàâåðíîå, îòâåò íà ýòîò âîïðîñ ìîã áû âïå÷àòëèòü ìíîãèõ. Ïîçâîëüòå íàïîìíèòü âàì, ÷òî âñå ìû ðàáîòàåì â òîé îòðàñëè ïðîìûøëåííîñòè, ãäå äàâëåíèå ñðîêîâ ðàçðàáîòêè îùóùàåòñÿ îñîáî ñèëüíî – è â ïðèíöèïå íåñðàâíèìî ñ òàêîâûì âî âðåìåíà ïîñòðîéêè ðàññìàòðèâàåìîãî çäàíèÿ. •
Ïîääåðæêà. Ïðèñìîòðèòåñü ê ôîòîãðàôèè, è âû óâèäèòå, ÷òî ÷àñòü çäàíèÿ ïîêðûòà ëåñàìè. Ðåñòàâðàöèîííûå ðàáîòû èäóò çäåñü ãîäàìè, è íà ýòî çàòðà÷èâàþòñÿ òàêèå ñóììû, ÷òî, ïîæàëóé, áûëî áû ïðîùå ñíåñòè ýòî çäàíèå è ïîñòðîèòü ÷òî-òî íîâîå. Íà ôîòîãðàôèè íå âèäíî (äà è íå ìîæåò áûòü âèäíî) êîå-÷òî åùå. Íàïðèìåð, ñêóëüïòóðû, óêðàøàþùèå çäàíèå, áûëè ñäåëàíû èç ïëîõî ïîäîáðàííîãî ìàòåðèàëà, êîòîðûé ñëèøêîì ëåãêî ðàçðóøàåòñÿ, òàê ÷òî èõ ðåñòàâðàöèÿ è çàìåíà áûëè íà÷àòû åäâà ëè íå ñðàçó æå ïîñëå çàâåðøåíèÿ ñòðîèòåëüñòâà, è âñå ýòè óêðàøåíèÿ, “ðþøå÷êè è ôèíòèôëþøå÷êè” – ïðåäìåò ïîñòîÿííîé çàáîòû ðåñòàâðàòîðîâ óæå áîëåå âåêà.
Òàê è â ïðîãðàììèðîâàíèè – î÷åíü âàæíî íàéòè çîëîòóþ ñåðåäèíó ìåæäó ñòîèìîñòüþ è ôóíêöèîíàëüíîñòüþ, ìåæäó ýëåãàíòíîñòüþ è ñîïðîâîæäàåìîñòüþ, ìåæäó âîçìîæíîñòÿìè ðàçâèòèÿ è óêðàøàòåëüñòâîì. Ñ ïîäîáíûìè ïðîáëåìàìè è ïîèñêîì êîìïðîìèññîâ ìû âûíóæäåíû ñòàëêèâàòüñÿ åæåäíåâíî ïðè ðàçðàáîòêå ïðîãðàììíîãî îáåñïå÷åíèÿ íà C++. Ñðåäè âîïðîñîâ, êîòîðûå ðàññìàòðèâàþòñÿ â äàííîé êíèãå, åñòü è òàêèå: äåëàåò ëè áåçîïàñíîñòü êîäà ïî îòíîøåíèþ ê èñêëþ÷åíèÿì ëó÷øå ñàì êîä? Åñëè äà – òî ÷òî èìåííî îçíà÷àåò “äåëàåò åãî ëó÷øå”, è íå ìîæåò ëè âîçíèêíóòü ñèòóàöèÿ, êîãäà ýòî íå òàê óæ è õîðîøî? À êàê íàñ÷åò èíêàïñóëÿöèè? Äåëàåò ëè îíà ïðîãðàììó ëó÷øå? Ïî÷åìó? Ïðè êàêèõ óñëîâèÿõ ýòî íå òàê? Åñëè âàñ çàèíòåðåñîâàëè ýòè âîïðîñû – êíèãà ïåðåä âàìè, ïðî÷òèòå åå. Êñòàòè, âñòðàèâàåìûå ôóíêöèè – ýòî õîðîøàÿ îïòèìèçàöèÿ? Ñëåäóåò ëè ê íåé ïðèáåãàòü? (Áóäüòå î÷åíü-î÷åíü îñòîðîæíû ïðè îòâåòå íà ýòîò âîïðîñ.) ×òî îáùåãî ìåæäó âîçìîæíîñòüþ ýêñïîðòà â C++ è çäàíèåì ïàðëàìåíòà? À ìåæäó std::string è ìîíîëèòíîé àðõèòåêòóðîé çäàíèé íà íàáåðåæíîé Äóíàÿ? Ïîñëå ðàññìîòðåíèÿ ìíîæåñòâà ðàçëè÷íûõ òåõíîëîãèé è âîçìîæíîñòåé C++, â êîíöå êíèãè öåëûé ðàçäåë îòâåäåí äëÿ àíàëèçà ðåàëüíûõ ïðèìåðîâ îïóáëèêîâàííûõ èñõîäíûõ òåêñòîâ. Ìû âûÿñíèì, ÷òî àâòîðàì ýòèõ ôðàãìåíòîâ óäàëîñü, ÷òî íå ñîâñåì, è êàê èñïðàâèòü áàëàíñ ìåæäó çàòðà÷èâàåìûìè óñèëèÿìè è õîðîøèì ñòèëåì. ß íàäåþñü, ÷òî ýòà êíèãà, à òàêæå ïðåäûäóùèå êíèãè ïî äàííîé òåìå1 ïîìîãóò âàì øèðå âçãëÿíóòü íà C++, ïðèáàâÿò âàì çíàíèé î äåòàëÿõ è òîíêîñòÿõ ÿçûêà, ðàññêàæóò î åãî âíóòðåííèõ âçàèìîñâÿçÿõ è ïîìîãóò âàì â ïîèñêå çîëîòîé ñåðåäèíû ïðè ðàçðàáîòêå ñîáñòâåííûõ ïðîãðàìì. Âçãëÿíèòå åùå ðàç íà ôîòîãðàôèþ íà îáëîæêå êíèãè, â ïðàâûé âåðõíèé óãîë. Âèäèòå òàì âîçäóøíûé øàð? Âîò òàê è ìû äîëæíû ïîäíÿòüñÿ íàä ãîðîäîì è óâèäåòü åãî âåñü, âî âñåé ïåðñïåêòèâå – êðàñîòó è èçÿùåñòâî îäíèõ ñòðîåíèé, ïðîñòîòó è íàäåæíîñòü äðóãèõ, ïîíÿòü, ÷òî ñòèëü è ñóòü âçàèìîñâÿçàíû, è îíè íå ïðîñòî ñîñóùåñòâóþò, íî è âçàèìîäåéñòâóþò è äîïîëíÿþò äðóã äðóãà. Ïîäíÿâøèñü íàä ãîðîäîì, ìû âèäèì íå îòäåëüíûå äîìà, íî âåñü ãîðîä â åãî êðàñîòå è íåïîâòîðèìîñòè, è âûðàáîòàòü èìåííî ýòîò âçãëÿä íà C++ – âî âñåé åãî êðàñîòå è öåëîñòíîñòè – äîëæíà ïîìî÷ü íàì äàííàÿ êíèãà.
Метод Сократа Ãðå÷åñêèé ôèëîñîô Ñîêðàò îáó÷àë ñâîèõ ó÷åíèêîâ, çàäàâàÿ èì âîïðîñû, êîòîðûå áûëè ðàçðàáîòàíû òàêèì îáðàçîì, ÷òîáû íàïðàâëÿòü ìûøëåíèå ó÷åíèêîâ è ïîìîãàòü 1 Âûøåäøèå â èçäàòåëüñòâå “Âèëüÿìñ” îáúåäèíåííûìè â îäíó êíèãó: Ñàòòåð Ã. Ðåøåíèå ñëîæíûõ çàäà÷ íà C++. Ñåðèÿ C++ In-Depth, ò.4. Ì.: Èçäàòåëüñêèé äîì “Âèëüÿìñ”, 2004. – Ïðèì. ðåä.
Предисловие
Стр. 15
15
èì ñäåëàòü âåðíûå âûâîäû èç òîãî, ÷òî îíè óæå çíàþò, à òàêæå ïîêàçàòü èì âçàèìîñâÿçü èçó÷àåìîãî ìàòåðèàëà ñ äðóãèìè çíàíèÿìè. Ýòîò ìåòîä îáó÷åíèÿ ñòàë òàê ïîïóëÿðåí, ÷òî ñåãîäíÿ ìû íàçûâàåì åãî “ìåòîäîì Ñîêðàòà”. Ñ òî÷êè çðåíèÿ ó÷àùèõñÿ ïîäõîä Ñîêðàòà âêëþ÷àåò èõ â ïðîöåññ îáó÷åíèÿ, çàñòàâëÿåò äóìàòü è ïîìîãàåò ïðèìåíèòü óæå èìåþùèåñÿ çíàíèÿ ê íîâîé èíôîðìàöèè. Ýòà êíèãà âïîëíå ñëåäóåò ìåòîäó Ñîêðàòà, êàê è åå ïðåäøåñòâåííèöû [Sutter00] è [Sutter02]. Ïðåäïîëàãàåòñÿ, ÷òî âàì ïðèõîäèòñÿ çàíèìàòüñÿ íàïèñàíèåì ïðîìûøëåííîãî ïðîãðàììíîãî îáåñïå÷åíèÿ íà ÿçûêå C++; â êíèãå èñïîëüçóþòñÿ âîïðîñû è îòâåòû äëÿ îáó÷åíèÿ ýôôåêòèâíîìó ïðèìåíåíèþ ñòàíäàðòà C++ è åãî ñòàíäàðòíîé áèáëèîòåêè, ïðè÷åì îñîáîå âíèìàíèå óäåëÿåòñÿ ðàçðàáîòêå íàäåæíîãî ïðîãðàììíîãî îáåñïå÷åíèÿ ñ èñïîëüçîâàíèåì âñåõ âîçìîæíîñòåé ñîâðåìåííîãî C++. Ìíîãèå èç ðàññìîòðåííûõ â êíèãå çàäà÷ ïîÿâèëèñü â ðåçóëüòàòå ðàáîòû àâòîðà è äðóãèõ ïðîãðàììèñòîâ íàä ñâîèìè ïðîãðàììàìè. Öåëü êíèãè – ïîìî÷ü ÷èòàòåëþ ñäåëàòü âåðíûå âûâîäû, êàê èç õîðîøî èçâåñòíîãî åìó ìàòåðèàëà, òàê è èç òîëüêî ÷òî èçó÷åííîãî, è ïîêàçàòü âçàèìîñâÿçü ìåæäó ðàçëè÷íûìè ÷àñòÿìè C++. Äàííàÿ êíèãà íå ïîñâÿùåíà êàêîìó-òî êîíêðåòíîìó àñïåêòó C++. Íåëüçÿ, îäíàêî, ñêàçàòü, ÷òî îíà îõâàòûâàåò âñå äåòàëè C++ – äëÿ ýòîãî ïîòðåáîâàëîñü áû ñëèøêîì ìíîãî êíèã, – íî, òåì íå ìåíåå, â íåé ðàññìàòðèâàåòñÿ øèðîêàÿ ïàëèòðà âîçìîæíîñòåé C++ è ñòàíäàðòíîé áèáëèîòåêè è, ÷òî íåìàëîâàæíî, äåìîíñòðèðóåòñÿ, êàê êàæóùèåñÿ íà ïåðâûé âçãëÿä íåñâÿçàííûìè ìåæäó ñîáîé âåùè ìîãóò ñîâìåñòíî èñïîëüçîâàòüñÿ äëÿ ïîëó÷åíèÿ íîâûõ ðåøåíèé ñòàðûõ è õîðîøî èçâåñòíûõ çàäà÷. Çäåñü âû íàéäåòå ìàòåðèàë, ïîñâÿùåííûé øàáëîíàì è ïðîñòðàíñòâàì èìåí, èñêëþ÷åíèÿì è íàñëåäîâàíèþ, ïðîåêòèðîâàíèþ íàäåæíûõ êëàññîâ è øàáëîíàì ïðîåêòèðîâàíèÿ, îáîáùåííîìó ïðîãðàììèðîâàíèþ è ìàãèè ìàêðîñîâ, – è íå ïðîñòî âèíåãðåò èç ýòèõ âîïðîñîâ, à çàäà÷è è ðåøåíèÿ, âûÿâëÿþùèå âçàèìîñâÿçü âñåõ ýòèõ ÷àñòåé ñîâðåìåííîãî C++. Ýòà êíèãà ïðîäîëæàåòñÿ ñ òîãî ìåñòà, ãäå çàêàí÷èâàåòñÿ èçëîæåíèå ìàòåðèàëà â [Sutter00] è [Sutter02], è ñëåäóåò òîé æå òðàäèöèè: Ìàòåðèàë êíèãè ïîäàåòñÿ â âèäå çàäà÷, ñãðóïïèðîâàííûõ ïî òåìàì. ×èòàòåëè ïåðâûõ êíèã íàéäóò çäåñü íàïîëíåííûå íîâûì ñîäåðæàíèåì óæå çíàêîìûå èì òåìû – áåçîïàñíîñòü èñêëþ÷åíèé, îáîáùåííîå ïðîãðàììèðîâàíèå, ìåòîäû îïòèìèçàöèè è óïðàâëåíèÿ ïàìÿòüþ. Îñíîâíîå âíèìàíèå óäåëÿåòñÿ âîïðîñàì îáîáùåííîãî ïðîãðàììèðîâàíèÿ è ýôôåêòèâíîãî èñïîëüçîâàíèÿ ñòàíäàðòíîé áèáëèîòåêè C++. Áîëüøèíñòâî çàäà÷ ïåðâîíà÷àëüíî áûëè îïóáëèêîâàíû â Internet è íåêîòîðûõ æóðíàëàõ, â ÷àñòíîñòè, ýòî ðàñøèðåííûå âåðñèè çàäà÷ 63—86, êîòîðûå ìîæíî íàéòè íà ìîåì óçëå Guru of the Week [GotW], à òàêæå ìàòåðèàëû, îïóáëèêîâàííûå ìíîþ â òàêèõ æóðíàëàõ, êàê C/C++ User Journal, Dr. Dobb’s Journal, áûâøåì C++ Report è äð. Ïîñëåäíèå èñïðàâëåíèÿ è äîïîëíåíèÿ ê êíèãå ìîæíî íàéòè íà Web-óçëå ïî àäðåñó www.gotw.ca.
Как читать данную книгу Ïðåäïîëàãàåòñÿ, ÷òî ÷èòàòåëü óæå õîðîøî çíàêîì ñ îñíîâàìè C++. Åñëè ýòî íå òàê, íà÷íèòå ñ õîðîøåãî ââåäåíèÿ è îáçîðà ïî C++. Äëÿ ýòîé öåëè ìîãó ïîðåêîìåíäîâàòü âàì òàêèå êíèãè, êàê [Stroustrup00], [Lippman98], à òàêæå [Meyers96] è [Meyers97]. Êàæäàÿ çàäà÷à â êíèãå èìååò çàãîëîâîê, êîòîðûé âûãëÿäèò, êàê ïîêàçàíî íèæå.
Задача №. Название задачи
Сложность: X
Íàçâàíèå çàäà÷è è óðîâåíü åå ñëîæíîñòè ïîäñêàçûâàþò âàì, äëÿ êîãî îíà ïðåäíàçíà÷åíà. Îáû÷íî â çàäà÷å åñòü âîïðîñ äëÿ íîâè÷êà, ÷òî ïîçâîëÿåò ðàçìÿòüñÿ ïðåæäå
16
Стр. 16
Предисловие
÷åì ïðèñòóïèòü ê ãëàâíîé ÷àñòè – âîïðîñó äëÿ ïðîôåññèîíàëà. Çàìå÷ó, ÷òî óêàçàííûé óðîâåíü ñëîæíîñòè çàäà÷ – ýòî ìîå ñóáúåêòèâíîå ìíåíèå îòíîñèòåëüíî òîãî, íàñêîëüêî ñëîæíî áóäåò ðåøèòü òó èëè èíóþ çàäà÷ó áîëüøèíñòâó ÷èòàòåëåé, òàê ÷òî âû âïîëíå ìîæåòå îáíàðóæèòü, ÷òî çàäà÷à ñ óðîâíåì ñëîæíîñòè 7 ðåøåíà âàìè ãîðàçäî áûñòðåå, ÷åì çàäà÷à ñ óðîâíåì ñëîæíîñòè 5. Ñî âðåìåíè âûõîäà â ñâåò ïðåäûäóùèõ êíèã ÿ ïîëó÷èë íåìàëî ïèñåì, â êîòîðûõ ÷èòàòåëè óòâåðæäàëè, ÷òî çàäà÷à M ñëîæíåå (ïðîùå) çàäà÷è N. Ýòî òîëüêî ïîäòâåðæäàåò ìîé òåçèñ î ñóáúåêòèâíîñòè îöåíîê è èõ çàâèñèìîñòè îò êîíêðåòíûõ çíàíèé è îïûòà ÷èòàòåëÿ. ×òåíèå êíèãè îò íà÷àëà äî êîíöà – íåïëîõîå ðåøåíèå, íî âû íå îáÿçàíû ïîñòóïàòü èìåííî òàê. Âû ìîæåòå, íàïðèìåð, ÷èòàòü òîëüêî èíòåðåñóþùèå âàñ ðàçäåëû êíèãè. Çà èñêëþ÷åíèåì òîãî, ÷òî ÿ íàçûâàþ “ìèíè-ñåðèÿìè” (ñâÿçàííûå ìåæäó ñîáîé çàäà÷è ñ îäèíàêîâûì íàçâàíèåì è ïîäçàãîëîâêàìè “×àñòü 1”, “×àñòü 2” è ò.ä.), çàäà÷è â êíèãå ïðàêòè÷åñêè íåçàâèñèìû äðóã îò äðóãà, è âû ìîæåòå ÷èòàòü èõ â ëþáîì ïîðÿäêå. Åäèíñòâåííàÿ ïîäñêàçêà: ìèíè-ñåðèè ëó÷øå ÷èòàòü âìåñòå; âî âñåì îñòàëüíîì – âûáîð çà âàìè. Âñå ïðèìåðû êîäà – âñåãî ëèøü îòðûâêè ïðîãðàìì, åñëè íå îãîâîðåíî èíîå, è íå ñëåäóåò îæèäàòü, ÷òî ýòè îòðûâêè áóäóò êîððåêòíî êîìïèëèðîâàòüñÿ ïðè îòñóòñòâèè îñòàëüíûõ ÷àñòåé ïðîãðàììû. Äëÿ ýòîãî âàì ïðèäåòñÿ ñàìîñòîÿòåëüíî äîïèñûâàòü íåäîñòàþùèå ÷àñòè. È ïîñëåäíåå çàìå÷àíèå – îá URL: íåò íè÷åãî áîëåå èçìåí÷èâîãî, ÷åì Web, è áîëåå ìó÷èòåëüíîãî, ÷åì äàâàòü ññûëêè íà Web â ïå÷àòíîé êíèãå: çà÷àñòóþ ýòè ññûëêè óñòàðåâàþò åùå äî òîãî, êàê êíèãà ïîïàäàåò â òèïîãðàôèþ. Òàê ÷òî êî âñåì ïðèâåäåííûì â êíèãå ññûëêàì ñëåäóåò îòíîñèòüñÿ êðèòè÷åñêè, è â ñëó÷àå èõ íåêîððåêòíîñòè – ïèøèòå ìíå. Äåëî â òîì, ÷òî âñå ññûëêè äàíû ÷åðåç ìîé Web-óçåë www.gotw.ca, è â ñëó÷àå íåêîððåêòíîñòè êàêîé-ëèáî ññûëêè ÿ ïðîñòî îáíîâëþ ïåðåíàïðàâëåíèå ê íîâîìó ìåñòîïîëîæåíèþ ñòðàíèöû (åñëè íàéäó åå) èëè óêàæó, ÷òî òàêîâîé áîëüøå íåò (åñëè íå ñìîãó åå íàéòè).
Благодарности  ïåðâóþ î÷åðåäü ÿ õî÷ó ïîáëàãîäàðèòü ìîþ æåíó Òèíó (Tina) çà åå òåðïåíèå, ëþáîâü è ïîääåðæêó, à òàêæå âñþ ìîþ ñåìüþ çà òî, ÷òî îíè âñåãäà ñî ìíîé, êàê ïðè íàïèñàíèè êíèã, òàê è â ëþáîå äðóãîå âðåìÿ. Áåç èõ áåçãðàíè÷íîãî òåðïåíèÿ è ó÷àñòèÿ êíèãà áû íå ïîëó÷èëàñü òàêîé, êàêîé âû åå âèäèòå. ß âûðàæàþ îñîáóþ ïðèçíàòåëüíîñòü ðåäàêòîðó ñåðèè Áüåðíó Ñòðàóñòðóïó (Bjarne Stroustrup), à òàêæå ðåäàêòîðàì Ïèòåðó Ãîðäîíó (Peter Gordon) è Äåááè Ëàôôåðòè (Debbie Lafferty), Òèððåëëó Àëüáàõ (Tyrrell Albaugh), Áåðíàðäó Ãàôíè (Bernard Gaffney), Êóðòó Äæîíñîíó (Curt Johnson), ×àíäà Ëèðè-Êóòó (Chanda Leary-Coutu), ×àðëüçó Ëåääè (Charles Leddy), Ìåëèíäå Ìàê-Êåéí (Malinda McCain), ×àòè Ïðàñåðñèõó (Chuti Prasertsith) è âñåì îñòàëüíûì ÷ëåíàì êîìàíäû Addison-Wesley çà èõ ïîìîùü è íàñòîé÷èâîñòü â ðàáîòå íàä äàííûì ïðîåêòîì. Òðóäíî ïðåäñòàâèòü ñåáå ëó÷øóþ êîìàíäó äëÿ ðàáîòû íàä äàííîé êíèãîé; èõ ýíòóçèàçì è ïîìîùü ïîìîãëè ñäåëàòü ýòó êíèãó òåì, ÷åì îíà, ÿ íàäåþñü, ÿâëÿåòñÿ. Åùå îäíà ãðóïïà ëþäåé, çàñëóæèâàþùèõ îñîáîé áëàãîäàðíîñòè, – ýòî ìíîæåñòâî ýêñïåðòîâ, ÷üÿ êðèòèêà è êîììåíòàðèè ïîìîãëè ñäåëàòü ìàòåðèàë êíèãè áîëåå ïîëíûì, áîëåå óäîáî÷èòàåìûì è áîëåå ïîëåçíûì. Îñîáóþ áëàãîäàðíîñòü ÿ õîòåë áû âûðàçèòü Áüåðíó Ñòðàóñòðóïó (Bjarne Stroustrup), Äýéâó Àáðàìñó (Dave Abrahams), Ñòèâó Àäàì÷èêó (Steve Adamczyk), Àíäðåþ Àëåêñàíäðåñêó (Andrei Alexandrescu), ×àêó Àëëèñîíó (Chuck Allison), Ìýòòó Îñòåðíó (Matt Austern), Éîðãó Áàðôóðòó (Joerg Barfurth), Ïèòó Áåêêåðó (Pete Becker), Áðåíäîíó Áðåþ (Brandon Bray), Ñòèâó Äüþõàðñòó (Steve Dewhurst), Äæîíàòàíó Êåéâçó (Jonathan Caves), Ïèòåðó Äèìîâó (Peter Dimov), Õàâüåðó Ýñòðàäà (Javier Estrada), Àòòèëå Ôåõåðó (Attila Fehér), Ìàðêî Äàëëà Ãàñïåðèíà (Marco Dalla Gasperina), Äóãó Ãðåãîðó (Doug Gregor), Ìàðêó Õîëëó (Mark Hall), Êýâëèíó ÕåíПредисловие
Стр. 17
17
íè (Kevlin Henney), Ãîâàðäó Õèííàíòó (Howard Hinnant), Êýþ Õîðñòìàíó (Cay Horstmann), Äæèìó Õàéñëîïó (Jim Hyslop), Ìàðêó Êàìèíñêè (Mark E. Kaminsky), Äýííèñó Ìàíêëó (Dennis Mancl), Áðàéåíó Ìàê-Íàìàðà (Brian McNamara), Ñêîòòó Ìåéåðñó (Scott Meyers), Äæåôôó Ïåéëó (Jeff Peil), Äæîíó Ïîòòåðó (John Potter), Ï. Ïëàãåðó (P. J. Plauger), Ìàðòèíó Ñåáîðó (Martin Sebor), Äæåéìñó Ñëîòåðó (James Slaughter), Íèêîëàþ Ñìèðíîâó (Nikolai Smirnov), Äæîíó Ñïàéñåðó (John Spicer), ßíó Êðèñòèàíó âàí Âèíêëþ (Jan Christiaan van Winkel), Äýâèäó Âàíäåâóðäó (Daveed Vandevoorde) è Áèëëó Âåéäó (Bill Wade). Âñå îñòàâøèåñÿ â êíèãå îøèáêè, îïèñêè è íåòî÷íîñòè – òîëüêî íà ìîåé ñîâåñòè. Åùå îäíà áëàãîäàðíîñòü – íàøåìó ùåíêó Ôðàíêè (Frankie), êîòîðûé îòòàñêèâàë ìåíÿ îò ñòîëà è òàùèë äûøàòü ñâåæèì âîçäóõîì, áåç ÷åãî, êîíå÷íî, ìîÿ ðàáîòà íèêîãäà íå áûëà áû çàêîí÷åíà. Çàìå÷ó, ÷òî Ôðàíêè íè÷åãî íå çíàåò î ïðîãðàììèðîâàíèè, îïòèìèçàöèè, àðõèòåêòóðå ïðîãðàììíîãî îáåñïå÷åíèÿ, è ïðè ýòîì îí âñåãäà âûãëÿäèò ñ÷àñòëèâûì è äîâîëüíûì. Íàä ýòèì ñòîèò çàäóìàòüñÿ…
Ãåðá Ñàòòåð (Herb Sutter) Ñèýòë, ìàé 2004
От издательства Âû, ÷èòàòåëü ýòîé êíèãè, è åñòü ãëàâíûé åå êðèòèê è êîììåíòàòîð. Ìû öåíèì âàøå ìíåíèå è õîòèì çíàòü, ÷òî áûëî ñäåëàíî íàìè ïðàâèëüíî, ÷òî ìîæíî áûëî ñäåëàòü ëó÷øå è ÷òî åùå âû õîòåëè áû óâèäåòü èçäàííûì íàìè. Íàì èíòåðåñíî óñëûøàòü è ëþáûå äðóãèå çàìå÷àíèÿ, êîòîðûå âàì õîòåëîñü áû âûñêàçàòü â íàø àäðåñ. Ìû æäåì âàøèõ êîììåíòàðèåâ è íàäååìñÿ íà íèõ. Âû ìîæåòå ïðèñëàòü íàì áóìàæíîå èëè ýëåêòðîííîå ïèñüìî, ëèáî ïðîñòî ïîñåòèòü íàø Web-ñåðâåð è îñòàâèòü ñâîè çàìå÷àíèÿ òàì. Îäíèì ñëîâîì, ëþáûì óäîáíûì äëÿ âàñ ñïîñîáîì äàéòå íàì çíàòü, íðàâèòñÿ èëè íåò âàì ýòà êíèãà, à òàêæå âûñêàæèòå ñâîå ìíåíèå î òîì, êàê ñäåëàòü íàøè êíèãè áîëåå èíòåðåñíûìè äëÿ âàñ. Ïîñûëàÿ ïèñüìî èëè ñîîáùåíèå, íå çàáóäüòå óêàçàòü íàçâàíèå êíèãè è åå àâòîðîâ, à òàêæå âàø îáðàòíûé àäðåñ. Ìû âíèìàòåëüíî îçíàêîìèìñÿ ñ âàøèì ìíåíèåì è îáÿçàòåëüíî ó÷òåì åãî ïðè îòáîðå è ïîäãîòîâêå ê èçäàíèþ ïîñëåäóþùèõ êíèã. Íàøè êîîðäèíàòû: E-mail:
[email protected]
WWW:
http://www.williamspublishing.com
Èíôîðìàöèÿ äëÿ ïèñåì èç: Ðîññèè:
127055, Ìîñêâà, óë. Ëåñíàÿ, ä. 43, ñòð. 1
Óêðàèíû:
03150, Êèåâ, à/ÿ 152
18
Стр. 18
Предисловие
ОБОБЩЕННОЕ ПРОГРАММИРОВАНИЕ И СТАНДАРТНАЯ БИБЛИОТЕКА C++ Îäíîé èç íàèáîëåå ìîùíûõ âîçìîæíîñòåé C++ ÿâëÿåòñÿ ïîääåðæêà îáîáùåííîãî ïðîãðàììèðîâàíèÿ. Ýòà âîçìîæíîñòü íàõîäèò íåïîñðåäñòâåííîå îòðàæåíèå â ãèáêîñòè ñòàíäàðòíîé áèáëèîòåêè C++, â îñîáåííîñòè â êîíòåéíåðàõ, èòåðàòîðàõ è àëãîðèòìàõ, èçâåñòíûõ ïîä íàçâàíèåì ñòàíäàðòíîé áèáëèîòåêè øàáëîíîâ (Standard Template Library – STL). Òàê æå, êàê è ïðåäûäóùàÿ êíèãà [Sutter02], ýòà êíèãà íà÷èíàåòñÿ ñ çàäà÷, êîòîðûå ïðèâëåêàþò íàøå âíèìàíèå ê íåêîòîðûì õîðîøî çíàêîìûì ÷àñòÿì STL, â ÷àñòíîñòè ê âåêòîðàì è ñòðîêàì. Ñìîæåòå ëè âû èçáåæàòü øèðîêî ðàñïðîñòðàíåííûõ ëîâóøåê ïðè èñïîëüçîâàíèè òàêîãî áàçîâîãî êîíòåéíåðà STL, êàê âåêòîð? Êàê âû âûïîëíèòå îáû÷íûå ìàíèïóëÿöèè ñî ñòðîêàìè â C++? Êàêèå óðîêè â ïëàíå êîíñòðóèðîâàíèÿ áèáëèîòåê âû ñìîæåòå èçâëå÷ü äëÿ ñåáÿ èç STL? Ïîñëå òîãî êàê ìû ðàçáåðåìñÿ ñ ïðåäîïðåäåëåííûìè øàáëîíàìè STL, ìû îáðàòèìñÿ ê áîëåå îáùèì âîïðîñàì, ñâÿçàííûì ñ øàáëîíàìè è îáîáùåííûì ïðîãðàììèðîâàíèåì íà C++. Êàê ìîæíî èçáåæàòü ïðè ðàçðàáîòêå ñîáñòâåííîãî øàáëîííîãî êîäà åãî íåîáîáùåííîñòè? Ïî÷åìó ñïåöèàëèçàöèÿ øàáëîíîâ ôóíêöèé – íå ëó÷øàÿ èäåÿ, è ÷òî ñëåäóåò äåëàòü âìåñòî ýòîãî? Êàê êîððåêòíî è ïåðåíîñèìî äîáèòüñÿ òåõ æå ðåçóëüòàòîâ, êîòîðûå äàþò îòíîøåíèÿ äðóæåñòâåííîñòè? È ÷òî íàì äàåò êëþ÷åâîå ñëîâî export? Ýòè è äðóãèå âîïðîñû áóäóò ðàññìîòðåíû íàìè â ðàçäåëå, ïîñâÿùåííîì îáîáùåííîìó ïðîãðàììèðîâàíèþ è ñòàíäàðòíîé áèáëèîòåêå C++.
Стр. 19
Задача 1. Вектор: потребление и злоупотребление
Сложность: 4
Ïî÷òè âñå èñïîëüçóþò std::vector, è ýòî õîðîøî. Ê ñîæàëåíèþ, ìíîãèå íå âñåãäà âåðíî ïîíèìàþò åãî ñåìàíòèêó è â ðåçóëüòàòå íåâîëüíî ïðèìåíÿþò åãî ñòðàííûìè, à ïîðîé è îïàñíûìè ñïîñîáàìè. Ñêîëüêî èç ïåðå÷èñëåííûõ íèæå ïðîáëåì ìîæíî íàéòè â âàøèõ ïðîãðàììàõ?
Вопрос для новичка 1.  ÷åì ðàçíèöà ìåæäó ñòðîêàìè A è B? void f( vector& v ) { v[0]; // A v.at(0); // B }
Вопрос для профессионала 2. Ðàññìîòðèì ñëåäóþùèé êîä. vector v; v.reserve( 2 ); assert( v.capacity() == 2 ); v[0] = 1; v[1] = 2; for(vector::iterator i = v.begin(); i, íî íå êàê > ñ ïîñëåäóþùèì >>.
Операторные шутки 1. Êàêîå íàèáîëüøåå êîëè÷åñòâî ïëþñîâ (+) ìîãóò áûòü ðàñïîëîæåíû ïîäðÿä, áåç âêëþ÷åíèÿ ïðîáåëüíûõ ñèìâîëîâ, â êîððåêòíîé ïðîãðàììå íà C++? Ïðèìå÷àíèå: êîíå÷íî, ïëþñû â êîììåíòàðèÿõ, äèðåêòèâàõ ïðåïðîöåññîðà, ìàêðîñàõ è ëèòåðàëàõ íå ó÷èòûâàþòñÿ. Ýòî áûëî áû íåñïîðòèâíî. Ìîæíî ñîçäàòü èñõîäíûé ôàéë, ñîäåðæàùèé ïîñëåäîâàòåëüíîñòü ñèìâîëîâ + ïðîèçâîëüíîé äëèíû (îãðàíè÷åííîé âîçìîæíîñòÿìè êîìïèëÿòîðà ïî îáðàáîòêå äëèííîé ñòðîêè). Åñëè ïîñëåäîâàòåëüíîñòü ñîñòîèò èç ÷åòíîãî êîëè÷åñòâà ñèìâîëîâ +, îíà èíòåðïðåòèðóåòñÿ êàê ++ ++ ++ ++ ... ++, ò.å. êàê ïîñëåäîâàòåëüíîñòü äâóõñèìâîëüíûõ Задача 33. Ооооператоры
Стр. 207
207
ëåêñåì ++. Äëÿ òîãî ÷òîáû òàêîé êîä áûë ðàáîòîñïîñîáåí è èìåë îäíîçíà÷íî îïðåäåëåííóþ ñåìàíòèêó, âñå, ÷òî íàì íàäî, – ýòî êëàññ, â êîòîðîì îïðåäåëåí ïîëüçîâàòåëüñêèé ïðåôèêñíûé îïåðàòîð ++, îáåñïå÷èâàþùèé âîçìîæíîñòü öåïî÷å÷íîãî âûçîâà. Íàïðèìåð: // ǚǻdzǷǰǻ 33-1(a) // class A { public: A& operator++() { return *this; } };
Òåïåðü ìû ìîæåì çàïèñàòü êîä A a; ++++++a;
// ǙDzǸǫȂǫǰǽ: ++ ++ ++ a;
êîòîðûé ðàáîòàåò ñëåäóþùèì îáðàçîì a.operator++().operator++().operator++()
À ÷òî, åñëè ïîñëåäîâàòåëüíîñòü èìååò íå÷åòíîå ÷èñëî ñèìâîëîâ +? Òîãäà îíà èíòåðïðåòèðóåòñÿ êàê ++ ++ ++ ++ ... ++ +, ïîñëåäîâàòåëüíîñòü äâóõñèìâîëüíûõ ëåêñåì ++, çà êîòîðîé ñëåäóåò çàêëþ÷àþùèé ñèìâîë +. Äëÿ òîãî ÷òîáû òàêîé êîä áûë ðàáîòîñïîñîáåí, íàäî äîïîëíèòåëüíî îïðåäåëèòü óíàðíûé îïåðàòîð +. // ǚǻdzǷǰǻ 33-1(Ǭ) // class A { public: A& operator+ () { return *this; } A& operator++() { return *this; } };
Òåïåðü ìû ìîæåì çàïèñàòü êîä A a; +++++++a;
// ǙDzǸǫȂǫǰǽ: ++ ++ ++ + a;
êîòîðûé ðàáîòàåò ñëåäóþùèì îáðàçîì. a.operator+().operator++().operator++().operator++()
Ýòî î÷åíü ïðîñòîé òðþê. Ñîçäàíèå íåîáû÷íî äëèííûõ ïîñëåäîâàòåëüíîñòåé äðóãèõ ñèìâîëîâ ìîæåò îêàçàòüñÿ íåìíîãî ñëîæíåå, íî âñå ðàâíî âîçìîæíûì.
Злоупотребление операторами Êîä â ïðèìåðàõ 33-1a è 33-1á íå ñëèøêîì çëîóïîòðåáëÿåò îáû÷íîé ñåìàíòèêîé îïåðàòîðîâ ++ è +.  äàëüíåéøåé ðàáîòå, îäíàêî, íàì ïðèäåòñÿ äàëåêî îòîéòè îò îáùåïðèíÿòûõ ïðàâèë êîäèðîâàíèÿ. Òî, ÷òî âû óâèäèòå äàëüøå, – íå äëÿ ïðîìûøëåííîãî èñïîëüçîâàíèÿ, à âñåãî ëèøü äëÿ ñîáñòâåííîãî óäîâîëüñòâèÿ. 2. Àíàëîãè÷íî, ÷åìó ðàâíî íàèáîëüøåå êîëè÷åñòâî êàæäûõ èç ïðèâåäåííûõ äàëåå ñèìâîëîâ, êîòîðûå ìîãóò ðàñïîëàãàòüñÿ â ïðîãðàììå ïîäðÿä, áåç âñòàâêè ïðîáåëüíûõ ñèìâîëîâ, âíå êîììåíòàðèåâ â êîððåêòíîé ïðîãðàììå íà C++? Äëÿ îòâåòà íà ýòîò âîïðîñ ìû ñîçäàäèì âñïîìîãàòåëüíûé êëàññ // ǚǻdzǷǰǻ 33-2 // class A { public: void operator&&( int ) { } void operator