1 1.1 Ñòðóêòóðíûå òèïû äàííûõ Îáúÿâëåíèå è îïðåäåëåíèå Êàê è â Pascal, â C++ èìåþòñÿ ñòðóêòóðíûå òèïû äàííûõ èëè êðàòêî ñòðóêòóðû. Îäíàêî, ñèíòàêñèñ èõ îïèñàíèÿ îòëè÷àåòñÿ îò ïðèíÿòîãî â Pascal. Êàê è äëÿ ïåðåìåííûõ èëè ôóíêöèé, ñóùåñòâóþò îáúÿâëåíèÿ è îïðåäåëåíèÿ ñòðóêòóð. Îáúÿâëåíèå ñòðóêòóðíîãî òèïà äàííûõ âûãëÿäèò ñëåäóþùèì îáðàçîì: struct èìÿ; Ýòîãî äîñòàòî÷íî òîëüêî äëÿ îáúÿâëåíèÿ óêàçàòåëåé íà äàííûé ñòðóêòóðíûé òèï. Äëÿ òîãî, ÷òîáû îïðåäåëÿòü ïåðåìåííûå äàííîãî ñòðóêòóðíîãî òèïà, íóæíî åãî îïðåäåëåíèå, êîòîðîå âûãëÿäèò òàê: struct èìÿ { òåëî } ïåðåìåííûå; Çäåñü òåëî ìîæåò ñîäåðæàòü ñëåäóþùèå ýëåìåíòû: 1) îïðåäåëåíèÿ ïîëåé, â òîì ÷èñëå áèòîâûõ. Îïðåäåëåíèå ïîëÿ âûãëÿäèò êàê îáû÷íàÿ äåêëàðàöèÿ ïåðåìåííîé, íî áåç èíèöèàëèçàöèè. Íàïðèìåð, ñëåäóþùàÿ ñòðóêòóðà îïèñûâàåò êîìïëåêñíîå ÷èñëî: struct complex { double re, im; }; Áèòîâûå ïîëÿ ýòî ïîëÿ, õðàíÿùèå öåëîå ÷èñëî (çíàêîâîå èëè íåò) è çàíèìàþùèå óêàçàííîå ÷èñëî áèòîâ. Íàïðèìåð, ñëåäóþùàÿ ñòðóêòóðà èìååò òðè áèòîâûõ ïîëÿ, êàæäîå èç êîòîðûõ çàíèìàåò äâà áèòà; ïîñêîëüêó îíè áåççíàêîâûå (äëÿ çíàêîâûõ íàäî ïèñàòü int), äèàïàçîí çíà÷åíèé êàæäîãî èç íèõ îò 0 äî 3: struct bitfields { unsigned a:2, b:2, c:2; }; Áèòîâûå ïîëÿ, ÷àùå âñåãî, èñïîëüçóþòñÿ äëÿ ýêîíîìèè ïàìÿòè. Èñïîëüçóÿ áèòîâûå ïîëÿ, â îäíîì áàéòå ìîæíî õðàíèòü 8 ëîãè÷åñêèõ ïåðåìåííûõ, òîãäà êàê åñëè êàæäóþ èç íèõ îïðåäåëÿòü ñ òèïîì bool, îíè â ñîâîêóïíîñòè çàéìóò 8 áàéòîâ. Òàêæå áèòîâûå ïîëÿ èñïîëüçóþòñÿ äëÿ ïðîãðàììèîâàíèÿ àïïàðàòóðû íà íèçêîì óðîâíå (íà óðîâíå ðåãèñòðîâ), ïîñêîëüêó îäèí ðåãèñòð, õðàíÿùèé íåáîëüøîå öåëîå ÷èñëî, ìîæåò äåëèòüñÿ íà íåêîòîðîå ÷èñëî ïîëåé, óïðàâëÿþùèõ íåçàâèñèìûìè ôóíêöèÿìè àïïàðàòóðû.  ýòîì ñëó÷àå ìîæåò âîçíèêíóòü ïîòðåáíîñòü ïðîïóñòèòü íåêîòîðîå ÷èñëî áèòîâ ìåæäó ñîñåäíèìè áèòîâûìè ïîëÿìè; äëÿ ýòîãî ìîæíî âîñïîëüçîâàòüñÿ áåçûìÿííûì áèòîâûì ïîëåì, îïðåäåëÿåìûì òàêæå, êàê è îáû÷íîå, íî áåç èìåíè: struct bitfields { unsigned a:2, :3, c:2; }; Çäåñü ìåæäó a è c áóäóò ïðîïóùåíû 3 áèòà. Áèòîâûì ïîëÿì ìîæíî ïðèñâàèâàòü çíà÷åíèÿ èëè èñïîëüçîâàòü èõ çíà÷åíèÿ â âûðàæåíèÿõ. Îäíàêî, ïðèìåíÿòü ê íèì îïåðàöèþ âçÿòèÿ àäðåñà & íåëüçÿ, ïîñêîëüêó ó áèòîâîãî ïîëÿ, âîîáùå ãîâîðÿ, íåò ñâîåãî àäðåñà: àäðåñ èìååòñÿ òîëüêî ó âñåé ÿ÷åéêè öåëèêîì, à íå ó åå ÷àñòåé. Êðîìå îáû÷íûõ è áèòîâûõ ïîëåé, èìåþòñÿ åùå ñòàòè÷åñêèå ïîëÿ. Ñòàòè÷åñêîå ïîëå, â îòëè÷èå îò îáû÷íîãî, êîïèÿ êîòîðîãî èìååòñÿ â êàæäîé ñòðóêòóðíîé ïåðåìåííîé äàííîãî òèïà, ñóùåñòâóåò â åäèíñòâåííîì ýêçåìïëÿðå äëÿ âñåõ ïåðåìåííûõ äàííîãî òèïà, è ñîîòâåòñòâóþùèå âûðàæåíèÿ äîñòóïà ê ýòîìó ïîëþ äëÿ âñåõ ïåðåìåííûõ ñèíîíèìû. Ñòàòè÷åñêèå ïîëÿ, êðîìå ñâîåãî îïðåäåëåíèÿ â ñòðóêòóðå, äîëæíû åùå áûòü îáúÿâëåíû êàê îáû÷íûå ãëîáàëüíûå ïåðåìåííûå; ïðè òàêîì îáúÿâëåíèè ýòî ïîëå ìîæåò áûòü èíèöèàëèçèðîâàíî. Êðîìå òîãî, äîñòóï ê íèì âîçìîæåí íå òîëüêî ÷åðåç ïåðåìåííóþ ñòðóêòóðíîãî òèïà, íî è ÷åðåç ñàì òèï. Èñïîëüçóþòñÿ òàêèå ïîëÿ â îñíîâíîì äëÿ òîãî, ÷òîáû õðàíèòü èíôîðìàöèþ îáîáùàþùåãî õàðàêòåðà îáî âñåõ ïåðåìåííûõ äàííîãî òèïà. Íàïðèìåð, â òàêîì ïîëå ìîæíî õðàíèòü ÷èñëî âñåõ ñóùåñòâóþùèõ â ïðîãðàììå ïåðåìåííûõ äàííîãî òèïà è èñïîëüçîâàòü åãî äëÿ òîãî, ÷òîáû ñíàáäèòü êàæäóþ òàêóþ ïåðåìåííóþ ¾ñåðèéíûì íîìåðîì¿.  êà÷åñòâå ïðèìåðà ðàññìîòðèì ñòðóêòóðíûé òèï äàííûõ, â êîòîðîì èñïîëüçóåòñÿ ñòàòè÷åñêîå ïîëå. struct stfields { int a; static int b; } x, y; int stfields::b = 7; Çäåñü ìû îïðåäåëÿåì ñòðóêòóðíûé òèï äàííûõ, â êîòîðîì äâà ïîëÿ. Îäíî ïîëå, a, îáû÷íîå, à äðóãîå, b, ñòàòè÷åñêîå. Çäåñü æå îïðåäåëÿþòñÿ äâå ïåðåìåííûå òàêîãî ñòðóêòóðíîãî òèïà. Òàê âîò, ïîëå a ó êàæäîé èç ýòèõ ïåðåìåííûõ ñâîå, è x.a è y.a äâå ðàçíûõ öåëûõ ïåðåìåííûõ; à ïîëå b ó âñåõ ïåðåìåííûõ òèïà stelds îáùåå, è êðîìå x.b è y.b ó íåãî åñòü åùå îäèí ñèíîíèì stelds::b, êîòîðûé è èñïîëüçóåòñÿ äëÿ îïðåäåëåíèÿ ýòîãî ïîëÿ êàê ãëîáàëüíîé ïåðåìåííîé. 2) Îáúÿâëåíèÿ è îïðåäåëåíèÿ ìåòîäîâ. Ñèíòàêñèñ ó ýòèõ ýëåìåíòîâ ñòðóêòóðíîãî òèïà äàííûõ òàêîé æå, êàê è ó îáúÿâëåíèé è îïðåäåëåíèé îáû÷íûõ ôóíêöèé. Îäíàêî, òîò ôàêò, ÷òî ýòè îáúÿâëåíèÿ èëè îïðåäåëåíèÿ ôóíêöèé íàõîäÿòñÿ âíóòðè ñòðóêòóðû, àâòîìàòè÷åñêè îçíà÷àåò, ÷òî ýòî ìåòîäû. Íàïðèìåð, ñëåäóþùàÿ ñòðóêòóðà èìååò ìåòîä, âûâîäÿùèé åäèíñòâåííîå ïîëå ïåðåìåííîé äàííîãî òèïà íà ýêðàí: struct sout { int a; void print() { cout<<a; } } x, y;  îòëè÷èå îò Pascal, òåëà ìåòîäîâ ìîãóò áûòü íàïèñàíû âíóòðè îïèñàíèÿ ñòðóêòóðû; â ýòîì ñëó÷àå òàêèå ìåòîäû àâòîìàòè÷åñêè ñ÷èòàþòñÿ ïîäñòàâëÿåìûìè ôóíêöèÿìè (êàê åñëè áû áûëî óêàçàíî êëþ÷åâîå ñëîâî inline ñì. ôàéë ïðî ôóíêöèè). Îäíàêî, ìîæíî ïîñòóïàòü è êàê â Pascal âíóòðè ñòðóêòóðû ðàçìåùàþòñÿ îáúÿâëåíèÿ ìåòîäîâ, à îïðåäåëåíèÿ ñíàðóæè.  òàêîì ñòèëå îïðåäåëåíèå ïðåäûäóùåé ñòðóêòóðû áóäåò âûãëÿäåòü òàê: struct sout { int a; void print(); } x, y; void sout::print() { cout<<a; }  ýòîì ñëó÷àå, ïðè èñïîëüçîâàíèè ðàçäåëüíîé êîìïèëÿöèè, îïðåäåëåíèå ìåòîäà, êàê è ëþáîé äðóãîé ôóíêöèè, äîëæíî âñòðå÷àòüñÿ òîëüêî â îäíîì èñõîäíîì ôàéëå. Êàê è â Pascal, ìåòîäû âûçûâàþòñÿ ñ óêàçàíèåì îáúåêòà; ñèíòàêñèñ âûçîâà ìåòîäà â C++ î÷åíü ïîõîæ íà ïðèíÿòûé â Pascal. Äëÿ ïðåäûäóùåé ñòðóêòóðû âûçîâ ìåòîäà print äëÿ ïåðåìåííîé x áóäåò âûãëÿäåòü òàê: x.print(). Êàê è â Pascal, âíóòðè ìåòîäîâ ìîæíî èñïîëüçîâàòü ïîëÿ è ìåòîäû äàííîãî ñòðóêòóðíîãî òèïà áåç óêàçàíèÿ îáúåêòà; îíè àâòîìàòè÷åñêè áóäóò îòíîñèòüñÿ ê òîìó îáúåêòó, äëÿ êîòîðîãî âûçâàí ìåòîä. Êðîìå òîãî, âíóòðè ìåòîäà ìîæíî ïîëó÷èòü óêàçàòåëü íà òîò îáúåêò, äëÿ êîòîðîãî ìåòîä âûçâàí; â C++ ýòîò óêàçàòåëü íàçûâàåòñÿ this (â Pascal îáúåêò, äëÿ êîòîðîãî âûçâàí ìåòîä, íàçûâàåòñÿ self). Èñïîëüçóÿ ýòîò óêàçàòåëü ÿâíî, ìîæíî ïåðåïèñàòü îïðåäåëåíèå ìåòîäà print ñëåäóþùèì îáðàçîì: void sout::print() { cout<<(*this).a; } Êàê è îáû÷íûå ôóíêöèè, ìåòîäû ìîãóò áûòü ïåðåãðóæåíû, ò. å. âïîëíå çàêîííî èìåòü äâà ìåòîäà ñ îäèíàêîâûìè èìåíàìè, ðàçëè÷àþùèåñÿ íàáîðîì òèïîâ ïàðàìåòðîâ. Êàê è ïîëÿ, ìåòîäû òîæå áûâàþò ñòàòè÷åñêèìè. Òàêèå ìåòîäû íå èìåþò óêàçàòåëÿ this, â íèõ íåëüçÿ ïîëüçîâàòüñÿ íåñòàòè÷åñêèìè ïîëÿìè è ìåòîäàìè áåç óêàçàíèÿ îáúåêòà, íî çàòî èõ ìîæíî âûçûâàòü íå òîëüêî ÷åðåç îáúåêò, íî è ÷åðåç òèï (ñèíòàêñèñ ïîõîæ íà èñïîëüçîâàíèå ñòàòè÷åñêèõ ïîëåé). Ñëåäóþùàÿ ñòðóêòóðà èìååò ñòàòè÷åñêèé ìåòîä title, ïå÷àòàþùèé ñòðîêó ¾Hello, world!¿: struct stmethod { static void title() { cout<<"Hello, world!"; } } x, y; Âûçâàòü ýòîò ìåòîä ìîæíî òàê: x.title(), à ìîæíî è òàê: stmethod::title(). Êàê è â Pascal, ñðåäè âñåõ ìåòîäîâ âûäåëÿþòñÿ êîíñòðóêòîðû è äåñòðóêòîðû, îäíàêî ñèíòàêñèñ èõ îáúÿâëåíèé è îïðåäåëåíèé ñèëüíî îòëè÷àåòñÿ îò ïðèíÿòîãî â Pascal. Âî-ïåðâûõ, ó êîíñòðóêòîðîâ è äåñòðóêòîðîâ â ïðèíöèïå íåëüçÿ ïèñàòü òèï âîçâðàùàåìîãî çíà÷åíèÿ. Âî-âòîðûõ, èìÿ êîíñòðóêòîðà âñåãäà äîëæíî ñîâïàäàòü ñ èìåíåì ñàìîãî ñòðóêòóðíîãî òèïà, à èìÿ äåñòðóêòîðà îòëè÷àòüñÿ îò íåãî äîáàâëåíèåì òèëüäû (äà, îïåðàöèÿ áèòîâîãî îòðèöàíèÿ) ïåðåä íèì. Òàêæå, äåñòðóêòîð â ïðèíöèïå íå ìîæåò èìåòü ïàðàìåòðîâ, õîòÿ ïèñàòü ïîñëå åãî èìåíè ïóñòûå êðóãëûå ñêîáêè íåîáõîäèìî. Âñå ýòî îçíà÷àåò, ñîãëàñíî ïðàâèëàì ïåðåãðóçêè ìåòîäîâ, ÷òî êîíñòðóêòîðîâ ìîæåò áûòü ìíîãî, íî ëþáûå äâà äîëæíû îòëè÷àòüñÿ íàáîðîì òèïîâ ïàðàìåòðîâ, à äåñòðóêòîð è âîâñå ìîæåò áûòü òîëüêî îäèí. Íàïðèìåð, ñëåäóþùàÿ ñòðóêòóðà èìååò äâà êîíñòðóêòîðà è äåñòðóêòîð: struct cd { int x; cd(int s) { x = s; } cd(char *s) { x = atoi(s); } ~cd() { cout<<"destructor"<<endl; } }; Çäåñü áèáëèîòå÷íàÿ ôóíêöèÿ atoi (ôàéë cstdlib) ïðåîáðàçóåò ñòðîêó â ÷èñëî. Ñåìàíòèêà êîíñòðóêòîðîâ è äåñòðóêòîðîâ â C++ òîæå ñèëüíî îòëè÷àåòñÿ îò ïðèíÿòîé â Pascal.  C++ êîíñòðóêòîðû è äåñòðóêòîðû âûçûâàþòñÿ àâòîìàòè÷åñêè ïðè ñîçäàíèè è óíè÷òîæåíèè ïåðåìåííûõ ñîîòâåòñòâåííî. Íàïðèìåð, ñëåäóþùàÿ äåêëàðàöèÿ îïðåäåëÿåò ïåðåìåííóþ x òèïà cd è çàïèñûâàåò â åå ïîëå íà÷àëüíîå çíà÷åíèå 7: cd x(7); Òàêàÿ çàïèñü îçíà÷àåò, ÷òî íóæíî çàâåñòè ïåðåìåííóþ x òèïà cd è çàòåì âûçâàòü äëÿ íåå êîíñòðóêòîð ñ öåëûì ïàðàìåòðîì, ðàâíûì 7. Òîãî æå ìîæíî äîáèòüñÿ, íàïèñàâ: cd x("7"); íî çäåñü óæå áóäåò âûçâàí êîíñòðóêòîð ñ ïàðàìåòðîì òèïà ¾ñòðîêà¿. Òàêèì îáðàçîì ìîæíî ïðè îïðåäåëåíèè ïåðåìåííîé âûçâàòü ëþáîé êîíñòðóêòîð ñîîòâåòñòâóþùåãî ñòðóêòóðíîãî òèïà, íî êîíñòðóêòîðû ñ îäíèì ïàðàìåòðîì ìîãóò áûòü âûçâàíû è èíà÷å: cd x = 7; Åñëè æå íàäî âûçâàòü êîíñòðóêòîð áåç ïàðàìåòðîâ (îí íàçûâàåòñÿ êîíñòðóêòîðîì ïî óìîë÷àíèþ), òî íå íóæíî ïèñàòü íè÷åãî: cd x; Ó íàøåé ñòðóêòóðû, ïðàâäà, íåò êîíñòðóêòîðà ïî óìîë÷àíèþ, òàê ÷òî òàêàÿ äåêëàðàöèÿ âûçîâåò ñîîáùåíèå îá îøèáêå. Ïèñàòü ïóñòûå ñêîáêè â ýòîì ñëó÷àå (âûçîâ êîíñòðóêòîðà áåç ïàðàìåòðîâ) íåëüçÿ êàòåãîðè÷åñêè, ïîñêîëüêó òàêàÿ çàïèñü cd x(); îçíà÷àåò ñîâñåì íå îïðåäåëåíèå ïåðåìåííîé, à ïðîòîòèï ôóíêöèè áåç ïàðàìåòðîâ, âîçâðàùàþùåé ïåðåìåííóþ òèïà cd â êà÷åñòâå ðåçóëüòàòà.  C++ ñðåäè âñåõ êîíñòðóêòîðîâ òàêæå âûäåëÿþòñÿ íåñêîëüêî ñïåöèàëüíûõ ñëó÷àåâ: à) Êîíñòðóêòîð ïî óìîë÷àíèþ (áåç ïàðàìåòðîâ). Ñàìîå âàæíîå åãî ïðèìåíåíèå èíèöèàëèçàöèÿ ýëåìåíòîâ ìàññèâà, åñëè îíè èìåþò ñòðóêòóðíûé òèï, òàê ÷òî åñëè íåò êîíñòðóêòîðà ïî óìîë÷àíèþ, ñîçäàòü ìàññèâ èç ýëåìåíòîâ òàêîãî ñòðóêòóðíîãî òèïà íåâîçìîæíî. Ïðàâäà, åñëè â ñòðóêòóðå íåò íèêàêîãî êîíñòðóêòîðà, òî êîìïèëÿòîð ñàì ñòðîèò êîíñòðóêòîð ïî óìîë÷àíèþ. Òàêæå êîíñòðóêòîð ïî óìîë÷àíèþ èñïîëüçóåòñÿ, êîãäà íóæíî âûçâàòü êîíñòðóêòîð, íî â ïðîãðàììå ÿâíî íå óêàçàíî, êàêîé êîíñòðóêòîð äîëæåí áûòü âûçâàí (ñì. ðàçäåë ïðî êîìïîçèöèþ, à òàêæå íàñëåäîâàíèå). á) Êîíñòðóêòîð êîïèðîâàíèÿ. Ýòî êîíñòðóêòîð ñ îäíèì ïàðàìåòðîì, òèï êîòîðîãî ññûëêà íà (êîíñòàíòíûé èëè íåò) ïåðåìåííóþ òîãî æå êëàññà. Ýòîò êîíñòðóêòîð, êàê è ëþáîé äðóãîé, ìîæåò áûòü âûçâàí ÿâíî ïðè ñîçäàíèè ïåðåìåííîé ñòðóêòóðíîãî òèïà; òàêæå îí èñïîëüçóåòñÿ ïðè ïåðåäà÷å ïàðàìåòðîâ èëè âîçâðàòå ðåçóëüòàòà ôóíêöèè ïî çíà÷åíèþ (êàê óæå ãîâîðèëîñü, ïåðåäà÷à ïàðàìåòðà ïî çíà÷åíèþ îçíà÷àåò, ÷òî â ôóíêöèè ìû èìååì äåëî ñ êîïèåé ôàêòè÷åñêîãî ïàðàìåòðà; òàê âîò, åñëè òèï ïàðàìåòðà ñòðóêòóðíûé, òî ýòà ñàìàÿ êîïèÿ ñòðîèòñÿ ïðè ïîìîùè êîíñòðóêòîðà êîïèðîâàíèÿ. Òî æå ñàìîå ïðîèñõîäèò è ïðè âîçâðàòå ðåçóëüòàòà). Åñëè â ñòðóêòóðå íåò êîíñòðóêòîðà êîïèðîâàíèÿ, îí ñòðîèòñÿ àâòîìàòè÷åñêè, èñõîäÿ èç êîíñòðóêòîðîâ êîïèðîâàíèÿ ïîëåé. Îäíàêî, äëÿ áîëüøèõ îáúåêòîâ òàêîé êîíñòðóêòîð êîïèðîâàíèÿ íå ïîäõîäèò, ïîýòîìó íóæíî ðåàëèçîâàòü ñâîé ñîáñòâåííûé. Îáñóäèì çäåñü, ÷òî òàêîå áîëüøèå è ìàëåíüêèå îáúåêòû (ïîä îáúåêòîì çäåñü è äàëåå ïîíèìàåòñÿ ïåðåìåííàÿ ñòðóêòóðíîãî òèïà). Êîãäà ìû çàâîäèì ïåðåìåííóþ ñòðóêòóðíîãî òèïà, âûäåëÿåòñÿ íåêîòîðîå êîëè÷åñòâî ïàìÿòè, äîñòàòî÷íîå äëÿ õðàíåíèÿ çíà÷åíèé âñåõ ïîëåé óêàçàííîãî ñòðóêòóðíîãî òèïà. Îäíàêî, èíîãäà áûâàåò òàê, ÷òî íå âåñü îáúåêò ðàçìåùàåòñÿ â ýòîé ïàìÿòè. Îáúåêò ìîæåò ñîäåðæàòü ïîëÿ òèïà óêàçàòåëü, óêàçûâàþùèå íà äèíàìè÷åñêèå ïåðåìåííûå èëè ìàññèâû-÷àñòè îáúåêòà, ðàñïîëîæåííûå ãäå-òî â äðóãîì ìåñòå ïàìÿòè. Òî, ÷òî ýòî ÷àñòè íàøåãî îáúåêòà, ìîæíî óçíàòü ïî òîìó, ÷òî îíè äîëæíû áûòü óíè÷òîæåíû âìåñòå ñ îáúåêòîì, êîãäà îí ñòàíîâèòñÿ íå íóæåí. Òàêèå îáúåêòû, èìåþùèå âíåøíèå ¾÷àñòè¿, íàçûâàþòñÿ áîëüøèìè. Äëÿ òàêèõ îáúåêòîâ, êàê ïðàâèëî, ñòàíäàðòíûå êîíñòðóêòîðû è äåñòðóêòîðû, ñîçäàâàåìûå êîìïèëÿòîðîì, íå ïîäõîäÿò. Îáúÿñíèì ýòî íà ïðèìåðå ïðîñòåéøåãî áîëüøîãî îáúåêòà, èìåþùåãî öåëîå ïîëå è ïîëå òèïà ¾óêàçàòåëü íà öåëîå¿, óêàçûâàþùåå íà âíåøíþþ äèíàìè÷åñêóþ ïåðåìåííóþ öåëîãî òèïà. struct Big { int x; int *p; Big(); Big(const Big &); ~Big(); }; Âî-ïåðâûõ, ïðè ñîçäàíèè ýòîãî îáúåêòà àâòîìàòè÷åñêè ïàìÿòü áóäåò âûäåëåíà òîëüêî ïîä x è p, íî íèêàê íå ïîä òó äèíàìè÷åñêóþ ïåðåìåííóþ, íà êîòîðóþ äîëæåí óêàçûâàòü p. Äëÿ ïðàâèëüíîãî ñîçäàíèÿ îáúåêòà, ïîýòîìó, íóæíî íàïèñàòü ñâîé êîíñòðóêòîð, îí áóäåò âûãëÿäåòü òàê: Big::Big() { x = 0; p = new int; *p = 0; } Òåïåðü, ïðè ñîçäàíèè îáúåêòà ïàìÿòü âûäåëÿåòñÿ ïðàâèëüíî. Íî åñëè íå íàïèñàòü äåñòðóêòîð, ïàìÿòü ïîä äèíàìè÷åñêèå ïåðåìåííûå íèêîãäà íå áóäåò îñâîáîæäàòüñÿ, ÷òî ïðèâåäåò ê ÿâëåíèþ, êîòîðîå íàçûâàåòñÿ óòå÷êà ïàìÿòè. ×òîáû ýòîãî íå ïðîèñõîäèëî, íóæíî ñîçäàòü è ñâîé ñîáñòâåííûé äåñòðóêòîð. Îí áóäåò âûãëÿäåòü òàê: Big::~Big() { delete p; } Òåïåðü ïðè óíè÷òîæåíèè îáúåêòà âûäåëåííàÿ ïîä åãî âíåøíþþ ÷àñòü ïàìÿòü áóäåò ïðàâèëüíî îñâîáîæäåíà. Íàêîíåö, ðàññìîòðèì, äëÿ ÷åãî íóæåí çäåñü êîíñòðóêòîð êîïèðîâàíèÿ. Åñëè åãî íåò, êîìïèëÿòîð ïîñòðîèò ñâîé ñîáñòâåííûé êîíñòðóêòîð êîïèðîâàíèÿ, äåéñòâèå êîòîðîãî áóäåò ñîñòîÿòü â òîì, ÷òîáû ïðîñòî ïðèñâîèòü ïîëÿì êîïèè çíà÷åíèÿ ïîëåé îðèãèíàëà.  èòîãå, åñëè îáúåêò áóäåò ñêîïèðîâàí, óêàçàòåëü p êîïèè áóäåò óêàçûâàòü íà òó æå äèíàìè÷åñêóþ ïåðåìåííóþ, ÷òî è óêàçàòåëü p îðèãèíàëà. Íî åñëè îðèãèíàë ïî êàêèì-ëèáî ïðè÷èíàì áóäåò óíè÷òîæåí, âìåñòå ñ íèì áóäåò óíè÷òîæåíà è òà äèíàìè÷åñêàÿ ïåðåìåííàÿ, íà êîòîðóþ óêàçûâàë åãî óêàçàòåëü p. Òàêèì îáðàçîì, óêàçàòåëü p êîïèè áóäåò óêàçûâàòü íà îñâîáîæäåííóþ ïàìÿòü (òàêîé óêàçàòåëü íàçûâàåòñÿ âèñÿ÷èì), ÷òî íåïðàâèëüíî. Òàêàÿ ñèòóàöèÿ èìååò ìåñòî, íàïðèìåð, â ñëåäóþùåì ôðàãìåíòå êîäà: Big f() { Big x; return x; } Ïîñêîëüêó ôóíêöèÿ f âîçâðàùàåò ðåçóëüòàò ïî çíà÷åíèþ, äëÿ ýòîãî èñïîëüçóåòñÿ êîíñòðóêòîð êîïèðîâàíèÿ, è â òîì âûðàæåíèè, ãäå èñïîëüçóåòñÿ ðåçóëüòàò ôóíêöèè f, áóäåò ðåàëüíî èñïîëüçîâàíà êîïèÿ x; îäíàêî, îðèãèíàë, êàê è âñÿêàÿ ëîêàëüíàÿ ïåðåìåííàÿ, áóäåò óíè÷òîæåí ïðè âûõîäå èç f. Òàêàÿ ïðîáëåìà ðåøàåòñÿ ïóòåì ñîçäàíèÿ ñâîåãî ñîáñòâåííîãî êîíñòðóêòîðà êîïèðîâàíèÿ. Îí áóäåò âûãëÿäåòü ñëåäóþùèì îáðàçîì: Big::Big(const Big &ori) { x = ori.x; p = new int; *p = *ori.p; } â) Êîíñòðóêòîð ïðåîáðàçîâàíèÿ. Òàê íàçûâàåòñÿ ëþáîé êîíñòðóêòîð ñ îäíèì ïàðàìåòðîì, òèï êîòîðîãî îòëè÷àåòñÿ îò ñàìîãî ñòðóêòóðíîãî òèïà, êîíñòðóêòîðîì êîòîðîãî îí ÿâëÿåòñÿ. Íàçâàíèå ýòîé ðàçíîâèäíîñòè êîíñòðóêòîðîâ îáúÿñíÿåòñÿ òåì, ÷òî ýòè êîíñòðóêòîðû èñïîëüçóþòñÿ äëÿ àâòîìàòè÷åñêîãî ïðåîáðàçîâàíèÿ òèïîâ òàì, ãäå ýòî íåîáõîäèìî. Íàïðèìåð, ó íàñ åñòü äâà ñòðóêòóðíûõ òèïà A è B, è â B åñòü êîíñòðóêòîð ñ åäèíñòâåííûì ïàðàìåòðîì òèïà A. Òîãäà ìû ìîæåì ïîäñòàâèòü, ñêàæåì, ïåðåìåííóþ òèïà A â ôóíêöèþ, ó êîòîðîé åñòü ïàðàìåòð òèïà B. Êîìïèëÿòîð ñàì ïîéìåò, ÷òî ïðè ýòîì íóæíî ñîçäàòü âðåìåííóþ ïåðåìåííóþ òèïà B ïðè ïîìîùè êîíñòðóêòîðà ïðåîáðàçîâàíèÿ (åãî ïàðàìåòðîì áóäåò èñïîëüçîâàííîå íàìè â âûçîâå âûðàæåíèå òèïà A) è ïåðåäàòü ýòó ïåðåìåííóþ â èíòåðåñóþùóþ íàñ ôóíêöèþ. Íàïîñëåäîê â ðàçäåëå ïðî ìåòîäû îáñóäèì âîïðîñ, êîãäà â ñ++ âûçûâàþòñÿ êîíñòðóêòîðû è äåñòðóêòîðû. Èìååòñÿ ðÿä ñëó÷àåâ, êîãäà âûçûâàþòñÿ êîíñòðóêòîðû: à) ïðè ñîçäàíèè ãëîáàëüíûõ ïåðåìåííûõ ñîîòâåòñòâóþùèå êîíñòðóêòîðû âûçûâàþòñÿ äî íà÷àëà ðàáîòû ôóíêöèè main. á) ïðè ñîçäàíèè ëîêàëüíûõ ñòàòè÷åñêèõ ïåðåìåííûõ ñîîòâåòñòâóþùèå êîíñòðóêòîðû âûçûâàþòñÿ îäèí ðàç çà âñå âðåìÿ ðàáîòû ïðîãðàììû, êîãäà óïðàâëåíèå âïåðâûå äîñòèãàåò ñîîòâåòñòâóþùåé äåêëàðàöèè. â) ïðè ñîçäàíèè îáû÷íûõ ëîêàëüíûõ ïåðåìåííûõ êîíñòðóêòîðû âûçûâàþòñÿ êàæäûé ðàç, êîãäà ñîçäàåòñÿ òàêàÿ ïåðåìåííàÿ (ïðè êàæäîì âûçîâå, êîãäà óïðàâëåíèå äîñòèãàåò ñîîòâåòñòâóþùåé äåêëàðàöèè). ã) ïðè ñîçäàíèè âðåìåííûõ áåçûìÿííûõ îáúåêòîâ.  ñ++ ìîæíî ñîçäàòü âðåìåííûé áåçûìÿííûé îáúåêò ëþáîãî ñòðóêòóðíîãî òèïà ïðè ïîìîùè ëþáîãî èç åãî êîíñòðóêòîðîâ. Ñèíòàêñèñ ýòîãî òàêîâ: èìÿ_òèïà(ïàðàìåòðû êîíñòðóêòîðà). Åñëè èñïîëüçóåòñÿ êîíñòðóêòîð ïî óìîë÷àíèþ, ïóñòûå ñêîáêè â äàííîì ñëó÷àå âñå ðàâíî îáÿçàòåëüíû. Íàïðèìåð, åñëè ó íàñ åñòü òèï Complex, õðàíÿùèé êîìïëåêñíîå ÷èñëî, è ó íåãî åñòü êîíñòðóêòîð ïî äâóì âåùåñòâåííûì ÷èñëàì (âåùåñòâåííàÿ è ìíèìàÿ ÷àñòü), òî â ïðîãðàììå ìîæíî èñïîëüçîâàòü âûðàæåíèå Complex(1.0, 2.0) âìåñòî ÷èñëà 1+2i. ä) ïðè ñîçäàíèè äèíàìè÷åñêèõ îáúåêòîâ ïîñëå âûäåëåíèÿ ïàìÿòè ïîä ïîëÿ ñîîòâåòñòâóþùåé ïåðåìåííîé. Åñëè â îïåðàöèè new ïðîñòî óêàçàí ñòðóêòóðíûé òèï, èñïîëüçóåòñÿ êîíñòðóêòîð ïî óìîë÷àíèþ, íî ìîæíî ïîñëå òèïà ïîñòàâèòü ñêîáêè è â íèõ óêàçàòü ïàðàìåòðû êîíñòðóêòîðà òîãäà áóäåò âûçâàí ñîîòâåòñòâóþùèé êîíñòðóêòîð. Íàïðèìåð, â êîíòåêñòå ïðåäûäóùåãî ïóíêòà âûðàæåíèå new Complex(1.0, 2.0) ñîçäàåò íîâóþ äèíàìè÷åñêóþ ïåðåìåííóþ òèïà Complex, âûçûâàåò äëÿ íåå êîíñòðóêòîð ïî äâóì âåùåñòâåííûì ÷èñëàì ñ ïàðàìåòðàìè 1 è 2, è âîçâðàùàåò óêàçàòåëü íà íåå. å) ïðè ñîçäàíèè ìàññèâà èç ýëåìåíòîâ ñòðóêòóðíîãî òèïà âûçûâàåòñÿ êîíñòðóêòîð ïî óìîë÷àíèþ äëÿ âñåõ åãî ýëåìåíòîâ. Äåñòðóêòîðû âûçûâàþòñÿ äëÿ óíè÷òîæåíèÿ îáúåêòîâ, ñîçäàííûõ ïðè ïîìîùè êîíñòðóêòîðîâ, â çàâèñèìîñòè îò âðåìåíè æèçíè òîãî èëè èíîãî îáúåêòà. Íàïðèìåð, äëÿ îáû÷íûõ ëîêàëüíûõ ïåðåìåííûõ äåñòðóêòîð âûçûâàåòñÿ íåïîñðåäñòâåííî ïåðåä âûõîäîì èç ôóíêöèè, äëÿ ãëîáàëüíûõ ïåðåìåííûõ ïîñëå çàâåðøåíèÿ ðàáîòû ôóíêöèè main, äëÿ äèíàìè÷åñêèõ ïåðåìåííûõ ïðè óíè÷òîæåíèè èõ îïåðàöèåé delete, íåïîñðåäñòâåííî ïåðåä îñâîáîæäåíèåì çàíèìàåìîé èìè ïàìÿòè. 3) Òàêæå âíóòðè ñòðóêòóðû ìîãóò âñòðå÷àòüñÿ îïðåäåëåíèÿ èëè typedef-ñèíîíèìû òèïîâ. Ýòî íóæíî äëÿ èñïîëüçîâàíèÿ òåõíîëîãèè îáîáùåííîãî ïðîãðàììèðîâàíèÿ, êîòîðàÿ áóäåò ðàññìîòðåíà ïîçæå. 1.2 Èñïîëüçîâàíèå ñòðóêòóðíûõ òèïîâ Îïðåäåëèâ ñòðóêòóðíûé òèï äàííûõ, åãî ìîæíî èñïîëüçîâàòü äëÿ îïðåäåëåíèÿ ïåðåìåííûõ, óêàçàòåëåé, ìàññèâîâ è ò. ä. òàê, êàê åñëè áû ýòî áûë îäèí èç âñòðîåííûõ òèïîâ âðîäå int èëè double. Ïðè ýòîì äîñòóï ê ïîëÿì èëè ìåòîäàì î÷åíü ïîõîæ ïî ñèíòàêñèñó íà àíàëîãè÷íûé äîñòóï â Pascal. Íåìíîãèå îòëè÷èÿ ñîñòîÿò â ñëåäóþùåì: â C++ íåò àíàëîãà îïåðàòîðà with, è äàæå åñëè ìåòîä íå èìååò ïàðàìåòðîâ, òî ïðè âûçîâå åãî â C++ âñå ðàâíî íàäî ïèñàòü ïóñòûå êðóãëûå ñêîáêè. Êðîìå òîãî, â C++ èìååòñÿ óäîáíàÿ îïåðàöèÿ äëÿ äîñòóïà ê ïîëþ èëè ìåòîäó òîé ñòðóêòóðû, íà êîòîðóþ óêàçûâàåò óêàçàòåëü. Åñëè p óêàçàòåëü íà ñòðóêòóðó, à f ïîëå ýòîé ñòðóêòóðû, òî âûðàæåíèå p->f îçíà÷àåò ïîëå f òîé ïåðåìåííîé, íà êîòîðóþ óêàçûâàåò p. 1.3 Ïðàâà äîñòóïà  C++ ñóùåñòâóåò ìåõàíèçì îãðàíè÷åíèÿ äîñòóïà ê ïîëÿì è ìåòîäàì ñòðóêòóðíûõ òèïîâ äàííûõ.  ñâÿçè ñ ýòèì ñóùåñòâóþò äâà (íà ñàìîì äåëå òðè, íî îá ýòîì ïîçæå êîãäà ðå÷ü ïîéäåò î íàñëåäîâàíèè) óðîâíÿ äîñòóïà ê ïîëÿì è ìåòîäàì. Ïåðâûé óðîâåíü äîñòóïà íàçûâàåòñÿ public. Ïðèíàäëåæàùèå åìó ïîëÿ è ìåòîäû îòêðûòû, ò. å. äîñòóï ê íèì âîçìîæåí èç ëþáîé ôóíêöèè ïðîãðàììû. Äðóãîé óðîâåíü äîñòóïà íàçûâàåòñÿ private; ïðèíàäëåæàùèå åìó ïîëÿ è ìåòîäû äîñòóïíû òîëüêî èç ìåòîäîâ äàííîãî êëàññà.  ñòðóêòóðå ïî óìîë÷àíèþ âñå ïîëÿ è ìåòîäû ÿâëÿþòñÿ îòêðûòûìè; åñëè íóæíî, ÷òîáû êàêèå-òî èç íèõ áûëè çàêðûòûìè, íóæíî ïåðåä íèìè íàïèñàòü private: (äâîåòî÷èå òîæå íóæíî ïèñàòü; ýòîò óðîâåíü äîñòóïà áóäåò äåéñòâîâàòü íà âñå ïîñëåäóþùèå îáúÿâëåíèÿ è îïðåäåëåíèÿ ïîëåé è ìåòîäîâ, äî òåõ ïîð, ïîêà ÿâíî íå âñòðåòèòñÿ public:). Èìååòñÿ è äðóãîå êëþ÷åâîå ñëîâî äëÿ îïðåäåëåíèÿ ñòðóêòóðíûõ òèïîâ äàííûõ, class. Îòëè÷èå åãî îò struct òîëüêî â òîì, ÷òî îíî îçíà÷àåò ïî óìîë÷àíèþ ðåæèì äîñòóïà private. Èíîãäà ïî ñîîáðàæåíèÿì ýôôåêòèâíîñòè òðåáóåòñÿ îòêðûòü äîñòóï äàæå ê çàêðûòûì ïîëÿì è ìåòîäàì êëàññà äëÿ íåêîòîðîé ôóíêöèè èëè äàæå äëÿ âñåõ ìåòîäîâ íåêîòîðîãî äðóãîãî êëàññà. Äëÿ ýòîãî ñóùåñòâóåò ïîíÿòèå äðóæáû. Ôóíêöèÿ ÿâëÿåòñÿ äðóãîì êëàññà, åñëè îíà èìååò äîñòóï êî âñåì åãî ïîëÿì è ìåòîäàì, äàæå ê çàêðûòûì. Âñå äðóæåñòâåííûå êëàññó ôóíêöèè äîëæíû áûòü ÿâíî óêàçàíû âíóòðè åãî îïðåäåëåíèÿ, ò. å. âíóòðè êëàññà äîëæíû áûòü ïåðå÷èñëåíû ïðîòîòèïû äðóæåñòâåííûõ åìó ôóíêöèé, ïåðåä êàæäûì èç êîòîðûõ äîëæíî ñòîÿòü êëþ÷åâîå ñëîâî friend. Òàêæå îáñòîèò äåëî è ñ êëàññàìè: êàæäûé äðóæåñòâåííûé êëàññ äëÿ êëàññà A, ò. å. òàêîé, âñå ìåòîäû êîòîðîãî èìåþò äîñòóï êî âñåì ïîëÿì è ìåòîäàì êëàññà A, äîëæåí áûòü îáúÿâëåí âíóòðè A ñ êëþ÷åâûì ñëîâîì friend ñïåðåäè. Âàæíîå çàìå÷àíèå: â C++ íåò íèêàêîé íåÿâíîé äðóæáû, ò. å. îòíîøåíèå äðóæáû ìåæäó êëàññàìè íå îáÿçàíî áûòü íè ñèììåòðè÷íûì, íè òðàíçèòèâíûì.  ÷àñòíîñòè, åñëè êëàññ A äðóã êëàññà B, ýòî îòíþäü íå îçíà÷àåò, ÷òî B äðóã A. Áîëåå òîãî, âëîæåííûå êëàññû, îïðåäåëåííûå âíóòðè äðóãèõ êëàññîâ, ñîâåðøåííî íå îáÿçàíû áûòü äðóçüÿìè ïîñëåäíèõ. Íàïîñëåäîê â ýòîì ðàçäåëå ñêàæåì ïàðó ñëîâ î òîì, çà÷åì íóæíî îãðàíè÷åíèå ïðàâ äîñòóïà. Ýòîìó åñòü äâå ãëàâíûõ ïðè÷èíû. à) Âî-ïåðâûõ, ýòî ïîçâîëÿåò ãàðàíòèðîâàòü öåëîñòíîñòü äàííûõ. Åñëè ëþáàÿ ôóíêöèÿ ìîæåò çàïèñûâàòü ÷òî óãîäíî â ëþáûå ïîëÿ ñòðóêòóðíîé ïåðåìåííîé, î÷åâèäíî, íåëüçÿ íè÷åãî ãàðàíòèðîâàòü îòíîñèòåëüíî åå ñîñòîÿíèÿ. Åñëè æå çàïèñûâàòü èíôîðìàöèþ â ïîëÿ ìîãóò òîëüêî ìåòîäû ñàìîãî êëàññà, îíè âïîëíå ìîãóò ïðîâåðÿòü ïðàâèëüíîñòü ýòîé èíôîðìàöèè, è ïðèíèìàòü ìåðû ê èñïðàâëåíèþ ñèòóàöèè, åñëè èíôîðìàöèÿ, êîòîðóþ ìû ñîáèðàåìñÿ çàïèñàòü, ïðàâèëüíîé íå ÿâëÿåòñÿ. Òèïè÷íûé ïðèìåð êëàññ, ñîäåðæàùèé äàòó. Åñëè â ýòîì êëàññå åñòü òðè öåëûõ ïîëÿ ãîä, äåíü è ìåñÿö, òî äàëåêî íå ëþáîå ñî÷åòàíèå èç òðåõ öåëûõ ÷èñåë â ýòèõ ïîëÿõ ìîæíî ðàññìàòðèâàòü êàê ïðàâèëüíóþ äàòó. Åñëè êòî óãîäíî ìîæåò çàïèñûâàòü â ýòè ïîëÿ ÷òî óãîäíî, íè÷åãî ãàðàíòèðîâàòü íåëüçÿ, íî åñëè ïîëÿ çàêðûòû è åäèíñòâåííûì ìåòîäîì, ïðè ïîìîùè êîòîðîãî ìîæíî çàïèñàòü äàòó â ïåðåìåííóþ, áóäåò, ñêàæåì, ìåòîä setDate ñ òðåìÿ öåëûìè ïàðàìåòðàìè, òî îí óæå èìååò ïîëíóþ âîçìîæíîñòü ïðîâåðèòü çàïèñûâàåìóþ â ïåðåìåííóþ äàòó è ïðèíÿòü ìåðû, åñëè îíà íåïðàâèëüíàÿ (ðåàêöèÿ íà íåïðàâèëüíóþ äàòó ìîæåò áûòü ñàìîé ðàçíîé: îò èãíîðèðîâàíèÿ ïðîáëåìû, ò. å. ïðè ïîïûòêå çàïèñàòü íåïðàâèëüíóþ äàòó ïðîñòî çàïèñûâàåòñÿ êàêàÿ-òî çàðàíåå ôèêñèðîâàííàÿ ïðàâèëüíàÿ äàòà è ïðîöåññ ïðîäîëæàåòñÿ êàê íè â ÷åì íå áûâàëî, äî âûäà÷è ñîîáùåíèÿ îá îøèáêå è àâàðèéíîãî çàâåðøåíèÿ ïðîãðàììû). á) Âî-âòîðûõ, ìû ìîæåì âïîñëåäñòâèè çàõîòåòü èçìåíèòü ðåàëèçàöèþ, ò. å. âíóòðåííåå óñòðîéñòâî íàøåãî êëàññà. Åñëè âñå ïîëÿ è ìåòîäû íàøåãî êëàññà îòêðûòû è ëþáàÿ ôóíêöèÿ íàøåé ïðîãðàììû ìîæåò ïîëüçîâàòüñÿ ëþáûìè èç íèõ, î÷åíü òðóäíî îòñëåäèòü âñå òå ìåñòà â ïðîãðàììå, â êîòîðûõ èñïîëüçóåòñÿ, íàïðèìåð, îïðåäåëåííîå ïîëå, è êàê îíî òàì èñïîëüçóåòñÿ. Åñëè æå ïîëÿ çàêðûòû è ïîëüçîâàòåëÿì âèäíî ëèøü íåáîëüøîå ÷èñëî ìåòîäîâ, ìû âîëüíû ìåíÿòü çàêðûòóþ ÷àñòü êëàññà êàê õîòèì (âñå ðàâíî îíà íå âèäíà íèêîìó, êðîìå íàøåãî êëàññà), ëèøü áû îòêðûòûå ìåòîäû ïðè íîâîé ðåàëèçàöèè âåëè ñåáÿ ïî ñìûñëó òàêæå, êàê è ðàíüøå. Ïðîäîëæàÿ ïðèìåð ñ äàòîé, ìû ìîæåì çàõîòåòü èçìåíèòü âíóòðåííåå ïðåäñòàâëåíèå äàòû ñ òðåõ öåëûõ ÷èñåë íà îäíî: íîìåð äíÿ, íà÷èíàÿ ñ êàêîé-òî îïðåäåëåííîé äàòû. Åñëè ïîëÿ äàòû îòêðûòû, íàì íóæíî îòñëåæèâàòü è êîððåêòèðîâàòü âñå ìåñòà â ïðîãðàììå, ãäå ýòè ïîëÿ èñïîëüçóþòñÿ, ÷òî ïðåäñòàâëÿåò ñîáîé î÷åíü ñëîæíóþ çàäà÷ó äëÿ áîëüøèõ ïðîãðàìì. Åñëè æå îíè çàêðûòû, è êëèåíòû ìîãóò ïîëüçîâàòüñÿ òîëüêî ìåòîäàìè, ñêàæåì, setDate, getYear, getMonth, getDay, òî âñå, ÷òî íàì íóæíî ñäåëàòü ïåðåïèñàòü íàø êëàññ òàê, ÷òîáû ýòè ìåòîäû âûäàâàëè (ïðè íîâîé ðåàëèçàöèè) ïðàâèëüíûå ðåçóëüòàòû. 1.4 Ïåðåãðóçêà îïåðàöèé  C++ åñòü åùå îäíà î÷åíü óäîáíàÿ ÷åðòà, êîòîðàÿ íàçûâàåòñÿ ïåðåãðóçêîé îïåðàöèé. Ìû óæå âñòðå÷àëèñü ñ íåé, êîãäà ãîâîðèëè, ÷òî äëÿ öåëûõ ÷èñåë îïåðàöèÿ << îçíà÷àåò áèòîâûé ñäâèã âëåâî, íî åñëè ëåâûé îïåðàíä ïîòîê âûâîäà, òî òà æå ñàìàÿ îïåðàöèÿ îçíà÷àåò âûâîä èíôîðìàöèè â ïîòîê. Îêàçûâàåòñÿ, â C++ ìîæíî ïåðåãðóæàòü íå òîëüêî ôóíêöèè, íî è ïî÷òè âñå îïåðàöèè, òàêèå, êàê ñëîæåíèå, âû÷èòàíèå è ò. ä. Ïðàâäà, îïðåäåëÿòü íîâûå âåðñèè ýòèõ îïåðàöèé ìîæíî òîëüêî äëÿ ïîëüçîâàòåëüñêèõ òèïîâ. Íàïðèìåð, ïåðåîïðåäåëèòü ñëîæåíèå äëÿ öåëûõ èëè âåùåñòâåííûõ ÷èñåë íåëüçÿ. Áîëüøèíñòâî îïåðàöèé ìîæíî ïåðåãðóæàòü äâóìÿ ñïîñîáàìè: à) Êàê ìåòîä. Ïðèìåð äëÿ ñëîæåíèÿ êîìïëåêñíûõ ÷èñåë ïðèâîäèòñÿ íèæå: class Complex { double x, y; public: Complex(double xx = 0, double yy = 0) { x = xx; y = yy; } Complex operator+(Complex c); }; Complex Complex::operator+(Complex c) { return Complex(x+c.x, y+c.y); } Çäåñü ó ñëîæåíèÿ âñåãî îäèí ïàðàìåòð, ïîòîìó ÷òî ïðè òàêîì ïåðåîïðåäåëåíèè ñëîæåíèÿ (êàê ìåòîä) ïåðâûì ïàðàìåòðîì âñåãäà áóäåò òîò îáúåêò, äëÿ êîòîðîãî ýòîò ìåòîä âûçâàí, ò. å. åñëè ïåðåìåííûå z1 è z2 îïðåäåëåíû êàê Complex, òî âûðàæåíèå z1+z2 ïîíèìàåòñÿ êîìïèëÿòîðîì êàê z1.operator+(z2).  èòîãå, ïðè òàêîì ïåðåîïðåäåëåíèè îïåðàöèé íóæíî â ñêîáêàõ óêàçûâàòü íà îäèí ïàðàìåòð ìåíüøå. á) Êàê âíåøíþþ ôóíêöèþ. Òîò æå ïðèìåð â ýòîì ñëó÷àå áóäåò âûãëÿäåòü òàê: class Complex { double x, y; public: Complex(double xx = 0, double yy = 0) { x = xx; y = yy; } friend Complex operator+(Complex c1, Complex c2); }; Complex operator+(Complex c1, Complex c2) { return Complex(c1.x+c2.x, c1.y+c2.y); }  ýòîì ñëó÷àå òî æå âûðàæåíèå z1+z2 òðàêòóåòñÿ óæå êàê operator+(z1, z2). Î÷åâèäíî, ÷òî íåëüçÿ ïåðåîïðåäåëÿòü îäíó è òó æå ïî ñìûñëó îïåðàöèþ îáîèìè ñïîñîáàìè ñðàçó òîãäà êîìïèëÿòîð íå áóäåò çíàòü, êàê åå íóæíî âûçûâàòü. 1.5 Êîíñòàíòíûå îáúåêòû C++ ïîçâîëÿåò èñïîëüçîâàòü êëþ÷åâîå ñëîâî const íå òîëüêî ñî âñòðîåííûìè òèïàìè, íî è ñ ïîëüçîâàòåëüñêèìè. Ñìûñë ýòîãî â òîì, ÷òîáû åùå íà ýòàïå êîìïèëÿöèè îòëàâëèâàòü íåêîòîðûå îøèáêè. Äîáàâëåíèå êëþ÷åâîãî ñëîâà const â äåêëàðàöèþ ïåðåìåííîé ñòðóêòóðíîãî òèïà ïðèâîäèò ê òîìó, ÷òî ó òàêîãî îáúåêòà: à) íåëüçÿ ïðèñâàèâàòü îòêðûòûì ïîëÿì çíà÷åíèÿ; á) ìîæíî ïîëüçîâàòüñÿ òîëüêî êîíñòàíòíûìè, ò. å. íå ìåíÿþùèìè ñâîåãî îáúåêòà, ìåòîäàìè. Òàêèå ìåòîäû, âîïåðâûõ, â çàãîëîâêå ïîñëå ñïèñêà ïàðàìåòðîâ, ò. å. ìåæäó ) è ; èëè òåëîì äîëæíû èìåòü êëþ÷åâîå ñëîâî const, è âî-âòîðûõ, íå äîëæíû ïûòàòüñÿ ïðèñâàèâàòü ïîëÿì çíà÷åíèÿ èëè âûçûâàòü äëÿ òîãî æå îáúåêòà íåêîíñòàíòíûå ìåòîäû. Òàêèå ìåòîäû ïðîñòî ðàññìàòðèâàþòñÿ êàê ïðèíèìàþùèå íåÿâíûé ïàðàìåòð this òèïà íå ïðîñòî óêàçàòåëü íà ñâîé êëàññ, à óêàçàòåëü íà êîíñòàíòó òèïà ýòîãî êëàññà. Ýòî ñîîáðàæåíèå ïîçâîëÿåò â ðàìêàõ îáû÷íûõ ïðàâèë ïåðåãðóçêè ìåòîäîâ, è áîëåå îáùî, ôóíêöèé, èìåòü äâà ìåòîäà, îäèíàêîâûõ ïî èìåíè è òèïàì ïàðàìåòðîâ, îäèí èç êîòîðûõ êîíñòàíòíûé, à äðóãîé íåò. Ýòî äîñòàòî÷íî óäîáíî ïðè ðåàëèçàöèè áèáëèîòå÷íûõ êëàññîâ. Çàäà÷è. 1. Íàïèñàòü ñòðóêòóðíûé òèï äàííûõ, ïðåäñòàâëÿþùèé ìîìåíò âðåìåíè. Ïðè ýòîì æåëàòåëüíî ãàðàíòèðîâàòü ïðàâèëüíîñòü çàïèñàííîé â íåì èíôîðìàöèè (ïðè ïîìîùè çàêðûòèÿ ïîëåé). 2. Íàïèñàòü ñòðóêòóðíûé òèï äàííûõ, ïðåäñòàâëÿþùèé îñòàòîê ïî ìîäóëþ NUMBER (êîíñòàíòà, îïðåäåëåííàÿ â ïðîãðàììå). Äîëæåí áûòü ðåàëèçîâàí êîíñòðóêòîð ïî öåëîìó ÷èñëó è îïåðàöèè ñëîæåíèÿ, âû÷èòàíèÿ è óìíîæåíèÿ. 3. Íàïèñàòü ñòðóêòóðíûé òèï äàííûõ, ïðåäñòàâëÿþùèé êîìïëåêñíîå ÷èñëî. Äîëæíû áûòü êîíñòðóêòîð ïî âåùåñòâåííîé è ìíèìîé ÷àñòè, àðèôìåòè÷åñêèå îïåðàöèè, ïåðåãðóæåííàÿ îïåðàöèÿ ! (êîìïëåêñíîå ñîïðÿæåíèå). 4. Íàïèñàòü ñòðóêòóðíûé òèï äàííûõ, ïðåäñòàâëÿþùèé äðîáü (ïîëÿ ÷èñëèòåëü è çíàìåíàòåëü öåëûå ÷èñëà). Äîëæíû áûòü êîíñòðóêòîð ïî öåëîìó ÷èñëó, ïî äâóì öåëûì ÷èñëàì, ìåòîä ñîêðàùåíèå äðîáè, àðèôìåòè÷åñêèå îïåðàöèè è îïåðàöèè ñðàâíåíèÿ. 5. Íàïèñàòü ñòðóêòóðíûé òèï äàííûõ, ïðåäñòàâëÿþùèé ìíîãî÷ëåí ñ âåùåñòâåííûìè êîýôôèöèåíòàìè (äàííûå ñòåïåíü è äèíàìè÷åñêèé ìàññèâ êîýôôèöèåíòîâ). Äîëæåí áûòü êîíñòðóêòîð ïî âåùåñòâåííîìó ÷èñëó (êîíñòàíòà), êîíñòðóêòîð ïî ñòåïåíè è ìàññèâó êîýôôèöèåíòîâ, êîíñòðóêòîð êîïèðîâàíèÿ, äåñòðóêòîð, ïåðåãðóæåííûå îïåðàöèè: ïðèñâàèâàíèå, àðèôìåòè÷åñêèå îïåðàöèè, îïåðàöèÿ èíäåêñàöèè (âîçâðàùàåò ññûëêó íà êîýôôèöèåíò ïî ñòåïåíè îäíî÷ëåíà), îïåðàöèÿ () (ïàðàìåòð âåùåñòâåííîå ÷èñëî, ðåçóëüòàò çíà÷åíèå ìíîãî÷ëåíà â óêàçàííîé òî÷êå). 6. Íàïèñàòü ñòðóêòóðíûé òèï äàííûõ, ïðåäñòàâëÿþùèé ìàòðèöó èç âåùåñòâåííûõ ÷èñåë. Äîëæåí áûòü êîíñòðóêòîð ïî ïàðå öåëûõ ÷èñåë è ìàññèâó âåùåñòâåííûõ (÷èñëî ñòðîê, ñòîëáöîâ è ýëåìåíòû), êîíñòðóêòîð êîïèðîâàíèÿ, äåñòðóêòîð, ïåðåãðóæåííûå îïåðàöèè: ïðèñâàèâàíèå, àðèôìåòè÷åñêèå îïåðàöèè (êðîìå äåëåíèÿ), îïåðàöèÿ èíäåêñàöèè (âîçâðàùàåò ññûëêó íà êîýôôèöèåíò ïî íîìåðàì ñòðîêè è ñòîëáöà, êðóãëûå ñêîáêè, ïîòîìó ÷òî â êâàäðàòíûõ äîïóñêàåòñÿ òîëüêî îäèí ïàðàìåòð), îïåðàöèÿ ! (òðàíñïîíèðîâàíèå), (îáðàòíàÿ ìàòðèöà), ìåòîä det (îïðåäåëèòåëü).