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

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«Π‘Ρ‚Π°Π½Π΄Π°Ρ€Ρ‚Ρ‹ программирования Π½Π° Π‘++. 101 ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ ΠΈ рСкомСндация». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 16

Автор Π“Π΅Ρ€Π± Π‘Π°Ρ‚Ρ‚Π΅Ρ€

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ здСсь [email protected] β€” функция-Π½Π΅ Ρ‡Π»Π΅Π½, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ ΠΎΠ½Π° ΠΎΠ±Π»Π°Π΄Π°Π΅Ρ‚ ΠΆΠ΅Π»Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ свойством возмоТности нСявного прСобразования ΠΊΠ°ΠΊ Π»Π΅Π²ΠΎΠ³ΠΎ, Ρ‚Π°ΠΊ ΠΈ ΠΏΡ€Π°Π²ΠΎΠ³ΠΎ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° (см. Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄Π°Ρ†ΠΈΡŽ 44). НапримСр, Ссли Π²Ρ‹ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚Π΅ класс String, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΠΌΠ΅Π΅Ρ‚ нСявный конструктор, ΠΏΠΎΠ»ΡƒΡ‡Π°ΡŽΡ‰ΠΈΠΉ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ Ρ‚ΠΈΠΏΠ° char, Ρ‚ΠΎ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ operator+(const String&, const String&), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½Π΅ являСтся Ρ‡Π»Π΅Π½ΠΎΠΌ класса, позволяСт ΠΎΡΡƒΡ‰Π΅ΡΡ‚Π²Π»ΡΡ‚ΡŒ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ ΠΊΠ°ΠΊ Ρ‚ΠΈΠΏΠ° char+String, Ρ‚Π°ΠΊ ΠΈ String+char; функция-Ρ‡Π»Π΅Π½ String::operator+(const String&) позволяСт ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΡŽ String+char. РСализация, основной Ρ†Π΅Π»ΡŒΡŽ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ являСтся ΡΡ„Ρ„Π΅ΠΊΡ‚ΠΈΠ²Π½ΠΎΡΡ‚ΡŒ, ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ ряд ΠΏΠ΅Ρ€Π΅Π³Ρ€ΡƒΠ·ΠΎΠΊ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° [email protected], Π½Π΅ ΡΠ²Π»ΡΡŽΡ‰ΠΈΡ…ΡΡ Ρ‡Π»Π΅Π½Π°ΠΌΠΈ класса, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ увСличСния количСства Π²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… Π² процСссС ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠΉ Ρ‚ΠΈΠΏΠΎΠ² (см. Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄Π°Ρ†ΠΈΡŽ 29).

Π’Π°ΠΊΠΆΠ΅ Π΄Π΅Π»Π°ΠΉΡ‚Π΅ Π½Π΅ Ρ‡Π»Π΅Π½ΠΎΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ [email protected]= Π²Π΅Π·Π΄Π΅, Π³Π΄Π΅ это Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ (см. Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄Π°Ρ†ΠΈΡŽ 44). Π’ любом случаС, всС ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹, Π½Π΅ ΡΠ²Π»ΡΡŽΡ‰ΠΈΠ΅ΡΡ Ρ‡Π»Π΅Π½Π°ΠΌΠΈ, Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ ΠΏΠΎΠΌΠ΅Ρ‰Π΅Π½Ρ‹ Π² Ρ‚ΠΎ ΠΆΠ΅ пространство ΠΈΠΌΠ΅Π½, Ρ‡Ρ‚ΠΎ ΠΈ класс T, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ ΠΎΠ½ΠΈ Π±ΡƒΠ΄ΡƒΡ‚ Π»Π΅Π³ΠΊΠΎ доступны для Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‰ΠΈΡ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΏΡ€ΠΈ отсутствии ΠΊΠ°ΠΊΠΈΡ…-Π»ΠΈΠ±ΠΎ ΡΡŽΡ€ΠΏΡ€ΠΈΠ·ΠΎΠ² со стороны поиска ΠΈΠΌΠ΅Π½ (см. Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄Π°Ρ†ΠΈΡŽ 57).

Как Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€Π΅Π΄ΡƒΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ [email protected], ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°ΡŽΡ‰ΠΈΠΉ ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ ΠΏΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΡŽ. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ Π²Ρ‹ обСспСчитС нСявноС ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ компилятором, Ρ‡Ρ‚ΠΎ обСспСчит Π΅ΠΌΡƒ Π±ΠΎΠ»ΡŒΡˆΡƒΡŽ свободу дСйствий ΠΏΠΎ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ:

T& [email protected]=(T& lhs, const T& rhs) {

 // ... рСализация ...

 return lhs;

}


T [email protected](T lhs, const T& rhs) { // lhs ΠΏΠ΅Ρ€Π΅Π΄Π°Π½ΠΎ ΠΏΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΡŽ

 return lhs @= rhs;

}

Π•Ρ‰Π΅ ΠΎΠ΄ΠΈΠ½ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ β€” ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ [email protected], ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ const-Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅. Π­Ρ‚Π° ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΈΠΊΠ° ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‚ΠΎ прСимущСство, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈ этом запрСщаСтся Ρ‚Π°ΠΊΠΎΠΉ Π½Π΅ ΠΈΠΌΠ΅ΡŽΡ‰ΠΈΠΉ смысла ΠΊΠΎΠ΄, ΠΊΠ°ΠΊ a+b=c, Π½ΠΎ Π² этом случаС ΠΌΡ‹ тСряСм Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ примСнСния ΠΏΠΎΡ‚Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹Ρ… конструкций Π½Π°ΠΏΠΎΠ΄ΠΎΠ±ΠΈΠ΅ Π° = (b+c).replace(pos, n, d). А это вСсьма Π²Ρ‹Ρ€Π°Π·ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΊΠΎΠ΄, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π² ΠΎΠ΄Π½ΠΎΠΉ строчкС выполняСт ΠΊΠΎΠ½ΠΊΠ°Ρ‚Π΅Π½Π°Ρ†ΠΈΡŽ строк b ΠΈ с, замСняСт Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ символы ΠΈ присваиваСт ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹ΠΉ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ Π°.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹

ΠŸΡ€ΠΈΠΌΠ΅Ρ€. РСализация += для строк. ΠŸΡ€ΠΈ ΠΊΠΎΠ½ΠΊΠ°Ρ‚Π΅Π½Π°Ρ†ΠΈΠΈ строк ΠΏΠΎΠ»Π΅Π·Π½ΠΎ Π·Π°Ρ€Π°Π½Π΅Π΅ Π·Π½Π°Ρ‚ΡŒ Π΄Π»ΠΈΠ½Ρƒ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²Ρ‹Π΄Π΅Π»ΡΡ‚ΡŒ ΠΏΠ°ΠΌΡΡ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π·:

String& String::operator+=( const String& rhs ) {

 // ... РСализация ...

 return *this;

}


String operator+( const String& lhs, const String& rhs ) {

 String temp; // ΠΈΠ·Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎ пуста

 // Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠ΅ достаточного количСства памяти

 temp.Reserve(lhs.size() + rhs.size());

 // ΠšΠΎΠ½ΠΊΠ°Ρ‚Π΅Π½Π°Ρ†ΠΈΡ строк ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‚

 return (temp += lhs) += rhs;

}

Π˜ΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ

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

Бсылки

[Alexandrescu03a] β€’ [Cline99] Β§23.06 β€’ [Meyers96] Β§22 β€’ [Sutter00] Β§20

28. ΠŸΡ€Π΅Π΄ΠΏΠΎΡ‡ΠΈΡ‚Π°ΠΉΡ‚Π΅ каноничСский Π²ΠΈΠ΄ ++ ΠΈ --, ΠΈ Π²Ρ‹Π·ΠΎΠ² прСфиксных ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ²

РСзюмС

ΠžΡΠΎΠ±Π΅Π½Π½ΠΎΡΡ‚ΡŒ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ² ΠΈΠ½ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚Π° ΠΈ Π΄Π΅ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚Π° состоит Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Ρƒ Π½ΠΈΡ… Π΅ΡΡ‚ΡŒ прСфиксная ΠΈ постфиксная Ρ„ΠΎΡ€ΠΌΡ‹ с Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΎΡ‚Π»ΠΈΡ‡Π°ΡŽΡ‰Π΅ΠΉΡΡ сСмантикой. ΠžΠΏΡ€Π΅Π΄Π΅Π»ΡΠΉΡ‚Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ operator++ ΠΈ operator-- Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ½ΠΈ ΠΏΠΎΠ΄Ρ€Π°ΠΆΠ°Π»ΠΈ повСдСнию своих встроСнных Π΄Π²ΠΎΠΉΠ½ΠΈΠΊΠΎΠ². Если Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π²Π°ΠΌ Π½Π΅ трСбуСтся исходноС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ β€” ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ прСфиксныС вСрсии ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ².

ΠžΠ±ΡΡƒΠΆΠ΄Π΅Π½ΠΈΠ΅

Бтарая ΡˆΡƒΡ‚ΠΊΠ° гласит, Ρ‡Ρ‚ΠΎ язык называСтся Π‘++, Π° Π½Π΅ ++Π‘, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ язык Π±Ρ‹Π» ΡƒΠ»ΡƒΡ‡ΡˆΠ΅Π½ (Π½Π° Ρ‡Ρ‚ΠΎ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ ΠΈΠ½ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚), Π½ΠΎ ΠΌΠ½ΠΎΠ³ΠΈΠ΅ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°ΡŽΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π΅Π³ΠΎ ΠΊΠ°ΠΊ Π‘ (ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅Π΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π΄ΠΎ ΠΈΠ½ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚Π°). К ΡΡ‡Π°ΡΡ‚ΡŒΡŽ, эту ΡˆΡƒΡ‚ΠΊΡƒ ΠΌΠΎΠΆΠ½ΠΎ ΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ ΡƒΡΡ‚Π°Ρ€Π΅Π²ΡˆΠ΅ΠΉ, Π½ΠΎ это отличная ΠΈΠ»Π»ΡŽΡΡ‚Ρ€Π°Ρ†ΠΈΡ для понимания отличия ΠΌΠ΅ΠΆΠ΄Ρƒ двумя Ρ„ΠΎΡ€ΠΌΠ°ΠΌΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ².

Π’ случаС ++ ΠΈ -- постфиксныС Ρ„ΠΎΡ€ΠΌΡ‹ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ² Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‚ исходноС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, Π² Ρ‚ΠΎ врСмя ΠΊΠ°ΠΊ прСфиксныС Ρ„ΠΎΡ€ΠΌΡ‹ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‚ Π½ΠΎΠ²ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅. Π›ΡƒΡ‡ΡˆΠ΅ всСго Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Ρ‹Π²Π°Ρ‚ΡŒ постфиксный ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ с использованиСм прСфиксного. Π’ΠΎΡ‚ каноничСский Π²ΠΈΠ΄ Ρ‚Π°ΠΊΠΎΠ³ΠΎ использования:

// ---- ΠŸΡ€Π΅Ρ„ΠΈΠΊΡΠ½Ρ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ -----------------------

T& T::operator++() { // ΠŸΡ€Π΅Ρ„ΠΈΠΊΡΠ½Ρ‹ΠΉ Π²ΠΈΠ΄:

 // Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅       // - Π’Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅

 // ΠΈΠ½ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚Π°       //   дСйствий

 return *this;       // - return *this;

}


T& T::operator--() { // ΠŸΡ€Π΅Ρ„ΠΈΠΊΡΠ½Ρ‹ΠΉ Π²ΠΈΠ΄:

 // Π’Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅       // - Π’Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅

 // Π΄Π΅ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚Π°       //   дСйствий

 return *this;       // - return *this;

}


// ---- ΠŸΠΎΡΡ‚Ρ„ΠΈΠΊΡΠ½Ρ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ ---------------------

T T::operator++(int) { // ΠŸΠΎΡΡ‚Ρ„ΠΈΠΊΡΠ½Ρ‹ΠΉ Π²ΠΈΠ΄:

 T old(*this);         // - Π—Π°ΠΏΠΎΠΌΠΈΠ½Π°Π΅ΠΌ староС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅

 ++*this;              // - Π’Ρ‹Π·ΠΎΠ² прСфиксной вСрсии

 return old;           // - Π’ΠΎΠ·Π²Ρ€Π°Ρ‚ старого значСния

}


T T::operator--(int) { // ΠŸΠΎΡΡ‚Ρ„ΠΈΠΊΡΠ½Ρ‹ΠΉ Π²ΠΈΠ΄:

 T old(*this);         // - Π—Π°ΠΏΠΎΠΌΠΈΠ½Π°Π΅ΠΌ староС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅

 --*this;              // - Π’Ρ‹Π·ΠΎΠ² прСфиксной вСрсии

 return old;           // - Π’ΠΎΠ·Π²Ρ€Π°Ρ‚ старого значСния

}

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

Π˜ΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ

Π¨Π°Π±Π»ΠΎΠ½Ρ‹, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Π΅ для Π½Π°ΡƒΡ‡Π½Ρ‹Ρ… вычислСний (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΡˆΠ°Π±Π»ΠΎΠ½Ρ‹ для прСдставлСния Ρ‚Π΅Π½Π·ΠΎΡ€ΠΎΠ² ΠΈΠ»ΠΈ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†), ΠΊ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ ΠΏΡ€Π΅Π΄ΡŠΡΠ²Π»ΡΡŽΡ‚ΡΡ ТСсткиС трСбования ΠΏΠΎ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ. Для Ρ‚Π°ΠΊΠΈΡ… шаблонов часто приходится ΠΈΡΠΊΠ°Ρ‚ΡŒ Π±ΠΎΠ»Π΅Π΅ эффСктивныС способы Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ прСфиксных Ρ„ΠΎΡ€ΠΌ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ².

Бсылки

[Cline99] Β§23.07-08 β€’ [Dewhurst03] Β§87 β€’ [Meyers96] Β§6 β€’ [Stroustrup00] Β§19.3 β€’ [Sutter00] Β§6, Β§20

29. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ ΠΏΠ΅Ρ€Π΅Π³Ρ€ΡƒΠ·ΠΊΡƒ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ нСявного прСобразования Ρ‚ΠΈΠΏΠΎΠ²

РСзюмС

НС ΠΏΡ€ΠΈΡƒΠΌΠ½ΠΎΠΆΠ°ΠΉΡ‚Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ свСрх нСобходимости (Π‘Ρ€ΠΈΡ‚Π²Π° Оккама): нСявноС ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠΎΠ² обСспСчиваСт ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ΅ синтаксичСскоС удобство (ΠΎΠ΄Π½Π°ΠΊΠΎ см. Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄Π°Ρ†ΠΈΡŽ 40), Π½ΠΎ Π² ситуации, ΠΊΠΎΠ³Π΄Π° допустима оптимизация (см. Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄Π°Ρ†ΠΈΡŽ 8) ΠΈ ΠΆΠ΅Π»Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ создания ΠΈΠ·Π»ΠΈΡˆΠ½ΠΈΡ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ², ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΡ‚ΡŒ ΠΏΠ΅Ρ€Π΅Π³Ρ€ΡƒΠΆΠ΅Π½Π½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ с сигнатурами, Ρ‚ΠΎΡ‡Π½ΠΎ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΌΠΈ распространСнным Ρ‚ΠΈΠΏΠ°ΠΌ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ², ΠΈ Ρ‚Π΅ΠΌ самым ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ прСобразования Ρ‚ΠΈΠΏΠΎΠ².

ΠžΠ±ΡΡƒΠΆΠ΄Π΅Π½ΠΈΠ΅

Когда Π²Ρ‹ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚Π΅ Π² офисС ΠΈ Ρƒ вас заканчиваСтся Π±ΡƒΠΌΠ°Π³Π°, Ρ‡Ρ‚ΠΎ Π²Ρ‹ Π΄Π΅Π»Π°Π΅Ρ‚Π΅? ΠŸΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ β€” Π²Ρ‹ ΠΈΠ΄Π΅Ρ‚Π΅ ΠΊ ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π»ΡŒΠ½ΠΎΠΌΡƒ Π°ΠΏΠΏΠ°Ρ€Π°Ρ‚Ρƒ ΠΈ Π΄Π΅Π»Π°Π΅Ρ‚Π΅ нСсколько ΠΊΠΎΠΏΠΈΠΉ чистого листа Π±ΡƒΠΌΠ°Π³ΠΈ.

Как Π±Ρ‹ Π³Π»ΡƒΠΏΠΎ это Π½ΠΈ Π·Π²ΡƒΡ‡Π°Π»ΠΎ, Π½ΠΎ Π·Π°Ρ‡Π°ΡΡ‚ΡƒΡŽ это ΠΈΠΌΠ΅Π½Π½ΠΎ Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Π΄Π΅Π»Π°Π΅Ρ‚ нСявноС ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠΎΠ²: созданиС ΠΈΠ·Π»ΠΈΡˆΠ½ΠΈΡ… Π²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ‚Ρ€ΠΈΠ²ΠΈΠ°Π»ΡŒΠ½Ρ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Π½Π°Π΄ Π½ΠΈΠΌΠΈ ΠΈ Ρ‚ΡƒΡ‚ ΠΆΠ΅ ΠΈΡ… Π²Ρ‹Π±Ρ€ΠΎΡΠΈΡ‚ΡŒ (см. Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄Π°Ρ†ΠΈΡŽ 40). Π’ качСствС ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π°ΡΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ сравнСниС строк:

class String { // ...

 String(const char* text); // ΠžΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΠ²Π°Π΅Ρ‚ нСявноС

                           // ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠΎΠ²

};

bool operator==(const String&, const String&);


// ... Π³Π΄Π΅-Ρ‚ΠΎ Π² ΠΊΠΎΠ΄Π΅ ...

if (someString == "Hello"){ ... }

Ознакомившись с ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹ΠΌΠΈ Π²Ρ‹ΡˆΠ΅ опрСдСлСниями, компилятор ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠ΅ сравнСниС Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, ΠΊΠ°ΠΊ Ссли Π±Ρ‹ ΠΎΠ½ΠΎ Π±Ρ‹Π»ΠΎ записано Π² Π²ΠΈΠ΄Π΅ someString == String("HellΠΎ"). Π­Ρ‚ΠΎ слишком Ρ€Π°ΡΡ‚ΠΎΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ β€” ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ символы, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΡ‚ΠΎΠΌ просто ΠΏΡ€ΠΎΡ‡Π΅ΡΡ‚ΡŒ ΠΈΡ…. РСшСниС этой ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ ΠΎΡ‡Π΅Π½ΡŒ простоС β€” ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ ΠΏΠ΅Ρ€Π΅Π³Ρ€ΡƒΠΆΠ΅Π½Π½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ прСобразования Ρ‚ΠΈΠΏΠΎΠ², Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€:

bool operator==(const String& lhs, const string& rhs); // #1

bool operator==(const String& lhs, const char* rhs);   // #2

bool operator==(const char* lhs, const String& rhs);   // #3

Π­Ρ‚ΠΎ выглядит ΠΊΠ°ΠΊ Π΄ΡƒΠ±Π»ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΊΠΎΠ΄Π°, Π½ΠΎ Π½Π° самом Π΄Π΅Π»Π΅ это всСго лишь "Π΄ΡƒΠ±Π»ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ сигнатур", ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ всС Ρ‚Ρ€ΠΈ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π° ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ ΠΎΠ΄Π½Ρƒ ΠΈ Ρ‚Ρƒ ΠΆΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ. Вряд Π»ΠΈ Π²Ρ‹ Π²ΠΏΠ°Π΄Π΅Ρ‚Π΅ Π² Π΅Ρ€Π΅ΡΡŒ ΠΏΡ€Π΅ΠΆΠ΄Π΅Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ (см. Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄Π°Ρ†ΠΈΡŽ 8) ΠΏΡ€ΠΈ Ρ‚Π°ΠΊΠΎΠΉ простой ΠΏΠ΅Ρ€Π΅Π³Ρ€ΡƒΠ·ΠΊΠ΅, Ρ‚Π΅ΠΌ Π±ΠΎΠ»Π΅Π΅ Ρ‡Ρ‚ΠΎ этот ΠΌΠ΅Ρ‚ΠΎΠ΄ слабо ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΠΌ ΠΏΡ€ΠΈ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ, ΠΊΠΎΠ³Π΄Π° Ρ‚Ρ€ΡƒΠ΄Π½ΠΎ Π·Π°Ρ€Π°Π½Π΅Π΅ ΠΏΡ€Π΅Π΄ΡΠΊΠ°Π·Π°Ρ‚ΡŒ, ΠΊΠ°ΠΊΠΈΠ΅ ΠΈΠΌΠ΅Π½Π½ΠΎ Ρ‚ΠΈΠΏΡ‹ Π±ΡƒΠ΄ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π² ΠΊΠΎΠ΄Π΅, критичСском ΠΏΠΎ ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΡŽ ΠΊ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ.

Бсылки

[Meyers96] Β§21 β€’ [Stroustrup00] Β§11.4, Β§C.6 β€’ [Sutter00] Β§6

30. Π˜Π·Π±Π΅Π³Π°ΠΉΡ‚Π΅ ΠΏΠ΅Ρ€Π΅Π³Ρ€ΡƒΠ·ΠΊΠΈ &&, || ΠΈ , (запятой)

РСзюмС

ΠœΡƒΠ΄Ρ€ΠΎΡΡ‚ΡŒ β€” это Π·Π½Π°Π½ΠΈΠ΅ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠΎΠ³Π΄Π° Π½Π°Π΄ΠΎ Π²ΠΎΠ·Π΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒΡΡ. ВстроСнныС ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ &&, || ΠΈ , (запятая) Ρ‚Ρ€Π°ΠΊΡ‚ΡƒΡŽΡ‚ΡΡ компилятором ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ. ПослС ΠΏΠ΅Ρ€Π΅Π³Ρ€ΡƒΠ·ΠΊΠΈ ΠΎΠ½ΠΈ становятся ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΌΠΈ функциями с вСсьма ΠΎΡ‚Π»ΠΈΡ‡Π½ΠΎΠΉ сСмантикой (ΠΏΡ€ΠΈ этом Π²Ρ‹ Π½Π°Ρ€ΡƒΡˆΠ°Π΅Ρ‚Π΅ Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄Π°Ρ†ΠΈΠΈ 26 ΠΈ 31), Π° это прямой ΠΏΡƒΡ‚ΡŒ ΠΊ Ρ‚Ρ€ΡƒΠ΄Π½ΠΎΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠΌΡ‹ΠΌ ошибкам ΠΈ нСнадСТности. НС ΠΏΠ΅Ρ€Π΅Π³Ρ€ΡƒΠΆΠ°ΠΉΡ‚Π΅ эти ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ Π±Π΅Π· ΠΊΡ€Π°ΠΉΠ½Π΅ΠΉ нСобходимости ΠΈ Π³Π»ΡƒΠ±ΠΎΠΊΠΎΠ³ΠΎ понимания.