Академический Документы
Профессиональный Документы
Культура Документы
ru
Âñå êíèãè àâòîðà: http://royallib.ru/author/hill_myurrey.html
Ýòà æå êíèãà â äðóãèõ ôîðìàòàõ: http://royallib.ru/book/hill_myurrey/C.html
Ïðèÿòíîãî ÷òåíèÿ!
C++
Ìþððåé Õèëë
Ñ++ - ýòî óíèâåðñàëüíûé ÿçûê ïðîãðàììèðîâàíèÿ, çàäóìàííûé òàê, ÷òîáû ñäåëàòü ïðîãðàììèðîâ
Êëþ÷åâûì ïîíÿòèåì Ñ++ ÿâëÿåòñÿ êëàññ. Êëàññ - ýòî òèï, îïðåäåëÿåìûé ïîëüçîâàòåëåì. Êëàññû
Ñ++ è åãî ñòàíäàðòíûå áèáëèîòåêè ñïðîåêòèðîâàíû òàê, ÷òîáû îáåñïå÷èâàòü ïåðåíîñèìîñòü. Èì
Ýòà êíèãà ïðåäíàçíà÷åíà ãëàâíûì îáðàçîì äëÿ òîãî, ÷òîáû ïîìî÷ü ñåðüåçíûì ïðîãðàììèñòàì èç
C++
Ïðåäèñëîâèå
ßçûê ôîðìèðóåò íàø ñïîñîá ìûøëåíèÿ è îïðåäåëÿåò, î ÷åì ìû ìîæåì ìûñëèòü.
Á.Ë. Âîðô
Ñ++ ýòî óíèâåðñàëüíûé ÿçûê ïðîãðàììèðîâàíèÿ, çàäóìàííûé òàê, ÷òîáû ñäåëàòü ïðîãðàììèðîâàí
Áëàãîäàðíîñòè
Ñ++ íèêîãäà áû íå ñîçðåë áåç ïîñòîÿííîãî èñïîëüçîâàíèÿ, ïðåäëîæåíèé è êîíñòðóêòèâíîé êðèòèê
Êðîìå òîãî, â ðàçâèòèå Ñ++ âíåñëè ñâîé âêëàä ñîòíè ëþäåé, êîòîðûå ïðèñûëàëè ìíå ïðåäëîæåíèÿ
 èçäàíèè ýòîé êíèãè ìíå ïîìîãëè ìíîãèå ëþäè, â ÷àñòíîñòè, Äæîí Áåíòëè, Ëàóðà Èâñ, Áðàéýí Ê
Ìþððýé Õèëë, Íüþ Äæåðñè Áüÿðí Ñòðàóñòðàï
Çàìå÷àíèÿ ïî Ðåàëèçàöèè
Âî âðåìÿ íàïèñàíèÿ ýòîé êíèãè âñå ðåàëèçàöèè Ñ++ èñïîëüçîâàëè âåðñèè åäèíñòâåííîãî èíòåðôåé
* Ñ++ ìîæíî êóïèòü â AT amp;T, Software Sales and Marketing, PO Box 25000, Greensboro, NC
) èëè â âàøèõ ìåñòíûõ îðãàíèçàöèÿõ, îñóùåñòâëÿþùèõ ïðîäàæó Ñèñòåìû UNIX. (ïðèì. àâòîðà)
Óïðàæíåíèÿ
Óïðàæíåíèÿ íàõîäÿòñÿ â êîíöå ãëàâ. Âñå óïðàæíåíèÿ ãëàâíûì îáðàçîì òèïà íàïèøèòå-ïðîãðàììó.
 Ñ++ íåò òèïîâ äàííûõ âûñîêîãî óðîâíÿ è íåò ïåðâè÷íûõ îïåðàöèé âûñîêîãî óðîâíÿ.  íåì íåò,
Èñêëþ÷àëèñü òå ÷åðòû, êîòîðûå ìîãëè áû ïîâëå÷ü äîïîëíèòåëüíûå ðàñõîäû ïàìÿòè èëè âðåìåíè âû
Ñ++ ïðîåêòèðîâàëñÿ äëÿ èñïîëüçîâàíèÿ â äîâîëüíî òðàäèöèîííîé ñðåäå êîìïèëÿöèè è âûïîëíåíèÿ,
Òèïû è ñðåäñòâà ñîêðûòèÿ äàííûõ â Ñ++ îïèðàþòñÿ íà ïðîâîäèìûé âî âðåìÿ êîìïèëÿöèè àíàëèç ïð
Èñòîðè÷åñêèå Çàìå÷àíèÿ
Áåçóñëîâíî, Ñ++ âîñõîäèò ãëàâíûì îáðàçîì ê C [7]. C ñîõðàíåí êàê ïîäìíîæåñòâî, ïîýòîìó ñäåë
Íàçâàíèå Ñ++ èçîáðåòåíèå ñîâñåì íåäàâíåå (ëåòà 1983-åãî). Áîëåå ðàííèå âåðñèè ÿçûêà èñïîë
Íàçâàíèå Ñ++ âûäóìàë Ðèê Ìàññèòòè. Íàçâàíèå óêàçûâàåò íà ýâîëþöèîííóþ ïðèðîäó ïåðåõîäà ê íå
Èçíà÷àëüíî Ñ++ áûë ðàçðàáîòàí, ÷òîáû àâòîðó è åãî äðóçüÿì íå ïðèõîäèëîñü ïðîãðàììèðîâàòü íà
 êà÷åñòâå áàçîâîãî ÿçûêà äëÿ Ñ++ áûë âûáðàí C, ïîòîìó ÷òî îí
1. ìíîãîöåëåâîé, ëàêîíè÷íûé è îòíîñèòåëüíî íèçêîãî óðîâíÿ,
2. îòâå÷àåò áîëüøèíñòâó çàäà÷ ñèñòåìíîãî ïðîãðàììèðîâàíèÿ,
3. èäåò âåçäå è íà âñåì è
4. ïðèãîäåí â ñðåäå ïðîãðàììèðîâàíèÿ UNIX.
 C åñòü ñâîè ñëîæíîñòè, íî â íàñïåõ ñïðîåêòèðîâàííîì ÿçûêå òîæå áûëè áû ñâîè, à ñëîæíîñòè
Ñ++ ñòàë èñïîëüçîâàòüñÿ øèðå, è ïî ìåðå òîãî, êàê âîçìîæíîñòè, ïðåäîñòàâëÿåìûå èì ïîìèìî âî
1. åñòü ìèëëèîíû ñòðîê íà C, êîòîðûå ìîãëè áû ïðèíåñòè ïîëüçó â Ñ++ ïðè óñëîâèè, ÷òî èõ íå
2. åñòü ñîòíè òûñÿ÷ ñòðîê áèáëèîòå÷íûõ ôóíêöèé è ñåðâèñíûõ ïðîãðàìì, íàïèñàííûõ íà C, êîòîð
3. åñòü äåñÿòêè òûñÿ÷ ïðîãðàììèñòîâ, êîòîðûå çíàþò C, è êîòîðûì, ïîýòîìó, íóæíî òîëüêî íàó÷
4. ïîñêîëüêó Ñ++ è C áóäóò èñïîëüçîâàòüñÿ íà îäíèõ è òåõ æå ñèñòåìàõ îäíèìè è òåìè æå ëþäüì
Ïîçäíåå áûëà ïðîâåäåíà ïðîâåðêà îïðåäåëåíèÿ Ñ++, ÷òîáû óäîñòîâåðèòüñÿ â òîì, ÷òî ëþáàÿ êîíñ
ßçûê C ñàì ýâîëþöèîíèðîâàë çà ïîñëåäíèå íåñêîëüêî ëåò, ÷àñòè÷íî ïîä âëèÿíèåì ðàçâèòèÿ Ñ++ (
Ýôôåêòèâíîñòü è Ñòðóêòóðà
Ñ++ áûë ðàçâèò èç ÿçûêà ïðîãðàììèðîâàíèÿ C è çà î÷åíü íåìíîãèìè èñêëþ÷åíèÿìè ñîõðàíÿåò C êà
 Ñ++ èñïîëüçóþòñÿ òå æå ïîñëåäîâàòåëüíîñòè âûçîâà è âîçâðàòà èç ôóíêöèé, ÷òî è â C.  òåõ
Îäíèì èç ïåðâîíà÷àëüíûõ ïðåäíàçíà÷åíèé C áûëî ïðèìåíåíèå åãî âìåñòî ïðîãðàììèðîâàíèÿ íà àññ
Îñîáîå âíèìàíèå, óäåëåííîå ïðè ðàçðàáîòêå Ñ++ ñòðóêòóðå, îòðàçèëîñü íà âîçðàñòàíèè ìàñøòàáà
Íå êàæäàÿ ÷àñòü ïðîãðàììû, îäíàêî, ìîæåò áûòü õîðîøî ñòðóêòóðèðîâàíà, íåçàâèñèìà îò àïïàðàò
 ýòîé êíèãå îñîáûé àêöåíò äåëàåòñÿ íà ìåòîäàõ ñîçäàíèÿ óíèâåðñàëüíûõ ñðåäñòâ, ïîëåçíûõ òèï
Ó êîãî-òî ìîæåò ïîÿâèòüñÿ ïîäîçðåíèå, ÷òî ñïåöèôèêàöèÿ ïðîãðàììû ñ ïîìîùüþ áîëåå ïîäðîáíîé
Ôèëîñîôñêèå Çàìå÷àíèÿ
ßçûê ïðîãðàììèðîâàíèÿ ñëóæèò äâóì ñâÿçàííûì ìåæäó ñîáîé öåëÿì: îí äàåò ïðîãðàììèñòó àïïàðàò
Ñâÿçü ìåæäó ÿçûêîì, íà êîòîðîì ìû äóìàåì/ïðîãðàììèðóåì, è çàäà÷àìè è ðåøåíèÿìè, êîòîðûå ìû
Ñèñòåìà òèïîâ äîëæíà áûòü îñîáåííî ïîëåçíà â íåòðèâèàëüíûõ çàäà÷àõ. Äåéñòâèòåëüíî, êîíöåïöè
Åñòåñòâåííî, òàêàÿ îðãàíèçàöèÿ èìååò ñâîè îãðàíè÷åíèÿ.  ÷àñòíîñòè, ìíîæåñòâî ïîíÿòèé èíîãä
Èíîãäà äëÿ îðãàíèçàöèè ïîíÿòèé íåêîòîðîé ïðîãðàììû îêàçûâàåòñÿ íåïðèãîäåí äàæå àöèêëè÷åñêèé
Åñëè âû ìîæåòå îðãàíèçîâàòü ïîíÿòèÿ ïðîãðàììû òîëüêî â âèäå îáùåãî ãðàôà (íå äåðåâà èëè àöè
Íàïîìíþ, ÷òî áîëüøóþ ÷àñòü ïðîãðàììèðîâàíèÿ ìîæíî ëåãêî è î÷åâèäíî âûïîëíÿòü, èñïîëüçóÿ òîë
Âîïðîñ «Êàê ïèøóò õîðîøèå ïðîãðàììû íà Ñ++» î÷åíü ïîõîæ íà âîïðîñ «Êàê ïèøóò õîðîøóþ àíãëèé
Áèáëèîãðàôè÷åñêèå Ññûëêè
 òåêñòå ìàëî ïðÿìûõ ññûëîê íà ëèòåðàòóðó, íî çäåñü ïðèâåäåí êîðîòêèé ñïèñîê êíèã è ñòàòåé,
[1] A.V. Aho, J.E. Hopcroft, and J.D. Ulman: Data Structures and Algorithms. Add
ison-Wesley, Reading, Massachusetts. 1983.
[2] O-J. Dahl, B. Myrhaug, and K. Nygaard: SIMULA Common Base Language. Norwegia
n Computer Center S-22, Oslo, Norsay. 1970
[3] O-J. Dahl and C.A.R. Hoare: Hierarchical Program Construction in «Structured P
rogramming.» Academic Press, New York. 1972. pp 174-220.
[4] A. Goldberg and D. Robson: SMALLTALK-80 The Language and Its Implementation.
Addison-Wesley, Reading, Massachusetts. 1983.
[5] R.E. Griswold et.al. The Snobol4 Programming Language. Prentice-Hall, Englew
ood Cliffs, New Jersey. 1970.
[6] R.E. Griswold and M.T. Griswold: The ICON Programming Language. Prentice-Hal
l, Englewood Cliffs, New Jersey. 1983.
[7] Brian W. Kernighan and Dennis M. Ritchie: The C Programming Language. Prenti
ce-Hall, Englewood Cliffs, New Jersey. 1978. Ðóññêèé ïåðåâîä â: Á.Â. Êåðíèãàí, Ä. Ðèò÷è, À.
[8] George Orwell: 1984. Secker and Warburg, London. 1949. Ðóññêèé ïåðåâîä: Äæ. Îðóýëë. 198
[9] Martin Richards and Colin Whitby-Strevens: BCPL The Language and Its Compile
r. Cambridge University Press. 1980.
[10] L. Rosler (Chairman, ANSI X3J11 Language Subcommittee): Preliminary Draft P
roposed Standard The C Language. X3 Secretariat: Computer and Busineess Equipmen
t Manufacturers Association, 311 First Street, N.W, Suite 500, Washington, DC 20
001, USA.
[11] L.Rosler: The Evolution of C Past and Future. AT amp;T Bell Laboratories Te
chnical Journal. Vol.63 No.8 Part 2. October 1984. pp 1685-1700.
[12] Ravi Sethi: Uniform Syntax for Type Expressions and Declarations. Software
Practice amp; Experience, Vol 11 (1981), pp 623-628.
[13] Bjarne Stroustrup: Adding Classes to C: An Exercise in Language Evolution.
Software Practice amp; Experience, 13 (1981), pp 139-61.
[14] P.M. Woodward and S.G. Bond: Algol 68-R Users Guide. Her Majesty's Statione
ry Office, London. 1974.
[15] UNIX System V Release 2.0 User Reference Manual. AT amp;T Bell Laboratories
, Murray Hill, New Jersey. December 1983.
[16] UNIX Time-Sharing System: Programmer's Manual. Research Version, Eighth Edi
tion. AT amp;T Bell Laboratories, Murray Hill, New Jersey. February 1985.
[17] UNIX Programmer's Manual. 4.2 Berkeley Software Distribution University of
California, Berkeley, California. March 1984.
Ýòà ãëàâà ïðåäñòàâëÿåò ñîáîé êðàòêèé îáçîð îñíîâíûõ ÷åðò ÿçûêà ïðîãðàììèðîâàíèÿ Ñ++. Ñíà÷àë
1.1 Ââåäåíèå
Ýòî òóðíå ïðîâåäåò âàñ ÷åðåç ðÿä ïðîãðàìì è ÷àñòåé ïðîãðàìì íà Ñ++. Ê êîíöó ó âàñ äîëæíî ñë
1.1.1 Âûâîä
Ïðåæäå âñåãî, äàâàéòå íàïèøåì ïðîãðàììó, âûâîäÿùóþ ñòðîêó âûäà÷è:
#include «stream.h»
main() (* cout « «Hello, world\n ; *)
Ñòðîêà #include «stream.h» ñîîáùàåò êîìïèëÿòîðó, ÷òîáû îí âêëþ÷èë ñòàíäàðòíûå âîçìîæíîñòè ï
* Ïðîãðàììèðóþùèì íà C «« èçâåñòíî êàê îïåðàöèÿ ñäâèãà âëåâî äëÿ öåëûõ. Òàêîå èñïîëüçîâàí
Îñòàëüíàÿ ÷àñòü ïðîãðàììû
main() (* ... *)
îïðåäåëÿåò ôóíêöèþ, íàçâàííóþ main. Êàæäàÿ ïðîãðàììà äîëæíà ñîäåðæàòü ôóíêöèþ ñ èìåíåì main
1.1.2 Êîìïèëÿöèÿ
Îòêóäà ïîÿâèëèñü âûõîäíîé ïîòîê cout è êîä, ðåàëèçóþùèé îïåðàöèþ âûâîäà ««? Äëÿ ïîëó÷åíèÿ â
Êîìàíäà êîìïèëÿöèè â Ñ++ îáû÷íî íàçûâàåòñÿ CC. Îíà èñïîëüçóåòñÿ òàê æå, êàê êîìàíäà cc äëÿ
$ CC hello.c $ a.out Hello,world $
a.out ýòî ïðèíèìàåìîå ïî óìîë÷àíèþ èìÿ èñïîëíÿåìîãî ðåçóëüòàòà êîìïèëÿöèè. Åñëè âû õîòèòå
$ CC hello.c -o hello $ hello Hello,world $
1.1.3 Ââîä
Ñëåäóþùàÿ (äîâîëüíî ìíîãîñëîâíàÿ) ïðîãðàììà ïðåäëàãàåò âàì ââåñòè ÷èñëî äþéìîâ. Ïîñëå òîãî,
#include «stream.h»
main() (* int inch = 0; // inch äþéì cout « inches ; cin » inch; cout « inch; cout ««
*2.54; cout «« « cm\n ; *)
Ïåðâàÿ ñòðîêà ôóíêöèè main() îïèñûâàåò öåëóþ ïåðåìåííóþ inch. Åå çíà÷åíèå ñ÷èòûâàåòñÿ ñ ïîì
$ a.out inches=12 12 in = 30.48 cm $
 ýòîì ïðèìåðå íà êàæäóþ êîìàíäó âûâîäà ïðèõîäèòñÿ îäèí îïåðàòîð. Ýòî ñëèøêîì äëèííî. Îïåðà
cout « inch «« " in = " «« inch*2.54 «« « cm\n ;
 ïîñëåäóþùèõ ðàçäåëàõ ââîä è âûâîä áóäóò îïèñàíû ãîðàçäî áîëåå ïîäðîáíî. Âñÿ ýòà ãëàâà ôàê
1.2 Êîììåíòàðèè
×àñòî áûâàåò ïîëåçíî âñòàâëÿòü â ïðîãðàììó òåêñò, êîòîðûé ïðåäíàçíà÷àåòñÿ â êà÷åñòâå êîììåí
Ñèìâîëû /* íà÷èíàþò êîììåíòàðèé, çàêàí÷èâàþùèéñÿ ñèìâîëàìè */. Âñÿ ýòà ïîñëåäîâàòåëüíîñòü ñ
Ñèìâîëû // íà÷èíàþò êîììåíòàðèé, êîòîðûé çàêàí÷èâàåòñÿ â êîíöå ñòðîêè, íà êîòîðîé îíè ïîÿâè
stream.h, îáúåêò òèïà int ìîæåò òàêæå áûòü âòîðûì îïåðàíäîì ««, êîãäà ïåðâûé îïåðàíä ostrea
cout « inch «« " in = " «« inch*2.54 «« « cm\n ;
ïðàâèëüíî îáðàáàòûâàåò ÷åòûðå âõîäíûõ çíà÷åíèÿ ðàçëè÷íûì îáðàçîì. Ñòðîêè ïå÷àòàþòñÿ áóêâàëü
 Ñ++ åñòü íåñêîëüêî îñíîâíûõ òèïîâ è íåñêîëüêî ñïîñîáîâ ñîçäàâàòü íîâûå. Ïðîñòåéøèå âèäû ò
1.4.1 Âûðàæåíèÿ
 Ñ++ èìååòñÿ áîëüøîå ÷èñëî îïåðàöèé, è îíè áóäóò îáúÿñíÿòüñÿ òàì, ãäå (è åñëè) ýòî ïîòðåáó
~ (äîïîëíåíèå) amp; (È) ^ (èñêëþ÷àþùåå ÈËÈ) ! (âêëþ÷àþùåå ÈËÈ) « (ëîãè÷åñêèé ñäâèã âëåâî)
ïðèìåíÿþòñÿ ê öåëûì, è ÷òî íåò îòäåëüíîãî òèïà äàííûõ äëÿ ëîãè÷åñêèõ äåéñòâèé.
Ñìûñë îïåðàöèè çàâèñèò îò ÷èñëà îïåðàíäîâ. Óíàðíîå amp; ÿâëÿåòñÿ îïåðàöèåé âçÿòèÿ àäðåñà, à
 Ñ++ åñòü îïåðàöèÿ ïðèñâàèâàíèÿ =, à íå îïåðàòîð ïðèñâàèâàíèÿ, êàê â íåêîòîðûõ ÿçûêàõ. Òàê
 áîëüøèíñòâå ïðîãðàìì íà Ñ++ øèðîêî ïðèìåíÿþòñÿ óêàçàòåëè. Óíàðíàÿ îïåðàöèÿ * ðàçûìåíîâûâà
* àíãë. dereference ïîëó÷èòü çíà÷åíèå îáúåêòà, íà êîòîðûé óêàçûâàåò äàííûé óêàçàòåëü. (
îïåðàòîð íå íóæåí. 1.4.4 Áëîêè Áëîê ýòî âîçìîæíî ïóñòîé ñïèñîê îïåðàòîðîâ, çàêëþ÷åííûé â
(* a=b+2; b++; *)
Áëîê ïîçâîëÿåò ðàññìàòðèâàòü íåñêîëüêî îïåðàòîðîâ êàê îäèí. Îáëàñòü âèäèìîñòè èìåíè, îïèñàí
1.4.5 Îïåðàòîð if
Ïðîãðàììà â ñëåäóþùåì ïðèìåðå îñóùåñòâëÿåò ïðåîáðàçîâàíèå äþéìîâ â ñàíòèìåòðû è ñàíòèìåòðîâ
#include «stream.h»
main() (* const float fac = 2.54; float x, in, cm; char ch = 0;
cout « "ââåäèòå äëèíó: "; cin » x »» ch;
if (ch == 'i') (* // inch äþéìû in = x; cm = x*fac; *) else if (ch == 'c') // cm ñàíòèì
; *) else in = cm = 0;
cout « in «« " in = " «« cm «« « cm\n ; *)
Çàìåòüòå, ÷òî óñëîâèå â îïåðàòîðå if äîëæíî áûòü çàêëþ÷åíî â êðóãëûå ñêîáêè.
switch. Êîíñòàíòû â âàðèàíòàõ case äîëæíû áûòü ðàçëè÷íûìè, è åñëè ïðîâåðÿåìîå çíà÷åíèå íå ñ
Ýòî ýêâèâàëåíòíî int i = 0; while (i«10) (* q[i] = p[i]; i++; *) íî áîëåå óäîáî÷èòàåìî, ïîñ
for (i=0; i«10; i++) q[i]=p[i];
òîæå ýêâèâàëåíòíî ïðåäûäóùåé çàïèñè ïðè óñëîâèè, ÷òî i ñîîòâåòñòâóþùèì îáðàçîì îïèñàíî ðàíü
1.4.9 Îïèñàíèÿ
Îïèñàíèå ýòî îïåðàòîð, ââîäÿùèé èìÿ â ïðîãðàììå. Îíî ìîæåò òàêæå èíèöèàëèçèðîâàòü îáúåêò
for (int i = 1; i«MAX; i++) (* int t = v[i-1]; v[i-1] = v[i]; v[i] = t; *)
Ïðè êàæäîì âûïîëíåíèè îïåðàòîðà for i áóäåò èíèöèàëèçèðîâàòüñÿ îäèí ðàç, à t MAX-1 ðàç.
1.5 Ôóíêöèè
Ôóíêöèÿ ýòî èìåíîâàííàÿ ÷àñòü ïðîãðàììû, ê êîòîðîé ìîæíî îáðàùàòüñÿ èç äðóãèõ ÷àñòåé ïðîã
extern float pow(float, int); //pow() îïðåäåëåíà â äðóãîì ìåñòå
main() (* for (int i=0; i«10; i++) cout « pow(2,i) «« «\n ; *)
Ïåðâàÿ ñòðîêà ôóíêöèè åå îïèñàíèå, óêàçûâàþùåå, ÷òî pow ôóíêöèÿ, ïîëó÷àþùàÿ ïàðàìåòðû ò
Ïðè âûçîâå ôóíêöèè òèï êàæäîãî ïàðàìåòðà ñîïîñòàâëÿåòñÿ ñ îæèäàåìûì òèïîì òî÷íî òàê æå, êàê
1.7 Êëàññû
Äàâàéòå ïîñìîòðèì, êàê ìû ìîãëè áû îïðåäåëèòü òèï ïîòîêà âûâîäà ostream. ×òîáû óïðîñòèòü çà
Ïîæàëóéñòà, íå èñïûòûâàéòå ïðèìåðû, îïðåäåëÿþùèå ostream â ýòîì è ïîñëåäóþùèõ ðàçäåëàõ. Ïîê
Îïðåäåëåíèå òèïà, îïðåäåëÿåìîãî ïîëüçîâàòåëåì (êîòîðûé â Ñ++ íàçûâàåòñÿ class, ò.å. êëàññ),
class ostream (* streambuf* buf; int state; public: void put(char*); void put(lo
ng); void put(double); *)
Îïèñàíèÿ ïîñëå ìåòêè public: çàäàþò èíòåðôåéñ: ïîëüçîâàòåëü ìîæåò îáðàùàòüñÿ òîëüêî ê òðåì
class îïðåäåëÿåò òèï, à íå îáúåêò äàííûõ, ïîýòîìó ÷òîáû èñïîëüçîâàòü ostream, ìû äîëæíû îäè
ostream my_out;
Ñ÷èòàÿ, ÷òî my_out áûë ñîîòâåòñòâóþùèì îáðàçîì ïðîèíèöèàëèçèðîâàí (êàê, îáúÿñíÿåòñÿ â #1.10
my_out.put(«Hello, world\n»);
Ñ ïîìîùüþ îïåðàöèè òî÷êà âûáèðàåòñÿ ÷ëåí êëàññà äëÿ äàííîãî îáúåêòà ýòîãî êëàññà. Çäåñü äëÿ
Ôóíêöèÿ ìîæåò îïðåäåëÿòüñÿ òàê:
void ostream::put(char* p) (* while (*p) buf.sputc(*p++); *)
ãäå sputc() ôóíêöèÿ, êîòîðàÿ ïîìåùàåò ñèìâîë â streambuf. Ïðåôèêñ ostream íåîáõîäèì, ÷òîá
Äëÿ îáðàùåíèÿ ê ôóíêöèè ÷ëåíó äîëæåí áûòü óêàçàí îáúåêò êëàññà.  ôóíêöèè ÷ëåíå ìîæíî ññûëà
void ostream::put(char* p) (* while (*p) this-»buf.sputc(*p++); *) Îïåðàöèÿ -» ïðèìåíÿåòñÿ
1.9 Ññûëêè
Ê ñîæàëåíèþ, ïîñëåäíÿÿ âåðñèÿ ostream ñîäåðæèò ñåðüåçíóþ îøèáêó è ê òîìó æå î÷åíü íåýôôåêòè
Ýòî ìîæíî ñäåëàòü ñ ïîìîùüþ ññûëîê. Ññûëêà äåéñòâóåò êàê èìÿ äëÿ îáúåêòà. T amp; îçíà÷àåò ñ
ostream amp; s1 = my_out; ostream amp; s2 = cout;
Òåïåðü ìîæíî èñïîëüçîâàòü ññûëêó s1 è my_out îäèíàêîâî, è îíè áóäóò èìåòü îäèíàêîâûå çíà÷åí
s1 = s2;
êîïèðóåò îáúåêò, íà êîòîðûé ññûëàåòñÿ s2 (òî åñòü, cout), â îáúåêò, íà êîòîðûé ññûëàåòñÿ s1
s1.put(«íå íàäî èñïîëüçîâàòü -»»);
à åñëè ïðèìåíèòü îïåðàöèþ âçÿòèÿ àäðåñà, òî âû ïîëó÷èòå àäðåñ îáúåêòà, íà êîòîðûé ññûëàåòñÿ
amp;s1 == amp;my_out
Ïåðâàÿ î÷åâèäíàÿ ïîëüçà îò ññûëîê ñîñòîèò â òîì, ÷òîáû îáåñïå÷èòü ïåðåäà÷ó àäðåñà îáúåêòà,
ostream amp; operator««(ostream amp; s, complex z) (* return s «« "(" «« z.real «« "," «« z
*)
Äîñòàòî÷íî èíòåðåñíî, ÷òî òåëî ôóíêöèè îñòàëîñü áåç èçìåíåíèé, íî åñëè âû áóäåòå îñóùåñòâëÿ
Ññûëêè òàêæå ñóùåñòâåííû äëÿ îïðåäåëåíèÿ ïîòîêà ââîäà, ïîñêîëüêó îïåðàöèÿ ââîäà ïîëó÷àåò â
class istream (* //... int state; public: istream amp; operator»»(char amp;); istrea
m amp; operator»»(char*); istream amp; operator»»(int amp;); istream amp; operator»»(long a
p;); //... *);
Çàìåòüòå, ÷òî äëÿ ÷òåíèÿ long è int èñïîëüçóþòñÿ ðàçíûå ôóíêöèè, òîãäà êàê äëÿ èõ ïå÷àòè òð
1.10 Êîíñòðóêòîðû
Îïðåäåëåíèå ostream êàê êëàññà ñäåëàëî ÷ëåíû äàííûå çàðûòûìè. Òîëüêî ôóíêöèÿ ÷ëåí èìååò äîñ
class ostream (* //... ostream(streambuf*); ostream(int size, char* s); *);
Çäåñü çàäàíî äâà êîíñòðóêòîðà. Îäèí ïîëó÷àåò âûøåóïîìÿíóòûé streambuf äëÿ ðåàëüíîãî âûâîäà,
ostream my_out( amp;some_stream_buffer); char xx[256]; ostream xx_stream(256,xx)
;
Îïèñàíèå my_out íå òîëüêî çàäàåò ñîîòâåòñòâóþùèé îáúåì ïàìÿòè ãäå-òî â äðóãîì ìåñòå, îíî òà
1.11 Âåêòîðà
Âñòðîåííîå â Ñ++ ïîíÿòèå âåêòîðà áûëî ðàçðàáîòàíî òàê, ÷òîáû îáåñïå÷èòü ìàêñèìàëüíóþ ýôôåêò
Èäåÿ ñîñòîèò â òîì, ÷òîáû êëàññ ñàì áûë ñòðóêòóðîé ôèêñèðîâàííîãî ðàçìåðà, óïðàâëÿþùåé äîñò
vector::vector(int s) (* if (s«=0) error( bad vector size ); // ïëîõîé ðàçìåð âåêòîðà sz =
Òåïåðü âû ìîæåòå îïèñûâàòü âåêòîðà òèïà vector ïî÷òè ñòîëü æå ýëåãàíòíî, êàê è âåêòîðà, âñò
vector v1(100); vector v2(nelem*2-4);
Îïåðàöèþ äîñòóïà ìîæíî îïðåäåëèòü êàê
int amp; vector::operator[](int i) (* if(i«0 !! sz =i) error(«vector index out of rang
e ); // èíäåêñ âûõîäèò çà ãðàíèöû âåêòîðà return v[i]; *)
Îïåðàöèÿ !! (ÈËÈÈËÈ) ýòî ëîãè÷åñêàÿ îïåðàöèÿ ÈËÈ. Åå ïðàâûé îïåðàíä âû÷èñëÿåòñÿ òîëüêî òî
v1[x] = v2[y];
Ôóíêöèÿ ñî ñòðàííûì èìåíåì ~vector ýòî äåñòðóêòîð, òî åñòü ôóíêöèÿ, îïèñàííàÿ äëÿ òîãî, ÷
vector::~vector() (* delete v; *)
òî îí áóäåò, ñ ïîìîùüþ îïåðàöèè delete, îñâîáîæäàòü ïðîñòðàíñòâî, âûäåëåííîå êîíñòðóêòîðîì,
1.12 Inline-ïîäñòàíîâêà
Åñëè ÷àñòî ïîâòîðÿåòñÿ îáðàùåíèå ê î÷åíü ìàëåíüêîé ôóíêöèè, òî âû ìîæåòå íà÷àòü áåñïîêîèòüñ
vector s(100); //... i = s.size(); x = elem(i-1);
ïîðîæäàåò êîä, ýêâèâàëåíòíûé
//... i = 100; x = s.v[i-1];
Ñ++ êîìïèëÿòîð îáû÷íî äîñòàòî÷íî ðàçóìåí, ÷òîáû ãåíåðèðîâàòü íàñòîëüêî õîðîøèé êîä, íàñêîëü
Âû ìîæåòå óêàçàòü, ÷òî âû õîòèòå, ÷òîáû ôóíêöèÿ áûëà inline-ïîäñòàâëÿåìîé, ïîñòàâèâ êëþ÷åâî
Ïðè õîðîøåì èñïîëüçîâàíèè inline-ôóíêöèè ðåçêî ïîâûøàþò ñêîðîñòü âûïîëíåíèÿ è óìåíüøàþò ðàç
vector ïðîñòî êîïèðóåò ñòðóêòóðó, óïðàâëÿþùóþ äîñòóïîì ê ýëìåíòàì. Ïîñëåäíåå, îäíàêî, ïðîèñ
Vec operator+(Vec amp; a,Vec amp;b) (* int s = a.size(); if (s != b.size()) erro
r(«bad vector size for +»); // ïëîõîé ðàçìåð âåêòîðà äëÿ + Vec sum(s); for (int i=0; i«s; i
; return sum; *)
Âîò ïðèìåð íåáîëüøîé ïðîãðàììû, êîòîðóþ ìîæíî âûïîëíèòü, åñëè ñêîìïèëèðîâàòü åå âìåñòå ñ ðà
#include «stream.h»
void error(char* p) (* cerr « p «« «\n ; exit(1); *)
void vector::set_size(int) (* /*...*/ *)
int amp; vec::operator[](int i) (* /*...*/ *)
main() (* Vec a(10); Vec b(10); for (int i=0; i«a.size(); i++) a[i] = i; b = a; Ve
c c = a+b; for (i=0; i c.size(); i++) cout «« c[i] «« «\n ; *)
îïðåäåëåíèå ôóíêöèé, åãî ìîæíî èñïîëüçîâàòü â ïðîãðàììå òîëüêî îäèí ðàç, â òî âðåìÿ êàê dec
declare(vector,char); //... implement(vector,char);
äàñò âàì îòäåëüíûé òèï «âåêòîð ñèìâîëîâ». Ïðèìåð ðåàëèçàöèè îáîáùåííûõ êëàññîâ ñ ïîìîùüþ ìà
ïðîãðàììíûì îáåñïå÷åíèåì. Âåäü ïî ñóòè äåëà, òèïè÷íîå äåéñòâèå ïîëüçîâàòåëÿ ýòî òêíóòü â
 ýòîé ãëàâå îïèñàíû îñíîâíûå òèïû (char, int, float è ò.ä.) è îñíîâíûå ñïîñîáû ïîñòðîåíèÿ
2.1 Îïèñàíèÿ
Ïðåæäå ÷åì èìÿ (èäåíòèôèêàòîð) ìîæåò áûòü èñïîëüçîâàíî â Ñ++ ïðîãðàììå, îí äîëæíî áûòü îïèñ
char ch; int count = 1; char* name = «Bjarne»; struct complex (* float re, im; *); c
omplex cvar; extern complex sqrt(complex); extern int error_number; typedef comp
lex point; float real(complex* p) (* return p-»re; *); const double pi = 3.1415926
535897932385; struct user;
Êàê ìîæíî âèäåòü èç ýòèõ ïðèìåðîâ, îïèñàíèå ìîæåò äåëàòü áîëüøå ÷åì ïðîñòî àññîöèèðîâàòü òè
extern complex sqrt(complex); extern int error_number; struct user;
íå ÿâëÿþòñÿ îäíîâðåìåííî îïðåäåëåíèÿìè. Ýòî îçíà÷àåò, ÷òî îáúåêò, ê êîòîðîìó îíè îòíîñÿòñÿ,
int count; int count; // îøèáêà: ïåðåîïðåäåëåíèå extern int error_number; extern int error_
à â ýòîì íè îäíîé (îá èñïîëüçîâàíèè extern ñì. #4.2):
extern int error_number; extern int error_number;
Íåêîòîðûå îïèñàíèÿ çàäàþò «çíà÷åíèå» äëÿ ñóùíîñòåé, êîòîðûå îíè îïðåäåëÿþò:
struct complex (* float re, im; *); typedef complex point; float real(complex* p
) (* return p-»re *); const double pi = 3.1415926535897932385;
Äëÿ òèïîâ, ôóíêöèé è êîíñòàíò «çíà÷åíèå» íåèçìåííî. Äëÿ íåêîíñòàíòíûõ òèïîâ äàííûõ íà÷àëüíî
int count = 1; char* name = «Bjarne»; //... count = 2; name = «Marian»;
Èç âñåõ îïðåäåëåíèé òîëüêî
char ch;
íå çàäàåò çíà÷åíèå. Âñÿêîå îïèñàíèå, çàäàþùåå çíà÷åíèå, ÿâëÿåòñÿ îïðåäåëåíèåì.
2.1.1 Îáëàñòü Âèäèìîñòè
Îïèñàíèå ââîäèò èìÿ â îáëàñòè âèäèìîñòè. Òî åñòü, èìÿ ìîæåò èñïîëüçîâàòüñÿ òîëüêî â îïðåäåë
int x; // ãëîáàëüíîå x
f() (* int x; // ëîêàëüíîå x ïðÿ÷åò ãëîáàëüíîå x x = 1; // ïðèñâîèòü ëîêàëüíîìó x (* int x;
int* p = amp;x; // âçÿòü àäðåñ ãëîáàëüíîãî x
Ñîêðûòèå èìåí íåèçáåæíî ïðè íàïèñàíèè áîëüøèõ ïðîãðàìì. Îäíàêî ÷èòàþùèé ÷åëîâåê ëåãêî ìîæåò
î÷åíü òðóäíî îáíàðóæèòü, ãëàâíûì îáðàçîì ïîòîìó, ÷òî îíè ðåäêèå. Çíà÷èò ñîêðûòèå èìåí ñëåäó
Ñ ïîìîùüþ ïðèìåíåíèÿ îïåðàöèè ðàçðåøåíèÿ îáëàñòè âèäèìîñòè :: ìîæíî èñïîëüçîâàòü ñêðûòîå ãë
int x;
f() (* int x = 1; // ñêðûâàåò ãëîáàëüíîå x ::x = 2; // ïðèñâàèâàåò ãëîáàëüíîìó x *)
Íî âîçìîæíîñòè èñïîëüçîâàòü ñêðûòîå ëîêàëüíîå èìÿ íåò.
Îáëàñòü âèäèìîñòè èìåíè íà÷èíàåòñÿ â òî÷êå îïèñàíèÿ. Ýòî îçíà÷àåò, ÷òî èìÿ ìîæíî èñïîëüçîâà
int x;
f() (* int x = x; // èçâðàùåíèå *)
Ýòî íå ÿâëÿåòñÿ íåäîïóñòèìûì, õîòÿ è áåññìûñëåííî, è êîìïèëÿòîð ïðåäóïðåäèò, ÷òî x «used be
int x;
f() // èçâðàùåíèå (* int y = x; // ãëîáàëüíîå x int x = 22; y = x; // ëîêàëüíîå x *)
Ïåðåìåííàÿ y èíèöèàëèçèðóåòñÿ çíà÷åíèåì ãëîáàëüíîãî x, 11, à çàòåì åìó ïðèñâàèâàåòñÿ çíà÷åí
Èìåíà ïàðàìåòðîâ ôóíêöèè ñ÷èòàþòñÿ îïèñàííûìè â ñàìîì âíåøíåì áëîêå ôóíêöèè, ïîýòîìó
f(int x) (* int x; // îøèáêà *)
ñîäåðæèò îøèáêó, òàê êàê x îïðåäåëåíî äâàæäû â îäíîé è òîé æå îáëàñòè âèäèìîñòè.
lvalue åñòü âûðàæåíèå, ññûëàþùååñÿ íà îáúåêò" (#ñ.5). Ñëîâî «lvalue» ïåðâîíà÷àëüíî áûëî ïðè
2.2 Èìåíà
Èìÿ (èäåíòèôèêàòîð) ñîñòîèò èç ïîñëåäîâàòåëüíîñòè áóêâ è öèôð. Ïåðâûé ñèìâîë äîëæåí áûòü áó
hello this_is_a_most_unusially_long_name DEFINED foO bAr u_name HorseSense var0
var1 CLASS _class ___
Ïðèìåðû ïîñëåäîâàòåëüíîñòåé ñèìâîëîâ, êîòîðûå íå ìîãóò èñïîëüçîâàòüñÿ êàê èäåíòèôèêàòîðû:
012 a fool $sys class 3var pay.due foo~bar .name if
Áóêâû â âåðõíåì è íèæíåì ðåãèñòðàõ ñ÷èòàþòñÿ ðàçëè÷íûìè, ïîýòîìó Count è count ðàçëè÷íûå
Âî âðåìÿ ÷òåíèÿ ïðîãðàììû êîìïèëÿòîð âñåãäà èùåò íàèáîëåå äëèííóþ ñòðîêó, ñîñòàâëÿþùóþ èìÿ,
2.3 Òèïû
Êàæäîå èìÿ (èäåíòèôèêàòîð) â Ñ++ ïðîãðàììå èìååò àññîöèèðîâàííûé ñ íèì òèï. Ýòîò òèï îïðåäå
int error number; float real(complex* p);
Ïîñêîëüêó error_number îïèñàíî êàê int, åãî ìîæíî ïðèñâàèâàòü, èñïîëüçîâàòü â àðèôìåòè÷åñêè
main() (* int* p = new int; cout « "sizeof(int) = " «« sizeof(int) «\n ; *)
Èìÿ òèïà ìîæíî òàêæå èñïîëüçîâàòü äëÿ çàäàíèÿ ÿâíîãî ïðåîáðàçîâàíèÿ îäíîãî òèïà â äðóãîé, í
float f; char* p; //... long ll = long(p); // ïðåîáðàçóåò p â long int i = int(f); // ïðåîá
2.3.5 Óêàçàòåëè
Äëÿ áîëüøèíñòâà òèïîâ T T* ÿâëÿåòñÿ òèïîì àðèôìåòè÷åñêèé óêàçàòåëü íà T. Òî åñòü, â ïåðåìåí
int* pi; char** cpp; // óêàçàòåëü íà óêàçàòåëü íà char int (*vp)[10]; // óêàçàòåëü íà âåêòî
Îñíîâíàÿ îïåðàöèÿ íàä óêàçàòåëåì ðàçûìåíîâàíèå, òî åñòü ññûëêà íà îáúåêò, íà êîòîðûé óêàç
char c1 = 'a'; char* p = amp;c1; // â p õðàíèòñÿ àäðåñ c1 char c2 = *p; // c2 = 'a'
Ïåðåìåííàÿ, íà êîòîðóþ óêàçûâàåò p, ýòî c1, à çíà÷åíèå, êîòîðîå õðàíèòñÿ â c1, ýòî 'a', ïî
Íàä óêàçàòåëÿìè ìîæíî îñóùåñòâëÿòü íåêîòîðûå àðèôìåòè÷åñêèå äåéñòâèÿ. Âîò, íàïðèìåð, ôóíêöè
int strlen(char* p) (* int i = 0; while (*p++) i++; return i; *)
Äðóãîé ñïîñîá íàéòè äëèíó ñîñòîèò â òîì, ÷òîáû ñíà÷àëà íàéòè êîíåö ñòðîêè, à çàòåì âû÷åñòü
int strlen(char* p) (* char* q = p; while (*q++) ; return q-p-1; *)
Î÷åíü ïîëåçíûìè ìîãóò îêàçàòüñÿ óêàçàòåëè íà ôóíêöèè. Îíè îáñóæäàþòñÿ â #4.6.7.
2.3.6 Âåêòîðà
Äëÿ òèïà T T[size] ÿâëÿåòñÿ òèïîì «âåêòîð èç size ýëåìåíòîâ òèïà T». Ýëåìåíòû èíäåêñèðóþòñÿ
float v[3]; // âåêòîð èç òðåõ float: v[0], v[1], v[2] int a[2][5]; // äâà âåêòîðà èç ïÿòè i
Öèêë äëÿ ïå÷àòè öåëûõ çíà÷åíèé áóêâ íèæíåãî ðåãèñòðà ìîæíî áûëî áû íàïèñàòü òàê:
extern int strlen(char*);
char alpha[] = «abcdefghijklmnoprstuvwxyz»;
main()
(* int sz = strlen(alpha);
for (int i=0; i«sz; i++) (* char ch = alpha[i]; cout "'" « chr(ch) «« "'" «« " = " «« c
0x «« hex(ch) «« «\n ; *) *)
Ôóíêöèÿ chr() âîçâðàùàåò ïðåäñòàâëåíèå íåáîëüøîãî öåëîãî â âèäå ñòðîêè; íàïðèìåð, chr(80) ý
'a' = 97 = 0141 = 0x61 'b' = 98 = 0142 = 0x62 'c' = 99 = 0143 = 0x63 ...
Çàìåòèì, ÷òî çàäàâàòü ðàçìåð âåêòîðà alpha íåîáÿçàòåëüíî. Êîìïèëÿòîð ñ÷èòàåò ÷èñëî ñèìâîëîâ
char v[9]; v = «ñòðîêà»; // îøèáêà
îøèáî÷íî, ïîñêîëüêó ïðèñâàèâàíèå íå îïðåäåëåíî äëÿ âåêòîðîâ.
Êîíå÷íî, äëÿ èíèöèàëèçàöèè ñèìâîëüíûõ ìàññèâîâ ïîäõîäÿò íå òîëüêî ñòðîêè. Äëÿ îñòàëüíûõ òèï
int v1[] = (* 1, 2, 3, 4 *); int v2[] = (* 'a', 'b', 'c', 'd' *);
char v3[] = (* 1, 2, 3, 4 *); char v4[] = (* 'a', 'b', 'c', 'd' *);
Çàìåòüòå, ÷òî v4 âåêòîð èç ÷åòûðåõ (à íå ïÿòè) ñèìâîëîâ; îí íå îêàí÷èâàåòñÿ íóëåì, êàê òî
Ìíîãîìåðíûå ìàññèâû ïðåäñòàâëÿþòñÿ êàê âåêòîðà âåêòîðîâ, è ïðèìåíåíèå çàïèñè ÷åðåç çàïÿòóþ,
int bad[5,2]; // îøèáêà
è òàê:
int v[5][2];
îçíà÷àåò ñëåäóþùèé ýëåìåíò ýòîãî âåêòîðà, à p ïðåäûäóùèé ýëåìåíò. Îòñþäà ñëåäóåò, ÷òî çíà÷å
main() (* char cv[10]; int iv[10];
char* pc = cv; int* pi = iv;
cout « "char* " « long(pc+1)-long(pc) «« «\n ; cout «« "int* " «« long(ic+1)-long(ic) ««
äàåò
char* 1 int* 4
ïîñêîëüêó íà ìîåé ìàøèíå êàæäûé ñèìâîë çàíèìàåò îäèí áàéò, à êàæäîå öåëîå çàíèìàåò ÷åòûðå á
Âû÷èòàíèå óêàçàòåëåé îïðåäåëåíî òîëüêî òîãäà, êîãäà îáà óêàçàòåëÿ óêàçûâàþò íà ýëåìåíòû îäí
int v1[10]; int v2[10];
int i = amp;v1[5] amp;v1[3]; // 2 i = amp;v1[5] amp;v2[3]; // ðåçóëüòàò íåîïðåäåëåí
int* p = v2+2; // p == amp;v2[2] p = v2-2; // p íåîïðåäåëåíî
2.3.8 Ñòðóêòóðû
Âåêòîð åñòü ñîâîêóïíîñòü ýëåìåíòîâ îäíîãî òèïà, struct ÿâëÿåòñÿ ñîâîêóïíîñòüþ ýëåìåíòîâ (ïð
struct address (* // ïî÷òîâûé àäðåñ char* name; // èìÿ «Jim Dandy» long number; // íîìåð äî
/ ãîðîä «New Providence» char* state[2]; // øòàò 'N' 'J' int zip; // èíäåêñ 7974 *)
îïðåäåëÿåò íîâûé òèï, íàçâàííûé address (ïî÷òîâûé àäðåñ), ñîñòîÿùèé èç ïóíêòîâ, òðåáóþùèõñÿ
ÿâëÿåòñÿ äîñòàòî÷íûì äëÿ ðàáîòû ñ ïîëíûì ïî÷òîâûì àäðåñîì, íî â êà÷åñòâå ïðèìåðà äîñòàòî÷åí
Ïåðåìåííûå òèïà address ìîãóò îïèñûâàòüñÿ òî÷íî òàêæå, êàê äðóãèå ïåðåìåííûå, à äîñòóï ê îò
address jd; jd.name = «Jim Dandy»; jd.number = 61;
Çàïèñü, êîòîðàÿ èñïîëüçîâàëàñü äëÿ èíèöèàëèçàöèè âåêòîðîâ, ìîæíî ïðèìåíÿòü è ê ïåðåìåííûì ñ
address jd = (* «Jim Dandy», 61, «South Street», «New Providence», (*'N','J'*), 7974 *);
Îäíàêî îáû÷íî ëó÷øå èñïîëüçîâàòü êîíñòðóêòîð (#5.2.4). Çàìåòüòå, ÷òî íåëüçÿ áûëî áû èíèöèàë
Ê ñòðóêòóðíûì îáúåêòàì ÷àñòî îáðàùàþòñÿ ïîñðåäñòâîì óêàçàòåëåé èñïîëüçóÿ îïåðàöèþ -». Íàïðè
void print_addr(address* p) (* cout « p- name \n p- number " " p- street «
p- state[1]) «« " " «« p- zip «« «\n ; *)
Îáúåêòû òèïà ñòðóêòóðà ìîæíî ïðèñâàèâàòü, ïåðåäàâàòü êàê ïàðàìåòðû ôóíêöèè è âîçâðàùàòü èç
address current;
address set_current(address next) (* address prev = current; current = next; ret
urn prev; *)
Îñòàëüíûå îñìûñëåííûå îïåðàöèè, òàêèå êàê ñðàâíåíèå (== è !=) íå îïðåäåëåíû. Îäíàêî ïîëüçîâ
Çàìåòüòå, ÷òî èìÿ òèïà ñòàíîâèòñÿ äîñòóïíûì ñðàçó ïîñëå òîãî, êàê îíî âñòðåòèëîñü, à íå òîë
struct link(* link* previous; link* successor; *)
Íîâûå îáúåêòû ñòðóêòóðíîãî òèïà íå ìîãóò áûòü îïèñûâàòüñÿ, ïîêà âñå îïèñàíèå íå ïðîñìîòðåíî
struct no_good (* no_good member; *);
ÿâëÿåòñÿ îøèáî÷íûì (êîìïèëÿòîð íå ìîæåò óñòàíîâèòü ðàçìåð no_good). ×òîáû äàòü âîçìîæíîñòü
struct list; // äîëæíà áûòü îïðåäåëåíà ïîçäíåå
struct link (* link* pre; link* suc; link* member_of; *);
struct list (* link* head; *)
Áåç ïåðâîãî îïèñàíèÿ list îïèñàíèå link âûçâàëî áû ê ñèíòàêñè÷åñêóþ îøèáêó.
2.3.10 Ññûëêè
Ññûëêà ÿâëÿåòñÿ äðóãèì èìåíåì îáúåêòà. Ãëàâíîå ïðèìåíåíèå ññûëîê ñîñòîèò â ñïåöèôèêàöèè îïå
int i = 1; int amp; r = i; // r è i òåïåðü ññûëàþòñÿ íà îäèí int int x = r // x = 1 r = 2;
Ññûëêà äîëæíà áûòü èíèöèàëèçèðîâàíà (äîëæíî áûòü ÷òî-òî, äëÿ ÷åãî îíà ÿâëÿåòñÿ èìåíåì). Çàì
Âîïðåêè îæèäàíèÿì, íè îäíà îïåðàöèÿ íà ññûëêó íå äåéñòâóåò. Íàïðèìåð:
int ii = 0; int amp; rr = ii; rr++; // ii óâåëè÷èâàåòñÿ íà 1
äîïóñòèìî, íî rr++ íå óâåëè÷èâàåò ññûëêó; âìåñòî ýòîãî + + ïðèìåíÿåòñÿ ê int, êîòîðûì îêàçû
Î÷åâèäíûì ñïîñîáîì ðåàëèçàöèè ññûëêè ÿâëÿåòñÿ êîíñòàíòíûé óêàçàòåëü, êîòîðûé ðàçûìåíîâûâàåò
1. Âî-ïåðâûõ, åñëè íåîáõîäèìî, ïðèìåíÿåòñÿ ïðåîáðàçîâàíèå òèïà (#ñ.6.6-8, #ñ.8.5.6),
2. Çàòåì ïîëó÷åííîå çíà÷åíèå ïîìåùàåòñÿ âî âðåìåííóþ ïåðåìåííóþ è
3. Íàêîíåö, åå àäðåñ èñïîëüçóåòñÿ â êà÷åñòâå çíà÷åíèÿ èíèöèàëèçàòîðà.
Ðàññìîòðèì îïèñàíèå
double amp; dr = 1;
Ýòî èíòåðïðåòèðóåòñÿ òàê:
double* drp; // ññûëêà, ïðåäñòàâëåííàÿ êàê óêàçàòåëü double temp; temp = double(1); drp = a
int x = 1; void incr(int amp; aa) (* aa++; *) incr(x) // x = 2
Ïî îïðåäåëåíèþ ñåìàíòèêà ïåðåäà÷è ïàðàìåòðà òà æå, ÷òî ñåìàíòèêà èíèöèàëèçàöèè, ïîýòîìó ïàð
ïðåäïî÷òèòåëüíî ÿâíî âîçâðàùàòü çíà÷åíèå èç ôóíêöèè èëè òðåáîâàòü â êà÷åñòâå ïàðàìåòðà óêàç
int x = 1; int next(int p) (* return p+1; *) x = next(x); // x = 2
void inc(int* p) (* (*p)++; *) inc( amp;x); // x = 3
Ññûëêè òàêæå ìîæíî ïðèìåíÿòü äëÿ îïðåäåëåíèÿ ôóíêöèé, êîòîðûå ìîãóò èñïîëüçîâàòüñÿ è â ëåâî
struct pair (* char* name; int val; *);
Îñíîâíàÿ èäåÿ ñîñòîèò â òîì, ÷òî ñòðîêà èìååò àññîöèèðîâàííîå ñ íåé öåëîå çíà÷åíèå. Ëåãêî î
const large = 1024; static pair vec[large+1*);
pair* find(char* p) /* ïîääåðæèâàåò ìíîæåñòâî ïàð «pair»: èùåò p, åñëè íàõîäèò, âîçâðàùàåò
if (i == large) return amp;vec[large-1];
return amp;vec[i]; *)
Ýòó ôóíêöèþ ìîæåò èñïîëüçîâàòü ôóíêöèÿ value(), ðåàëèçóþùàÿ ìàññèâ öåëûõ, èíäåêñèðîâàííûé ñ
int amp; value(char* p) (* pair* res = find(p); if (res-»name == 0) (* // äî ñèõ ïîð íå âñò
en(p)+1]; // èíèöèàëèçèðîâàòü strcpy(res-»name,p); res-»val = 0; // íà÷àëüíîå çíà÷åíèå 0 *)
Äëÿ äàííîé â êà÷åñòâå ïàðàìåòðà ñòðîêè value() íàõîäèò öåëûé îáúåêò (à íå çíà÷åíèå ñîîòâåòñ
íàïðèìåð, òàê:
const MAX = 256; // áîëüøå ñàìîãî áîëüøîãî ñëîâà
main() // ïîäñ÷èòûâàåò ÷èñëî âõîæäåíèé êàæäîãî ñëîâà âî ââîäå (* char buf[MAX];
while (cin»»buf) value(buf)++;
for (int i=0; vec[i].name; i++) cout « vec[i].name «« ": " «« vec [i].val «« «\n ; *)
Íà êàæäîì ïðîõîäå öèêë ñ÷èòûâàåò îäíî ñëîâî èç ñòàíäàðòíîé ñòðîêè ââîäà cin â buf (ñì. Ãëàâ
aa bb bb aa aa bb aa aa
òî ïðîãðàììà âûäàñò:
aa: 5 bb: 3
Ëåãêî óñîâåðøåíñòâîâàòü ýòî â ïëàíå ñîáñòâåííîãî òèïà àññîöèèðîâàííîãî ìàññèâà ñ ïîìîùüþ êë
2.3.11 Ðåãèñòðû
Âî ìíîãèõ ìàøèííûõ àðõèòåêòóðàõ ìîæíî îáðàùàòüñÿ ê (íåáîëüøèì) îáúåêòàì çàìåòíî áûñòðåå, êî
register int i; register point cursor; register char* p;
Îïèñàíèå register ñëåäóåò èñïîëüçîâàòü òîëüêî â òåõ ñëó÷àÿõ, êîãäà ýôôåêòèâíîñòü äåéñòâèòåë
Íåâîçìîæíî ïîëó÷èòü àäðåñ èìåíè, îïèñàííîãî êàê register, ðåãèñòð íå ìîæåò òàêæå áûòü ãëîáà
2.4 Êîíñòàíòû
Ñ++ äàåò âîçìîæíîñòü çàïèñè çíà÷åíèé îñíîâíûõ òèïîâ: ñèìâîëüíûõ êîíñòàíò, öåëûõ êîíñòàíò è
ëþáîãî òèïà ìîæíî äàòü èìÿ è èñïîëüçîâàòü åãî êàê êîíñòàíòó, äîáàâèâ ê åãî îïèñàíèþ êëþ÷åâî
2.4.4 Ñòðîêè
Ñòðîêîâàÿ êîíñòàíòà ýòî ïîñëåäîâàòåëüíîñòü ñèìâîëîâ, çàêëþ÷åííàÿ â äâîéíûå êàâû÷êè "
«ýòî ñòðîêà»
Êàæäàÿ ñòðîêîâàÿ êîíñòàíòà ñîäåðæèò íà îäèí ñèìâîë áîëüøå, ÷åì êàæåòñÿ; âñå îíè çàêàí÷èâàþò
sizeof(«asdf»)==5;
Ñòðîêà èìååò òèï «âåêòîð èç ñîîòâåòñòâóþùåãî ÷èñëà ñèìâîëîâ», ïîýòîìó «asdf» èìååò òèï char
Ñîãëàøåíèå î ïðåäñòàâëåíèè íåãðàôè÷åñêèõ ñèìâîëîâ ñ îáðàòíîé êîñîé ìîæíî èñïîëüçîâàòü òàêæå
cout « «ãóäîê â êîíöå ñîîáùåíèÿ\007\n
ãäå 7 çíà÷åíèå ASKII ñèìâîëà bel (çâîíîê).
 ñòðîêå íåâîçìîæíî èìåòü «íàñòîÿùóþ» íîâóþ ñòðîêó:
«ýòî íå ñòðîêà, à ñèíòàêñè÷åñêàÿ îøèáêà»
Îäíàêî â ñòðîêå ìîæåò ñòîÿòü îáðàòíàÿ êîñàÿ, ñðàçó ïîñëå êîòîðîé èäåò íîâàÿ ñòðîêà; è òî, è
cout « «çäåñü âñå \ ok
íàïå÷àòàåò
çäåñü âñå ok
Íîâàÿ ñòðîêà, ïåðåä êîòîðîé èäåò escape (îáðàòíàÿ êîñàÿ), íå ïðèâîäèò ê ïîÿâëåíèþ â ñòðîêå
 ñòðîêå ìîæíî èìåòü ïóñòîé ñèìâîë, íî áîëüøèíñòâî ïðîãðàìì íå áóäåò ïðåäïîëàãàòü, ÷òî åñòü
Âñòàâëÿÿ ÷èñëåííóþ êîíñòàíòó â ñòðîêó ñ ïîìîùüþ âîñüìåðè÷íîé èëè øåñòíàäöàòåðè÷íîé çàïèñè á
char v1[] = «a\x0fah\0129»; // 'a' '\xfa' 'h' '\12' '9' char v2[] = «a\xfah\129»; // 'a'
'\xfa' 'h' '\12' '9' char v3[] = «a\xfad\127»; // 'a' '\xfad' '\127'
Èìåéòå â âèäó, ÷òî äâóõçíà÷íîé øåñòíàäöàòåðè÷íîé çàïèñè íà ìàøèíàõ ñ 9-áèòîâûì áàéòîì áóäåò
2.4.5 Íîëü
Íîëü ìîæíî óïîòðåáëÿòü êàê êîíñòàíòó ëþáîãî öåëîãî, ïëàâàþùåãî èëè óêàçàòåëüíîãî òèïà. Íèêà
2.4.6 Const
Êëþ÷åâîå ñëîâî const ìîæåò äîáàâëÿòüñÿ ê îïèñàíèþ îáúåêòà, ÷òîáû ñäåëàòü ýòîò îáúåêò êîíñòà
const int model = 145; const int v[] = (* 1, 2, 3, 4 *);
Ïîñêîëüêó êîíñòàíòå íè÷åãî íåëüçÿ ïðèñâîèòü, îíà äîëæíà áûòü èíèöèàëèçèðîâàíà. Îïèñàíèå ÷åã
2.4.7 Ïåðå÷èñëåíèÿ
Åñòü äðóãîé ìåòîä îïðåäåëåíèÿ öåëûõ êîíñòàíò, êîòîðûé èíîãäà áîëåå óäîáåí, ÷åì ïðèìåíåíèå c
enum (* ASM, AUTO, BREAK *);
ïåðå÷èñëåíèå îïðåäåëÿåò òðè öåëûõ êîíñòàíòû, íàçûâàåìûõ ïåðå÷èñëèòåëÿìè, è ïðèñâàèâàåò èì ç
const ASM = 0; const AUTO = 1; const BREAK = 2;
Ïåðå÷èñëåíèå ìîæåò áûòü èìåíîâàííûì. Íàïðèìåð:
enum keyword (* ASM, AUTO, BREAK *);
Èìÿ ïåðå÷èñëåíèÿ ñòàíîâèòñÿ ñèíîíèìîì int, à íå íîâûì òèïîì. Îïèñàíèå ïåðåìåííîé keyword, à
keyword key;
switch (key) (* case ASM: // ÷òî-òî äåëàåò break; case BREAK: // ÷òî-òî äåëàåò break; *)
ïîáóæäàåò êîìïèëÿòîð âûäàòü ïðåäóïðåæäåíèå, ïîñêîëüêó òîëüêî äâà çíà÷åíèÿ keyword èç òðåõ è
Ìîæíî òàêæå çàäàâàòü çíà÷åíèÿ ïåðå÷èñëèòåëåé ÿâíî. Íàïðèìåð:
enum int16 (* sign=0100000, // çíàê most_significant=040000, // ñàìûé çíà÷èìûé least_signif
Òàêèå çíà÷åíèÿ íå îáÿçàòåëüíî äîëæíû áûòü ðàçëè÷íûìè, âîçðàñòàþùèìè èëè ïîëîæèòåëüíûìè.
2.5.1 Ïîëÿ
Èñïîëüçîâàíèå char äëÿ ïðåäñòàâëåíèÿ äâîè÷íîé ïåðåìåíîé, íàïðèìåð, ïåðåêëþ÷àòåëÿ âêëþ÷åíî/â
struct sreg (* unsigned enable : 1; unsigned page : 3; unsigned : 1; // íåèñïîëüçóåìîå unsi
signed : 4: // íåèñïîëüçóåìîå unsigned access : 1; unsigned length : 1; unsigned non_reside
Ïîëó÷èëîñü ðàçìåùåíèå ðåãèñòðà 0 ñîñòîÿíèÿ DEC PDP11/45 (â ïðåäïîëîæåíèè, ÷òî ïîëÿ â ñëîâå
sreg* sr0 = (sreg*)0777572; //... if (sr-»access) (* // íàðóøåíèå äîñòóïà // ÷èñòèò ìàññèâ
Îäíàêî ïðèìåíåíèå ïîëåé äëÿ óïàêîâêè íåñêîëüêèõ ïåðåìåííûõ â îäèí áàéò íå îáÿçàòåëüíî ýêîíî
è êðàòêàÿ çàïèñü äëÿ ïðèìåíåíèÿ ëîãè÷åñêèõ îïåðàöèé ñ öåëüþ èçâëå÷åíèÿ èíôîðìàöèè èç ÷àñòè
2.5.2 Îáúåäèíåíèÿ
Ðàññìîòðèì ïðîåêòèðîâàíèå ñèìâîëüíîé òàáëèöû, â êîòîðîé êàæäûé ýëåìåíò ñîäåðæèò èìÿ è çíà÷å
struct entry (* char* name; char type; char* string_value; // èñïîëüçóåòñÿ åñëè type == 's'
void print_entry(entry* p) (* switch p-»type (* case 's': cout « p- string_value; break
; case 'i': cout p- int_value; break; default: cerr «« «èñïîð÷åí type\n ; break; *) *)
Ïîñêîëüêó string_value è int_value íèêîãäà íå ìîãóò èñïîëüçîâàòüñÿ îäíîâðåìåííî, ÿñíî, ÷òî
struct entry (* char* name; char type; union (* char* string_value; //èñïîëüçóåòñÿ åñëè typ
e; //èñïîëüçóåòñÿ åñëè type == 'i' *); *);
Ýòî îñòàâëÿåò âñþ ÷àñòü ïðîãðàììû, èñïîëüçóþùóþ entry, áåç èçìåíåíèé, íî îáåñïå÷èâàåò, ÷òî
Èñïîëüçîâàíèå îáúåäèíåíèé òàêèì îáðàçîì, ÷òîáû ïðè ÷òåíèè çíà÷åíèÿ âñåãäà ïðèìåíÿëñÿ òîò ÷ë
Îáúåäèíåíèÿ èíîãäà èñïîëüçóþò äëÿ «îáúåäèíåíèÿ è ïðåîáðàçîâàíèå òèïà» (ýòî äåëàþò ãëàâíûì î
struct fudge (* union (* int i; int* p; *); *);
fudge a; a.i = 4096; int* p = a.p; // ïëîõîå èñïîëüçîâàíèå
Íî íà ñàìîì äåëå ýòî ñîâñåì íå ïðåîáðàçîâàíèå: íà íåêîòîðûõ ìàøèíàõ int è int* çàíèìàþò íåî
Èçðåäêà îáúåäèíåíèÿ óìûøëåííî ïðèìåíÿþò, ÷òîáû èçáåæàòü ïðåîáðàçîâàíèÿ òèïîâ. Ìîæíî, íàïðèì
fudge.p = 0; int i = fudge.i; // i íå îáÿçàòåëüíî äîëæíî áûòü 0
Ìîæíî òàêæå äàòü îáúåäèíåíèþ èìÿ, òî åñòü ñäåëàòü åãî ïîëíîïðàâíûì òèïîì. Íàïðèìåð, fudge ì
union fudge (* int i; int* p; *);
è èñïîëüçîâàòü (íåïðàâèëüíî) â òî÷íîñòè êàê ðàíüøå. Èìåþòñÿ òàêæå è îïðàâäàííûå ïðèìåíåíèÿ
2.6 Óïðàæíåíèÿ
1. (*1) Çàñòàâüòå ðàáîòàòü ïðîãðàììó ñ «Hello, world» (1.1.1).
2. (*1) Äëÿ êàæäîãî îïèñàíèÿ â #2.1 ñäåëàéòå ñëåäóþùåå: Åñëè îïèñàíèå íå ÿâëÿåòñÿ îïðåäåëåí
3. (*1) Íàïèøèòå îïèñàíèÿ äëÿ: óêàçàòåëÿ íà ñèìâîë; âåêòîðà èç 10 öåëûõ; ññûëêè íà âåêòîð è
4. (*1.5) Íàïèøèòå ïðîãðàììó, êîòîðàÿ ïå÷àòàåò ðàçìåðû îñíîâíûõ è óêàçàòåëüíûõ òèïîâ. Èñïîë
5. (*1.5) Íàïèøèòå ïðîãðàììó, êîòîðàÿ ïå÷àòàåò áóêâû 'a'...'z' è öèôðû '0'...'9' è èõ ÷èñëî
6. (*1) Íàïå÷àòàéòå íàáîð áèòîâ, êîòîðûì ïðåäñòàâëÿåòñÿ óêàçàòåëü 0 íà âàøåé ñèñòåìå. Ïîäñê
7. (*1.5) Íàïèøèòå ôóíêöèþ, ïå÷àòàþùóþ ïîðÿäîê è ìàíòèññó ïàðàìåòðà òèïà double.
8. (*2) Êàêîâû íàèáîëüøèå è íàèìåíüøèå çíà÷åíèÿ, íà âøåé ñèñòåìå, ñëåäóþùèõ òèïîâ: char, sh
9. (*1) Êàêîå ñàìîå äëèííîå ëîêàëüíîå èìÿ ìîæíî èñïîëüçîâàòü â Ñ++ ïðîãðàììå â âàøåé ñèñòåì
10. (*2) Îïðåäåëèòå one ñëåäóþùèì îáðàçîì:
const one = 1;
Ïîïûòàéòåñü ïîìåíÿòü çíà÷åíèå one íà 2. Îïðåäåëèòå num ñëåäóþùèì îáðàçîì:
const num[] = (* 1, 2 *);
Ïîïûòàéòåñü ïîìåíÿòü çíà÷åíèå num[1] íà 2.
11. (*1) Íàïèøèòå ôóíêöèþ, ïåðåñòàâëÿþùóþ äâà öåëûõ (ìåíÿþùóþ çíà÷åíèÿ). Èñïîëüçóéòå â êà÷å
12. (*1) Êàêîâ ðàçìåð âåêòîðà str â ñëåäóþùåì ïðèìåðå:
char str[] = «a short string»;
Êàêîâà äëèíà ñòðîêè «a short string»?
13. (*1.5) Îïðåäåëèòå òàáëèöó íàçâàíèé ìåñÿöåâ ãîäà è ÷èñëà äíåé â íèõ. Âûâåäèòå åå. Ñäåëàé
14. (*1) Ñ ïîìîùüþ typedef îïðåäåëèòå òèïû: áåççíàêîâûé char, êîíñòàíòíûé áåççíàêîâûé char,
Ñ++ èìååò íåáîëüøîé, íî ãèáêèé íàáîð ðàçëè÷íûõ âèäîâ îïåðàòîðîâ äëÿ êîíòðîëÿ ïîòîêà óïðàâëå
* Íàì íåèçâåñòåí ðóññêîÿçû÷íûé òåðìèí, ýêâèâàëåíòíûé àíãëèéñêîìó indentation. Èíîãäà ýòî
îáåñïå÷èâàþò, ÷òî ii áóäåò ëåæàòü â äèàïàçîíå 0...TBLS1; % ýòî îïåðàöèÿ âçÿòèÿ ïî ìîäóëþ
Âîò ôóíêöèÿ ïîëíîñòüþ:
extern int strlen(const char*); extern int strcmp(const char*, const char*); ext
ern int strcpy(const char*, const char*);
name* look(char* p, int ins =0) (* int ii = 0; // õýøèðîâàíèå char* pp = p; while (*pp) ii
; if (ii « 0) ii = -ii; ii %= TBLSZ;
for (name* n=table[ii]; n; n=n-»next) // ïîèñê if (strcmp(p,n-»string) == 0) return n;
if (ins == 0) error(«èìÿ íå íàéäåíî»);
name* nn = new name; // âñòàâêà nn-»string = new char[strlen(p)+1]; strcpy(nn-»string,p); n
= 1; nn-»next = table[ii]; table[ii] = nn; return nn; *)
Ïîñëå âû÷èñëåíèÿ õýø-êîäà ii èìÿ íàõîäèòñÿ ïðîñòûì ïðîìîòðîì ÷åðåç ïîëÿ next. Ïðîâåðêà êàæä
Äîáàâëåíèå íîâîãî name âêëþ÷àåò â ñåáÿ ñîçäàíèå íîâîãî îáúåêòà â ñâîáîäíîé ïàìÿòè ñ ïîìîùüþ
3.1.5 Äðàéâåð
Êîãäà âñå ÷àñòè ïðîãðàììû íà ìåñòå, íàì íóæåí òîëüêî äðàéâåð äëÿ èíèöèàëèçàöèè è âñåãî òîãî
int main() (* // âñòàâèòü ïðåäîïðåäåëåííûå èìåíà: insert(«pi»)-»value = 3.14159265358979323
while (cin) (* get_token(); if (curr_tok == END) break; if (curr_tok == PRINT) c
ontinue; cout « expr() «« «\n ; *) return no_of_errors; *)
Ïðèíÿòî îáû÷íî, ÷òî main() âîçâðàùàåò íîëü ïðè íîðìàëíîì çàâåðøåíèè ïðîãðàììû è íå íîëü â ï
Îñíîâíàÿ ðàáîòà öèêëà ÷èòàòü âûðàæåíèÿ è ïèñàòü îòâåò. Ýòî äåëàåò ñòðîêà:
cout « expr() «« «\n ;
Ïðîâåðêà cin íà êàæäîì ïðîõîäå öèêëà îáåñïå÷èâàåò çàâåøåíèå ïðîãðàììû â ñëó÷àå, åñëè ñ ïîòî
while (cin) (* // ... if (curr_tok == PRINT) continue; cout « expr() «« «\n ; *)
ýêâèâàëåíòíî
while (cin) (* // ... if (curr_tok == PRINT) goto end_of_loop; cout « expr() «« «\n ; end_
f_loop *)
Áîëåå ïîäðîáíî öèêëû îïèñûâàþòñÿ â #ñ.9.
3.3.1 Ïðîâåðêè
Ïðîâåðêà çíà÷åíèÿ ìîæåò îñóùåñòâëÿòüñÿ èëè îïåðàòîðîì if, èëè îïåðàòîðîì switch:
if ( âûðàæåíèå ) îïåðàòîð if ( âûðàæåíèå ) îïåðàòîð else îïåðàòîð switch ( âûðàæåíèå ) îïåð
 Ñ++ íåò îòäåëüíîãî áóëåâñêîãî òèïà. Îïåðàöèè ñðàâíåíèÿ
== != « = »=
âîçâðàùàþò öåëîå 1, åñëè ñðàâíåíèå èñòèííî, èíà÷å âîçðàùàþò 0. Íå òàê óæ íåïðèâû÷íî âèäåòü,
 îïåðàòîðå if ïåðâûé (èëè åäèíñòâåííûé) îïåðàòîð âûïîíÿåòñÿ â òîì ñëó÷àå, åñëè âûðàæåíèå í
if (a) // ...
ýêâèâàëåíòíî
if (a != 0) // ...
Ëîãè÷åñêèå îïåðàöèè amp; amp; !! ! íàèáîëåå ÷àñòî èñïîëüçóþòñÿ â óñëîâèÿõ. Îïåðàöèè amp; am
if (p amp; amp; 1«p-»count) // ...
âíà÷àëå ïðîâåðÿåò, ÿâëÿåòñÿ ëè p íå íóëåì, è òîëüêî åñëè ýòî òàê, òî ïðîâåðÿåò 1«p-»count.
Íåêîòîðûå ïðîñòûå îïåðàòîðû if ìîãóò áûòü ñ óäîáñòâîì
çàìåíåíû âûðàæåíèÿìè àðèôìåòè÷åñêîãî if. Íàïðèìåð:
if (a «= d) max = b; else max = a;
ëó÷øå âûðàæàåòñÿ òàê:
max = (a«=b) ? b : a;
Ñêîáêè âîêðóã óñëîâèÿ íåîáÿçàòåëüíû, íî ÿ ñ÷èòàþ, ÷òî êîãäà îíè èñïîëüçóþòñÿ, ïðîãðàììó ëåã
Íåêîòîðûå ïðîñòûå îïåðàòîðû switch ìîæíî ïî-äðóãîìó çïèñàòü â âèäå íàáîðà îïåðàòîðîâ if. Íà
switch (val) (* case 1: f(); break; case 2; g(); break; default: h(); break; *)
èíà÷å ìîæíî áûëî áû çàïèñàòü òàê:
if (val == 1) f(); else if (val == 2) g(); else h();
Ñìûñë òîò æå, îäíàêî ïåðâûé âàðèàíò (switch) ïðåäïî÷òòåëüíåå, ïîñêîëüêó â ýòîì ñëó÷àå ÿâíî
Çàáîòüòåñü î òîì, ÷òî switch äîëæåí êàê-òî çàâåðøàòüñÿ, åñëè òîëüêî âû íå õîòèòå, ÷òîáû âûï
switch (val) (* // îñòîðîæíî case 1: cout « case 1\n ; case 2; cout « «case 2\n ; defaul
ïðè val==1 íàïå÷àòàåò
case 1 case 2 default: case íå íàéäåí
ê âåëèêîìó èçóìëåíèþ íåïîñâÿùåííîãî. Ñàìûé îáû÷íûé ñïñîá çàâåðøèòü ñëó÷àé ýòî break, èíîã
switch (val) (* // îñòîðîæíî
case 0: cout « case 0\n ; case1: case 1: cout «case 1\n ; return; case 2; cout «« «cas
case1; default: cout «« «default: case íå íàéäåí\n ; return; *)
Ïðè îáðàùåíèè ê íåìó ñ val==2 âûäàñò
case 2 case 1
Çàìåòüòå, ÷òî ìåòêà case íå ïîäõîäèò êàê ìåòêà äëÿ óïîðåáëåíèÿ â îïåðàòîðå goto:
goto case 1; // ñèíòàêñè÷åñêàÿ îøèáêà
3.3.2 Goto
Ñ++ ñíàáæåí èìåþùèì äóðíóþ ðåïóòàöèþ îïåðàòîðîì goto.
goto èäåíòèôèêàòîð; èäåíòèôèêàòîð : îïåðàòîð
 îáùåì, â ïðîãðàììèðîâàíèè âûñîêîãî óðîâíÿ îí èìååò î÷åíü ìàëî ïðèìåíåíèé, íî îí ìîæåò áûò
Îäíî èç íåìíîãèõ ðàçóìíûõ ïðèìåíåíèé ñîñòîèò â âûõîäå èç âëîæåííîãî öèêëà èëè ïåðåêëþ÷àòåëÿ
for (int i = 0; i«n; i++) for (int j = 0; j«m; j++) if (nm[i][j] == a) goto found //
íàéäåíî // íå íàéäåíî // ...
found: // íàéäåíî // nm[i][j] == a
Èìååòñÿ òàêæå îïåðàòîð continue, êîòîðûé ïî ñóòè äåëàåò ïåðåõîä íà êîíåö îïåðàòîðà öèêëà, ê
Íàïðèìåð:
// tbl.c: Ðåàëèçàöèÿ òàáëèöû èìåí /* Ãàóññîâñêîå èñêëþ÷åíèå ñ ÷àñòè÷íûì Ñì. Ralston: «A fir
// swap() ïðåäïîëàãàåò ðàçìåùåíèå ñòåêà AT amp;T sB20.
/**************************************
Copyright (c) 1984 AT amp;T, Inc. All rights reserved
****************************************/
Óäà÷íî ïîäîáðàííûå è õîðîøî íàïèñàííûå êîììåíòàðèè ñùåñòâåííàÿ ÷àñòü ïðîãðàììû. Íàïèñàíèå
Çàìåòüòå òàêæå, ÷òî åñëè â ôóíêöèè èñïîëüçóþòñÿ èñêëþ÷òåëüíî êîììåíòàðèè //, òî ëþáóþ ÷àñòü
3.5 Óïðàæíåíèÿ
1. (*1) Ïåðåïèøèòå ñëåäóþùèé îïåðàòîð for â âèäå ýêâèâàëåíòíîãî îïåðàòîðà while: for (i=0;
2. (*1) Ïîëíîñòüþ ðàññòàâüòå ñêîáêè â ñëåäóþùèõ âûðàæíèÿõ: a = b + c * d «« 2 amp; 8 a amp;
5 a = b == c ++ a = b = c = 0 a[4][2] *= * b ? c : * d * 2 a-b,c=d
3. (*2) Íàéäèòå ïÿòü ðàçëè÷íûõ êîíñòðóêöèé Ñ++, çíà÷åíèå êîòîðûõ íåîïðåäåëåíî.
4. (*2) Íàéäèòå äåñÿòü ðàçëè÷íûõ ïðèìåðîâ íåïåðåíîñèìîé Ñ++ ïðîãðàììû.
5. (*1) ×òî ïðîèñõîäèò â âàøåé ñèñòåìå, åñëè âû äåëèòå íà íîëü? ×òî ïðîèñõîäèò ïðè ïåðåïîëí
6. (*1) Ïîëíîñòüþ ðàññòàâüòå ñêîáêè â ñëåäóþùèõ âûðàæíèÿõ: *p++ * p ++a (int*)p-»m *p.m *a
7. (*2) Íàïèøèòå ôóíêöèè: strlen(), êîòîðàÿ âîçâðàùàåò äëèíó ñòðîêè, strcpy(), êîòîðàÿ êîïè
8. (*1) Ïîñìîòðèòå, êàê âàø êîìïèëÿòîð ðåàãèðóåò íà îøèáêè: a := b+1; if (a = 3) // ... if
9. (*2) Íàïèøèòå ôóíêöèþ cat(), ïîëó÷àþùóþ äâà ñòðîêîâûõ ïàðàìåòðà è âîçâðàùàþùóþ ñòðîêó, ê
10. (*2) ×òî äåëàåò ñëåäóþùàÿ ïðîãðàììà?
void send(register* to, register* from, register count) // Ïîëåçíûå êîììåíòàðèè íåñîìíåííî
do (* *to++ = *from++; case 7: do (* *to++ = *from++; case 6: do (* *to++ = *fro
m++; case 5: do (* *to++ = *from++; case 4: do (* *to++ = *from++; case 3: do (*
*to++ = *from++; case 2: do (* *to++ = *from++; case 1: do (* *to++ = *from++;
while ( n»0); *) *) Çà÷åì êòî-òî ìîã íàïèñàòü íå÷òî ïîõîæåå?
11. (*2) Íàïèøèòå ôóíêöèþ atoi(), êîòîðàÿ ïîëó÷àåò ñòðêó, ñîäåðæàùóþ öèôðû, è âîçâðàùàåò ñî
12. (*2) Ïåðåïèøèòå get_token() (#3.1.2), ÷òîáû îíà çà îäèí ðàç ÷èòàëà ñòðîêó â áóôåð, à çà
13. (*2) Äîáàâüòå â íàñòîëüíûé êàëüêóëÿòîð èç #3.1 òàêèå ôóíêöèè, êàê sqrt(), log() è sin()
14. (*3) Äàéòå ïîëüçîâàòåëþ âîçìîæíîñòü îïðåäåëÿòü ôóíöèè â íàñòîëüíîì êàëüêóëÿòîðå. Ïîäñêà
15. (*1.5) Ïðåîáðàçóéòå íàñòîëüíûé êàëüêóëÿòîð òàê, ÷òáû âìåñòî ñòàòè÷åñêèõ ïåðåìåííûõ name
16. (*2.5) Íàïèøèòå ïðîãðàììó, êîòîðàÿ âûáðàñûâàåò êîìåíòàðèè èç Ñ++ ïðîãðàììû. Òî åñòü, ÷è
17. (*2) Ïîñìîòðèòå êàêèå-íèáóäü ïðîãðàììû, ÷òîáû ïîíÿòü ïðèíöèï ðàçëè÷íûõ ñòèëåé êîììåíòèð
Âñå íåòðèâèàëüíûå ïðîãðàììû ñîáèðàþòñÿ èç íåñêîëüêèõ ðàçäåëüíî êîìïèëèðóåìûõ åäèíèö (èõ ïðè
4.1 Ââåäåíèå
Èìåòü âñþ ïðîãðàììó â îäíîì ôàéëå îáû÷íî íåâîçìîæíî, ïîñêîëüêó êîäû ñòàíäàðòíûõ áèáëèîòåê è
Ðàññìîòðèì ïðèìåð ñ êàëüêóëÿòîðîì. Îí áûë ïðåäñòàâëåí â âèäå îäíîãî èñõîäíîãî ôàéëà. Åñëè â
Ïðîãðàììà, ñîñòîÿùàÿ èç íåñêîëüêèõ ðàçäåëüíî êîìïèëèðóìûõ ôàéëîâ, äîëæíà áûòü ñîãëàñîâàííîé
* èëè ëèíêåð. (ïðèì. ïåðåâ.)
Ïðîãðàììèñò ìîæåò ñêîìïåíñèðîâàòü íåäîñòàòîê ïîääåðæêè ñî ñòîðîíû êîìïîíîâùèêà, ïðåäîñòàâèâ
íàõîäÿòñÿ â îòäåëüíî êîìïèëèðóåìûõ ÷àñòÿõ. Ñðåäñòâà, êîòîðûå ýòî îáåñïå÷èâàþò, â âàøåé ñèñò
* C ðàçðàáîòàí òàê, ÷òîáû â áîëüøèíñòâå ñëó÷àåâ ïîçâëÿòü îñóùåñòâëÿòü íåÿâíóþ êîìïîíîâêó.
4.2 Êîìïîíîâêà
Åñëè íå óêàçàíî èíîå, òî èìÿ, íå ÿâëÿþùååñÿ ëîêàëüíûì äëÿ ôóíêöèè èëè êëàññà, â êàæäîé ÷àñò
// file1.c: int a = 1; int f() (* /* ÷òî-òî äåëàåò */ *)
// file2.c: extern int a; int f(); void g() (* a = f(); *)
a è f(), èñïîëüçóåìûå g() â ôàéëå file2.c, òå æå, ÷òî îïðåäåëåíû â ôàéëå file1.c. Êëþ÷åâîå
// file1.c: int a = 1; int b = 1; extern int c;
// file2.c: int a; extern double b; extern int c;
Çäåñü òðè îøèáêè: a îïðåäåëåíî äâàæäû (int a; ÿâëÿåòñÿ îïðåäåëåíèåì, êîòîðîå îçíà÷àåò int a
Ñëåäóþùàÿ ïðîãðàììà íå ÿâëÿåòñÿ Ñ++ ïðîãðàììîé (õîòÿ C ïðîãðàììîé ÿâëÿåòñÿ):
// file1.c: int a; int f() (* return a; *)
// file2.c: int a; int g() (* return f(); *)
Âî-ïåðâûõ, file2.c íå Ñ++, ïîòîìó ÷òî f() íå áûëà îïèñàíà, è ïîýòîìó êîìïèëÿòîð áóäåò íåäîâ
Èìÿ ìîæíî ñäåëàòü ëîêàëüíûì â ôàéëå, îïèñàâ åãî static. Íàïðèìåð:
// file1.c: static int a = 6; static int f() (* /* ... */ *)
// file2.c: static int a = 7; static int f() (* /* ... */ *)
Ïîñêîëüêó êàæäîå a è f îïèñàíî êàê static, ïîëó÷àþùàÿñÿ â ðåçóëüòàòå ïðîãðàììà ÿâëÿåòñÿ ïðà
Êîãäà ïåðåìåííûå è ôóíêöèè ÿâíî îïèñàíû êàê static, ÷àñòü ïðîãðàììû ëåã÷å ïîíÿòü (âàì íå íà
Ðàññìîòðèì äâà ôàéëà:
// file1.c: const int a = 6; inline int f() (* /* ... */ *) struct s (* int a,b;
*)
// file1.c: const int a = 7; inline int f() (* /* ... */ *) struct s (* int a,b;
*)
Ðàç ïðàâèëî «ðîâíî îäíî îïðåäåëåíèå» ïðèìåíÿåòñÿ ê êîíòàíòàì, inline-ôóíêöèÿì è îïðåäåëåíèÿ
4.6 Ôóíêöèè
Îáû÷íûé ñïîñîá ñäåëàòü ÷òî-ëèáî â Ñ++ ïðîãðàììå ýòî âûçâàòü ôóíêöèþ, êîòîðàÿ ýòî äåëàåò.
Ãëàâà 5 Êëàññû
Ýòè òèïû íå «àáñòðàêòíû», îíè ñòîëü æå ðåàëüíû, êàê int è float. Äóã ÌàêÈëðîé
 ýòîé ãëàâå îïèñûâàþòñÿ âîçìîæíîñòè îïðåäåëåíèÿ íîâûõ òèïîâ â Ñ++, äëÿ êîòîðûõ äîñòóï ê äà
5.2.2 Êëàññû
Îïèñàíèå date â ïðåäûäóùåì ïîäðàçäåëå äàåò ìíîæåñòâî ôóíêöèé äëÿ ðàáîòû ñ date, íî íå óêàçû
class date (* int month, day, year; public: void set(int, int, int); void get(in
t*, int*, int*); void next(); void print(); *);
Ìåòêà public: äåëèò òåëî êëàññà íà äâå ÷àñòè. Èìåíà â ïåðâîé, çàêðûòîé ÷àñòè, ìîãóò èñïîëüç
void date::ptinr() // ïå÷àòàåò â çàïèñè, ïðèíÿòîé â ÑØÀ (* cout «« month «« "/" «« day «« "
Îäíàêî ôóíêöèè íå ÷ëåíû îòãîðîæåíû îò èñïîëüçîâàíèÿ çàðûòûõ ÷ëåíîâ êëàññà date. Íàïðèìåð:
void backdate() (* today.day ; // îøèáêà *)
 òîì, ÷òî äîñòóï ê ñòðóêòóðå äàííûõ îãðàíè÷åí ÿâíî îïñàííûì ñïèñêîì ôóíêöèé, åñòü íåñêîëüê
Çàùèòà çàêðûòûõ äàííûõ ñâÿçàíà ñ îãðàíè÷åíèåì èñïîëüçâàíèÿ èìåí ÷ëåíîâ êëàññà. Ýòî ìîæíî îá
dlink* list_head;
void f(dlink*a, dlink *b) (* // ... list_head-»append(a); list_head-»append(b); *)
Öåïî÷êè òàêîé îáùåé ïðèðîäû ÿâëÿþòñÿ îñíîâîé äëÿ ñïèñêâûõ êëàññîâ, êîòîðûå îïèñûâàþòñÿ â Ãë
5.2.4 Èíèöèàëèçàöèÿ
Èñïîëüçîâàíèå äëÿ îáåñïå÷åíèÿ èíèöèàëèçàöèè îáúåêòà êëàññà ôóíêöèé âðîäå set_date() (óñòàíî
class date (* // ... date(int, int, int); *);
Êîãäà êëàññ èìååò êîíñòðóêòîð, âñå îáúåêòû ýòîãî êëàññà áóäóò èíèöèàëèçèðîâàòüñÿ. Åñëè äëÿ
date today = date(23,6,1983); date xmas(25,12,0); // ñîêðàùåííàÿ ôîðìà // (xmas ðîæäåñòâî
×àñòî áûâàåò õîðîøî îáåñïå÷èòü íåñêîëüêî ñïîñîáîâ èíèöàëèçàöèè îáúåêòà êëàññà. Ýòî ìîæíî ñä
class date (* int month, day, year; public: // ... date(int, int, int); // äåíü ìåñÿö ãîä d
/ äàòà â ñòðîêîâîì ïðåäñòàâëåíèè date(int); // äåíü, ìåñÿö è ãîä ñåãîäíÿøíèå date(); // äàò
Êîíñòðóêòîðû ïîä÷èíÿþòñÿ òåì æå ïðàâèëàì îòíîñèòåëüíî òèïîâ ïàðàìåòðîâ, ÷òî è ïåðåãðóæåííûå
date today(4); date july4(«Èþëü 4, 1983»); date guy(«5 Íîÿ»); date now; // èíèöèàëèçèðóåòñÿ
Çàìåòüòå, ÷òî ôóíêöèè ÷ëåíû ìîãóò áûòü ïåðåãðóæåíû áåç ÿâíîãî èñïîëüçîâàíèÿ êëþ÷åâîãî ñëîâà
Ðàçìíîæåíèå êîíñòðóêòîðîâ â ïðèìåðå ñ date òèïè÷íî. Ïðè ðàçðàáîòêå êëàññà âñåãäà åñòü ñîáëà
class date (* int month, day, year; public: // ... date(int d =0, int m =0, int
y =0); date(char*); // äàòà â ñòðîêîâîì ïðåäñòàâëåíèè *);
date::date(int d, int m, int y) (* day = d ? d : today.day; month = m ? m : toda
y.month; year = y ? y : today.year; // ïðîâåðêà, ÷òî äàòà äîïóñòèìàÿ // ... *)
Êîãäà èñïîëüçóåòñÿ çíà÷åíèå ïàðàìåòðà, óêàçûâàþùåå «áðàòü ïî óìîë÷àíèþ», âûáðàííîå çíà÷åíèå
Îáúåêò êëàññà áåç êîíñòðóêòîðîâ ìîæíî èíèöèàëèçèðîâàòü ïóòåì ïðèñâàèâàíèÿ åìó äðóãîãî îáúåê
date d = today; // èíèöèàëèçàöèÿ ïîñðåäñòâîì ïðèñâàèâàíèÿ
Ïî ñóùåñòâó, èìååòñÿ êîíñòðóêòîð ïî óìîë÷àíèþ, îïðåäëåííûé êàê ïîáèòîâàÿ êîïèÿ îáúåêòà òîãî
5.2.5 Î÷èñòêà
Îïðåäåëÿåìûé ïîëüçîâàòåëåì òèï ÷àùå èìååò, ÷åì íå èìååò, êîíñòðóêòîð, êîòîðûé îáåñïå÷èâàåò
class char_stack (* int size; char* top; char* s; public: char_stack(int sz) (*
top=s=new char[size=sz]; *) ~char_stack() (* delete s; *) // äåñòðóêòîð void push(char c) (
= c; *) char pop() (* return * top;*) *)
Êîãäà char_stack âûõîäèò èç îáëàñòè âèäèìîñòè, âûçûâàåñÿ äåñòðóêòîð:
void f() (* char_stack s1(100); char_stack s2(200); s1.push('a'); s2.push(s1.pop
()); char ch = s2.pop(); cout « chr(ch) «« «\n ; *)
Êîãäà âûçûâàåòñÿ f(), êîíñòðóêòîð char_stack âûçûâàåòñÿ äëÿ s1, ÷òîáû âûäåëèòü âåêòîð èç 10
5.2.6 Inline
Ïðè ïðîãðàììèðîâàíèè ñ èñïîëüçîâàíèåì êëàññîâ î÷åíü ÷àòî èñïîëüçóåòñÿ ìíîãî ìàëåíüêèõ ôóíêö
×òîáû ñïðàâèòüñÿ ñ ýòîé ïðîáëåìîé, áûë ðàçðàáîòàí àïïðàò inline-ôóíêöèé. Ôóíêöèÿ, îïðåäåëåí
Ôóíêöèþ ÷ëåí ìîæíî òàêæå îïèñàòü êàê inline âíå îïèñàíèÿ êëàññà. Íàïðèìåð: char char_stack
char* s; public: char pop(); // ... *);
inline char char_stack::pop() (* return * top; *)
Ýòîé ñëîæíîñòè ìîæíî èçáåæàòü, ïðåäñòàâèâ êàæäûé îáúåêò êëàññà êàê óêàçàòåëü íà «íàñòîÿùèé»
5.3.2 Çàêîí÷åííûé Êëàññ
Ïðîãðàììèðîâàíèå áåç ñîêðûòèÿ äàííûõ (ñ ïðèìåíåíèåì ñòðóêòóð) òðåáóåò ìåíüøåé ïðîäóìàííîñòè
Âîò ïðèìåð çàêîí÷åííîãî òèïà intset, êîòîðûé ðåàëèçóåò ïîíÿòèå «ìíîæåñòâî öåëûõ»:
class intset (* int cursize, maxsize; int *x; public: intset(int m, int n); // ñàìîå áîëüøå
~intset();
int member(int t); // ÿâëÿåòñÿ ëè t ýëåìåíòîì? void insert(int t); // äîáàâèòü "t" â ìíîæåñ
void iterate(int amp; i) (* i = 0; *) int ok(int amp; i) (* return i«cursize; *) i
nt next(int amp; i) (* return x[i++]; *) *);
×òîáû ïðîòåñòèðîâàòü ýòîò êëàññ, ìîæíî ñîçäàòü è ðàñï÷àòàòü ìíîæåñòâî ñëó÷àéíûõ öåëûõ ÷èñåë
#include «stream.h»
void error(char* s) (* cerr « "set: " «« s «« «\n ; exit(1); *)
Êëàññ intset èñïîëüçóåòñÿ â main(), êîòîðàÿ ïðåäïîëàãàåò äâà öåëûõ ïàðàìåòðà. Ïåðâûé ïàðàìå
main(int argc, char* argv[]) (* if (argc != 3) error(«îæèäàåòñÿ äâà ïàðàìåòðà»); int count
/ â äèàïàçîíå 1..n intset s(m,n);
while (count«m) (* int t = randint(n); if (s.member(t)==0) (* s.insert(t); count++
; *) *)
print_in_order( amp;s); *)
 ïðîãðàììå, äëÿ êîòîðîé òðåáóåòñÿ äâà ïàðàìåòðà, ñ÷å÷èê ÷èñëà ïàðàìåòðîâ, argc, äîëæåí ðàâ
extern int atoi(char*);
ôóíêöèÿ atoi() ýòî ñòàíäàðòíàÿ áèáëèîòå÷íàÿ ôóíêöèÿ äëÿ ïðåîáðàçîâàíèÿ ïðåäñòàâëåíèÿ öåëîãî
extern int rand(); // Íå î÷åíü ñëó÷àéíûå, áóäüòå îñòîðîæíû
int randint(int u) // â äèàïàçîíå 1..u (* int r = rand(); if (r « 0) r = -r; return 1 + r%u
Ïîäðîáíîñòè ðåàëèçàöèè êëàññà äîëæíû ïðåäñòàâëÿòü äëÿ ïîëüçîâàòåëÿ âåñüìà íåçíà÷èòåëüíûé èí
intset::intset(int m, int n)//ñàìîå áîëüøåå,m int'îâ â 1..n (* if (m«1 !! n m) error(«íåäîï
maxsize]; *)
intset::~intset() (* delete x; *)
Öåëûå ÷èñëà âñòàâëÿþòñÿ, ïîýòîìó îíè õðàíÿòñÿ â âîçðàòàþùåì ïîðÿäêå:
void intset::insert(int t) (* if (++cursize » maxsize) error(«ñëèøêîì ìíîãî ýëåìåíòîâ»); in
while (i»0 amp; amp; x[i-1]»x[i]) (* int t = x[i]; // ïåðåñòàâèòü x[i] è [i-1] x[i] = x[i-1
*) *)
Äëÿ íàõîæäåíèÿ ÷ëåíîâ èñïîëüçóåòñÿ ïðîñòî äâîè÷íûé ïèñê:
int intset::member(int t) // äâîè÷íûé ïîèñê (* int l = 0; int u = cursize-1;
while (l «= u) (* int m = (l+u)/2; if (t x[m]) u = m-1; else if (t x[m]) l = m+1;
else return 1; // íàéäåíî *) return 0; // íå íàéäåíî *)
È, íàêîíåö, íàì íóæíî îáåñïå÷èòü ìíîæåñòâî îïåðàöèé, ÷òîáû ïîëüçîâàòåëü ìîã îñóùåñòâëÿòü öè
Äàåòñÿ òðè ôóíêöèè: iterate() äëÿ èíèöèàëèçàöèè èòåðöèè, ok() äëÿ ïðîâåðêè, åñòü ëè ñëåäóþù
class intset (* // ... void iterate(int amp; i) (* i = 0; *) int ok(int amp; i)
(* return i«cursize; *) int next(int amp; i) (* return x[i++]; *) *);
×òîáû äàòü âîçìîæíîñòü ýòèì òðåì îïåðàöèÿì ðàáîòàòü ñîìåñòíî è ÷òîáû çàïîìíèòü, êóäà äîøåë
void print_in_order(intset* set) (* int var; set-»iterate(var); while (set-»ok(var))
cout « set- next(var) « «\n ; *)
Äðóãîé ñïîñîá çàäàòü èòåðàòîð ïðèâîäèòñÿ â #6.8.
5.4.1 Äðóçüÿ
Ïðåäïîëîæèì, âû îïðåäåëèëè äâà êëàññà, vector è matrix (âåêòîð è ìàòðèöà). Êàæäûé ñêðûâàåò
vector multiply(matrix amp; m, vector amp; v); (* vector r; for (int i = 0; i«3; i
++) (* // r[i] = m[i] * v; r.elem(i) = 0; for (int j = 0; j«3; j++) r.elem(i) += m
.elem(i,j) * v.elem(j); *) return r; *)
Ýòî ñâîåãî ðîäà «åñòåñòâåííûé» ñïîñîá, íî îí î÷åíü íåýôåêòèâåí. Ïðè êàæäîì îáðàùåíèè ê mult
Òåïåðü, åñëè ìû ñäåëàåì multiply() ÷ëåíîì êëàññà vector, ìû ñìîæåì îáîéòèñü áåç ïðîâåðêè èí
class matrix;
class vector (* float v[4]; // ... friend vector multiply(matrix amp;, vector am
p;); *);
class matrix (* vector v[4]; // ... friend vector multiply(matrix amp;, vector a
mp;); *);
Ôóíêöèÿ äðóã íå èìååò íèêàêèõ îñîáåííîñòåé, ïîìèìî ïðàâà äîñòóïà ê çàêðûòîé ÷àñòè êëàññà. Â
ïðîãðàììû è ñîïîñòàâëÿåòñÿ ñ äðóãèìè îïèñàíèÿìè ýòîãî èìåíè. Îïèñàíèå äðóãà ìîæåò ðàñïîëàãà
Òåïåðü ìîæíî íàïèñàòü ôóíêöèþ óìíîæåíèÿ, êîòîðàÿ èñïîëçóåò ýëåìåíòû âåêòîðîâ è ìàòðèöû íåïî
vector multiply(matrix amp; m, vector amp; v); (* vector r; for (int i = 0; i«3; i
++) (* // r[i] = m[i] * v; r.v[i] = 0; for (int j = 0; j«3; j++) r.v[i] += m.v[i][
j] * v.v[j]; *) return r; *)
Åñòü ñïîñîáû ïðåîäîëåòü ýòó êîíêðåòíóþ ïðîáëåìó ýôôåòèâíîñòè íå èñïîëüçóÿ àïïàðàò friend (ì
Ôóíêöèÿ ÷ëåí îäíîãî êëàññà ìîæåò áûòü äðóãîì äðóãîãî. Íàïðèìåð:
class x (* // ... void f(); *);
class y (* // ... friend void x::f(); *);
Íåò íè÷åãî íåîáû÷íîãî â òîì, ÷òî âñå ôóíêöèè ÷ëåíû îäíãî êëàññà ÿâëÿþòñÿ äðóçüÿìè äðóãîãî.
class x (* friend class y; // ... *);
Òàêîå îïèñàíèå friend äåëàåò âñå ôóíêöèè ÷ëåíû êëàññà y äðóçüÿìè x.
* Áîëåå ïîçäíèå âåðñèè Ñ++ ïîääåðæèâàþò ïîíÿòèå óêàçòåëü íà ÷ëåí: cl::* îçíà÷àåò «óêàçàòå
typedef void (cl::*PROC)(int); PROC pf1 = amp;cl::print; // ïðèâåäåíèå ê òèïó íåíóæíî PROC
Äëÿ âûçîâîâ ÷åðåç óêàçàòåëü íà ôóíêöèþ ÷ëåí èñïîëüçóþòñÿ îïåðàöèè . è -». Íàïðèìåð:
(z1.*pf1)(2); (( amp;z2)-»*pf2)(4);
(ïðèì. àâòîðà)
#include «stream.h»
struct cl (* char* val; void print(int x) (* cout « val «« x «« «\n ; *); cl(char* v) (* v
v; *) *);
// ``ôàëüøèâûé'' òèï äëÿ ôóíêöèé ÷ëåíîâ: typedef void (*PROC)(void*, int);
main() (* cl z1("z1 "); cl z2("z2 "); PROC pf1 = PROC( amp;z1.print); PROC pf2 =
PROC( amp;z2.print); z1.print(1); (*pf1)( amp;z1,2); z2.print(3); (*pf2)( amp;z
2,4); *)
Âî ìíîãèõ ñëó÷àÿõ ìîæíî âîñïîëüçîâàòüñÿ âèðòóàëüíûìè ôóíêöèÿìè (ñì. Ãëàâó 7) òàì, ãäå èíà÷å
union tok_val (* char* p; // ñòðîêà char v[8]; // èäåíòèôèêàòîð (ìàêñèìóì 8 char) long i; /
Ñëîæíîñòü ñîñòîèò â òîì, ÷òî êîìïèëÿòîð, âîîáùå ãîâîðÿ, íå çíàåò, êàêîé ÷ëåí èñïîëüçóåòñÿ â
void strange(int i) (* tok_val x; if (i) x.p = "2"; else x.d = 2; sqrt(x.d); // îøèáêà åñëè
)
Êðîìå òîãî, îáúåäèíåíèå, îïðåäåëåííîå òàê, êàê ýòî, íåëüçÿ èíèöèàëèçèðîâàòü. Íàïðèìåð:
tok_val curr_val = 12; //îøèáêà:int ïðèñâàèâàåòñÿ tok_val'ó
ÿâëÿåòñÿ íåäîïóñòèìûì. Äëÿ òîãî, ÷òîáû ýòî ïðåîäîëåòü, ìîæíî âîñïîëüçîâàòüñÿ êîíñòðóêòîðàìè
union tok_val (* char* p; // ñòðîêà char v[8]; // èäåíòèôèêàòîð (ìàêñèìóì 8 char) long i; /
tok_val(char*); // äîëæíà âûáðàòü ìåæäó p è v tok_val(int ii) (* i = ii; *) tok_val() (* d
Ýòî ïîçâîëÿåò ñïðàâëÿòüñÿ ñ òåìè ñèòóàöèÿìè, êîãäà òèïû ÷ëåíîâ ìîãóò áûòü ðàçðåøåíû ïî ïðàâ
void f() (* tok_val a = 10; // a.i = 10 tok_val b = 10.0; // b.d = 10.0 *)
Êîãäà ýòî íåâîçìîæíî (äëÿ òàêèõ òèïîâ, êàê char* è char[8], int è char, è ò.ï.), íóæíûé ÷ëå
tok_val::tok_val(char* pp) (* if (strlen(pp) «= 8) strncpy(v,pp,8); // êîðîòêàÿ ñòðîêà else
Òàêèõ ñèòóàöèé âîîáùå-òî ëó÷øå èçáåãàòü.
Èñïîëüçîâàíèå êîíñòðóêòîðîâ íå ïðåäîõðàíÿåò îò òàêîãî ñëó÷àéíîãî íåïðàâèëüíîãî óïîòðåáëåíèÿ
ïðèñâàèâàåòñÿ çíà÷åíèå îäíîãî òèïà, à ïîòîì ðàññìàòðèâàåòñÿ êàê äðóãîé òèï. Ýòà ïðîáëåìà ðå
class tok_val (* char tag; union (* char* p; char v[8]; long i; double d; *); in
t check(char t, char* s) (* if (tag!=t) (* error(s); return 0; *) return 1; *) p
ublic: tok_val(char* pp); tok_val(long ii) (* i=ii; tag='I'; *) tok_val(double d
d) (* d=dd; tag='D'; *)
long amp; ival() (* check('I',"ival"); return i; *) double amp; fval() (* check(
'D',"fval"); return d; *) char* amp; sval() (* check('S',"sval"); return p; *) c
har* id() (* check('N',"id"); return v; *) *);
Êîíñòðóêòîð, ïîëó÷àþùèé ñòðîêîâûé ïàðàìåòð, èñïîëüçóåò äëÿ êîïèðîâàíèÿ êîðîòêèõ ñòðîê strnc
tok_val::tok_val(char* pp) (* if (strlen(pp) «= 8) (* // êîðîòêàÿ ñòðîêà tag = 'N' strncpy(
// ïðîñòî ñîõðàíèòü óêàçàòåëü *) *)
Òèï tok_val ìîæíî èñïîëüçîâàòü òàê:
void f() (* tok_val t1(«short»); // êîðîòêàÿ, ïðèñâîèòü v tok_val t2(«long string»); //äëèí
id(),8); // ïðîâåðêà check() íå ïðîéäåò *)
5.5.1 Ïðåäîñòåðåæåíèå
Åñëè x è y îáúåêòû êëàññà cl, òî x=y â ñòàíäàðòíîì ñëó÷àå îçíà÷àåò ïîáèòîâîå êîïèðîâàíèå
class char_stack (* int size; char* top; char* s; public: char_stack(int sz) (*
top=s=new char[size=sz]; *) ~char_stack() (* delete s; *) // äåñòðóêòîð void push(char c) (
= c; *) char pop() (* return * top; *) *);
void h() (* char_stack s1(100); char_stack s2 = s1; // íåïðèÿòíîñòü char_stack s3(99); s3 =
Çäåñü char_stack::char_stack() âûçûâàåòñÿ äâàæäû: äëÿ s1 è äëÿ s3. Äëÿ s2 îí íå âûçûâàåòñÿ,
Ðàçäåëüíî ñîçäàâàåìûå îáúåêòû âðîäå ýòèõ ìîãóò îêàçàòüñÿ ïîëåçíûìè, íî ó÷òèòå, ÷òî members
5.5.5 Âåêòîðà Îáúåêòîâ Êëàññà
×òîáû îïèñàòü âåêòîð îáúåêòîâ êëàññà, èìåþùåãî êîíñòðóòîð, ýòîò êëàññ äîëæåí èìåòü êîíñòðóê
table tblvec[10];
áóäåò îøèáêîé, òàê êàê äëÿ table::table() òðåáóåòñÿ öåëûé ïàðàìåòð. Íåò ñïîñîáà çàäàòü ïàðà
class table (* // ... void init(int sz); // êàê ñòàðûé êîíñòðóêòîð public: table(int sz) //
Êîãäà âåêòîð óíè÷òîæàåòñÿ, äåñòðóêòîð äîëæåí âûçûâàòüñÿ äëÿ êàæäîãî ýëåìåíòà ýòîãî âåêòîðà.
void f() (* table* t1 = new table; table* t2 = new table[10]; delete t1; // îäíà òàáëèöà de
íåïðèÿòíîñòü: 10 òàáëèö *)
 ýòîì ñëó÷àå äëèíó âåêòîðà äîëæåí çàäàâàòü ïðîãðàììèñò:
void g(int sz) (* table* t1 = new table; table* t2 = new table[sz]; delete t1; d
elete[] t2; *)
Íî ïî÷åìó æå êîìïèëÿòîð íå ìîæåò íàéòè ÷èñëî ýëåìåíòîâ âåêòîðà èç îáúåìà âûäåëåííîé ïàìÿòè?
5.5.7 Ïðåäîñòåðåæåíèå
Êîãäà â êîíñòðóêòîðå ïðîèçâîäèòñÿ óêàçàòåëþ this, çíà÷íèå this äî ýòîãî ïðèñâàèâàíèÿ íåîïðå
mytype::mytype(int i) (* if (i) this = mytype_alloc(); // ïðèñâàèâàíèå ÷ëåíàì *);
îòêîìïèëèðóåòñÿ, è ïðè i==0 íèêàêîé îáúåêò ðàçìåùåí íå áóäåò.
Êîíñòðóêòîð ìîæåò îïðåäåëèòü, áûë ëè îí âûçâàí îïåðàöèåé new, èëè íåò. Åñëè îí âûçâàí new,
mytype::mytype(int i) (* if (this == 0) this = mytype_alloc(); // ïðèñâàèâàíèå ÷ëåíàì *);
Ýêâèâàëåíòíîãî ñðåäñòâà, êîòîðîå ïîçâîëÿåò äåñòðóêòîðó ðåøèòü âîïðîñ, áûë ëè åãî îáúåêò ñîç
Åñëè òîò, êòî ðåàëèçóåò êëàññ, ÿâëÿåòñÿ îäíîâðåìåííî è åãî åäèíñòâåííûì ïîëüçîâàòåëåì, òî è
5.6 Óïðàæíåíèÿ
1. (*1) Ìîäèôèöèðóéòå íàñòîëüíûé êàëüêóëÿòîð èç Ãëàâû 3, ÷òîáû èñïîëüçîâàòü êëàññ table.
2. (*1) Ðàçðàáîòàéòå tnode (#ñ.8.5) êàê êëàññ ñ êîíòðóêòîðàìè, äåñòðóêòîðàìè è ò.ï. Îïðåäåë
3. (*1) Ïðåîáðàçóéòå êëàññ intset (#5.3.2) â ìíîæåñòâî ñòðîê.
4. (*1) Ïðåîáðàçóéòå êëàññ intset â ìíîæåñòâî óçëîâ node, ãäå node îïðåäåëÿåìàÿ âàìè ñòðó
5. (*3) Îïðåäåëèòå êëàññ äëÿ àíàëèçà, õðàíåíèÿ, âû÷èñëíèÿ è ïå÷àòè ïðîñòûõ àðèôìåòè÷åñêèõ â
class expr (* // ... public: expr(char*); int eval(); void print(); *) Ïàðàìåòð ñòðîêà êîíñ
expr x(«123/4+123*4-3»); cout « "x = " «« x.eval() «« «\n ; x.print();
Îïðåäåëèòå êëàññ expr äâà ðàçà: îäèí ðàç èñïîëüçóÿ â ê÷åñòâå ïðåäñòàâëåíèÿ ñâÿçàííûé ñïèñîê
6. (*1) Îïðåäåëèòå êëàññ char_queue (ñèìâîëüíàÿ î÷åðåäü) òàêèì îáðàçîì, ÷òîáû îòêðûòûé èíòå
7. (*2) Îïðåäåëèòå êëàññ histogram (ãèñòîãðàììà), â êòîðîì âåäåòñÿ ïîäñ÷åò ÷èñåë â îïðåäåëå
8. (*2) Îïðåäåëèòå íåñêîëüêî êëàññîâ, ïðåäîñòàâëÿþùèõ ñëó÷àéíûå ÷èñëà ñ îïðåäåëåííûìè ðàñïð
9. (*2) Ïåðåïèøèòå ïðèìåð date (#5.8.2), ïðèìåð char_stack (#5.2.5) è ïðèìåð intset (#5.3.2
10. (*3) Äëÿ êàêîãî-íèáóäü ÿçûêà ñïðîåêòèðóéòå êëàññ òàáëèöà èìåí è êëàññ âõîæäåíèå â òàáëè
11. (*2) Ìîäèôèöèðóéòå êëàññ âûðàæåíèå èç Óïðàæíåíèÿ 5 òàê, ÷òîáû îáðàáàòûâàòü ïåðåìåííûå è
12. (*1) Äàíà ïðîãðàììà:
#include «stream.h»
main() (* cout « «Hello, world\n ; *)
ìîäèôèöèðóéòå åå, ÷òîáû ïîëó÷èòü âûäà÷ó
Initialize Hello, world Clean up
Íå äåëàéòå íèêàêèõ èçìåíåíèé â main().
 ýòîé ãëàâå îïèñûâàåòñÿ àïïàðàò, ïðåäîñòàâëÿåìûé â Ñ++ äëÿ ïåðåãðóçêè îïåðàöèé. Ïðîãðàììèñ
6.1 Ââåäåíèå
×àñòî ïðîãðàììû ðàáîòàþò ñ îáúåêòàìè, êîòîðûå ÿâëÿþòñÿ êîíêðåòíûìè ïðåäñòàâëåíèÿìè àáñòðàêò
class complex (* double re, im; public: complex(double r, double i) (* re=r; im=
i; *) friend complex operator+(complex, complex); friend complex operator*(compl
ex, complex); *);
îïðåäåëÿåò ïðîñòóþ ðåàëèçàöèþ ïîíÿòèÿ êîìïëåêñíîãî ÷èëà, â êîòîðîé ÷èñëî ïðåäñòàâëÿåòñÿ ïàð
void f() (* complex a = complex(1, 3.1); complex b = complex(1.2, 2); complex c
= b;
a = b+c; b = b+c*a; c = a*b+complex(1,2); *)
Âûïîëíÿþòñÿ îáû÷íûå ïðàâèëà ïðèîðèòåòîâ, ïîýòîìó âòîðîé îïåðàòîð îçíà÷àåò b=b+(c*a), à íå b
6.3.1 Êîíñòðóêòîðû
Àëüòåðíàòèâó èñïîëüçîâàíèþ íåñêîëüêèõ ôóíêöèé (ïåðåãðæåííûõ) ñîñòàâëÿåò îïèñàíèå êîíñòðóêòî
class complex (* // ... complex(double r) (* re=r; im=0; *) *);
Êîíñòðóêòîð, òðåáóþùèé òîëüêî îäèí ïàðàìåòð, íåîáÿçòåëüíî âûçûâàòü ÿâíî:
complex z1 = complex(23); complex z2 = 23;
È z1, è z2 áóäóò èíèöèàëèçèðîâàíû âûçîâîì complex(23).
Êîíñòðóêòîð ýòî ïðåäïèñàíèå, êàê ñîçäàâàòü çíà÷åíèå äàííîãî òèïà. Êîãäà òðåáóåòñÿ çíà÷åíè
class complex (* double re, im; public: complex(double r, double i = 0) (* re=r;
im=i; *)
friend complex operator+(complex, complex); friend complex operator*(complex, co
mplex); *);
è äåéñòâèÿ, â êîòîðûå áóäóò âõîäèòü ïåðåìåííûå complex è öåëûå êîíñòàíòû, ñòàëè áû äîïóñòèì
a=operator*( b, complex( double(2), double(0) ) )
Îïðåäåëåííîå ïîëüçîâàòåëåì ïðåîáðàçîâàíèå òèïà ïðèìåíåòñÿ íåÿâíî òîëüêî òîãäà, êîãäà îíî ÿâ
Îáúåêò, ñêîíñòðóèðîâàííûé ñ ïîìîùüþ ÿâíîãî èëè íåÿâíîãî âûçîâà êîíñòðóêòîðà, ÿâëÿåòñÿ àâòîì
class tiny (* char v; int assign(int i) (*return v=(i amp;~63) ? (error(«îøèáêà äèàïàçîíà»)
nt i) (* assign(i); *) tiny(tiny amp; i) (* v = t.v; *) int operator=(tiny amp;
i) (* return v = t.v; *) int operator=(int i) (* return assign(i); *) operator i
nt() (* return v; *) *)
Äèàïàçîí çíà÷åíèÿ ïðîâåðÿåòñÿ âñåãäà, êîãäà tiny èíèöèëèçèðóåòñÿ int, è âñåãäà, êîãäà åìó ï
void main() (* tiny c1 = 2; tiny c2 = 62; tiny c3 = c2 c1; // c3 = 60 tiny c4 =
c3; // íåò ïðîâåðêè äèàïàçîíà (íåîáÿçàòåëüíà) int i = c1 + c2; // i = 64 c1 = c2 + 2 * c1;
Òèï âåêòîð èç tiny ìîæåò îêàçàòüñÿ áîëåå ïîëåçíûì, ïîêîëüêó îí ýêîíîìèò ïðîñòðàíñòâî. ×òîáû
Äðóãîå ïðèìåíåíèå îïðåäåëÿåìûõ îïåðàöèé ïðåîáðàçîâàíèÿ ýòî òèïû, êîòîðûå ïðåäîñòàâëÿþò íå
Ôóíêöèè ïðåîáðàçîâàíèÿ îêàçûâàþòñÿ îñîáåííî ïîëåçíûìè äëÿ ðàáîòû ñî ñòðóêòóðàìè äàííûõ, êîã
Òèïû istream è ostream îïèðàþòñÿ íà ôóíêöèþ ïðåîáðàçîâíèÿ, ÷òîáû ñäåëàòü âîçìîæíûìè òàêèå î
while (cin»»x) cout««x;
Äåéñòâèå ââîäà cin»»x âûøå âîçâðàùàåò istream amp;. Ýòî çí÷åíèå íåÿâíî ïðåîáðàçóåòñÿ ê çíà÷
6.3.3 Íåîäíîçíà÷íîñòè
Ïðèñâàèâàíèå îáúåêòó (èëè èíèöèàëèçàöèÿ îáúåêòà) êëàññà X ÿâëÿåòñÿ äîïóñòèìûì, åñëè èëè ïðè
class x (* /* ... */ x(int); x(char*); *); class y (* /* ... */ y(int); *); clas
s z (* /* ... */ z(x); *);
overload f; x f(x); y f(y);
z g(z);
f(1); // íåäîïóñòèìî: íåîäíîçíà÷íîñòü f(x(1)) èëè f(y(1)) f(x(1)); f(y(1)); g(«asdf»); // í
Îïðåäåëÿåìûå ïîëüçîâàòåëåì ïðåîáðàçîâàíèÿ ðàññìàòðèâàþñÿ òîëüêî â òîì ñëó÷àå, åñëè áåç íèõ
class x (* /* ... */ x(int); *) overload h(double), h(x); h(1);
Âûçîâ ìîã áû áûòü ïðîèíòåðïðåòèðîâàí èëè êàê h(double(1)), èëè êàê h(x(1)), è áûë áû íåäîïó
Ïðàâèëà ïðåîáðàçîâàíèÿ íå ÿâëÿþòñÿ íè ñàìûìè ïðîñòûìè äëÿ ðåàëèçàöèè è äîêóìåíòàöèè, íè íàè
Ñàìûé îáùèé ïîäõîä ó÷èòûâàë áû âñþ èìåþùóþñÿ èíôîðìàöèþ î òèïàõ è ðàññìàòðèâàë áû âñå âîçìî
6.4 Êîíñòàíòû
Êîíñòàíòû êëàññîâîãî òèïà îïðåäåëèòü íåâîçìîæíî â òîì ñìûñëå, â êàêîì 1.2 è 12e ÿâëÿþòñÿ êî
6.7 Èíäåêñèðîâàíèå
×òîáû çàäàòü ñìûñë èíäåêñîâ äëÿ îáúåêòîâ êëàññà, èñïîëçóåòñÿ ôóíêöèÿ operator[]. Âòîðîé ïàð
struct pair (* char* name; int val; *);
class assoc (* pair* vec; int max; int free; public: assoc(int); int amp; operat
or[](char*); void print_all(); *);
 assoc õðàíèòñÿ âåêòîð ïàð pair äëèíû max. Èíäåêñ ïåâîãî íåèñïîëüçîâàííîãî ýëåìåíòà âåêòîð
assoc::assoc(int s) (* max = (s«16) ? s : 16; free = 0; vec = new pair[max]; *)
Ïðè ðåàëèçàöèè ïðèìåíÿåòñÿ âñå òîò æå ïðîñòîé è íåýôôåòèâíûé ìåòîä ïîèñêà, ÷òî èñïîëüçîâàëñ
#include «string.h»
int assoc::operator[](char* p) /* ðàáîòà ñ ìíîæåñòâîì ïàð «pair»: ïîèñê p, âîçâðàò ññûëêè í
for (pp= amp;vec[free-1]; vec«=pp; pp ) if (strcmp(p,pp-»name)==0) return pp-»val;
if (free==max) (* // ïåðåïîëíåíèå: âåêòîð óâåëè÷èâàåòñÿ
pair* nvec = new pair[max*2]; for ( int i=0; i«max; i++) nvec[i] = vec[i]; delete
vec; vec = nvec; max = 2*max; *)
pp = amp;vec[free++]; pp-»name = new char[strlen(p)+1]; strcpy(pp-»name,p); pp-»val =
0; // íà÷àëüíîå çíà÷åíèå: 0 return pp-»val; *)
Ïîñêîëüêó ïðåäñòàâëåíèå assoc ñêðûòî, íàì íóæåí ñïîñîá åãî ïå÷àòè.  ñëåäóþùåì ðàçäåëå áóäå
vouid assoc::print_all() (* for (int i = 0; i«free; i++) cout « vec[i].name «« ": " «« vec
.val «« «\n ; *)
Ìû ìîæåì, íàêîíåö, íàïèñàòü ïðîñòóþ ãëàâíóþ ïðîãðàììó:
main() // ñ÷èòàåò âõîæäåíèÿ êàæäîãî ñëîâà âî ââîäå (* const MAX = 256; // áîëüøå ñàìîãî áîë
class assoc_iterator(* assoc* cs; // òåêóùèé ìàññèâ assoc int i; // òåêóùèé èíäåêñ public:
s; i = 0; *) pair* operator()() (* return (i«cs-»free)? amp;cs-»vec[i++] : 0; *) *);
Íàäî èíèöèàëèçèðîâàòü assoc_iterator äëÿ ìàññèâà assoc, ïîñëå ÷åãî îí áóäåò âîçâðàùàòü óêàç
main() // ñ÷èòàåò âõîæäåíèÿ êàæäîãî ñëîâà âî ââîäå (* const MAX = 256; // áîëüøå ñàìîãî áîë
( p = next() ) cout « p- name ": " «« p- val «« «\n ; *)
0 Èòåðàòîðíûé òèï âðîäå ýòîãî èìååò ïðåèìóùåñòâî ïåðåä íáîðîì ôóíêöèé, êîòîðûå âûïîëíÿþò òó
Êîíå÷íî, òàêîå ïðèìåíåíèå îáúåêòîâ äëÿ ïðåäñòàâëåíèÿ èòåðàòîðîâ íèêàê îñîáåííî ñ ïåðåãðóçêî
6.11 Ïðåäîñòåðåæåíèå
Êàê è áîëüøóþ ÷àñòü âîçìîæíîñòåé â ÿçûêàõ ïðîãðàììèðîâíèÿ, ïåðåãðóçêó îïåðàöèé ìîæíî èñïîëü
Èçëîæåííûé àïïàðàò äîëæåí óáåðå÷ü ïðîãðàììèñòà/÷èòàòåëÿ îò õóäøèõ êðàéíîñòåé ïðèìåíåíèÿ ïåð
Ìîæåò áûòü, ðàçóìíî ïðèìåíÿòü ïåðåãðóçêó îïåðàöèé ãëàâíûì îáðàçîì òàê, ÷òîáû ïîäðàæàòü îáùå
6.12 Óïðàæíåíèÿ
1. (*2) Îïðåäåëèòå èòåðàòîð äëÿ êëàññà string. Îïðåäåëèòå îïåðàöèþ êîíêàòåíàöèè + è îïåðàöè
2. (*1.5) Çàäàéòå ñ ïîìîùüþ ïåðåãðóçêè () îïåðàöèþ âûäåëíèÿ ïîäñòðîêè äëÿ êëàññà ñòðîê.
3. (*3) Ïîñòðîéòå êëàññ string òàê, ÷òîáû îïåðàöèÿ âûäåëíèÿ ïîäñòðîêè ìîãëà èñïîëüçîâàòüñÿ
4. (*2) Ïîñòðîéòå êëàññ string òàê, ÷òîáû äëÿ ïðèñâàèâàíèÿ, ïåðåäà÷è ïàðàìåòðîâ è ò.ï. îí è
5. (*3) Ìîäèôèöèðóéòå êëàññ string èç ïðåäûäóùåãî ïðèìåðà òàêèì îáðàçîì, ÷òîáû ñòðîêà êîïèð
6. (*4) Ðàçðàáîòàéòå êëàññ string ñ ñåìàíòèêîé ïî çíà÷åíèþ, êîïèðîâàíèåì ñ çàäåðæêîé è îïåð
7. (*2) Êàêèå ïðåîáðàçîâàíèÿ èñïîëüçóþòñÿ â êàæäîì âûðàæíèè ñëåäóþùåé ïðîãðàììû:
struct X (* int i; X(int); operator+(int); *);
struct Y (* int i; Y(X); operator+(X); operator int(); *);
X operator* (X,Y); int f(X);
X x = 1; Y y = x; int i = 2;
main() (* i + 10; y + 10; y + 10 * y; x + y + i; x * x + i; f(7); f(y); y + y; 1
06 + y; *)
Îïðåäåëèòå X è Y òàê, ÷òîáû îíè îáà áûëè öåëûìè òèïàìè. Èçìåíèòå ïðîãðàììó òàê, ÷òîáû îíà ð
8. (*2) Îïðåäåëèòå êëàññ INT, êîòîðûé âåäåò ñåáÿ â òî÷íîñòè êàê int. Ïîäñêàçêà: îïðåäåëèòå
9. (*1) Îïðåäåëèòå êëàññ RINT, êîòîðûé âåäåò ñåáÿ â òî÷íîòè êàê int çà èñêëþ÷åíèåì òîãî, ÷ò
10. (*3) Îïðåäåëèòå êëàññ LINT, âåäóùèé ñåáÿ êàê RINT, çà èñêëþ÷åíèåì òîãî, ÷òî èìååò òî÷íî
11. (*4) Îïðåäåëèòå êëàññ, êîòîðûé ðåàëèçóåò àðèôìåòèêó ñ ïðîèçâîëüíîé òî÷íîñòüþ. Ïîäñêàçêà
12. (*2) Íàïèøèòå ïðîãðàììó, äîâåäåííóþ äî íå÷èòàåìîãî ñîòîÿíèÿ ñ ïîìîùüþ ìàêðîñîâ è ïåðåãð
13. (*3) Ïîìåíÿéòåñü ñî ñâîèì äðóãîì ïðîãðàììàìè, êîòîðûå ó âàñ ïîëó÷èëèñü â ïðåäûäóùåì óïð
14. (*2) Ïåðåïèøèòå ïðèìåðû ñ comlpex (#6.3.1), tiny (#6.3.2) è string (#6.9) íå èñïîëüçóÿ
15. (*2) Îïðåäåëèòå òèï vec4 êàê âåêòîð èõ ÷åòûðåõ float. Îïðåäåëèòå operator[] äëÿ vec4. Î
16. (*3) Îïðåäåëèòå êëàññ mat4 êàê âåêòîð èç ÷åòûðåõ vec4. Îïðåäåëèòå äëÿ mat4 operator[],
17. (*2) Îïðåäåëèòå êëàññ vector, àíàëîãè÷íûé vec4, íî ñ äëèíîé, êîòîðàÿ çàäàåòñÿ êàê ïàðàì
18. (*3) Îïðåäåëèòå êëàññ matrix, àíàëîãè÷íûé mat4, íî ñ ðàçìåðíîñòüþ, çàäàâàåìîé ïàðàìåòðà
 ýòîé ãëàâå îïèñûâàåòñÿ ïîíÿòèå ïðîèçâîäíîãî êëàññà â Ñ ++. Ïðîèçâîäíûå êëàññû äàþò ïðîñòî
7.1 Ââåäåíèå
Ïðåäñòàâèì ñåáå ïðîöåññ íàïèñàíèÿ íåêîòîðîãî óíèâåðñàëíîãî ñðåäñòâà (íàïðèìåð, òèï ñâÿçàííû
Ïðè÷èíà ýòîãî õàîñà ÷àñòè÷íî ñîñòîèò â òîì, ÷òî ïðåäñòâèòü òàêèå îáùèå ïîíÿòèÿ â ÿçûêå ïðîã
Íàïèñàíèå îáùåöåëåâûõ ñðåäñòâ çàäà÷à íåïðîñòàÿ, è ÷àòî îñíîâíîé àêöåíò â èõ ðàçðàáîòêå äð
Ïîñêîëüêó ìåíåäæåð ÿâëÿåòñÿ ñëóæàùèì, manager* ìîæåò èïîëüçîâàòüñÿ êàê employee*. Îäíàêî ñë
7.2.2 Ôóíêöèè ×ëåíû
Ïðîñòî ñòðóêòóðû äàííûõ âðîäå employee è manager íà ñìîì äåëå íå ñòîëü èíòåðåñíû è ÷àñòî íå
class employee (* char* name; // ... public: employee* next; void print(); // ..
. *);
class manager : public employee (* // ... public: void print(); // ... *);
Íàäî îòâåòèòü íà íåêîòîðûå âîïðîñû. Êàê ìîæåò ôóíêöèÿ ÷ëåí ïðîèçâîäíîãî êëàññà manager èñïî
Ðàññìîòðèì:
void manager::print() (* cout « " èìÿ " «« name «« «\n ; // ... *)
×ëåí ïðîèçâîäíîãî êëàññà ìîæåò èñïîëüçîâàòü îòêðûòîå èìÿ èç ñâîåãî áàçîâîãî êëàññà òàê æå,
Ýòî ìíîãèì ïîêàæåòñÿ óäèâèòåëüíûì, íî ïðåäñòàâüòå ñåáå äðóãîé âàðèàíò: ÷òî ôóíêöèÿ ÷ëåí ìîã
Ñ äðóãîé ñòîðîíû, ìîæíî âåäü èñïîëüçîâàòü ìåõàíèçì friend, ÷òîáû ïðåäîñòàâèòü òàêîé äîñòóï
class employee (* friend void manager::print(); // ... *);
ðåøèëî áû ïðîáëåìó ñ manager::print(), è
class employee (* friend class manager; // ... *);
ñäåëàëî áû äîñòóïíûì êàæäûé ÷ëåí employee äëÿ âñåõ ôóíöèé êëàññà manager.  ÷àñòíîñòè, ýòî
Äðóãîå, èíîãäà áîëåå ïðîçðà÷íîå ðåøåíèå äëÿ ïðîèçâîäíîãî êëàññà èñïîëüçîâàòü òîëüêî îòêðû
void manager::print() (* employee::print(); // ïå÷àòàåò èíôîðìàöèþ î ñëóæàùåì // ... // ïå÷
Çàìåòüòå, ÷òî íàäî èñïîëüçîâàòü ::, ïîòîìó ÷òî print() áûëà ïåðåîïðåäåëåíà â manager. Òàêîå
void manager::print() (* print(); // ïå÷àòàåò èíôîðìàöèþ î ñëóæàùåì // ... // ïå÷àòàåò èíôî
è îáíàðóæèòü, ÷òî ïðîãðàììà ïîñëå âûçîâà manager::print() íåîæèäàííî ïîïàäàåò â ïîñëåäîâàòå
7.2.3 Âèäèìîñòü
Êëàññ employee ñòàë îòêðûòûì (public) áàçîâûì êëàññîì êëàññà manager â ðåçóëüòàòå îïèñàíèÿ:
class manager : public employee (* // ... *);
Ýòî îçíà÷àåò, ÷òî îòêðûòûé ÷ëåí êëàññà employee ÿâëÿåòñÿ òàêæå è îòêðûòûì ÷ëåíîì êëàññà man
void clear(manager* p) (* p-»next = 0; *)
áóäåò êîìïèëèðîâàòüñÿ, òàê êàê next îòêðûòûé ÷ëåí è employee è manager'à. Àëüòåðíàòèâà
7.2.4 Óêàçàòåëè
Åñëè ïðîèçâîäíûé êëàññ derived èìååò îòêðûòûé áàçîâûé êëàññ base, òî óêàçàòåëü íà derived ì
class base (* /* ... */ *); class derived : public base (* /* ... */ *);
derived m; base* pb = amp;m; // íåÿâíîå ïðåîáðàçîâàíèå derived* pd = pb; // îøèáêà: base* í
Èíà÷å ãîâîðÿ, îáúåêò ïðîèçâîäíîãî êëàññà ïðè ðàáîòå ñ íèì ÷åðåç óêàçàòåëü è ìîæíî ðàññìàòðè
Áóäü base çàêðûòûì áàçîâûì êëàññîì êëàññà derived, íåÿíîå ïðåîáðàçîâàíèå derived* â base* í
class base (* int m1; public: int m2; // m2 îòêðûòûé ÷ëåí base *);
class derived : base (* // m2 ÍÅ îòêðûòûé ÷ëåí derived *);
derived d; d.m2 = 2; // îøèáêà: m2 èç çàêðûòîé ÷àñòè êëàññà base* pb = amp;d; // îøèáêà: (ç
Ïîìèìî âñåãî ïðî÷åãî, ýòîò ïðèìåð ïîêàçûâàåò, ÷òî èïîëüçóÿ ÿâíîå ïðèâåäåíèå ê òèïó ìîæíî ñë
Îáúåêòû êëàññà êîíñòðóèðóþòñÿ ñíèçó ââåðõ: ñíà÷àëà áàçâûé, ïîòîì ÷ëåíû, à ïîòîì ñàì ïðîèçâî
7.3.1 Èíòåðôåéñ
Ðàññìîòðèì òàêîå íàïèñàíèå êëàññà slist äëÿ îäíîêðàòíî ñâÿçàííîãî ñïèñêà, ñ ïîìîùüþ êîòîðîã
typedef void* ent;
Òî÷íàÿ ñóùíîñòü òèïà ent íåñóùåñòâåííà, íî íóæíî, ÷òîáû â íåì ìîã õðàíèòüñÿ óêàçàòåëü. Òîãä
class slink (* friend class slist; friend class slist_iterator; slink* next; ent
e; slink(ent a, slink* p) (* e=a; next=p;*) *);
 îäíîì çâåíå ìîæåò õðàíèòüñÿ îäèí ent, è ñ ïîìîùüþ íåãî ðåàëèçóåòñÿ êëàññ slist:
class slist (* friend class slist_iterator; slink* last; // last-»next ãîëîâà ñïèñêà publ
t a); // äîáàâèòü â ãîëîâó ñïèñêà int append(ent a); // äîáàâèòü â õâîñò ñïèñêà ent get();
slist() (* last=0; *) slist(ent a) (* last=new slink(a,0); last-»next=last; *) ~sl
ist() (* clear(); *)
*);
Õîòÿ ñïèñîê î÷åâèäíûì îáðàçîì ðåàëèçóåòñÿ êàê ñâÿçàííûé ñïèñîê, ðåàëèçàöèþ ìîæíî èçìåíèòü ò
7.3.2 Ðåàëèçàöèÿ
Ðåàëèçóþùèå slist ôóíêöèè â îñíîâíîì ïðîñòû. Åäèíñòâåíàÿ íàñòîÿùàÿ ñëîæíîñòü ÷òî äåëàòü â
int slist::insert(ent a) (* if (last) last-»next = new slink(a,last-»next); else (*
last = new slink(a,0); last-»next = last; *) return 0; *)
int slist::append(ent a) (* if (last) last = last-»next = new slink(a,last-»next); e
lse (* last = new slink(a,0); last-»next = last; *) return 0; *)
ent slist::get() (* if (last == 0) slist_handler(«get fromempty list»); // âçÿòü èç ïóñòîãî
r f-»e; if (f == last) last = 0; else last-»next = f-»next; delete f; return f; *)
Îáðàòèòå âíèìàíèå, êàê âûçûâàåòñÿ slist_handler (åãî îïèñàíèå ìîæíî íàéòè â #7.3.4). Ýòîò ó
(*slist_handler)(«get fromempty list»);
È slist::clear(), íàêîíåö, óäàëÿåò èç ñïèñêà âñå ýëåìåíòû:
void slist::clear() (* slink* l = last;
if (l == 0) return; do (* slink* ll = l; l = l-»next; delete ll; *) while (l!=last
); *)
Êëàññ slist íå îáåñïå÷èâàåò ñïîñîáà çàãëÿíóòü â ñïèñîê, íî òîëüêî ñðåäñòâà äëÿ âñòàâëåíèÿ è
class slist_iterator (* slink* ce; slist* cs; public: slist_iterator(slist amp;
s) (* cs = amp;s; ce = cs-»last; *)
ent operator()() (* // äëÿ èíäèêàöèè êîíöà èòåðàöèè âîçâðàùàåò 0 // äëÿ âñåõ òèïîâ íå èäåàë
#include «stream.h»
struct base (* base(); *);
struct derived : base (* derived(); *)
base::base() (* cout « \tbase 1: this= int(this) «« «\n ; if (this == 0) this = (base
t «« «\tbase 2: this= «« int(this) «« «\n ; *)
derived::derived() (* cout « \tderived 1: this= int(this) «« «\n ; this = (this == 0)
ed*)43 : this; cout «« «\tderived 2: this= «« int(this) «« «\n ; *)
main() (* cout « base b;\n ; base b; cout new base b;\n ; new base; cout «« «derived
d d; cout «« «new derived d;\n ; new derived; cout «« «at the end\n ;
*)
ïîðîæäàåò âûâîä
base b; base 1: this=2147478307 base 2: this=2147478307 new base; base 1: this=0
base 2: this=27 derived d; derived 1: this=2147478306 base 1: this=2147478306 b
ase 2: this=2147478306 derived 1: this=2147478306 new derived; derived 1: this=0
base 1: this=43 base 2: this=43 derived 1: this=43 at the end
Åñëè äåñòðóêòîð ïðîèçâîäíîãî êëàññà îñóùåñòâëÿåò ïðèñâèâàíèå óêàçàòåëþ this, òî áóäåò ïðèñâ
* Ê ñîæàëåíèþ, îá ýòîì ïðèñâàèâàíèè ëåãêî çàáûòü. Íàïðìåð, â ïåðâîì èçäàíèè ýòîé êíèãè (à
7.8 Óïðàæíåíèÿ
1. (*1) Îïðåäåëèòå
class base (* public: virtual void iam() (* cout « «base\n ; *) *);
Âûâåäèòå èç base äâà êëàññà è äëÿ êàæäîãî îïðåäåëèòå iam () («ÿ åñòü»), êîòîðàÿ âûâîäèò èìÿ
2. (*2) Ðåàëèçóéòå ïðèìèòèâû ýêðàíà (#7.6.1) ïîäõîäÿùèì äëÿ âàøåé ñèñòåìû îáðàçîì.
3. (*2) Îïðåäåëèòå êëàññ triangle (òðåóãîëüíèê) è êëàññ circle (êðóã).
4. (*2) Îïðåäåëèòå ôóíêöèþ, êîòîðàÿ ðèñóåò ëèíèþ, ñîåäèíÿùóþ äâå ôèãóðû, îòûñêèâàÿ äâå áëèæ
5. (*2) Ìîäèôèöèðóéòå ïðèìåð ñ ôèãóðàìè òàê, ÷òîáû line áëà rectangle è íàîáîðîò.
6. (*2) Ïðèäóìàéòå è ðåàëèçóéòå äâàæäû ñâÿçàííûé ñïèñîê, êîòîðûé ìîæíî èñïîëüçîâàòü áåç èòå
7. (*2) Ïðèäóìàéòå è ðåàëèçóéòå äâàæäû ñâÿçàííûé ñïèñîê, êîòîðûì ìîæíî ïîëüçîâàòüñÿ òîëüêî
8. (*2) Ïîñòðîéòå îáîáùåííûé âàðèàíò äâàæäû ñâÿçàííîãî ñïèñêà.
9. (*4) Ñäåëàéòå ñïèñîê, â êîòîðîì âñòàâëÿþòñÿ è óäàëÿþòñÿ ñàìè îáúåêòû (à íå ïðîñòî óêàçàò
10. (*5) Ïðèäóìàéòå è ðåàëèçóéòå áèáëèîòåêó äëÿ íàïèñàíèÿ ìîäåëåé, óïðàâëÿåìûõ ïðåðûâàíèÿìè
Ãëàâà 8 Ïîòîêè
``bad input char: .Ppm(*=P!..*@Z9A*)5!!!!!"syui!!!"!Mp#V6P?p8`;!4lf amp;
ñîîáùåíèå îá îøèáêå (ñîêðàùåííîå)
ßçûê Ñ++ íå îáåñïå÷èâàåò ñðåäñòâ äëÿ ââîäà/âûâîäà. Åìó ýòî è íå íóæíî. Òàêèå ñðåäñòâà ëåãêî
8.1 Ââåäåíèå
Ðàçðàáîòêà è ðåàëèçàöèÿ ñòàíäàðòíûõ ñðåäñòâ ââîäà/âûâîäà äëÿ ÿçûêà ïðîãðàììèðîâàíèÿ çàðåêîì
Ñ++ ðàçðàáîòàí òàê, ÷òîáû ó ïîëüçîâàòåëÿ áûëà âîçìîíîñòü îïðåäåëÿòü íîâûå òèïû ñòîëü æå ýôô
Ñðåäñòâà ââîäà/âûâîäà «stream.h» ñâÿçàíû èñêëþ÷èòåëüíî ñ îáðàáîòêîé ïðåîáðàçîâàíèÿ òèïèçèðî
Îáðàáîòêà è âñòðîåííûõ è îïðåäåëÿåìûõ ïîëüçîâàòåëåì òïîâ îäíîðîäíûì îáðàçîì è ñ ãàðàíòèåé ò
put(cerr,"x = «); // cerr ïîòîê âûâîäà îøèáîê put(cerr,x); put(cerr,»\n");
Òèï ïàðàìåòðà îïðåäåëÿåò òî, êàêàÿ èç ôóíêöèé put áóäåò âûçûâàòüñÿ äëÿ êàæäîãî ïàðàìåòðà. Ý
çàïèñü è ïîçâîëÿåò ïðîãðàììèñòó âûâîäèòü ðÿä îáúåêòîâ îäíèì îïåðàòîðîì. Íàïðèìåð:
cerr « "x = " «« x «« «\n ;
ãäå cerr ñòàíäàðòíûé ïîòîê âûâîäà îøèáîê. Ïîýòîìó, åëè x ÿâëÿåòñÿ int ñî çíà÷åíèåì 123, ò
x = 123
è ñèìâîë íîâîé ñòðîêè. Àíàëîãè÷íî, åñëè X ïðèíàäëåæèò îïðåäåëåííîìó ïîëüçîâàòåëåì òèïó comp
x = (1,2.4)
Ýòîò ìåòîä ìîæíî ïðèìåíÿòü âñåãäà, êîãäà äëÿ x îïðåäåëíà îïåðàöèÿ ««, è ïîëüçîâàòåëü ìîæåò
8.2 Âûâîä
 ýòîì ðàçäåëå ñíà÷àëà îáñóæäàþòñÿ ñðåäñòâà ôîðìàòíîãî è áåñôîðìàòíîãî âûâîäà âñòðîåííûõ òè
class circle : public shape (* int radius; public: // ... void draw(ostream amp;
); *);
Òî åñòü, êðóã èìååò âñå ïðèçíàêè ôèãóðû è ìîæåò îáðàáòûâàòüñÿ êàê ôèãóðà, íî èìååò òàêæå è
×òîáû ïîääåðæèâàòü äëÿ òàêèõ êëàññîâ ñòàíäàðòíóþ ïàðäèãìó âûâîäà, îïåðàöèÿ «« îïðåäåëÿåòñÿ
ostream amp; operator« (ostream amp; s, shape* p) (* p- draw(s); return s; *)
Åñëè next èòåðàòîð òèïà îïðåäåëåííîãî â #7.3.3, òî ñïèñîê ôèãóð ðàñïå÷àòûâàåòñÿ íàïðèìåð
while ( p = next() ) cout «« p;
Ïðîïóñê îïðåäåëÿåòñÿ êàê ñòàíäàðòí÷é ïðîïóñê â C, ÷åðåç âûçîâ isspase() â òîì âèäå, êàê îíà
 êà÷åñòâå àëüòåðíàòèâû ìîæíî èñïîëüçîâàòü ôóíêöèè get():
class istream (* // ... istream amp; get(char amp; c); // char istream amp; get(
char* p, int n, int ='\n'); // ñòðîêà *);
Îíè îáðàáàòûâàþò ñèìâîëû ïðîïóñêà òàê æå, êàê îñòàëüíûå ñèìâîëû. Ôóíêöèÿ istream::get(char)
cin.get(buf,256,'\t');
áóäåò ÷èòàòü â buf íå áîëåå 256 ñèìâîëîâ, à åñëè âñòðòèòñÿ òàáóëÿöèÿ ('\t'), òî ýòî ïðèâåäå
Ñòàíäàðòíûé çàãîëîâî÷íûé ôàéë «ctype.h» îïðåäåëÿåò íåêîëüêî ôóíêöèé, êîòîðûå ìîãóò îêàçàòüñ
int isalpha(char) // 'a'..'z' 'A'..'Z' int isupper(char) // 'A'..'Z' int islower
(char) // 'a'..'z' int isdigit(char) // '0'..'9' int isxdigit(char) // '0'..'9'
'a'..'f' 'A'..'F' int isspase(char) // ' ' '\t' âîçâðàò íîâàÿ ñòðîêà // ïåðåâîä ôîðìàòà int
it() int isprint(char) // ïå÷àòàåìûé: ascii ' '..'-' int isgraph(char) // isalpha() ! isdig
punct() int isascii(char c) (* return 0«=c amp; amp; c«=127; *)
Âñå êðîìå isascii() ðåàëèçóþòñÿ âíåøíå îäèíàêîâî, ñ ïðìåíåíèåì ñèìâîëà â êà÷åñòâå èíäåêñà â
(('a'«=c amp; amp; c«='z') !! ('A'«=c amp; amp; c«='Z')) // àëôàâèòíûé
íå òîëüêî óòîìèòåëüíî ïèøóòñÿ è ÷ðåâàòû îøèáêàìè (íà ìøèíå ñ íàáîðîì ñèìâîëîâ EBCDIC îíî áó
isalpha(c)
void word_per_line(char v[], int sz) /* ïå÷àòåò "v" ðàçìåðà «sz» ïî îäíîìó ñëîâó íà ñòðîêå
Çàâåðøàþùèé íóëåâîé ñèìâîë â ýòîì ñëó÷àå èíòåðïðåòèðóåñÿ êàê ñèìâîë êîíöà ôàéëà.
 ïîìîùüþ ostream ìîæíî îòôîðìàòèðîâàòü ñîîáùåíèÿ, êîòðûå íå íóæíî ïå÷àòàòü òîò÷àñ æå:
char* p = new char[message_size]; ostream ost(message_size,p); do_something(argu
ments,ost); display(p);
Òàêàÿ îïåðàöèÿ, êàê do_something, ìîæåò ïèñàòü â ïîòîê ost, ïåðåäàâàòü ost ñâîèì ïîäîïåðàöè
8.6 Áóôåðèçàöèÿ
Ïðè çàäàíèè îïåðàöèé ââîäà/âûâîäà ìû íèêàê íå êàñàëèñü òèïîâ ôàéëîâ, íî âåäü íå âñå óñòðîéñ
struct streambuf (* // óïðàâëåíèå áóôåðîì ïîòîêà
char* base; // íà÷àëî áóôåðà char* pptr; // ñëåäóþùèé ñâîáîäíûé char char* qptr; // ñëåäóþù
// Îïóñòîøàåò áóôåð: // Âîçâðàùàåò EOF ïðè îøèáêå è 0 â ñëó÷àå óñïåõà virtual int overflow(
// Çàïîëíÿåò áóôåð
// Âîçâðàùåò EOF ïðè îøèáêå èëè êîíöå ââîäà, // èíà÷å ñëåäóþùèé char virtual int underflow(
int snextc() // áåðåò ñëåäóþùèé char (* return (++qptr==pptr) ? underflow() : *qptr amp;037
// ...
int allocate() //âûäåëÿåò íåêîòîðîå ïðîñòðàíñòâî áóôåðà
streambuf() (* /* ... */*) streambuf(char* p, int l) (* /* ... */*) ~streambuf()
(* /* ... */*) *);
Îáðàòèòå âíèìàíèå, ÷òî çäåñü îïðåäåëÿþòñÿ óêàçàòåëè, íîáõîäèìûå äëÿ ðàáîòû ñ áóôåðîì, ïîýòî
struct filebuf : public streambuf (*
int fd; // äåñêðèïòîð ôàéëà char opened; // ôàéë îòêðûò
int overflow(int c =EOF); int underflow();
// ...
// Îòêðûâàåò ôàéë: // åñëè íå ñðàáàòûâàåò, òî âîçâðàùåò 0, // â ñëó÷àå óñïåõà âîçâðàùàåò «t
filebuf() (* opened = 0; *) filebuf(int nfd) (* /* ... */ *) filebuf(int nfd, ch
ar* p, int l) : (p,l) (* /*...*/ *) ~filebuf() (* close(); *) *);
int filebuf::underflow() // çàïîëíÿåò áóôåð èç fd (* if (!opened !! allocate()==EOF) return
int count = read(fd, base, eptr-base); if (count « 1) return EOF;
qptr = base; pptr = base + count; return *qptr amp; 0377; *)
8.7 Ýôôåêòèâíîñòü
Ìîæíî áûëî áû îæèäàòü, ÷òî ðàç ââîä/âûâîä «stream.h» îïðåäåëåí ñ ïîìîùüþ îáùåäîñòóïíûõ ñðåä
Äëÿ ïðîñòûõ îáúåêòîâ (öåëîå, ñòðîêà è ò.ï.) òðåáóåòñÿ ïî îíîìó âûçîâó íà êàæäûé. Êàê âûÿñíÿ
8.8 Óïðàæíåíèÿ
1. (*1.5) Ñ÷èòàéòå ôàéë ÷èñåë ñ ïëàâàþùåé òî÷êîé, ñîñòàâüòå èç ïàð ñ÷èòàííûõ ÷èñåë êîìïëåêñ
2. (*1.5) Îïðåäåëèòå òèï name_and_address (èìÿ_è_àäðåñ). Îïðåäåëèòå äëÿ íåãî « è ». Ñêîïè
3. (*2) Ïîñòðîéòå íåñêîëüêî ôóíêöèé äëÿ çàïðîñà è ÷òåíèÿ ðàçëè÷íîãî âèäà èíôîðìàöèè. Ïðîñòå
4. (*1.5) Íàïèøèòå ïðîãðàììó, êîòîðàÿ ïå÷àòàåò (1) âñå áóâû â íèæíåì ðåãèñòðå, (2) âñå áóêâ
5. (*4) Ðåàëèçóéòå ñòàíäàðòíóþ áèáëèîòåêó ââîäà/âûâîäà C («stdio.h») ñ ïîìîùüþ ñòàíäàðòíîé
6. (*4) Ðåàëèçóéòå ñòàíäàðòíóþ áèáëèîòåêó ââîäà/âûâîäà Ñ++ («stream.h») ñ ïîìîùüþ ñòàíäàðòí
7. (*4) Ðåàëèçóéòå ñòàíäàðòíûå áèáëèîòåêè C è Ñ++ òàê, ÷òáû îíè ìîãëè èñïîëüçîâàòüñÿ îäíîâð
8. (*2) Ðåàëèçóéòå êëàññ, äëÿ êîòîðîãî [] ïåðåãðóæåíî äëÿ ðåàëèçàöèè ñëó÷àéíîãî ÷òåíèÿ ñèìâ
9. (*3) Êàê Óïðàæíåíèå 8, òîëüêî ñäåëàéòå, ÷òîáû [] ðàáîòëî è äëÿ ÷òåíèÿ, è äëÿ çàïèñè. Ïîä
10. (*2) Êàê Óïðàæíåíèå 9, òîëüêî ðàçðåøèòå [] èíäåêñèðîâàòü çàïèñè íåêîòîðîãî âèäà, à íå ñ
11. (*3) Ñäåëàéòå îáîáùåííûé âàðèàíò êëàññà, îïðåäåëåííîãî â Óïðàæíåíèè 10.
12. (*3.5) Ðàçðàáîòàéòå è ðåàëèçóéòå îïåðàöèþ ââîäà ïî ñïîñòàâëåíèþ ñ îáðàçöîì. Äëÿ ñïåöèôè
13. (*4) Ïðèäóìàéòå (è ðåàëèçóéòå) âèä îáðàçöîâ, êîòîðûå íàìíîãî ëó÷øå.
Ñïðàâî÷íîå Ðóêîâîäñòâî
1. Ââåäåíèå
ßçûê ïðîãðàììèðîâàíèÿ Ñ++ ýòî C*, ðàñøèðåííûé ââåäåíåì êëàññîâ, inline-ôóíêöèé, ïåðåãðóæå
* «ßçûê ïðîãðàììèðîâàíèÿ Ñè» Áðàéýíà Â. Êåðíèãàíà è Äåíèñà Ì. Ðèò÷è. Ýòî ðóêîâîäñòâî áûëî
2. Äîãîâîðåííîñòè î Ëåêñèêå
Åñòü øåñòü êëàññîâ ëåêñåì: èäåíòèôèêàòîðû, êëþ÷åâûå ñëâà, êîíñòàíòû, ñòðîêè, îïåðàòîðû è ïð
Åñëè âõîäíîé ïîòîê ðàçîáðàí íà ëåêñåìû äî äàííîãî ñèìâëà, ïðèíèìàåòñÿ, ÷òî ñëåäóþùàÿ ëåêñåì
2.1 Êîììåíòàðèè
Ñèìâîëû /* çàäàþò íà÷àëî êîììåíòàðèÿ, çàêàí÷èâàþùåãîñÿ ñèìâîëàìè */. Êîììåíòàðèè íå ìîãóò á
2.4 Êîíñòàíòû
Êàê îïèñàíî íèæå, åñòü íåñêîëüêî âèäîâ êîíñòàíò. Â #2.6 ïðèâîäèòñÿ êðàòêàÿ ñâîäêà àïïàðàòíû
2.5 Ñòðîêè
Ñòðîêà åñòü ïîñëåäîâàòåëüíîñòü ñèìâîëîâ, çàêëþ÷åííàÿ â äâîéíûå êàâû÷êè: «...». Ñòðîêà èìååò
3. Çàïèñü Ñèíòàêñèñà
Ïî èñïîëüçóåìûì â äàííîì ðóêîâîäñòâå ñèíòàêñè÷åñêèì ïðâèëàì çàïèñè ñèíòàêñè÷åñêèå êàòåãîðèè
(* âûðàæåíèå opt *)
óêàçûâàåò íà íåîáÿçàòåëüíîñòü âûðàæåíèÿ â ôèãóðíûõ ñêîêàõ. Ñèíòàêñèñ êðàòêî èçëîæåí â #14.
4. Èìåíà è Òèïû
Èìÿ îáîçíà÷àåò(äåíîòèðóåò) îáúåêò, ôóíêöèþ, òèï, çíà÷íèå èëè ìåòêó. Èìÿ ââîäèòñÿ â ïðîãðàìì
4.3 Êîìïîíîâêà
Èìÿ â ôàéëîâîé îáëàñòè âèäèìîñòè, íå îïèñàííîå ÿâíî êàê static, ÿâëÿåòñÿ îáùèì äëÿ êàæäîãî
Òèïû, ñïåöèôèöèðîâàííûå âî âñåõ îïèñàíèÿõ âíåøíåãî èìåíè äîëæíû áûòü èäåíòè÷íû. Ìîæåò áûòü
Ðåàëèçàöèÿ ìîæåò ïîòðåáîâàòü, ÷òîáû ñîñòàâíîå const, èïîëüçîâàííîå òàì, ãäå íå âñðå÷åíî íèê
6.5 Unsigned
Âñåãäà ïðè ñî÷åòàíèè öåëîãî áåç çíàêà è îáû÷íîãî öåëîãî îáû÷íîå öåëîå ïðåîáðàçóåòñÿ ê òèïó
Ïðè ïðåîáðàçîâàíèè öåëîãî áåç çíàêà â äëèííîå çíà÷åíèå ðåçóëüòàòà ÷èñëåííî ñîâïàäàåò ñî çíà
6.6 Àðèôìåòè÷åñêèå Ïðåîáðàçîâàíèÿ
Áîëüøîå êîëè÷åñòâî îïåðàöèé âûçûâàþò ïðåîáðàçîâàíèÿ è äàþò òèï ðåçóëüòàòà îäèíàêîâûì îáðàçî
Âî-ïåðâûõ, ëþáûå îïåðàíäû òèïà char, unsigned char èëè short ïðåîáðàçóþòñÿ ê òèïó int.
Äàëåå, åñëè îäèí èç îïåðàíäîâ èìååò òèï double, òî äðãîé ïðåîáðàçóåòñÿ ê òèïó double è òîò
Èíà÷å, åñëè îäèí èç îïåðàíäîâ èìååò òèï unsigned long, òî äðóãîé ïðåîáðàçóåòñÿ ê òèïó unsig
Èíà÷å, åñëè îäèí èç îïåðàíäîâ èìååò òèï long, òî äðóãîé ïðåîáðàçóåòñÿ ê òèïó long è òàêîâ æ
Èíà÷å, åñëè îäèí èç îïåðàíäîâ èìååò òèï unsigned, òî äðóãîé ïðåîáðàçóåòñÿ ê òèïó unsigned è
Èíà÷å îáà îïåðàíäà äîëæíû èìåòü òèï int è òàêîâ æå òèï ðåçóëüòàòà.
7. Âûðàæåíèÿ
Ïðèîðèòåò îïåðàöèé â âûðàæåíÿõ òàêîé æå, êàê è ïîðÿäîê ãëàâíûõ ïîäðàçäåëîâ â ýòîì ðàçäåëå,
 îñòàëüíûõ ñëó÷àÿõ ïîðÿäîê âû÷èñëåíèÿ âûðàæåíèÿ íåîïðäåëåí. Òî÷íåå, êîìïèëÿòîð âîëåí âû÷èñ
ïîðÿäêå, êîòîðûé îí ñ÷èòàåò áîëåå ýôôåêòèâíûì, äàæå åñëè ïîâûðàæåíèÿ âûçûâàþò ïîáî÷íûå ýôôå
Îáðàáîòêà ïåðåïîëíåíèÿ è êîíòðîëü äåëåíèÿ ïðè âû÷èñëåíèè âûðàæåíèÿ ìàøèííî çàâèñèìû.  áîëü
Êðîìå ñòàíäàðòíîãî çíà÷åíèÿ, îïèñàííîãî â #7.2-7.15, îïåðàöèè ìîãóò áûòü ïåðåãðóæåíû*, òî å
* Ýòîò òåðìèí ïðèìåíÿåòñÿ äëÿ îïèñàíèÿ èñïîëüçîâàíèÿ â ÿçûêå îäíîé è òîé æå ëåêñåìû äëÿ î
7.2.2 Sizeof
Îïåðàöèÿ sizeof äàåò ðàçìåð îïåðàíäà â áàéòàõ. (Áàéò íå îïðåäåëÿåòñÿ ÿçûêîì èíà÷å, ÷åì ÷åðå
Îïåðàöèþ sizeof ìîæíî òàêæå ïðèìåíÿòü ê çàêëþ÷åííîìó â ñêîáêè èìåíè òèïà.  ýòîì ñëó÷àå îíà
8. Îïèñàíèÿ
Îïèñàíèÿ èñïîëüçóþòñÿ äëÿ îïðåäåëåíèÿ èíòåðïðåòàöèè, äâàåìîé êàæäîìó èäåíòèôèêàòîðó. Îíè íå
îïèñàíèå: ñïåöèôèêàòîðû_îïèñàíèÿ opt ñïèñîê_îïèñàòåëåé opt ; îïèñàíèå_èìåíè asm_îïèñàíèå
Îïèñàòåëè â ñïèñêå_îïèñàòåëåé ñîäåðæàò èäåíòèôèêàòîðû, ïîäëåæàùèå îïèñàíèþ. Ñïåöèôèêàòîðû_î
ñïåöèôèêàòîð_îïèñàíèÿ: ñïåöèôèêàòîð_êëàññà_ïàìÿòè ñïåöèôèêàòîð_òèïà ñïåöèôèêàòîð_ôóíêöèè fr
ñïåöèôèêàòîðû_îïèñàíèÿ: ñïåöèôèêàòîð_îïèñàíèÿ ñïåöèôèêàòîð_îïèñàíèÿ opt
Ñïèñîê äîëæåí áûòü âíóòðåííå íåïðîòèâîðå÷èâ â îïèñûâàìîì íèæå ñìûñëå.
8.3 Îïèñàòåëè
Ñïèñîê_îïèñàòåëåé, ïîÿâëÿþùèéñÿ â îïèñàíèè, åñòü ðàçäëåííàÿ çàïÿòûìè ïîñëåäîâàòåëüíîñòü îïè
ñïèñîê_îïèñàòåëåé: èíèö_îïèñàòåëü èíèö_îïèñàòåëü , ñïèñîê_îïèñàòåëåé
èíèö_îïèñàòåëü:
îïèñàòåëü èíèöèàëèçàòîð opt
Èíèöèàëèçàòîðû îáñóæäàþòñÿ â #8.6. Ñïåöèôèêàòîð â îïèñíèè óêàçûâàåò òèï è êëàññ ïàìÿòè îáúå
îïèñàòåëü: îï_èìÿ ( îïèñàòåëü ) * const opt îïèñàòåëü amp; const opt îïèñàòåëü îïèñàòåëü (
îï-èìÿ: ïðîñòîå_îï_èìÿ typedef-èìÿ :: ïðîñòîå_îï_èìÿ
ïðîñòîå_îï_èìÿ: èäåíòèôèêàòîð typedef-èìÿ ~ typedef-èìÿ èìÿ_ôóíêöèè_îïåðàöèè èìÿ_ôóíêöèè_ïð
Ãðóïïèðîâêà òà æå, ÷òî è â âûðàæåíèÿõ.
8.4.1 Ïðèìåðû
Îïèñàíèå
int i; int *pi; int f (); int *fpi (); int (*pif) ();
îïèñûâàåò öåëîå i, óêàçàòåëü pi íà öåëîå, ôóíêöèþ f, âîçâðàùàþùóþ öåëîå, ôóíêöèþ fpi , âîçâ
Îïèñàíèå
const a = 10, *pc = amp;a, *const cpc = pc; int b, *const cp = amp;b;
îïèñûâàåò a: öåëóþ êîíñòàíòó, pc: óêàçàòåëü íà öåëóþ êîíñòàíòó, cpc: êîíñòàíòíûé óêàçàòåëü
a = 1; a++; *pc = 2; cp = amp;a; cpc++;
Ïðèìåðû äîïóñòèìûõ âûðàæåíèé:
b = a; *cp = a; pc++; pc = cpc; Îïèñàíèå
fseek (FILE*,long,int);
îïèñûâàåò ôóíêöèþ, ïîëó÷àþùóþ òðè ïàðàìåòðà óêàçàííûõ òèïîâ. Ïîñêîëüêó òèï âîçâðàùàåìîãî çí
point (int = 0,int = 0);
îïèñûâàåò ôóíêöèþ, êîòîðàÿ ìîæåò âûçûâàòüñÿ áåç ïàðàìåðîâ, ñ îäíèì èëè ñ äâóìÿ ïàðàìåòðàìè
point (1,2); point (1); point ();
Îïèñàíèå
printf (char* ... );
îïèñûâàåò ôóíêöèþ, êîòîðàÿ ìîæåò âûçûâàòüñÿ ñ ðàçëè÷íûìè ÷èñëîì è òèïàìè ïàðàìåòðîâ. Íàïðèì
printf («hello, world»); printf («a=%d b=%d»,a,b);
Îäíàêî, âñåãäà åå ïåðâûì ïàðàìåòðîì äîëæåí áûòü char*.
Îïèñàíèå
float fa[17], *afp[17];
îïèñûâàåò ìàññèâ ÷èñåë ñ ïëàâàþùåé òî÷êîé è ìàññèâ óêçàòåëåé íà ÷èñëà ñ ïëàâàþùåé òî÷êîé. È
static int x3d[3][5][7];
îïèñûâàåò ìàññèâ öåëûõ, ðàçìåðîì 3x6x7. Ñîâñåì ïîäðîáíî: x3d ÿâëÿåòñÿ ìàññèâîì èç òðåõ ýëåì
8.5.5 Êîíñòðóêòîðû
Ôóíêöèÿ ÷ëåí ñ èìåíåì, ñîâïàäàþùèì ñ èìåíåì åå êëàññà, íàçûâàåòñÿ êîíñòðóêòîðîì. Åñëè êëàññ
Êîíñòðóêòîð íå ìîæåò áûòü virtual èëè friend.
Åñëè êëàññ èìååò áàçîâûé êëàññ èëè îáúåêòû ÷ëåíû ñ êîíòðóêòîðàìè, èõ êîíñòðóêòîðû âûçûâàþòñ
Îáúåêò êëàññà ñ êîíñòðóêòîðîì íå ìîæåò áûòü ÷ëåíîì îáåäèíåíèÿ.
Äëÿ êîíñòðóêòîðà íåëüçÿ çàäàòü âîçâðàùàåìîå çíà÷åíèå, êàê íåëüçÿ èñïîëüçîâàòü îïåðàòîð retu
Êîíñòðóêòîð ìîæåò ÿâíî ïðèìåíÿòüñÿ äëÿ ñîçäàíèÿ íîâûõ îáúåêòîâ åãî òèïà èñïîëüçóÿ ñèíòàêñèñ
typedef-èìÿ ( ñïèñîê_ïàðàìåòðîâ opt )
Íàïðèìåð,
complex zz = complex (1,2.3); cprint (complex (7.8,1.2));
Îáúåêòû, ñîçäàííûå òàêèì îáðàçîì, íå èìåþò èìåíè (åñëè òîëüêî êîíñòðóêòîð íå èñïîëüçîâàí êà
8.5.6 Ïðåîáðàçîâàíèÿ
Êîíñòðóêòîð, ïîëó÷àþùèé îäèí ïàðàìåòð, îïðåäåëÿåò ïðåîðàçîâàíèå èç òèïà ñâîåãî ïàðàìåòðà â
class X (* ... X (int); *); f (X arg) (* X a = 1; // a = X (1) a = 2; // a = X (
2) f (3); // f (X (3)) *)
Åñëè íè îäèí êîíñòðóêòîð äëÿ êëàññà X íå ïîëó÷àåò ïðèâàèâàåìûé òèï, òî íå äåëàåòñÿ íèêàêèõ
operator òèï
çàäàåò ïðåîáðàçîâàíèå èç X â òèï. Òèï íå ìîæåò ñîäåðæàòü îïèñàíèÿ [] «âåêòîð èç» èëè () «ôó
class X (* // ... operator int(); *);
X a; int i = int(a); i = (int)a; i = a;
Âî âñåõ òðåõ ñëó÷àÿõ çíà÷åíå áóäåò ïðåîáðàçîâûâàòüñÿ ôóíêöèåé X::operator int(). Ïðèìåíåíèå
X a, b; // ... int i = (a) ? 1+a : 0; int j = (a amp; amp;b) ? a+b : i;
8.5.7 Äåñòðóêòîðû
Ôóíêöèÿ ÷ëåí êëàññà cl ñ èìåíåì ~cl íàçûâàåòñÿ äåñòðóòîðîì. Äåñòðóêòîð íå âîçâðàùàåò íèêàêî
Äåñòðóêòîð äëÿ áàçîâîãî êëàññà âûïîëíÿåòñÿ ïîñëå äåñðóêòîðà ïðîèçâîäíîãî îò íåãî êëàññà. Äå
Îáúåêò êëàññà ñ äåñòðóêòîðîì íå ìîæåò áûòü ÷ëåíîì îáåäèíåíèÿ.
8.5.10 Äðóçüÿ
Äðóã êëàññà ýòî ôóíêöèÿ íå-÷ëåí, êîòîðàÿ ìîæåò èñïîëçîâàòü èìåíà çàêðûòûõ ÷ëåíîâ. Äðóã íå
class private (* int a; friend void friend_set(private*, int); public: void memb
er_set(int); *);
void friend_set (private* p, int i) (* p-»a = i; *)
void private::member_set (int i) (* a = i; *)
private obj; friend_set ( amp;obj,10); obj.member_set (10);
Åñëè îïèñàíèå friend îòíîñòèñÿ ê ïåðåãðóæåííîìó èìåíè èëè îïåðàöèè, òî äðóãîì ñòàíîâèòñÿ òî
class cl2 (* friend char* cl1::foo(int); // ... *);
Âñå ôóíêöèè êëàññà cl1 ìîãóò áûòü ñäåëàíû äðóçüÿìè êëàñà cl2 ñ ïîìîùüþ îäíîãî îïèñàíèÿ
class cl2 (* friend class cl1 ; // ... *);
Ôóíêöèÿ ÷ëåí, îïðåäåëåííàÿ (#10) â îïèñàíèè êëàññà, ÿëÿåòñÿ inline.
8.5.13 Îáúåäèíåíèÿ
Îáúåäèíåíèå ìîæíî ñ÷èòàòü ñòðóêòóðîé, âñå îáúåêòû ÷ëåíû êîòîðîé íà÷èíàþòñÿ ñî ñìåùåíèÿ 0, è
Îáúåäèíåíèå âèäà
union (* ñïèñîê_÷ëåíîâ *);
íàçûâàåòñÿ áåçûìÿííûì îáúåäèíåíèåì; îíî îïðåäåëÿåò íåìåíîâàííûé îáúåêò. Èìåíà ÷ëåíîâ áåçûìÿ
union (* int a; char* p; *); a = 1; // ... p = «asdf»;
Çäåñü a è p èñïîëüçóþòñÿ êàê ïðîñòûå ïåðåìåííûå (íå-÷ëíû), íî òàê êàê îíè ÿâëÿþòñÿ ÷ëåíàìè
8.6.3 Ññûëêè
Êîãäà ïåðåìåííàÿ îïèñàíà êàê T amp;, òî åñòü «ññûëêà íà òèï T», îíà äîëæíà áûòü èíèöèàëèçèð
int i; int amp; r = i; r = 1; // çíà÷åíèå i ñòàíîâèòñÿ 1 int* p = amp;r; // p óêàçûâàåò íà
Çíà÷åíèå ññûëêè íå ìîæåò áûòü èçìåíåíî ïîñëå èíèöèàëèçöèè. Çàìåòüòå, ÷òî îáðàáîòêà èíèöèàëè
double amp; rr = 1;
äîïóñòèìî, è rr áóäåò óêàçûâàòü íà îáúåêò òèïà double, ñîäåðæàùèé çíà÷åíèå 1.0.
Çàìåòüòå, ÷òî ññûëêà íà êëàññ B ìîæåò áûòü èíèöèàëèçèðâàíà îáúåêòîì êëàññà D ïðè óñëîâèè, ÷
Ññûëêè îñîáåííî ïîëåçíû â êà÷åñòâå òèïîâ ïàðàìåòðîâ. Íàïðèìåð:
struct B (* ... *); struct D : B (* ... *); int f(B amp;); D a; f(a);
Âûðàæåíèå äîëæíî áûòü àðèôìåòè÷åñêîãî èëè óêàçàòåëüíîãî òèïà èëè êëàññîâîãî òèïà, äëÿ êîòîð
9.5 Îïåðàòîð Do
Îïåðàòîð do èìååò âèä
do îïåðàòîð while ( âûðàæåíèå ) ;
Âûïîëíåíèå ïîäîïåðàòîðà ïîâòîðÿåòñÿ äî òåõ ïîð, ïîêà çíà÷åíèå îñòàåòñÿ íå íóëåì. Ïðîâåðêà â
Êàæäîå èëè îáà âûðàæåíèÿ ìîãóò áûòü îïóùåíû. Îòñóòñòâèå âûðàæåíèÿ_1 äåëàåò ïîäðàçóìåâàåìîå
èäåíòèôèêàòîð :
êîòîðàÿ ñëóæèò äëÿ îïèñàíèÿ èäåíòèôèêàòîðà êàê ìåòêè. Ìåòêà èñïîëüçóåòñÿ òîëüêî êàê îáúåêò
#ifndef èäåíòèôèêàòîð
ïðîâåðÿåò, ÿâëÿåòñÿ ëè èäåíòèôèêàòîð íåîïðåäåëåííûì â ïðåïðîöåññîðå â äàííûé ìîìåíò.
Ïîñëå êàæäîãî èç òðåõ âèäîâ ìîæåò ñòîÿòü ïðîèçâîëüíîå êîëè÷åñòâî ñòðîê, âîçìîæíî, ñîäåðæàùè
#else
è äàëåå äî êîìàíäíîé ñòðîêè
#endif
Åñëè ïðîâåðåííîå óñëîâèå èñòèííî, òî âñå ñòðîêè ìåæäó #else è #endif èãíîðèðóþòñÿ. Åñëè ïðî
Ýòè êîíñòðóêöèè ìîãóò áûòü âëîæåííûìè.
14.1 Âûðàæåíèÿ
âûðàæåíèå: òåðì âûðàæåíèå áèíàðíàÿ_îïåðàöèÿ âûðàæåíèå âûðàæåíèå ? âûðàæåíèå : âûðàæåíèå ñïè
ñïèñîê_âûðàæåíèé: âûðàæåíèå ñïèñîê_âûðàæåíèé , âûðàæåíèå
òåðì: ïåðâè÷íîå_âûðàæåíèå óíàðíàÿ_îïåðàöèÿ òåðì òåðì ++ òåðì sizeof âûðàæåíèå sizeof ( èì
ïåðâè÷íîå_âûðàæåíèå: id :: èäåíòèôèêàòîð êîíñòàíòà ñòðîêà this ( âûðàæåíèå ) ïåðâè÷íîå_âûðà
id: èäåíòèôèêàòîð typedef-èìÿ :: èäåíòèôèêàòîð typedef-èìÿ :: èìÿ_ôóíêöèè_îïåðàöèè
îïåðàöèÿ: óíàðíàÿ_îïåðàöèÿ áèíàðíàÿ_îïåðàöèÿ ñïåöèàëüíàÿ_îïåðàöèÿ îïåðàöèÿ_ñâîáîäíîé_ïàìÿòè
Áèíàðíûå îïåðàöèè èìåþò ïðèîðèòåò, óáûâàþùèé â óêàçàííîì ïîðÿäêå:
áèíàðíàÿ_îïåðàöèÿ: îäíà èç * / % + « » « »
== != amp; ^ ! amp; amp; !! îïåðàöèÿ_ïðèñâàèâàíèÿ
îïåðàöèÿ_ïðèñâàèâàíèÿ: îäíà èç = += -= *= /= %= ^= amp;= != »»= ««=
óíàðíàÿ_îïåðàöèÿ: îäíà èç * amp; + ~ ! ++
ñïåöèàëüíàÿ_îïåðàöèÿ: îäíà èç () []
îïåðàöèÿ_ñâîáîäíîé_ïàìÿòè: îäíà èç new delete
èìÿ_òèïà: ñïåöèôèêàòîðû_îïèñàíèÿ àáñòðàêòíûé_îïèñàòåëü
àáñòðàêòíûé_îïèñàòåëü: ïóñòîé * àáñòðàêòíûé_îïèñàòåëü àáñòðàêòíûé_îïèñàòåëü ( ñïèñîê_îïèñàí
ïðîñòîå_èìÿ_òèïà: typedef-èìÿ char short int long unsigned float double void
typedef-èìÿ: èäåíòèôèêàòîð
14.2 Îïèñàíèÿ
îïèñàíèå: ñïåöèôèêàòîðû_îïèñàíèÿ opt ñïèñîê_îïèñàòåëåé opt ; îïèñàíèå_èìåíè asm-îïèñàíèå
îïèñàíèå_èìåíè: ñîñò èäåíòèôèêàòîð ; enum èäåíòèôèêàòîð ;
ñîñò:
class struct union
asm-îïèñàíèå: asm ( ñòðîêà ) ;
ñïåöèôèêàòîðû_îïèñàíèÿ: ñïåöèôèêàòîð_îïèñàíèÿ ñïåöèôèêàòîðû_îïèñàíèÿ opt
ñïåöèôèêàòîð_îïèñàíèÿ: ñïåöèôèêàòîð_êëàññà_ïàìÿòè ñïåöèôèêàòîð_òèïà ñïåöèôèêàòîð_ôóíêöèè ty
ñïåöèôèêàòîð_òèïà: ïðîñòîå_èìÿ_òèïà ñïåöèôèêàòîð_êëàññà ñïåöèôèêàòîð_enum óñëîæíåííûé_ñïåöè
ñïåöèôèêàòîð_êëàññà_ïàìÿòè: auto extern register static
ñïåöèôèêàòîð_ôóíêöèè: inline overload virtual
óñëîæíåííûé_ñïåöèôèêàòîð_òèïà: êëþ÷ typedef-èìÿ êëþ÷ èäåíòèôèêàòîð
êëþ÷: class struct union enum
ñïèñîê_îïèñàòåëåé: èíèö-îïèñàòåëü èíèö-îïèñàòåëü , ñïèñîê_îïèñàòåëåé
èíèö-îïèñàòåëü: îïèñàòåëü èíèöèàëèçàòîð opt
îïèñàòåëü: îï_èìÿ ( îïèñàòåëü ) * const opt îïèñàòåëü amp; const opt îïèñàòåëü
îïèñàòåëü ( ñïèñîê_îïèñàíèé_ïàðàìåòðîâ ) îïèñàòåëü [ êîíñòàíòíîå_âûðàæåíèå opt ]
îï_èìÿ: ïðîñòîå_îï_èìÿ typedef-èìÿ :: ïðîñòîå_îï_èìÿ
ïðîñòîå_îï_èìÿ: èäåíòèôèêàòîð typedef-èìÿ ~ typedef-èìÿ èìÿ_ôóíêöèè_îïåðàöèè èìÿ_ôóíêöèè_ïð
èìÿ_ôóíêöèè_îïåðàöèè: operator îïåðàöèÿ
èìÿ_ôóíêöèè_ïðåîáðàçîâàíèÿ operator òèï
ñïèñîê_îïèñàíèé_ïàðàìåòðîâ: ñïèñîê_îïèñàíèé_ïðì opt ... opt
ñïèñîê_îïèñàíèé_ïðì: ñïèñîê_îïèñàíèé_ïðì , îïèñàíèå_ïàðàìåòðà îïèñàíèå_ïàðàìåòðà
îïèñàíèå_ïàðàìåòðà: ñïåöèôèêàòîðû_îïèñàíèÿ îïèñàòåëü = âûðàæåíèå ñïåöèôèêàòîðû_îïèñàíèÿ îïè
ñïåöèôèêàòîð_êëàññà: çàãîëîâîê_êëàññà (* ñïèñîê_÷ëåíîâ opt *) çàãîëîâîê_êëàññà (* ñïèñîê_÷ë
çàãîëîâîê_êëàññà: ñîñò èäåíòèôèêàòîð opt ñîñò èäåíòèôèêàòîð opt : public opt typedef-èìÿ
ñïèñîê_÷ëåíîâ: îïèñàíèå_÷ëåíà ñïèñîê_÷ëåíîâ opt
îïèñàíèå_÷ëåíà: ñïåöèôèêàòîðû_îïèñàíèÿ opt îïèñàòåëü_÷ëåíà èíèöèàëèçàòîð opt ; îïðåäåëåíèå_
îïèñàòåëü_÷ëåíà: îïèñàòåëü èäåíòèôèêàòîð opt : êîíñòàíòíîå_âûðàæåíèå
èíèöèàëèçàòîð: = âûðàæåíèå = (* ñïèñîê_èíèöèàëèçàòîðîâ *) = (* ñïèñîê_èíèöèàëèçàòîðîâ , *)
14.3 Îïåðàòîðû
ñîñòàâíîé_îïåðàòîð: (* ñïèñîê_îïåðàòîðîâ opt *)
ñïèñîê_îïåðàòîðîâ: îïåðàòîð îïåðàòîð ñïèñîê_îïåðàòîðîâ
îïåðàòîð: îïèñàíèå ñîñòàâíîé_îïåðàòîð âûðàæåíèå opt ; if ( âûðàæåíèå ) îïåðàòîð if ( âûðàæå
14.5 Ïðåïðîöåññîð
#define èäåíòèôèêàòîð ñòðîêà_ëåêñåì
#define èäåíòèôèêàòîð( èäåíòèôèêàòîð,...,èäåíòèôèêàòîð ) ñòðîêà ëåêñåì #else #endif #if âûð
15. Îòëè÷èÿ îò C
15.1 Ðàñøèðåíèÿ
Òèïû ïàðàìåòðîâ ôóíêöèè ìîãóò áûòü çàäàíû (#8.4) è áóäóò ïðîâåðÿòüñÿ (#7.1). Ìîãóò âûïîëíÿò
Äëÿ âûðàæåíèé ñ ÷èñëàìè ñ ïëàâàþùåé òî÷êîé ìîæåò èñïîëçîâàòüñÿ ïëàâàþùàÿ àðèôìåòèêà îäèíàðí
Èìåíà ôóíêöèé ìîãóò áûòü ïåðåãðóæåíû; #8.9.
Îïåðàöèè ìîãóò áûòü ïåðåãðóæåíû; 7.16, #8.5.11.
Ôóíêöèè ìîãóò áûòü inline-ïîäñòàâëÿåìûìè; #8.1.
Îáúåêòû äàííûõ ìîãóò áûòü êîíñòàíòíûìè (const); #8.3.
Ìîãóò áûòü îïèñàíû îáúåêòû ññûëî÷íîãî òèïà; #8.4, #8.6.3
Îïåðàöèè new è delete îáåñïå÷èâàþò ñâîáîäíîå õðàíåíèå â ïàìÿòè, #7.2.
Êëàññû ìîãóò îáåñïå÷èâàòü ñîêðûòèå äàííûõ (#8.5.9), ãðàíòèðîâàííóþ èíèöèàëèçàöèþ (#8.6.2),
Èìÿ êëàññà èëè ïåðå÷èñëåíèÿ ÿâëÿåòñÿ èìåíåì òèïà; #8.5.
Ëþáîé óêàçàòåëü ìîæåò ïðèñâàèâàòüñÿ void* áåç ïðèìåíåèÿ ïðèâåäåíèÿ ê òèïó; #7.14.
Îïèñàíèå âíóòðè áëîêà ÿâëÿåòñÿ îïåðàòîðîì; #9.14.
Ìîæíî îïèñûâàòü áåçûìÿííûå îáúåäèíåíèÿ; #8.5.13.
15.3 Àíàõðîíèçìû
Èçëîæåííûå çäåñü ðàñøèðåíèÿ ìîãóò ïðåäîñòàâëÿòüñÿ äëÿ òîãî, ÷òîáû óïðîñòèòü èñïîëüçîâàíèå C
Ïðåæíåå íåîïðåäåëåííîå èìÿ ìîæåò èñïîëüçîâàòüñÿ êàê èìÿ ôóíêöèè â âûçîâå.  ýòîì ñëó÷àå èìÿ
ôóíêöèÿ, âîçâðàùàþùàÿ int ñ òèïîì ïàðàìåòðà (...).
Êëþ÷åâîå ñëîâî void ìîæåò èñïîëüçîâàòüñÿ äëÿ óêàçàíèÿ òîãî, ÷òî ôóíêöèÿ íå ïîëó÷àåò ïàðàìåò
Ìîãóò èñïîëüçîâàòüñÿ ïðîãðàììû, â êîòîðûõ èñïîëüçóåòñÿ ñèíòàêñèñ îïðåäåëåíèÿ ôóíêöèé â C
ñòàðîå_îïðåäåëåíèå_ôóíêöèè: ñïåöèôèêàòîðû_îïèñàíèÿ opt ñòàðûé_îïèñàòåëü_ôóíêöèè ñïèñîê_îïèñ
ñòàðûé_îïèñàòåëü_ôóíêöèè: îïèñàòåëü (* ñïèñîê_ïàðàìåòðîâ *)
ñïèñîê_ïàðàìåòðîâ: èäåíòèôèêàòîð èäåíòèôèêàòîð , èäåíòèôèêàòîð
íàïðèìåð,
max(a,b) (* return (a«b) ? b : a; *)
Åñëè ôóíêöèÿ, îïèñàííàÿ êàê ýòà, áûëà ðàíåå îïèñàíà, òèï åå ïàðàìåòðà áóäåò ïðèíÿò (...), ò
Âìåñòî :: ìîæåò èñïîëüçîâàòüñÿ òî÷êà äëÿ ñïåöèôèêàöèè èìåíè â îïðåäåëåíèè ôóíêöèè ÷ëåíà. Íà
int cl.fct() (* /* ... */ *)
Îäíî è òî æå èìÿ ìîæåò áûòü îïèñàíî îäíîâðåìåííî è äëÿ êëàññà èëè ïåðå÷èñëåíèÿ, è äëÿ îáúåê