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

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«Π­Ρ„Ρ„Π΅ΠΊΡ‚ΠΈΠ²Π½ΠΎΠ΅ использованиС C++. 55 Π²Π΅Ρ€Π½Ρ‹Ρ… способов ΡƒΠ»ΡƒΡ‡ΡˆΠΈΡ‚ΡŒ структуру ΠΈ ΠΊΠΎΠ΄ Π²Π°ΡˆΠΈΡ… ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΒ». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 32

Автор Π‘ΠΊΠΎΡ‚Ρ‚ ΠœΠ°ΠΉΠ΅Ρ€Ρ

Π’ Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Ρ… ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ Widget Π½Π°ΠΊΠ»Π°Π΄Π½Ρ‹Π΅ расходы Π²Ρ‹Ρ‡ΠΈΡΠ»ΡΡŽΡ‚ΡΡ Ρ‚Π°ΠΊ:

β€’ ΠŸΠΎΠ΄Ρ…ΠΎΠ΄ A: 1 конструктор + 1 дСструктор + n присваиваний

β€’ ΠŸΠΎΠ΄Ρ…ΠΎΠ΄ B: n конструкторов + n дСструкторов

Для классов, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΡΡ‚ΠΎΠΈΠΌΠΎΡΡ‚ΡŒ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ присваивания мСньшС, Ρ‡Π΅ΠΌ ΠΏΠ°Ρ€Ρ‹ конструктор-дСструктор, ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ A ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ Π±ΠΎΠ»Π΅Π΅ эффСктивСн. ОсобСнно это Π²Π΅Ρ€Π½ΠΎ, ΠΊΠΎΠ³Π΄Π° Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ n достаточно Π²Π΅Π»ΠΈΠΊΠΎ. Π’ ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ B Π»ΡƒΡ‡ΡˆΠ΅. Π‘ΠΎΠ»Π΅Π΅ Ρ‚ΠΎΠ³ΠΎ, Π² случаС A имя w Π²ΠΈΠ΄ΠΈΠΌΠΎ Π² Π±ΠΎΠ»Π΅Π΅ ΡˆΠΈΡ€ΠΎΠΊΠΎΠΉ области (Π²ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‰Π΅ΠΉ Π² сСбя Ρ†ΠΈΠΊΠ»), Ρ‡Π΅ΠΌ Π² случаС B, Π° ΠΈΠ½ΠΎΠ³Π΄Π° это Π΄Π΅Π»Π°Π΅Ρ‚ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ ΠΌΠ΅Π½Π΅Π΅ понятной ΠΈ ΡƒΠ΄ΠΎΠ±Π½ΠΎΠΉ для сопровоТдСния. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ Ссли (1) Π½Π΅Ρ‚ Π°ΠΏΡ€ΠΈΠΎΡ€Π½ΠΎΠΉ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ присваиваниС обходится дСшСвлС, Ρ‡Π΅ΠΌ ΠΏΠ°Ρ€Π° конструктор-дСструктор, ΠΈ (2) Ρ€Π΅Ρ‡ΡŒ ΠΈΠ΄Π΅Ρ‚ ΠΎ части ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΊΡ€ΠΈΡ‚ΠΈΡ‡Π½Π°, Ρ‚ΠΎ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ рСкомСндуСтся ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ B.

Π§Ρ‚ΠΎ слСдуСт ΠΏΠΎΠΌΠ½ΠΈΡ‚ΡŒ

β€’ ΠžΡ‚ΠΊΠ»Π°Π΄Ρ‹Π²Π°ΠΉΡ‚Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… насколько Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ. Π­Ρ‚ΠΎ Π΄Π΅Π»Π°Π΅Ρ‚ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ яснСС ΠΈ ΠΏΠΎΠ²Ρ‹ΡˆΠ°Π΅Ρ‚ ΠΈΡ… ΡΡ„Ρ„Π΅ΠΊΡ‚ΠΈΠ²Π½ΠΎΡΡ‚ΡŒ.

ΠŸΡ€Π°Π²ΠΈΠ»ΠΎ 27: НС злоупотрСбляйтС ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ΠΌ Ρ‚ΠΈΠΏΠΎΠ²

ΠŸΡ€Π°Π²ΠΈΠ»Π° C++ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Π°Π½Ρ‹ Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с Ρ‚ΠΈΠΏΠ°ΠΌΠΈ Π±Ρ‹Π»ΠΎ Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ. ВСорСтичСски, Ссли ваша ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° компилируСтся Π±Π΅Π· ошибок, Π·Π½Π°Ρ‡ΠΈΡ‚, ΠΎΠ½Π° Π½Π΅ пытаСтся Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ Π½ΠΈΠΊΠ°ΠΊΠΈΡ… нСбСзопасных ΠΈΠ»ΠΈ бСссмыслСнных ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ с ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌΠΈ. Π­Ρ‚ΠΎ цСнная гарантия. НС Π½Π°Π΄ΠΎ ΠΎΡ‚ Π½Π΅Π΅ ΠΎΡ‚ΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒΡΡ.

К соТалСнию, привСдСния обходят систСму Ρ‚ΠΈΠΏΠΎΠ². И это ΠΌΠΎΠΆΠ΅Ρ‚ привСсти ΠΊ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹ΠΌ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°ΠΌ, Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Ρ€Π°ΡΠΏΠΎΠ·Π½Π°Ρ‚ΡŒ Π»Π΅Π³ΠΊΠΎ, Π° Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ – Ρ‡Ρ€Π΅Π·Π²Ρ‹Ρ‡Π°ΠΉΠ½ΠΎ Ρ‚Ρ€ΡƒΠ΄Π½ΠΎ. Если Π²Ρ‹ ΠΏΡ€ΠΈΡˆΠ»ΠΈ ΠΊ C++ ΠΈΠ· ΠΌΠΈΡ€Π° C, Java ΠΈΠ»ΠΈ C#, ΠΏΡ€ΠΈΠΌΠΈΡ‚Π΅ эток свСдСнию, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π² ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹Ρ… языках Π² привСдСниях Ρ‚ΠΈΠΏΠΎΠ² Ρ‡Π°Ρ‰Π΅ Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΡΡ‚ΡŒ, ΠΈ ΠΎΠ½ΠΈ ΠΌΠ΅Π½Π΅Π΅ опасны, Ρ‡Π΅ΠΌ Π² C++. Но C++ – это Π½Π΅ C. Π­Ρ‚ΠΎ Π½Π΅ Java. Π­Ρ‚ΠΎ Π½Π΅ C#. Π’ этом языкС ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ – это срСдство, ΠΊ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ Π½ΡƒΠΆΠ½ΠΎ ΠΎΡ‚Π½ΠΎΡΠΈΡ‚ΡŒΡΡ с Π΄ΠΎΠ»ΠΆΠ½Ρ‹ΠΌ ΠΏΠΎΡ‡Ρ‚Π΅Π½ΠΈΠ΅ΠΌ.

НачнСм с ΠΎΠ±Π·ΠΎΡ€Π° синтаксиса ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ² привСдСния Ρ‚ΠΈΠΏΠΎΠ², ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ сущСствуСт Ρ‚Ρ€ΠΈ Ρ€Π°Π·Π½Ρ‹Ρ… способа Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΎΠ΄Π½ΠΎ ΠΈ Ρ‚ΠΎ ΠΆΠ΅. ΠŸΡ€ΠΈΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Π² стилС C выглядит Ρ‚Π°ΠΊ:


(T) expression // привСсти expression ΠΊ Ρ‚ΠΈΠΏΡƒ T


Π€ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹ΠΉ синтаксис привСдСния Ρ‚Π°ΠΊΠΎΠ²:


T( expression) // привСсти expression ΠΊ Ρ‚ΠΈΠΏΡƒ T


ΠœΠ΅ΠΆΠ΄Ρƒ этими двумя Ρ„ΠΎΡ€ΠΌΠ°ΠΌΠΈ Π½Π΅Ρ‚ ΠΎΡ‰ΡƒΡ‚ΠΈΠΌΠΎΠ³ΠΎ различия, просто скобки Ρ€Π°ΡΡΡ‚Π°Π²Π»ΡΡŽΡ‚ΡΡ ΠΏΠΎ-Ρ€Π°Π·Π½ΠΎΠΌΡƒ. Π― Π½Π°Π·Ρ‹Π²Π°ΡŽ эти Ρ„ΠΎΡ€ΠΌΡ‹ привСдСниями Π² старом стилС.

C++ Ρ‚Π°ΠΊΠΆΠ΅ прСдставляСт Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅ Π½ΠΎΠ²Ρ‹Π΅ Ρ„ΠΎΡ€ΠΌΡ‹ привСдСния Ρ‚ΠΈΠΏΠΎΠ² (часто Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΡ‹Π΅ привСдСниями Π² стилС Π‘++):


const_cast<T>(expression)

dynamic_cast<T>(expression)

reinterpret_cast<T>(expression)

static_cast<T>(expression)


Π£ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΈΠ· Π½ΠΈΡ… своС Π½Π°Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅:

β€’ const_cast ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ примСняСтся для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΡ‚Π±Ρ€ΠΎΡΠΈΡ‚ΡŒ ΠΊΠΎΠ½ΡΡ‚Π°Π½Ρ‚Π½ΠΎΡΡ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°. НикакоС Π΄Ρ€ΡƒΠ³ΠΎΠ΅ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Π² стилС C++ Π½Π΅ позволяСт это ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ;

β€’ dynamic_cast примСняСтся Π³Π»Π°Π²Π½Ρ‹ΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ для выполнСния «бСзопасного ΠΏΠΎΠ½ΠΈΠΆΠ°ΡŽΡ‰Π΅Π³ΠΎ привСдСния» (downcasting). Π­Ρ‚ΠΎΡ‚ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ позволяСт ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ, ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠΈΡ‚ Π»ΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Π΄Π°Π½Π½ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ° Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΈΠ΅Ρ€Π°Ρ€Ρ…ΠΈΠΈ наслСдования. Π­Ρ‚ΠΎ СдинствСнный Π²ΠΈΠ΄ привСдСния, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ с использованиСм старого синтаксиса. Π­Ρ‚ΠΎ Ρ‚Π°ΠΊΠΆΠ΅ СдинствСнноС ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ΠΈΠ΅, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΡ‰ΡƒΡ‚ΠΈΠΌΡ‹Ρ… Π·Π°Ρ‚Ρ€Π°Ρ‚ Π²ΠΎ врСмя исполнСния (ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅ ΠΏΠΎΠ·ΠΆΠ΅);

β€’ reinterpret_cast ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½ для Π½ΠΈΠ·ΠΊΠΎΡƒΡ€ΠΎΠ²Π½Π΅Π²Ρ‹Ρ… ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ΠΈΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠΎΡ€ΠΎΠΆΠ΄Π°ΡŽΡ‚ зависимыС ΠΎΡ‚ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ (Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ нСпСрСносимыС) Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ указатСля ΠΊ int. Π’Π½Π΅ Π½ΠΈΠ·ΠΊΠΎΡƒΡ€ΠΎΠ²Π½Π΅Π²ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π° Ρ‚Π°ΠΊΠΎΠ΅ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Ρ€Π΅Π΄ΠΊΠΎ. Π― использовал Π΅Π³ΠΎ Π² этой ΠΊΠ½ΠΈΠ³Π΅ лишь ΠΎΠ΄Π½Π°ΠΆΠ΄Ρ‹, ΠΊΠΎΠ³Π΄Π° обсуТдал написаниС ΠΎΡ‚Π»Π°Π΄ΠΎΡ‡Π½ΠΎΠ³ΠΎ распрСдСлитСля памяти (см. ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ 50);

β€’ static_cast ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ использован для явного прСобразования Ρ‚ΠΈΠΏΠΎΠ² (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, нСконстантных ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² ΠΊ константным (ΠΊΠ°ΠΊ Π² ΠΏΡ€Π°Π²ΠΈΠ»Π΅ 3), int ΠΊ double ΠΈ Ρ‚. ΠΏ.). Он Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ использован для выполнСния ΠΎΠ±Ρ€Π°Ρ‚Π½Ρ‹Ρ… ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠΉ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ void* ΠΊ Ρ‚ΠΈΠΏΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΌ указатСлям, ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ Π½Π° Π±Π°Π·ΠΎΠ²Ρ‹ΠΉ класс ΠΊ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŽ Π½Π° ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹ΠΉ). Но привСсти константный ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΠΊ нСконстантному этот ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ (это Π²ΠΎΡ‚Ρ‡ΠΈΠ½Π° const_cast).

ΠŸΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ΠΈΠΉ Π² старом стилС остаСтся Π²ΠΏΠΎΠ»Π½Π΅ Π·Π°ΠΊΠΎΠ½Π½Ρ‹ΠΌ, Π½ΠΎ Π½ΠΎΠ²Ρ‹Π΅ Ρ„ΠΎΡ€ΠΌΡ‹ ΠΏΡ€Π΅Π΄ΠΏΠΎΡ‡Ρ‚ΠΈΡ‚Π΅Π»ΡŒΠ½Π΅Π΅. Π’ΠΎ-ΠΏΠ΅Ρ€Π²Ρ‹Ρ…, ΠΈΡ… Π³ΠΎΡ€Π°Π·Π΄ΠΎ Π»Π΅Π³Ρ‡Π΅ Π½Π°ΠΉΡ‚ΠΈ Π² ΠΊΠΎΠ΄Π΅ (ΠΈ для Ρ‡Π΅Π»ΠΎΠ²Π΅ΠΊΠ°, ΠΈ для инструмСнта, ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎΠ³ΠΎ grep), Ρ‡Ρ‚ΠΎ ΡƒΠΏΡ€ΠΎΡ‰Π°Π΅Ρ‚ процСсс поиска Π² ΠΊΠΎΠ΄Π΅ Ρ‚Π΅Ρ… мСст, Π³Π΄Π΅ систСма Ρ‚ΠΈΠΏΠΈΠ·Π°Ρ†ΠΈΠΈ подвСргаСтся опасности. Π’ΠΎ-Π²Ρ‚ΠΎΡ€Ρ‹Ρ…, Π±ΠΎΠ»Π΅Π΅ ΡƒΠ·ΠΊΠΎ спСциализированноС Π½Π°Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° привСдСния Π΄Π°Π΅Ρ‚ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ компиляторам Π΄ΠΈΠ°Π³Π½ΠΎΡΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ошибки ΠΈΡ… использования. НапримСр, Ссли Π²Ρ‹ ΠΏΠΎΠΏΡ‹Ρ‚Π°Π΅Ρ‚Π΅ΡΡŒ ΠΈΠ·Π±Π°Π²ΠΈΡ‚ΡŒΡΡ ΠΎΡ‚ константности, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ любой ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ привСдСния Π² стилС C++, ΠΊΡ€ΠΎΠΌΠ΅ const_cast, Ρ‚ΠΎ ваш ΠΊΠΎΠ΄ Π½Π΅ откомпилируСтся.

Π― ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Π² старом стилС Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‚ΠΎΠ³Π΄Π°, ΠΊΠΎΠ³Π΄Π° Ρ…ΠΎΡ‡Ρƒ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ explicit конструктор, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Π² качСствС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. НапримСр:


class Widget {

public:

explicit Widget(int size);

...

};

void doSomeWork(const Widget& w);

doSomeWork(Widget(15)); // ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Widget ΠΈΠ· int

// с Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹ΠΌ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ΠΌ

doSomeWork(static_cast<Widget>(15)); // ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Widget ΠΈΠ· int

// с ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ΠΌ Π² стилС C++


Но Π½Π°ΠΌΠ΅Ρ€Π΅Π½Π½ΠΎΠ΅ созданиС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Π½Π΅ «ощущаСтся» ΠΊΠ°ΠΊ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠ°, поэтому Π² Π΄Π°Π½Π½ΠΎΠΌ случаС, Π½Π°Π²Π΅Ρ€Π½ΠΎΠ΅, Π»ΡƒΡ‡ΡˆΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΠ΅ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ вмСсто static_cast. Π”Π° ΠΈ Π²ΠΎΠΎΠ±Ρ‰Π΅, ΠΊΠΎΠ΄, Π²Π΅Π΄ΡƒΡ‰ΠΈΠΉ ΠΊ Π°Π²Π°Ρ€ΠΈΠΉΠ½ΠΎΠΌΡƒ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡŽ, ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ выглядит ΡΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½Π½ΠΎ Ρ€Π°Π·ΡƒΠΌΠ½Ρ‹ΠΌ, ΠΊΠΎΠ³Π΄Π° Π²Ρ‹ Π΅Π³ΠΎ ΠΏΠΈΡˆΠ΅Ρ‚Π΅, поэтому Π»ΡƒΡ‡ΡˆΠ΅ Π½Π΅ ΠΎΠ±Ρ€Π°Ρ‰Π°Ρ‚ΡŒ внимания Π½Π° ощущСния ΠΈ всСгда ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ привСдСниями Π² Π½ΠΎΠ²ΠΎΠΌ стилС.

МногиС программисты ΠΏΠΎΠ»Π°Π³Π°ΡŽΡ‚, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠ° всСго лишь Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚ компилятору, Ρ‡Ρ‚ΠΎ Π½ΡƒΠΆΠ½ΠΎ Ρ‚Ρ€Π°ΠΊΡ‚ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ΄ΠΈΠ½ Ρ‚ΠΈΠΏ ΠΊΠ°ΠΊ Π΄Ρ€ΡƒΠ³ΠΎΠΉ, Π½ΠΎ ΠΎΠ½ΠΈ Π·Π°Π±Π»ΡƒΠΆΠ΄Π°ΡŽΡ‚ΡΡ. ΠŸΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΡ Ρ‚ΠΈΠΏΠ° любого Ρ€ΠΎΠ΄Π° (ΠΊΠ°ΠΊ явныС, посрСдством привСдСния, Ρ‚Π°ΠΊ ΠΈ нСявныС, выполняСмыС самим компилятором) часто приводят ΠΊ появлСнию ΠΊΠΎΠ΄Π°, исполняСмого Π²ΠΎ врСмя Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. Рассмотрим ΠΏΡ€ΠΈΠΌΠ΅Ρ€:


int x, y;

...

double d = static_cast<double>(x)/y; // дСлСниС x на y с использованиСм

// дСлСния с ΠΏΠ»Π°Π²Π°ΡŽΡ‰Π΅ΠΉ Ρ‚ΠΎΡ‡ΠΊΠΎΠΉ


ΠŸΡ€ΠΈΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ int x ΠΊ Ρ‚ΠΈΠΏΡƒ double ΠΏΠΎΡ‡Ρ‚ΠΈ навСрняка ΠΏΠΎΡ€ΠΎΠΆΠ΄Π°Π΅Ρ‚ исполняСмый ΠΊΠΎΠ΄, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Π² Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π΅ Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅Π΅ прСдставлСниС int отличаСтся ΠΎΡ‚ прСдставлСния double. Если это вас Π½Π΅ особСнно ΡƒΠ΄ΠΈΠ²ΠΈΠ»ΠΎ, Π½ΠΎ взглянитС Π½Π° ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€:


class Base {...};

class Derived: public Base {...};

Derived d;

Base *pb = &d; // нСявноС ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ Derived*

// Π² Base*


Π—Π΄Π΅ΡΡŒ ΠΌΡ‹ всСго лишь создали ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ класса Π½Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½ΠΎΠ³ΠΎ, Π½ΠΎ ΠΈΠ½ΠΎΠ³Π΄Π° эти Π΄Π²Π° указатСля ΡƒΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‚ вовсС Π½Π΅ Π½Π° ΠΎΠ΄Π½ΠΎ ΠΈ Ρ‚ΠΎ ΠΆΠ΅. Π’ Ρ‚Π°ΠΊΠΎΠΌ случаС Π²ΠΎ врСмя исполнСния ΠΊ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŽ Derived* прибавляСтся смСщСниС, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ указатСля Base*.

ПослСдний ΠΏΡ€ΠΈΠΌΠ΅Ρ€ дСмонстрируСт, Ρ‡Ρ‚ΠΎ ΠΎΠ΄ΠΈΠ½ ΠΈ Ρ‚ΠΎΡ‚ ΠΆΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Ρ‚ΠΈΠΏΠ° Derived) ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ Π±ΠΎΠ»Π΅Π΅ ΠΎΠ΄Π½ΠΎΠ³ΠΎ адрСса (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, адрСс ΠΏΡ€ΠΈ ΡƒΠΊΠ°Π·Π°Π½ΠΈΠΈ Π½Π° Π½Π΅Π³ΠΎ ΠΊΠ°ΠΊ Π½Π° Base* отличаСтся ΠΎΡ‚ адрСса ΠΏΡ€ΠΈ ΡƒΠΊΠ°Π·Π°Π½ΠΈΠΈ ΠΊΠ°ΠΊ Π½Π° Derived*). Π’Π°ΠΊΠΎΠ΅ Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ Π² C. Π’Π°ΠΊΠΎΠ΅ Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ Π² Java. Π’Π°ΠΊΠΎΠ³ΠΎ Π½Π΅ Π±Ρ‹Π²Π°Π΅Ρ‚ Π² C#. Но это случаСтся Π² C++. ЀактичСски, ΠΊΠΎΠ³Π΄Π° примСняСтся мноТСствСнноС наслСдованиС, Ρ‚Π°ΠΊΠΎΠ΅ случаСтся сплошь ΠΈ рядом, Π½ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΎΠΈΠ·ΠΎΠΉΡ‚ΠΈ ΠΈ ΠΏΡ€ΠΈ ΠΎΠ΄ΠΈΠ½ΠΎΡ‡Π½ΠΎΠΌ наслСдовании. Π­Ρ‚ΠΎ ΠΊΠΎ всСму ΠΏΡ€ΠΎΡ‡Π΅ΠΌΡƒ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ, программируя Π½Π° C++, Π²Ρ‹ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ ΠΎ Ρ‚ΠΎΠΌ, ΠΊΠ°ΠΊ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Ρ€Π°ΡΠΏΠΎΠ»Π°Π³Π°ΡŽΡ‚ΡΡ Π² памяти, ΠΈ ΡƒΠΆ Ρ‚Π΅ΠΌ Π±ΠΎΠ»Π΅Π΅ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠΎΠ² Π½Π° Π±Π°Π·Π΅ этих ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ. НапримСр, ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ адрСса ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° ΠΊ Ρ‚ΠΈΠΏΡƒ char* ΠΈ ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅ использованиС арифмСтичСских ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ Π½Π°Π΄ указатСлями ΠΏΠΎΡ‡Ρ‚ΠΈ всСгда становятся ΠΏΡ€ΠΈΡ‡ΠΈΠ½ΠΎΠΉ Π½Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ³ΠΎ повСдСния.

Π—Π°ΠΌΠ΅Ρ‚ΡŒΡ‚Π΅, я сказал, Ρ‡Ρ‚ΠΎ смСщСниС трСбуСтся ΠΏΡ€ΠΈΠ±Π°Π²Π»ΡΡ‚ΡŒ Β«ΠΈΠ½ΠΎΠ³Π΄Π°Β». Бпособы размСщСния ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Π² памяти ΠΈ способы вычислСния ΠΈΡ… адрСсов ΠΈΠ·ΠΌΠ΅Π½ΡΡŽΡ‚ΡΡ ΠΎΡ‚ компилятора ΠΊ компилятору. А Π·Π½Π°Ρ‡ΠΈΡ‚, ΠΈΠ· Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ Β«Π²Ρ‹ Π·Π½Π°Π΅Ρ‚Π΅, ΠΊΠ°ΠΊ хранится ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Π² памяти» Π½Π° ΠΎΠ΄Π½ΠΎΠΉ ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ΅, вовсС Π½Π΅ слСдуСт, Ρ‡Ρ‚ΠΎ Π½Π° Π΄Ρ€ΡƒΠ³ΠΈΡ… всС Π±ΡƒΠ΄Π΅Ρ‚ устроСно Ρ‚ΠΎΡ‡Π½ΠΎ Ρ‚Π°ΠΊ ΠΆΠ΅. ΠœΠΈΡ€ ΠΏΠΎΠ»ΠΎΠ½ программистов, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ усвоили этот ΡƒΡ€ΠΎΠΊ, Π·Π°ΠΏΠ»Π°Ρ‚ΠΈΠ² слишком Π²Ρ‹ΡΠΎΠΊΡƒΡŽ Ρ†Π΅Π½Ρƒ.

Π˜Π½Ρ‚Π΅Ρ€Π΅ΡΠ½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚, ΠΊΠ°ΡΠ°ΡŽΡ‰ΠΈΠΉΡΡ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ΠΈΠΉ, β€“ Π΅Ρ‰Π΅ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π»Π΅Π³ΠΊΠΎ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΊΠΎΠ΄, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ выглядит ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹ΠΌ (ΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹ΠΌ Π½Π° Π΄Ρ€ΡƒΠ³ΠΈΡ… языках), Π½ΠΎ Π½Π° самом Π΄Π΅Π»Π΅ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹ΠΌ Π½Π΅ являСтся. НапримСр, Π²ΠΎ ΠΌΠ½ΠΎΠ³ΠΈΡ… каркасах для Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ трСбуСтся, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ-Ρ‡Π»Π΅Π½Ρ‹, ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Π΅ Π² ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹Ρ… классах, Π²Π½Π°Ρ‡Π°Π»Π΅ Π²Ρ‹Π·Ρ‹Π²Π°Π»ΠΈ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈΠ· Π±Π°Π·ΠΎΠ²Ρ‹Ρ… классов. ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Ρ‡Ρ‚ΠΎ Ρƒ нас Π΅ΡΡ‚ΡŒ Π±Π°Π·ΠΎΠ²Ρ‹ΠΉ класс Window ΠΈ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹ΠΉ ΠΎΡ‚ Π½Π΅Π³ΠΎ класс SpecialWindow, ΠΏΡ€ΠΈΡ‡Π΅ΠΌ Π² ΠΎΠ±ΠΎΠΈΡ… ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π° Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Π°Ρ функция onResize. Π”Π°Π»Π΅Π΅ ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Ρ‡Ρ‚ΠΎ onResize ΠΈΠ· SpecialWindow Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ сначала onResize ΠΈΠ· Window. Π‘Π»Π΅Π΄ΡƒΡŽΡ‰Π°Ρ рСализация выглядит Ρ…ΠΎΡ€ΠΎΡˆΠΎ, Π½ΠΎ ΠΏΠΎ сути Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Π°:


class Window { // Π±Π°Π·ΠΎΠ²Ρ‹ΠΉ класс

public:

virtual void onResize() {...} // рСализация onResize Π² Π±Π°Π·ΠΎΠ²ΠΎΠΌ

... // классС

};

class SpecialWindow: public Window { // ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹ΠΉ класс

public:

virtual void onResize() { // рСализация onResize

static_cast<Window>(*this).onResize(); // Π² ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½ΠΎΠΌ классС;