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

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

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

1) ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²ΡŒΡ‚Π΅ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ-Ρ‡Π»Π΅Π½, которая эффСктивно ΠΎΠ±ΠΌΠ΅Π½ΠΈΠ²Π°Π΅Ρ‚ значСния Π΄Π²ΡƒΡ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² вашСго Ρ‚ΠΈΠΏΠ°. По ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π°ΠΌ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ я сСйчас объясню, эта функция Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½Π° Π²ΠΎΠ·Π±ΡƒΠΆΠ΄Π°Ρ‚ΡŒ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ;

2) ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²ΡŒΡ‚Π΅ ΡΠ²ΠΎΠ±ΠΎΠ΄Π½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ swap Π² Ρ‚ΠΎΠΌ ΠΆΠ΅ пространствС ΠΈΠΌΠ΅Π½, Ρ‡Ρ‚ΠΎ ΠΈ ваш класс ΠΈΠ»ΠΈ шаблон. ΠŸΡƒΡΡ‚ΡŒ ΠΎΠ½Π° Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ Π²Π°ΡˆΡƒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ-Ρ‡Π»Π΅Π½;

3) Ссли Π²Ρ‹ ΠΏΠΈΡˆΠ΅Ρ‚Π΅ класс (Π° Π½Π΅ шаблон), спСциализируйтС std::swap для вашСго класса. ΠŸΡƒΡΡ‚ΡŒ ΠΎΠ½Π° Ρ‚Π°ΠΊΠΆΠ΅ Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ Π²Π°ΡˆΡƒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ-Ρ‡Π»Π΅Π½.

НаконСц, Ссли Π²Ρ‹ Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚Π΅ swap, ΡƒΠ±Π΅Π΄ΠΈΡ‚Π΅ΡΡŒ, Ρ‡Ρ‚ΠΎ Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΎ using-объявлСниС, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π²Π²ΠΎΠ΄ΠΈΡ‚ std::swap Π² ΠΎΠ±Π»Π°ΡΡ‚ΡŒ видимости вашСй Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Π° Π·Π°Ρ‚Π΅ΠΌ Π²Ρ‹Π·Ρ‹Π²Π°ΠΉΡ‚Π΅ swap Π±Π΅Π· ΠΊΠ²Π°Π»ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ пространства ΠΈΠΌΠ΅Π½.

Π― Π΅Ρ‰Π΅ Π·Π°Π±Ρ‹Π» ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅Π΄ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ вСрсия Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ-Ρ‡Π»Π΅Π½Π° swap Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½Π° Π²ΠΎΠ·Π±ΡƒΠΆΠ΄Π°Ρ‚ΡŒ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ. Π”Π΅Π»ΠΎ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΎΠ΄Π½ΠΎ ΠΈΠ· Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ частых ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠΉ swap – ΠΏΠΎΠΌΠΎΡ‡ΡŒ классам (ΠΈ шаблонам классов) Π² прСдоставлСнии Π½Π°Π΄Π΅ΠΆΠ½Ρ‹Ρ… Π³Π°Ρ€Π°Π½Ρ‚ΠΈΠΉ бСзопасности ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ. Π’ ΠΏΡ€Π°Π²ΠΈΠ»Π΅ 29 Π²Ρ‹ Π½Π°ΠΉΠ΄Π΅Ρ‚Π΅ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ Π½Π° эту Ρ‚Π΅ΠΌΡƒ, Π° сСйчас лишь ΠΏΠΎΠ΄Ρ‡Π΅Ρ€ΠΊΠ½Π΅ΠΌ, Ρ‡Ρ‚ΠΎ Π² основС этого ΠΏΡ€ΠΈΠ΅ΠΌΠ° Π»Π΅ΠΆΠΈΡ‚ ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ swap, рСализованная Π² Π²ΠΈΠ΄Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ-Ρ‡Π»Π΅Π½Π°, Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ Π²ΠΎΠ·Π±ΡƒΠΆΠ΄Π°Π΅Ρ‚ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ. Π­Ρ‚ΠΎ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅ касаСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ-Ρ‡Π»Π΅Π½Π°! Оно Π½Π΅ относится ΠΊ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ swap Π² Π²ΠΈΠ΄Π΅ свободной Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ стандартная вСрсия swap ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ основана Π½Π° конструкторах копирования ΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π΅ присваивания, Π° этим функциям Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΎ Π²ΠΎΠ·Π±ΡƒΠΆΠ΄Π°Ρ‚ΡŒ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ. Когда Π²Ρ‹ ΠΏΠΈΡˆΠ΅Ρ‚Π΅ ΡΠΎΠ±ΡΡ‚Π²Π΅Π½Π½ΡƒΡŽ Π²Π΅Ρ€ΡΠΈΡŽ swap, Ρ‚ΠΎ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ прСдставляСтС Π½Π΅ просто эффСктивный способ ΠΎΠ±ΠΌΠ΅Π½Π° Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ, Π° Ρ‚Π°ΠΊΠΎΠΉ, ΠΏΡ€ΠΈ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ Π½Π΅ Π²ΠΎΠ·Π±ΡƒΠΆΠ΄Π°ΡŽΡ‚ΡΡ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ. ΠžΠ±Ρ‰Π΅Π΅ ΠΏΡ€Π°Π²ΠΈΠ» Ρ‚Π°ΠΊΠΎΠ²ΠΎ: эти Π΄Π²Π΅ характСристики swap ΠΈΠ΄ΡƒΡ‚ Ρ€ΡƒΠΊΠ° ΠΎΠ± Ρ€ΡƒΠΊΡƒ, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ высокоэффСктивныС ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ ΠΎΠ±ΠΌΠ΅Π½Π° всСгда основаны Π½Π° опСрациях Π½Π°Π΄ встроСнными Ρ‚ΠΈΠΏΠ°ΠΌΠΈ (Ρ‚Π°ΠΊΠΈΠΌΠΈ ΠΊΠ°ΠΊ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ, Π»Π΅ΠΆΠ°Ρ‰ΠΈΠ΅ Π² основС ΠΈΠ΄ΠΈΠΎΠΌΡ‹ pimpl), Π° ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Π½Π°Π΄ встроСнными Ρ‚ΠΈΠΏΠ°ΠΌΠΈ Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ Π²ΠΎΠ·Π±ΡƒΠΆΠ΄Π°ΡŽΡ‚ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ.

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

β€’ ΠŸΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²ΡŒΡ‚Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ-Ρ‡Π»Π΅Π½ swap, Ссли std::swap Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ с вашим Ρ‚ΠΈΠΏΠΎΠΌ нСэффСктивно. Π£Π±Π΅Π΄ΠΈΡ‚Π΅ΡΡŒ, Ρ‡Ρ‚ΠΎ ΠΎΠ½Π° Π½Π΅ Π²ΠΎΠ·Π±ΡƒΠΆΠ΄Π°Π΅Ρ‚ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ.

β€’ Если Π²Ρ‹ прСдоставляСтС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ-Ρ‡Π»Π΅Π½ swap, Ρ‚ΠΎ Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²ΡŒΡ‚Π΅ ΡΠ²ΠΎΠ±ΠΎΠ΄Π½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‰ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ-Ρ‡Π»Π΅Π½. Для классов (Π½Π΅ шаблонов) спСциализируйтС Ρ‚Π°ΠΊΠΆΠ΅ std::swap.

β€’ Когда вызываСтся swap, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ using-объявлСниС, вводящСС std::swap Π² ΠΎΠ±Π»Π°ΡΡ‚ΡŒ видимости, ΠΈ Π²Ρ‹Π·Ρ‹Π²Π°ΠΉΡ‚Π΅ swap Π±Π΅Π· ΠΊΠ²Π°Π»ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π° пространства ΠΈΠΌΠ΅Π½.

β€’ ДопускаСтся прСдоставлСниС ΠΏΠΎΠ»Π½ΠΎΠΉ спСциализации шаблонов, находящихся Π² пространствС ΠΈΠΌΠ΅Π½ std, для ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΡ… Ρ‚ΠΈΠΏΠΎΠ², Π½ΠΎ Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ ΠΏΡ‹Ρ‚Π°ΠΉΡ‚Π΅ΡΡŒ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π² пространство std Ρ‡Ρ‚ΠΎ-Π»ΠΈΠ±ΠΎ Π½ΠΎΠ²ΠΎΠ΅.

Π“Π»Π°Π²Π° 5

РСализация

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

ΠŸΡ€Π°Π²ΠΈΠ»ΠΎ 26: ΠžΡ‚ΠΊΠ»Π°Π΄Ρ‹Π²Π°ΠΉΡ‚Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… насколько Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ

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

ВСроятно, Π²Ρ‹ Π΄ΡƒΠΌΠ°Π΅Ρ‚Π΅, Ρ‡Ρ‚ΠΎ Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ ΠΎΠ±ΡŠΡΠ²Π»ΡΠ΅Ρ‚Π΅ Π½Π΅ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Ρ… ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…, Π½ΠΎ Ρ‚Π°ΠΊ Π»ΠΈ это? Рассмотрим ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, которая Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π·Π°ΡˆΠΈΡ„Ρ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ ΠΏΠ°Ρ€ΠΎΠ»ΡŒ ΠΏΡ€ΠΈ условии, Ρ‡Ρ‚ΠΎ Π΅Π³ΠΎ Π΄Π»ΠΈΠ½Π° Π½Π΅ мСньшС Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΠΌΠΈΠ½ΠΈΠΌΡƒΠΌΠ°. Если ΠΏΠ°Ρ€ΠΎΠ»ΡŒ слишком ΠΊΠΎΡ€ΠΎΡ‚ΠΊΠΈΠΉ, функция Π²ΠΎΠ·Π±ΡƒΠΆΠ΄Π°Π΅Ρ‚ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠ° logic_error, ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ΅ Π² стандартной Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ΅ C++ (см. ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ 54):


// эта функция ΠΎΠ±ΡŠΡΠ²Π»ΡΠ΅Ρ‚ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ encrypted слишком Ρ€Π°Π½ΠΎ

std::string encryptPassword(const std::string& password)

{

using namespace std;

string encrypted;

if(password.length() < MinimumPasswordLength) {

throw logic_error(β€œΠ‘Π»ΠΈΡˆΠΊΠΎΠΌ ΠΊΠΎΡ€ΠΎΡ‚ΠΊΠΈΠΉ ΠΏΠ°Ρ€ΠΎΠ»ΡŒβ€);

}

... // ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ всС, Ρ‡Ρ‚ΠΎ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ для помСщСния

// Π·Π°ΡˆΠΈΡ„Ρ€ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ пароля Π² ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ encrypted

return encrypted;

}


НСльзя ΡΠΊΠ°Π·Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ encrypted Π² этой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ совсСм ΡƒΠΆ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ, Π½ΠΎ ΠΎΠ½ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π² случаС, ΠΊΠΎΠ³Π΄Π° возбуТдаСтся ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅. Π”Ρ€ΡƒΠ³ΠΈΠΌΠΈ словами, Π²Ρ‹ ΠΏΠ»Π°Ρ‚ΠΈΡ‚Π΅ Π·Π° Π²Ρ‹Π·ΠΎΠ² конструктора ΠΈ дСструктора ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° encrypted, Π΄Π°ΠΆΠ΅ Ссли функция encryptPassword Π²ΠΎΠ·Π±ΡƒΠΆΠ΄Π°Π΅Ρ‚ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅. Π’Π°ΠΊ Π½Π΅ Π»ΡƒΡ‡ΡˆΠ΅ Π»ΠΈ ΠΎΡ‚Π»ΠΎΠΆΠΈΡ‚ΡŒ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ encrypted Π΄ΠΎ Ρ‚ΠΎΠ³ΠΎ ΠΌΠΎΠΌΠ΅Π½Ρ‚Π°, ΠΊΠΎΠ³Π΄Π° Π²Ρ‹ Π±ΡƒΠ΄Π΅Ρ‚Π΅ Π·Π½Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΎΠ½Π° Π½ΡƒΠΆΠ½Π°?


// Π² этой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ encrypted ΠΎΡ‚Π»ΠΎΠΆΠ΅Π½ΠΎ Π΄ΠΎ ΠΌΠΎΠΌΠ΅Π½Ρ‚Π°,

// ΠΊΠΎΠ³Π΄Π° Π² Π½Π΅ΠΉ Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ Π½Π°Π΄ΠΎΠ±Π½ΠΎΡΡ‚ΡŒ

std::string encryptPassword(const std::string& password)

{

using namespace std;

if(password.length() < MinimumPasswordLength) {

throw logic_error(β€œΠ‘Π»ΠΈΡˆΠΊΠΎΠΌ ΠΊΠΎΡ€ΠΎΡ‚ΠΊΠΈΠΉ ΠΏΠ°Ρ€ΠΎΠ»ΡŒβ€);

}

string encrypted;

... // ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ всС, Ρ‡Ρ‚ΠΎ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ для помСщСния

// Π·Π°ΡˆΠΈΡ„Ρ€ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ пароля Π² ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ encrypted

return encrypted;

}


Π­Ρ‚ΠΎΡ‚ ΠΊΠΎΠ΄ всС Π΅Ρ‰Π΅ Π½Π΅ Π½Π°ΡΡ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΊΠΎΠΌΠΏΠ°ΠΊΡ‚Π½Ρ‹ΠΉ, ΠΊΠ°ΠΊ ΠΌΠΎΠ³ Π±Ρ‹ Π±Ρ‹Ρ‚ΡŒ, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ пСрСмСнная encrypted ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π° Π±Π΅Π· Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ значСния. А Π·Π½Π°Ρ‡ΠΈΡ‚, Π±ΡƒΠ΄Π΅Ρ‚ использован Π΅Π΅ конструктор ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ. Часто ΠΏΠ΅Ρ€Π²ΠΎΠ΅, Ρ‡Ρ‚ΠΎ Π½ΡƒΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ с ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ, β€“ это Π΄Π°Ρ‚ΡŒ Π΅ΠΌΡƒ ΠΊΠ°ΠΊΠΎΠ΅-Ρ‚ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, Π½Π΅Ρ€Π΅Π΄ΠΊΠΎ посрСдством присваивания. Π’ ΠΏΡ€Π°Π²ΠΈΠ»Π΅ 4 объяснСно, ΠΏΠΎΡ‡Π΅ΠΌΡƒ конструированиС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ с ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ присваиваниСм значСния ΠΌΠ΅Π½Π΅Π΅ эффСктивно, Ρ‡Π΅ΠΌ инициализация Π½ΡƒΠΆΠ½Ρ‹ΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ с самого Π½Π°Ρ‡Π°Π»Π°. Π­Ρ‚ΠΎ относится ΠΈ ΠΊ Π΄Π°Π½Π½ΠΎΠΌΡƒ ΡΠ»ΡƒΡ‡Π°ΡŽ. НапримСр, ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Ρ‡Ρ‚ΠΎ для выполнСния Β«Ρ‚Ρ€ΡƒΠ΄Π½ΠΎΠΉΒ» части Ρ€Π°Π±ΠΎΡ‚Ρ‹ функция encryptPassword Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ:


void encrypt(std::string& s); // ΡˆΠΈΡ„Ρ€ΡƒΠ΅Ρ‚ s ΠΏΠΎ мСсту


Π’ΠΎΠ³Π΄Π° encryptPassword ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π° ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, хотя ΠΈ это Π΅Ρ‰Π΅ Π½Π΅ ΠΎΠΏΡ‚ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ способ:


// Π² этой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ encrypted ΠΎΡ‚Π»ΠΎΠΆΠ΅Π½ΠΎ Π΄ΠΎ ΠΌΠΎΠΌΠ΅Π½Ρ‚Π°,

// ΠΊΠΎΠ³Π΄Π° Π² Π½Π΅ΠΉ Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ Π½Π°Π΄ΠΎΠ±Π½ΠΎΡΡ‚ΡŒ, Π½ΠΎ ΠΈ этот Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ Π΅Ρ‰Π΅ нСдостаточно

// эффСктивСн

std::string encryptPassword(const std::string& password)

{

... // ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π΄Π»ΠΈΠ½Ρ‹

string encrypted; // конструктор ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ

encrypted = password; // присваиваниС encrypted

encrypt(encrypted);

return encrypted;

}


Π•Ρ‰Π΅ Π»ΡƒΡ‡ΡˆΠ΅ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ encrypted ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠΌ password, ΠΈΠ·Π±Π΅ΠΆΠ°Π² Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ ΠΏΠΎΡ‚Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎ дорогостоящСго конструктора ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ:


// Π° это ΠΎΠΏΡ‚ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ способ опрСдСлСния ΠΈ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ encrypted

std::string encryptPassword(const std::string& password)

{

... // ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π΄Π»ΠΈΠ½Ρ‹

string encrypted(password); // ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΈ инициализация

// конструктором копирования

encrypt(encrypted);

return encrypted;

}


Π­Ρ‚ΠΎ ΠΈ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ Β«ΠΎΡ‚ΠΊΠ»Π°Π΄Ρ‹Π²Π°Ρ‚ΡŒ насколько Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΒ» (ΠΊΠ°ΠΊ сказано Π² Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ΅ ΠΏΡ€Π°Π²ΠΈΠ»Π°). Π’Ρ‹ Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΎΡ‚ΠΊΠ»Π°Π΄Ρ‹Π²Π°Ρ‚ΡŒ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ Π΄ΠΎ Ρ‚ΠΎΠ³ΠΎ ΠΌΠΎΠΌΠ΅Π½Ρ‚Π°, ΠΊΠΎΠ³Π΄Π° ΠΎΠ½Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ, Π½ΡƒΠΆΠ½ΠΎ Π΅Ρ‰Π΅ ΠΏΠΎΡΡ‚Π°Ρ€Π°Ρ‚ΡŒΡΡ ΠΎΡ‚Π»ΠΎΠΆΠΈΡ‚ΡŒ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π΄ΠΎ получСния Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² для ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ. ΠŸΠΎΡΡ‚ΡƒΠΏΠΈΠ² Ρ‚Π°ΠΊ, Π²Ρ‹ ΠΈΠ·Π±Π΅Π³Π°Π΅Ρ‚Π΅ конструирования ΠΈ Ρ€Π°Π·Ρ€ΡƒΡˆΠ΅Π½ΠΈΡ Π½Π΅Π½ΡƒΠΆΠ½Ρ‹Ρ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ², Π° Ρ‚Π°ΠΊΠΆΠ΅ ΠΈΠ·Π»ΠΈΡˆΠ½ΠΈΡ… Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² конструкторов ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ. Π‘ΠΎΠ»Π΅Π΅ Ρ‚ΠΎΠ³ΠΎ, это ΠΏΠΎΠΌΠΎΠ³Π°Π΅Ρ‚ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π½Π°Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… Π·Π° счСт ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΈΡ… Π² Ρ‚ΠΎΠΌ контСкстС, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΈΡ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ понятно Π±Π΅Π· слов.

«А ΠΊΠ°ΠΊ насчСт Ρ†ΠΈΠΊΠ»ΠΎΠ²?Β» – ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡƒΠ΄ΠΈΠ²ΠΈΡ‚ΡŒΡΡ Π²Ρ‹. Если пСрСмСнная ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π²Π½ΡƒΡ‚Ρ€ΠΈ Ρ†ΠΈΠΊΠ»Π°, Ρ‚ΠΎ Ρ‡Ρ‚ΠΎ Π»ΡƒΡ‡ΡˆΠ΅: ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Π΅Π΅ Π²Π½Π΅ Ρ†ΠΈΠΊΠ»Π° ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ присваиваниС Π½Π° ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΠΈ ΠΈΠ»ΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Π΅Π΅ Π²Π½ΡƒΡ‚Ρ€ΠΈ Ρ†ΠΈΠΊΠ»Π°? Π”Ρ€ΡƒΠ³ΠΈΠΌΠΈ словами, какая ΠΈΠ· ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… конструкций ΠΏΡ€Π΅Π΄ΠΏΠΎΡ‡Ρ‚ΠΈΡ‚Π΅Π»ΡŒΠ½Π΅Π΅?


// ΠŸΠΎΠ΄Ρ…ΠΎΠ΄ A: ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π²Π½Π΅ Ρ†ΠΈΠΊΠ»Π°

Widget w;

for(int i=0; i<n; ++i) {

w = Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, зависящСС ΠΎΡ‚ i;

...

}

// ΠŸΠΎΠ΄Ρ…ΠΎΠ΄ B: ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π²Π½ΡƒΡ‚Ρ€ΠΈ Ρ†ΠΈΠΊΠ»Π°

for(int i=0; i<n; ++i) {

Widget w(Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, зависящСС ΠΎΡ‚ i);

...

}


Π—Π΄Π΅ΡΡŒ я ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠΆΡƒ ΠΎΡ‚ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Ρ‚ΠΈΠΏΠ° string ΠΊ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρƒ Ρ‚ΠΈΠΏΠ° Widget, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ Π»ΡŽΠ±Ρ‹Ρ… ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ стоимости конструирования, Ρ€Π°Π·Ρ€ΡƒΡˆΠ΅Π½ΠΈΡ ΠΈ присваивания.

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

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