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

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ «Освой ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ Π‘++ Π·Π° 21 дСнь.Β». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 139

Автор ДТСсс Π›ΠΈΠ±Π΅Ρ€Ρ‚ΠΈ

Π§Ρ‚ΠΎΠ±Ρ‹ ΠΈΠΌΠ΅Ρ‚ΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ быстро ΠΈΡΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ Π²ΠΎΠ·Π½ΠΈΠΊΠ°ΡŽΡ‰ΠΈΠ΅ ошибки ΠΈ ΠΌΠΎΠ΄Π΅Ρ€Π½ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ Π² соотвСтствии с трСбованиями Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ дня, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Ρ‚Π°ΠΊ ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹ΠΉ ΠΊΠΎΠ΄, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Ρ€Π°Π·ΠΎΠ±Ρ€Π°Ρ‚ΡŒΡΡ Π² Π½Π΅ΠΌ ΠΏΠΎ ΠΏΡ€ΠΎΡˆΠ΅ΡΡ‚Π²ΠΈΡŽ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ ΠΌΠΎΠ³Π»ΠΈ Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π²Ρ‹, Π½ΠΎ ΠΈ любой Π΄Ρ€ΡƒΠ³ΠΎΠΉ программист.


ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅:"Π“Π½ΠΈΠ»ΠΎΠΉ" ΠΊΠΎΠ΄ β€” это ΡˆΡƒΡ‚Π»ΠΈΠ²Ρ‹ΠΉ Ρ‚Π΅Ρ€ΠΌΠΈΠ½, ΠΏΡ€ΠΈΠ΄ΡƒΠΌΠ°Π½Π½Ρ‹ΠΉ программистами для объяснСния Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ Ρ…ΠΎΡ€ΠΎΡˆΠΎ ΠΎΡ‚Π»Π°ΠΆΠ΅Π½Π½Ρ‹Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π²Π΄Ρ€ΡƒΠ³ становятся Π½Π΅Π½Π°Π΄Π΅ΠΆΠ½Ρ‹ΠΌΠΈ ΠΈ нСэффСктивными. Об этом явлСнии Π½Π΅ стоит Π·Π°Π±Ρ‹Π²Π°Ρ‚ΡŒ, вСдь ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ часто Π±Ρ‹Π²Π°ΡŽΡ‚ Ρ‡Ρ€Π΅Π·Π²Ρ‹Ρ‡Π°ΠΉΠ½ΠΎ слоТными, ΠΈΠ·-Π·Π° Ρ‡Π΅Π³ΠΎ ΠΌΠ½ΠΎΠ³ΠΈΠ΅ ошибки, ΠΏΠΎΠ³Ρ€Π΅ΡˆΠ½ΠΎΡΡ‚ΠΈ ΠΈ ляпсусы ΠΌΠΎΠ³ΡƒΡ‚ Π΄ΠΎΠ»Π³ΠΎΠ΅ врСмя ΠΎΡΡ‚Π°Π²Π°Ρ‚ΡŒΡΡ Π² Ρ‚Π΅Π½ΠΈ, ΠΏΠΎΠΊΠ° Π½Π΅ проявят сСбя Π²ΠΎ всСй красС. Для Π·Π°Ρ‰ΠΈΡ‚Ρ‹ ΠΎΡ‚ ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎΠΉ "плСсСни" Π½ΡƒΠΆΠ½ΠΎ ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΊΠΎΠ΄ Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ самим Π±Ρ‹Π»ΠΎ нСслоТно ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Ρ‚ΡŒ Π΅Π³ΠΎ Ρ€Π°Π±ΠΎΡ‚ΠΎΡΠΏΠΎΡΠΎΠ±Π½ΠΎΡΡ‚ΡŒ.


Π­Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ ваш ΠΊΠΎΠ΄ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎ ΠΏΡ€ΠΎΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½, Π΄Π°ΠΆΠ΅ Ссли Π²Ρ‹ ΠΈ Π½Π΅ ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π΅Ρ‚Π΅, Ρ‡Ρ‚ΠΎ ΠΊΡ‚ΠΎ-Ρ‚ΠΎ Π΄Ρ€ΡƒΠ³ΠΎΠΉ, ΠΊΡ€ΠΎΠΌΠ΅ вас, ΠΌΠΎΠΆΠ΅Ρ‚ Π·Π°Π³Π»ΡΠ½ΡƒΡ‚ΡŒ Π² Π½Π΅Π³ΠΎ. Когда ΠΏΡ€ΠΎΠΉΠ΄Π΅Ρ‚ мСсяцСв ΡˆΠ΅ΡΡ‚ΡŒ послС Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ Π²Ρ‹ ΠΏΠ΅Ρ€Π΅Π΄Π°Π΄ΠΈΡ‚Π΅ свой ΠΊΠΎΠ΄ Π·Π°ΠΊΠ°Π·Ρ‡ΠΈΠΊΡƒ, Π²Ρ‹ сами Π±ΡƒΠ΄Π΅Ρ‚Π΅ ΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Π½Π° свою ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ Π³Π»Π°Π·Π°ΠΌΠΈ постороннСго Ρ‡Π΅Π»ΠΎΠ²Π΅ΠΊΠ° ΠΈ ΡƒΠ΄ΠΈΠ²Π»ΡΡ‚ΡŒΡΡ Ρ‚ΠΎΠΌΡƒ, ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ Ρ‚Π°ΠΊΠΎΠΉ нСпонятный ΠΈ извилистый ΠΊΠΎΠ΄, надСясь ΠΏΡ€ΠΈ этом Π½Π° ΡƒΡΠΏΠ΅ΡˆΠ½ΡƒΡŽ Ρ€Π°Π±ΠΎΡ‚Ρƒ.

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

Π’ C++ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ β€” это ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ пСрСдаСтся ΠΈΠ· области ΠΊΠΎΠ΄Π°, Π³Π΄Π΅ Π²ΠΎΠ·Π½ΠΈΠΊΠ»Π° ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°, Π² Ρ‚Ρƒ Ρ‡Π°ΡΡ‚ΡŒ ΠΊΠΎΠ΄Π°, Π³Π΄Π΅ эта ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° обрабатываСтся. Π’ΠΈΠΏ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ опрСдСляСт, какая ΠΎΠ±Π»Π°ΡΡ‚ΡŒ ΠΊΠΎΠ΄Π° Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ ΠΈ ΠΊΠ°ΠΊ содСрТимоС ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°, Ссли ΠΎΠ½ сущСствуСт, ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ для ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠΉ связи с ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ. Основная идСя использования ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ довольно проста.

β€’ ЀактичСскоС распрСдСлСниС рСсурсов (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, распрСдСлСниС памяти ΠΈΠ»ΠΈ Π·Π°Ρ…Π²Π°Ρ‚ Ρ„Π°ΠΉΠ»Π°) ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ осущСствляСтся Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ Π½Π° Π½ΠΈΠ·ΠΊΠΎΠΌ ΡƒΡ€ΠΎΠ²Π½Π΅.

β€’ Π’Ρ‹Ρ…ΠΎΠ΄ ΠΈΠ· ΠΈΡΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ ситуации, возникшСй ΠΏΡ€ΠΈ сбоС ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ ΠΈΠ·-Π·Π° Π½Π΅Ρ…Π²Π°Ρ‚ΠΊΠΈ памяти ΠΈΠ»ΠΈ Π·Π°Ρ…Π²Π°Ρ‚Π° Ρ„Π°ΠΉΠ»Π° Π΄Ρ€ΡƒΠ³ΠΈΠΌ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΠΌ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ рСализуСтся Π½Π° высоком ΡƒΡ€ΠΎΠ²Π½Π΅ программирования Π² ΠΊΠΎΠ΄Π΅, ΠΎΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‰Π΅ΠΌ взаимодСйствиС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ с ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ.

β€’ Π˜ΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΠ²Π°ΡŽΡ‚ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ ΠΎΡ‚ ΠΊΠΎΠ΄Π° распрСдСлСния рСсурсов ΠΊ ΠΊΠΎΠ΄Ρƒ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΈΡΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ ситуации. Π–Π΅Π»Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΊΠΎΠ΄ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΈΡΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ ситуации Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ отслСТивал Π΅Π΅ появлСниС, Π½ΠΎ ΠΈ ΠΌΠΎΠ³ ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΡ‚ΡŒ элСгантный Π²Ρ‹Ρ…ΠΎΠ΄ ΠΈΠ· ΠΈΡΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ ситуации, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΎΡ‚ΠΌΠ΅Π½Ρƒ выдСлСния памяти Π² случаС Π΅Π΅ Π½Π΅Ρ…Π²Π°Ρ‚ΠΊΠΈ.

Как ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ

Π‘ΠΎΠ·Π΄Π°ΡŽΡ‚ΡΡ Π±Π»ΠΎΠΊΠΈ try для помСщСния Π² Π½ΠΈΡ… Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚ΠΎΠ² ΠΊΠΎΠ΄Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€:

try

{

   SomeDangerousFunction();

}

Π˜ΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ, возникшиС Π² Π±Π»ΠΎΠΊΠ°Ρ… try, ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°ΡŽΡ‚ΡΡ Π² Π±Π»ΠΎΠΊΠ°Ρ… catch, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€:

try

{

   SomeDangerousFunction();

}

catch(OutOfMemory)

{

   // ΠΏΡ€Π΅Π΄ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅ΠΌ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ дСйствия

}

catch(FileNotFound)

{

   // ΠΏΡ€Π΅Π΄ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅ΠΌ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ дСйствия

}

НиТС ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Ρ‹ основныС ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΡ‹ использовании ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ.

1. Π˜Π΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΡ†ΠΈΡ€ΡƒΠΉΡ‚Π΅ Ρ‚Π΅ области ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, Π³Π΄Π΅ начинаСтся Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ, которая ΠΌΠΎΠ³Π»Π° Π±Ρ‹ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ ΠΈΡΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΡƒΡŽ ΡΠΈΡ‚ΡƒΠ°Ρ†ΠΈΡŽ, ΠΈ помСститС ΠΈΡ… Π² Π±Π»ΠΎΠΊΠΈ try.

2. Π‘ΠΎΠ·Π΄Π°ΠΉΡ‚Π΅ Π±Π»ΠΎΠΊΠΈ catch для ΠΏΠ΅Ρ€Π΅Ρ…Π²Π°Ρ‚Π° ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ, Ссли Ρ‚Π°ΠΊΠΎΠ²Ρ‹Π΅ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΡƒΡ‚, очистки Π²Ρ‹Π΄Π΅Π»Π΅Π½Π½ΠΎΠΉ памяти ΠΈ информирования ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ. Π’ листингС 20.1 ΠΈΠ»Π»ΡŽΡΡ‚Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ΡΡ использованиС Π±Π»ΠΎΠΊΠΎΠ² try ΠΈ catch.

Π˜ΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ β€” это ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ для ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΎ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ΅.

Π‘Π»ΠΎΠΊ try β€” это Π·Π°ΠΊΠ»ΡŽΡ‡Π΅Π½Π½Ρ‹ΠΉ Π² Ρ„ΠΈΠ³ΡƒΡ€Π½Ρ‹Π΅ скобки Π±Π»ΠΎΠΊ, содСрТащий Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚Ρ‹ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, способныС Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ ΠΈΡΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ ситуации.

Π‘Π»ΠΎΠΊ catch β€” это Π±Π»ΠΎΠΊ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ слСдуСт Π·Π° Π±Π»ΠΎΠΊΠΎΠΌ try ΠΈ Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ выполняСтся ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ.

ΠŸΡ€ΠΈ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΈΠΈ ΠΈΡΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ ситуации ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ пСрСдаСтся Π±Π»ΠΎΠΊΡƒ catch, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ слСдуСт сразу Π·Π° Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΌ Π±Π»ΠΎΠΊΠΎΠΌ try.


ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅:НСкоторыС ΠΎΡ‡Π΅Π½ΡŒ старыС компиляторы Π½Π΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‚ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ. Однако ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ являСтся Ρ‡Π°ΡΡ‚ΡŒΡŽ стандарта ANSI C++. ВсС соврСмСнныС вСрсии компиляторов ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‚ эту Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ. Если Ρƒ вас ΡƒΡΡ‚Π°Ρ€Π΅Π²ΡˆΠΈΠΉ компилятор, Π²Ρ‹ Π½Π΅ смоТСтС ΡΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ листинги, ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹Π΅ Π½Π° этом занятии. Однако всС ΠΆΠ΅ стоит ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ прСдставлСнный ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π» Π΄ΠΎ ΠΊΠΎΠ½Ρ†Π°, Π° Π·Π°Ρ‚Π΅ΠΌ Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒΡΡ ΠΊ Π½Π΅ΠΌΡƒ послС обновлСния своСго компилятора.


Листинг 20.1. Π’ΠΎΠ·Π½ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΈΠ΅ ΠΈΡΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ ситуации

1: #include <iostream.h>

2:

3: const int DefaultSize = 10;

4:

5: class Array

6: {

7:    public:

8:       // конструкторы

9:       Array(int itsSize = DefaultSize);

10:      Array(const Array &rhs);

11:      ~Array() { delete [] pType;}

12:

13:      // ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹

14:      Array& operator=(const Array&);

15:      int& operator[](int offSet);

16:      const int& operator[](int offSet) const;

17:

18:      // ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ доступа

19:      int GetitsSize() const { return itsSize; }

20:

21:      // функция-Π΄Ρ€ΡƒΠ³

22:      friend ostream& operator<< (ostream&, const Array&);

23:

24:      class xBoundary { } ; // опрСдСляСм класс ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ

25:   private:

26:      int *pType;

27:      int itsSize;

28: };

29:

30:

31: Array::Array(intsize):

32: itsSize(size)

33: {

34:    Ρ€Π’ΡƒΡ€Π΅ = new int[size];

35:    for (int i = 0; i<size; i++)

36:    pType[i] = 0;

37: }

38:

39:

40: Array& Array::operator=(const Array &rhs)

41: {

42:    if (this == &rhs)

43:       return *thts;

44:    delete [] pType;

45:    itsSize = rhs.GetitsSiza();

46:    pType = new int[itsSize];

47:    for (int i = 0; i<itsSize; i++)

48:       pType[i] = rhs[i];

49:    return *this;

50: }

51:

52: Array::Array(const Array &rhs)

53: {

54:    itsSize = rhs.GetitsSize();

55:    pType = new int[itsSize];

56:    for (int i = 0; i<itsSize; i++)

57:       pType[i] = rhs[i];

58: }

59:

60:

61: int& Array::operator[](int offSet)

62: {

63:    int size = GetitsSize();

64:    if (offSet >= 0 && offSet < GetitsSize())

65:       return pType[offSet];

66:    throw xBoundary();

67:    return pType[0]; // Ρ‚Ρ€Π΅Π±ΠΎΠ²Π°Π½ΠΈΠ΅ компилятора

68: }

69:

70:

71: const int& Array::operator[](int offSet) const

72: {

73:    int mysize = GetitsSize();

74:    if (offSet >= 0 && offSet < GetitsSize())

75:       return pType[offSet];

76:    throw xBoundary();

77:    return pType[0]; // Ρ‚Ρ€Π΅Π±ΠΎΠ²Π°Π½ΠΈΠ΅ компилятора

78: }

79:

80: ostream& operator<< (ostream& output, const Array& theArray)

81: {

82:    for (int i = 0; i<theArray,GetitsSize(); i++)

83:       output << "[" << i << "] " << theArray[i] << endl;

84:    return output;

85: }

86:

87: int main()

88: {

89:    Array intArray(20);

90:    try

91:    {

92:       for (int ] << 0; j< 100; j++)

93:       {

94:          intArray[j] = j;

95:          cout << "intArray[" << j << "] okay..." << endl;

96:       }

97:    }

98:    catch (Array::xBoundary)

99:    {

100:      cout << "Unable to process your input!\n";

101:   }

102:   cout << "Done.\n";

103:   return 0;

104: }


Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚:

intArray[0] okay...

intArray[1] okay...

intArray[2] okay...

intArray[3] okay...

intArray[4] okay...

intArray[5] okay...

intArray[6] okay...

intArray[7] okay...

intArray[8] okay...

intArray[9] okay...

intArray[10] okay...

intArray[11] okay...

intArray[12] okay...

intArray[13] okay...

intArray[14] okay...

intArray[15] okay...

intArray[16] okay...

intArray[17] okay...

intArray[18] okay...

intArray[19] okay...

Unable to process your input!

Done.


Анализ: Π’ листингС 20.1 прСдставлСн нСсколько усСчСнный класс Array, основанный Π½Π° шаблонС, Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Π°Π½Π½ΠΎΠΌ Π½Π° занятии 19.

Π’ строкС 24 ΠΎΠ±ΡŠΡΠ²Π»ΡΠ΅Ρ‚ΡΡ Π½ΠΎΠ²Ρ‹ΠΉ класс xBoundary Π²Π½ΡƒΡ‚Ρ€ΠΈ объявлСния внСшнСго класса Array.

Π’ этом Π½ΠΎΠ²ΠΎΠΌ классС Π½ΠΈ ΠΏΠΎ ΠΊΠ°ΠΊΠΈΠΌ внСшним ΠΏΡ€ΠΈΠ·Π½Π°ΠΊΠ°ΠΌ нСльзя ΡƒΠ·Π½Π°Ρ‚ΡŒ класс ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΈΡΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… ситуаций. Он Ρ‡Ρ€Π΅Π·Π²Ρ‹Ρ‡Π°ΠΉΠ½ΠΎ прост ΠΈ Π½Π΅ содСрТит Π½ΠΈΠΊΠ°ΠΊΠΈΡ… Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ². Π’Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅ это Π²ΠΏΠΎΠ»Π½Π΅ работоспособный класс.

На самом Π΄Π΅Π»Π΅ Π±Ρ‹Π»ΠΎ Π±Ρ‹ Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ Π½Π΅ содСрТит Π½ΠΈΠΊΠ°ΠΊΠΈΡ… ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ², ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ компилятор автоматичСски Π½Π°Π·Π½Π°Ρ‡Π°Π΅Ρ‚ Π΅ΠΌΡƒ стандартный конструктор, дСструктор, конструктор-ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Ρ‰ΠΈΠΊ ΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ присваивания (=), поэтому Ρƒ Π½Π΅Π³ΠΎ фактичСски Π΅ΡΡ‚ΡŒ Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°, Π½ΠΎ Π½Π΅Ρ‚ Π΄Π°Π½Π½Ρ‹Ρ….

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Π΅Π³ΠΎ объявлСниС Π²Π½ΡƒΡ‚Ρ€ΠΈ класса Array слуТит Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для объСдинСния Π΄Π²ΡƒΡ… классов. Как описано Π² Π³Π»Π°Π²Π΅ 15, класс Array Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ Π½ΠΈΠΊΠ°ΠΊΠΎΠ³ΠΎ особого доступа ΠΊ классу xBoundary, Π΄Π° ΠΈ класс xBoundary Π½Π΅ Π½Π°Π΄Π΅Π»Π΅Π½ прСимущСствСнным доступом ΠΊ Ρ‡Π»Π΅Π½Π°ΠΌ класса Array.

Π’ строках 61β€”68 ΠΈ 71β€”78 ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ индСксирования ([]) Π·Π°ΠΌΠ΅Ρ‰Π΅Π½Ρ‹ Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π²Π²Π΅Π΄Π΅Π½Π½Ρ‹ΠΉ индСкс смСщСния ΠΈ, Ссли ΠΎΠ½ΠΎ окаТСтся Π²Π½Π΅ допустимого Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π°, ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚ΡŒΡΡ ΠΊ классу xBoundary для создания ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ. НазначСниС ΠΊΡ€ΡƒΠ³Π»Ρ‹Ρ… скобок состоит Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΡ‚Π΄Π΅Π»ΠΈΡ‚ΡŒ ΠΎΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅ ΠΊ конструктору класса xBoundary ΠΎΡ‚ использования константы пСрСчислСния. ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ компиляторы ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠΈ Microsoft Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‚, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π² любом случаС Π·Π°ΠΊΠ°Π½Ρ‡ΠΈΠ²Π°Π»ΠΎΡΡŒ строкой с ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠΌ return, ΡΠΎΠ³Π»Π°ΡΡƒΡŽΡ‰Π΅ΠΉΡΡ ΠΏΠΎ Ρ‚ΠΈΠΏΡƒ с ΠΏΡ€ΠΎΡ‚ΠΎΡ‚ΠΈΠΏΠΎΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ (Π² Π΄Π°Π½Π½ΠΎΠΌ случаС Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅ ссылки Π½Π° цСлочислСнноС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅), нСсмотря Π½Π° Ρ‚ΠΎ Ρ‡Ρ‚ΠΎ Π² случаС возникновСния ΠΈΡΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ ситуации Π² строкС 66 Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ достигнСт строки 67. Π­Ρ‚ΠΎΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚ ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ логичСскиС ошибки Π½Π΅ Ρ‡ΡƒΠΆΠ΄Ρ‹ Π΄Π°ΠΆΠ΅ ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠΈ Microsoft!