Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«C++Β». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 34

Автор ΠœΡŽΡ€Ρ€Π΅ΠΉ Π₯ΠΈΠ»Π»

void f(complex a, complex b) (* complex c = a + b; // сокращСнная запись complex d = operator+(a,b); // явный Π²Ρ‹Π·ΠΎΠ² *)

ΠŸΡ€ΠΈ Π½Π°Π»ΠΈΡ‡ΠΈΠΈ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅Π³ΠΎ описания complex ΠΎΠ±Π° ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Ρ‚ΠΎΡ€Π° ΡΠ²Π»ΡΡŽΡ‚ΡΡ синонимами.

6.2.1 Π‘ΠΈΠ½Π°Ρ€Π½Ρ‹Π΅ ΠΈ Π£Π½Π°Ρ€Π½Ρ‹Π΅ ΠžΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ

Бинарная опСрация ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π° ΠΈΠ»ΠΈ ΠΊΠ°ΠΊ функция Ρ‡Π»Π΅Π½, ΠΏΠΎΠ»ΡƒΡ‡Π°ΡŽΡ‰Π°Ρ ΠΎΠ΄ΠΈΠ½ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€, ΠΈΠ»ΠΈ ΠΊΠ°ΠΊ функция Π΄Ρ€ΡƒΠ³, ΠΏΠΎΠ»ΡƒΡ‡ΡŽΡ‰Π°Ρ Π΄Π²Π° ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, для любой Π±ΠΈΠ½Π°Ρ€Π½ΠΎΠΉ ΠΎΠΏΠ΅Ρ€Ρ†ΠΈΠΈ @ [email protected] ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΈΠ»ΠΈ ΠΊΠ°ΠΊ [email protected](bb), ΠΈΠ»ΠΈ ΠΊΠ°ΠΊ [email protected](aa,bb). Если ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Ρ‹ ΠΎΠ±Π΅, Ρ‚ΠΎ [email protected] являСтся ошибкой. Унарная опСрация, прСфиксная ΠΈΠ»ΠΈ постфиксная, ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π° ΠΈΠ»ΠΈ ΠΊΠ°ΠΊ функция Ρ‡Π»Π΅Π½, Π½Π΅ ΠΏΠΎΠ»ΡƒΡ‡Π°ΡŽΡ‰Π°Ρ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ², ΠΈΠ»ΠΈ ΠΊΠ°ΠΊ функция Π΄Ρ€ΡƒΠ³, ΠΏΠΎΠ»ΡƒΡ‡Π°ΡŽΡ‰Π°Ρ ΠΎΠ΄ΠΈΠ½ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, для любой ΡƒΠ½Π°Ρ€Π½ΠΎΠΉ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ @ aa @ ΠΈΠ»ΠΈ @aa ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΈΠ»ΠΈ ΠΊΠ°ΠΊ [email protected](), ΠΈΠ»ΠΈ ΠΊΠ°ΠΊ [email protected](aa). Если ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΎ ΠΈ Ρ‚ΠΎ, ΠΈ Π΄Ρ€ΡƒΠ³ΠΎΠ΅, Ρ‚ΠΎ ΠΈ [email protected], ΠΈ @aa ΡΠ²Π»ΡΡŽΡ‚ΡΡ ошибками. Рассмотрим ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹:

class X (* // Π΄Ρ€ΡƒΠ·ΡŒΡ

friend X operator-(X); // ΡƒΠ½Π°Ρ€Π½Ρ‹ΠΉ минус friend X operator-(X,X); // Π±ΠΈΠ½Π°Ρ€Π½Ρ‹ΠΉ минус friend X operator-(); // ошибка: Π½Π΅Ρ‚ ΠΎΠΏΠ΅Ρ€Π°Π½Π΄ΠΎΠ²

friend X operator-(X,X,X); // ошибка: тСрнарная

// Ρ‡Π»Π΅Π½Ρ‹ (с нСявным ΠΏΠ΅Ρ€Π²Ρ‹ΠΌ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠΌ: this)

X* operator amp;(); // ΡƒΠ½Π°Ρ€Π½ΠΎΠ΅ amp; (взятиС адрСса) X operator amp;(X); // Π±ΠΈΠ½Π°Ρ€Π½ΠΎΠ΅ amp; (опСрация И) X operator amp;(X,X); // ошибка: Ρ‚Π΅Ρ€Π½Π°Ρ€Π½ΠΎΠ΅

*);

Когда ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ ++ ΠΈ – ΠΏΠ΅Ρ€Π΅Π³Ρ€ΡƒΠΆΠ΅Π½Ρ‹, прСфиксноС использваниС ΠΈ постфиксноС Ρ€Π°Π·Π»ΠΈΡ‡ΠΈΡ‚ΡŒ Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ.

6.2.2 ΠŸΡ€Π΅Π΄ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΉ Бмысл ΠžΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ

ΠžΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ смысла ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ, опрСдСляСмых ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π»Π΅ΠΌ, Π½Π΅ дСлаСтся Π½ΠΈΠΊΠ°ΠΊΠΈΡ… ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ. Π’ частности, посколку Π½Π΅ прСдполагаСтся, Ρ‡Ρ‚ΠΎ ΠΏΠ΅Ρ€Π΅Π³Ρ€ΡƒΠΆΠ΅Π½Π½ΠΎΠ΅ = Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅Ρ‚ присваиваниС Π΅Π΅ ΠΏΠ΅Ρ€Π²ΠΎΠΌΡƒ ΠΎΠΏΠ΅Ρ€Π°Π½Π΄Ρƒ, Π½Π΅ дСлаСтся Π½ΠΈΠΊΠ°ΠΊΠΎΠΉ ΠΏΡ€ΠΎΠ²Π΅ΠΊΠΈ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ΄ΠΎΡΡ‚ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒΡΡ, являСтся Π»ΠΈ этот ΠΎΠΏΠ΅Ρ€Π°Π½Π΄ lvalue (#с.6).

ЗначСния Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… встроСнных ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Ρ‹ ΠΊΠ°ΠΊ Ρ€Π°Π²Π½ΠΎΡΠΈΠ»ΡŒΠ½Ρ‹Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΌ комбинациям Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ Π½Π°Π΄ Ρ‚ΠΌΠΈ ΠΆΠ΅ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°ΠΌΠΈ. НапримСр, Ссли a являСтся int, Ρ‚ΠΎ ++a ΠΎΠ½Π°Ρ‡Π°Π΅Ρ‚ a+=1, Ρ‡Ρ‚ΠΎ Π² свою ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ a=a+1. Π’Π°ΠΊΠΈΠ΅ ΡΠΎΠΎΡ‚Π½ΡˆΠ΅Π½ΠΈΡ для опрСдСляСмых ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ Π½Π΅ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ΡΡ, Ссли Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π½Π΅ ΡΠ»ΡƒΡ‡ΠΈΠ»ΠΎΡΡŒ Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ сам ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠ» ΠΈΡ… Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ. НапримСр, ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ operator+= () для Ρ‚ΠΏΠ° complex Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π²Ρ‹Π²Π΅Π΄Π΅Π½ΠΎ ΠΈΠ· ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠΉ complex::operator+() ΠΈ complex::operator=().

По историчСскому совпадСнию ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ = ΠΈ amp; ΠΈΠΌΠ΅ΡŽΡ‚ ΠΎΠΏΡ€Π΅Π΄Π»Π΅Π½Π½Ρ‹ΠΉ смысл для ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² классов. Никакого элСгантного спсоба Β«Π½Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒΒ» эти Π΄Π²Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Π½Π΅ сущСствуСт. Π˜Ρ… ΠΌΠΎΠ½ΠΎ, ΠΎΠ΄Π½Π°ΠΊΠΎ, ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ нСдССспособными для класса X. МоТно, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΎΠΏΠΈΡΠ°Ρ‚ΡŒ X::operator amp;(), Π½Π΅ Π·Π°Π΄Π°Π² Π΅Π΅ опрСдСлСния. Если Π³Π΄Π΅-Π»ΠΈΠ±ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ Π±Ρ€Π°Ρ‚ΡŒΡΡ адрСс ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° класса X, Ρ‚ΠΎ ΠΊΠΎΠΌΠΏΠ½ΠΎΠ²Ρ‰ΠΈΠΊ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΡ‚ отсутствиС опрСдСлСния*. Или, Π΄Ρ€ΡƒΠ³ΠΎΠΉ способ, ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ X::operator amp;() Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ½Π° Π²Ρ‹Π·Ρ‹Π²Π°Π»Π° ΠΎΡˆΠΈΠΊΡƒ Π²ΠΎ врСмя выполнСния.

____________________ * Π’ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… систСмах ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²Ρ‰ΠΈΠΊ Π½Π°ΡΡ‚ΠΎΠ»ΡŒΠΊΠΎ Β«ΡƒΠΌΠ΅Π½Β», Ρ‡Ρ‚ΠΎ ругаСтся, Π΄Π°ΠΆΠ΅ Ссли Π½Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π° Π½Π΅ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠ°Ρ функция. Π’ Ρ‚Π°ΠΊΠΈΡ… систСмах этим ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ нСльзя. (ΠΏΡ€ΠΈΠΌ Π°Ρ‚ΠΎΡ€Π°)

6.2.3 ΠžΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ ΠΈ ΠžΠΏΡ€Π΅Π΄Π΅Π»ΡΠ΅ΠΌΡ‹Π΅ ΠŸΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ Π’ΠΈΠΏΡ‹

Ѐункция опСрация Π΄ΠΎΠ»ΠΆΠ½Π° ΠΈΠ»ΠΈ Π±Ρ‹Ρ‚ΡŒ Ρ‡Π»Π΅Π½ΠΎΠΌ, ΠΈΠ»ΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ΡŒ Π² качСствС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° ΠΏΠΎ мСньшСй ΠΌΠ΅Ρ€Π΅ ΠΎΠ΄ΠΈΠ½ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ класса (фунциям, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ new ΠΈ delete, это Π΄Π»Π°Ρ‚ΡŒ Π½Π΅ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ). Π­Ρ‚ΠΎ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚, Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Ρ‚Π΅Π»ΡŒ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ смысл Π½ΠΈΠΊΠ°ΠΊΠΎΠ³ΠΎ выраТСния, Π½Π΅ Π²ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‰Π΅Π³ΠΎ Π² сСбя ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ³ΠΎ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ Ρ‚ΠΈΠΏΠ°. Π’ часности, Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, которая дСйствуСт ΠΈΡΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π½Π° ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ.

Ѐункция опСрация, ΠΏΠ΅Ρ€Π²Ρ‹ΠΌ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠΌ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ прСдполагСтся основной встроСнный Ρ‚ΠΈΠΏ, Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ Ρ‡Π»Π΅Π½ΠΎΠΌ. Рассмотрим, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, слоТСниС комплСксной ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ aa с Ρ†Π΅Π»Ρ‹ΠΌ 2: aa+2, ΠΏΡ€ΠΈ подходящим ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ описанной Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Ρ‡Π»Π½Π΅, ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΡ€ΠΎΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΎ ΠΊΠ°ΠΊ aa.operator+(2), Π½ΠΎ с 2+aa это Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ сдСлано, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Π½Π΅Ρ‚ Ρ‚Π°ΠΊΠΎΠ³ΠΎ класса int, для ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ Π±Ρ‹ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ + Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ это ΠΎΠ·Π½Π°Ρ‡Π°Π»ΠΎ 2.operator+(aa). Π”Π°ΠΆΠ΅ Ссли Π±Ρ‹ Ρ‚Π°ΠΊΠΎΠΉ Ρ‚ΠΈΠΏ Π±Ρ‹Π», Ρ‚ΠΎ для

Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ ΠΈ 2+aa ΠΈ aa+2, понадобилось Π±Ρ‹ Π΄Π²Π΅ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Ρ‡Π»Π΅Π½Π°. Π’Π°ΠΊ ΠΊΠ°ΠΊ компилятор Π½Π΅ Π·Π½Π°Π΅Ρ‚ смысла +, опрСдСляСмого ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ, Ρ‚ΠΎ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»Π°Π³Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ ΠΊΠΎΠΌΠΌΡƒΡ‚Π°Ρ‚ΠΈΠ²Π΅Π½, ΠΈ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ 2+aa ΠΊΠ°ΠΊ aa+2. Π‘ этим ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠΌ ΠΌΠΎΠ³ΡƒΡ‚ Π»Π΅Π³ΠΊΠΎ ΡΠΏΡ€Π°Π²ΠΈΡ‚ΡŒΡΡ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π΄Ρ€ΡƒΠ·ΡŒΡ.

ВсС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ ΠΏΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΡŽ ΠΏΠ΅Ρ€Π΅Π³Ρ€ΡƒΠΆΠ΅Π½Ρ‹. Ѐункция опСрация Π·Π°Π΄Π°Π΅Ρ‚ Π½ΠΎΠ²Ρ‹ΠΉ смысл ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Π² Π΄ΠΎΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΊ встроСному ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΡŽ, ΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ нСсколько Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΎΠΏΡ€Π°Ρ†ΠΈΠΉ с ΠΎΠ΄Π½ΠΈΠΌ ΠΈ Ρ‚Π΅ΠΌ ΠΆΠ΅ ΠΈΠΌΠ΅Π½Π΅ΠΌ, Ссли Π² Ρ‚ΠΈΠΏΠ°Ρ… ΠΈΡ… ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² ΠΈΠΌΠ΅ΡŽΡ‚ΡΡ отличия, Ρ€Π°Π·Π»ΠΈΡ‡ΠΈΠΌΡ‹Π΅ для компилятора, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ½ ΠΌΠΎΠ³ Ρ€Π°Π·Π»ΠΈΡ‡Π°Ρ‚ΡŒ ΠΈΡ… ΠΏΡ€ΠΈ ΠΎΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠΈ (см. #4.6.7).

6.3 ΠžΠΏΡ€Π΅Π΄Π΅Π»ΡΠ΅ΠΌΠΎΠ΅ ΠŸΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ ΠŸΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ Π’ΠΈΠΏΠ°

ΠŸΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Π°Ρ Π²ΠΎ Π²Π²Π΅Π΄Π΅Π½ΠΈΠΈ рСализация комплСксных чисСл слишком ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Π°, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ½Π° ΠΌΠΎΠ³Π»Π° ΡƒΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ ΠΊΠΎΠ³ΠΎ-Π»ΠΈΠ±ΠΎ, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Π΅Π΅ Π½ΡƒΠΆΠ½ΠΎ Ρ€Π°ΡΡˆΠΈΡ€ΠΈΡ‚ΡŒ. Π­Ρ‚ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ Π² основном ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π΅Π½ΠΈΠ΅ΠΌ описанных Π²Ρ‹ΡˆΠ΅ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ². НапримСр:

class complex (* double re, im; public: complex(double r, double i) (* re=r; im=i; *)

friend complex operator+(complex, complex); friend complex operator+(complex, double); friend complex operator+(double, complex);

friend complex operator-(complex, complex); friend complex operator-(complex, double); friend complex operator-(double, complex); complex operator-() // ΡƒΠ½Π°Ρ€Π½Ρ‹ΠΉ -

friend complex operator*(complex, complex); friend complex operator*(complex, double); friend complex operator*(double, complex);

// ... *);

Π’Π΅ΠΏΠ΅Ρ€ΡŒ, имСя описаниС complex, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ:

void f() (* complex a(1,1), b(2,2), c(3,3), d(4,4), e(5,5); a = -b-c; b = c*2.0*c; c = (d+e)*a; *)

Но ΠΏΠΈΡΠ°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ сочСтания complex ΠΈ double, ΠΊΠ°ΠΊ это дСлалось Π²Ρ‹ΡˆΠ΅ для operator+(), нСвыносимо Π½ΡƒΠ΄Π½ΠΎ. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, Π±Π»ΠΈΠ·ΠΊΠΈΠ΅ ΠΊ Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ срСдства комплСксной Π°Ρ€ΠΈΡ„ΠΌΠ΅Ρ‚ΠΈΠΊΠΈ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ ΠΏΠΎ мСньшСй ΠΌΠ΅Ρ€Π΅ Π΄ΡŽΠΆΠΈΠ½Ρƒ Ρ‚Π°ΠΊΠΈΡ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ. ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΡ‚Π΅, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π½Π° Ρ‚ΠΈΠΏ complex, описанный Π² Β«complex.hΒ».

6.3.1 ΠšΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ‚ΠΎΡ€Ρ‹

ΠΠ»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Ρƒ использованию Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ (ΠΏΠ΅Ρ€Π΅Π³Ρ€ΠΆΠ΅Π½Π½Ρ‹Ρ…) составляСт описаниС конструктора, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΠΎ Π·Π°Π΄Π°Π½Π½ΠΌΡƒ double создаСт complex. НапримСр:

class complex (* // ... complex(double r) (* re=r; im=0; *) *);

ΠšΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ‚ΠΎΡ€, Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‰ΠΈΠΉ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€, Π½Π΅ΠΎΠ±ΡΠ·Ρ‚Π΅Π»ΡŒΠ½ΠΎ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ явно:

complex z1 = complex(23); complex z2 = 23;

И z1, ΠΈ z2 Π±ΡƒΠ΄ΡƒΡ‚ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Ρ‹ Π²Ρ‹Π·ΠΎΠ²ΠΎΠΌ complex(23).

ΠšΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ‚ΠΎΡ€ – это прСдписаниС, ΠΊΠ°ΠΊ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π΄Π°Π½Π½ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ°. Когда трСбуСтся Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠ°, ΠΈ ΠΊΠΎΠ³Π΄Π° Ρ‚Π°ΠΊΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ создано конструктором, Ρ‚ΠΎΠ³Π΄Π°, Ссли Ρ‚Π°ΠΊΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ даСтся для присваивания, вызываСтся конструктор. НапримСр, класс complex ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ Π±Ρ‹ ΠΎΠΏΠΈΡΠ°Ρ‚ΡŒ Ρ‚Π°ΠΊ:

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, complex); *);

ΠΈ дСйствия, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±ΡƒΠ΄ΡƒΡ‚ Π²Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ complex ΠΈ Ρ†Π΅Π»Ρ‹Π΅ константы, стали Π±Ρ‹ допустимы. ЦСлая константа Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΊΠ°ΠΊ complex с Π½ΡƒΠ»Π΅Π²ΠΎΠΉ ΠΌΠ½ΠΈΠΌΠΎΠΉ Ρ‡Π°ΡΡ‚ΡŒΡŽ. НаримСр, a=b*2 ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚:

a=operator*( b, complex( double(2), double(0) ) )

ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ΅ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠ° примСнСтся нСявно Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‚ΠΎΠ³Π΄Π°, ΠΊΠΎΠ³Π΄Π° ΠΎΠ½ΠΎ являСтся СдинствСнным.

ΠžΠ±ΡŠΠ΅ΠΊΡ‚, сконструированный с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ явного ΠΈΠ»ΠΈ нСявного Π²Ρ‹Π·ΠΎΠ²Π° конструктора, являСтся автоматичСским ΠΈ Π±ΡƒΠ΄Π΅Ρ‚ ΡƒΠ½ΠΈΡ‡Ρ‚ΠΆΠ΅Π½ ΠΏΡ€ΠΈ ΠΏΠ΅Ρ€Π²ΠΎΠΉ возмоТности, ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ сразу ΠΆΠ΅ послС ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π°, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΎΠ½ Π±Ρ‹Π» создан.

6.3.2 ΠžΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ ΠŸΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΡ

ИспользованиС конструктора для задания прСобразования Ρ‚ΠΈΠΏΠ° являСтся ΡƒΠ΄ΠΎΠ±Π½Ρ‹ΠΌ, Π½ΠΎ ΠΈΠΌΠ΅Π΅Ρ‚ слСдствия, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ ΠΎΠΊΠ·Π°Ρ‚ΡŒΡΡ Π½Π΅ΠΆΠ΅Π»Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌΠΈ:

1. НС ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ нСявного прСобразования ΠΈΠ· ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΎΠ³ΠΎ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ Ρ‚ΠΈΠΏΠ° Π² основной Ρ‚ΠΈΠΏ (ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ осноныС Ρ‚ΠΈΠΏΡ‹ Π½Π΅ ΡΠ²Π»ΡΡŽΡ‚ΡΡ классами)

2. НСвозмоТно Π·Π°Π΄Π°Ρ‚ΡŒ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈΠ· Π½ΠΎΠ²ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ° Π² старый, Π½Π΅ измСняя описаниС старого

3. НСвозмоТно ΠΈΠΌΠ΅Ρ‚ΡŒ конструктор с ΠΎΠ΄Π½ΠΈΠΌ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠΌ, Π½Π΅ имСя ΠΏΡ€ΠΈ этом прСобразования.

ПослСднСС Π½Π΅ являСтся ΡΠ΅Ρ€ΡŒΠ΅Π·Π½ΠΎΠΉ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΎΠΉ, Π° с ΠΏΠ΅Ρ€Π²Ρ‹ΠΌΠΈ двумя ΠΌΠΎΠΆΠ½ΠΎ ΡΠΏΡ€Π°Π²ΠΈΡ‚ΡŒΡΡ, ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠ² для исходного Ρ‚ΠΈΠΏΠ° ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΡŽ прСобразования. Ѐункция Ρ‡Π»Π΅Π½ X::operator T(), Π³Π΄Π΅ T – имя Ρ‚ΠΏΠ°, опрСдСляСт ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈΠ· X Π² T. НапримСр, ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠΏΡ€Π΄Π΅Π»ΠΈΡ‚ΡŒ Ρ‚ΠΈΠΏ tiny (ΠΊΡ€ΠΎΡˆΠ΅Ρ‡Π½Ρ‹ΠΉ), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π΅ 0...63, Π½ΠΎ всС Ρ€Π°Π²Π½ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ свободно ΡΠΎΡ‡Ρ‚Π°Ρ‚ΡŒΡΡ Π² Ρ†Π΅Π»Ρ‹ΠΌΠΈ Π² арифмСтичСских опСрациях:


class tiny (* char v; int assign(int i) (*return v=(i amp;~63) ? (error(«ошибка диапазона»),0):i;*) public: tiny(int 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 int() (* return v; *) *)

Π”ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ значСния провСряСтся всСгда, ΠΊΠΎΠ³Π΄Π° tiny иницилизируСтся int, ΠΈ всСгда, ΠΊΠΎΠ³Π΄Π° Π΅ΠΌΡƒ присваиваСтся int. Одно tiny ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΈΡΠ²Π°ΠΈΠ²Π°Ρ‚ΡŒΡΡ Π΄Ρ€ΡƒΠ³ΠΎΠΌΡƒ Π±Π΅Π· ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π°. Π§Ρ‚Π±Ρ‹ Ρ€Π°Π·Ρ€Π΅ΡˆΠΈΡ‚ΡŒ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ Π½Π°Π΄ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌΠΈ tiny ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹Π΅ Ρ†Π΅Π»Ρ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ, опрСдСляСтся tiny::operator int(), нСявноС ΠΏΡ€Π΅ΠΎΠ±Ρ€Π·ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈΠ· tiny Π² int. ВсСгда, ΠΊΠΎΠ³Π΄Π° Π² Ρ‚ΠΎΠΌ мСстС, Π³Π΄Π΅ трСбСтся int, появляСтся 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; // ошибка Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π°: c1 = 0 (Π° Π½Π΅ 66) c2 = c1 -i; // ошибка Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π°: c2 = 0 c3 = c2; // Π½Π΅Ρ‚ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π° (Π½Π΅ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Π°) *)

Π’ΠΈΠΏ Π²Π΅ΠΊΡ‚ΠΎΡ€ ΠΈΠ· tiny ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ Π±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹ΠΌ, ΠΏΠΎΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΎΠ½ экономит пространство. Π§Ρ‚ΠΎΠ±Ρ‹ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ этот Ρ‚ΠΈΠΏ Π±ΠΎΠ»Π΅Π΅ ΡƒΠ΄ΠΎΠ±Π½Ρ‹ΠΌ Π² ΠΎΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠΈ, ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΡŽ индСксировния.

Π”Ρ€ΡƒΠ³ΠΎΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ опрСдСляСмых ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ прСобразования – это Ρ‚ΠΈΠΏΡ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‚ нСстандартныС прСдставлСния чисСл (Π°Ρ€ΠΈΡ„ΠΌΠ΅Ρ‚ΠΈΠΊΠ° ΠΏΠΎ основанию 100, Π°Ρ€ΠΈΡ„ΠΌΠ΅Ρ‚ΠΈΠΊΠ°, Π°Ρ€ΠΈΡ„ΠΌΠ΅Ρ‚ΠΈΠΊΠ° с фиксированной Ρ‚ΠΎΡ‡ΠΊΠΎΠΉ, Π΄Π²ΠΎΠΈΡ‡Π½ΠΎ-дСсятичноС прСдставлСниС ΠΈ Ρ‚.ΠΏ.). ΠŸΡ€ΠΈ этом ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ΡΡ Ρ‚Π°ΠΊΠΈΠ΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ, ΠΊΠ°ΠΊ + ΠΈ *.