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

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«ΠžΡΠ½ΠΎΠ²Ρ‹ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½ΠΎ-ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ программирования». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 71

Автор Π‘Π΅Ρ€Ρ‚Ρ€Π°Π½ ΠœΠ΅ΠΉΠ΅Ρ€

x = y


истинно Ρ‚ΠΎΠ³Π΄Π° ΠΈ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‚ΠΎΠ³Π΄Π°, ΠΊΠΎΠ³Π΄Π° ΠΎΠ±Π΅ ссылки пусты ΠΈΠ»ΠΈ присоСдинСны ΠΊ ΠΎΠ΄Π½ΠΎΠΌΡƒ ΠΈ Ρ‚ΠΎΠΌΡƒ ΠΆΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρƒ. ΠŸΡ€ΠΎΡ‚ΠΈΠ²ΠΎΠΏΠΎΠ»ΠΎΠΆΠ½Ρ‹ΠΉ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ "Π½Π΅ эквивалСнтно" записываСтся ΠΊΠ°ΠΊ /=.

Π’Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅:


r = a.loved_one


истинно Π² ситуации, прСдставлСнной Π½Π° рис.8.13 ΠΈ Π»ΠΎΠΆΠ½ΠΎ для ситуации рис.8.12 .

Π—Π°ΠΌΠ΅Ρ‚ΡŒΡ‚Π΅, Π² опСрациях эквивалСнтности ΡΡ€Π°Π²Π½ΠΈΠ²Π°ΡŽΡ‚ΡΡ ссылки, Π° Π½Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹, ΠΊ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ ΠΎΠ½ΠΈ присоСдинСны. Π’Π°ΠΊ Ρ‡Ρ‚ΠΎ Ссли Π΄Π²Π΅ ссылки присоСдинСны ΠΊ Ρ€Π°Π·Π½Ρ‹ΠΌ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌ, Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠΌ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ эквивалСнтности Π±ΡƒΠ΄Π΅Ρ‚ false, Π΄Π°ΠΆΠ΅ Ссли ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ ΠΈΠΌΠ΅ΡŽΡ‚ всС поля с ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹ΠΌΠΈ значСниями. ΠžΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ, ΡΡ€Π°Π²Π½ΠΈΠ²Π°ΡŽΡ‰ΠΈΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹, Π° Π½Π΅ ссылки, Π±ΡƒΠ΄ΡƒΡ‚ Π²Π²Π΅Π΄Π΅Π½Ρ‹ ΠΏΠΎΠ·Π΄Π½Π΅Π΅.

Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ void

ΠŸΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΏΡƒΡΡ‚ΡƒΡŽ ссылку достаточно просто - ΠΏΡ€ΠΈ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ всС ссылки пусты. Однако ΡƒΠ΄ΠΎΠ±Π½ΠΎ ΠΈΠΌΠ΅Ρ‚ΡŒ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠ΅ имя для ссылки, доступной Π² любом контСкстС ΠΈ ΠΈΠΌΠ΅ΡŽΡ‰Π΅ΠΉ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ void . ΠŸΡ€Π΅Π΄ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΉ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚


Void


ΠΈΠ³Ρ€Π°Π΅Ρ‚ эту Ρ€ΠΎΠ»ΡŒ.

ΠžΠ±Ρ‹Ρ‡Π½ΠΎ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ Void ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π² тСстах, ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡΡŽΡ‰ΠΈΡ… пустоту ссылок:


if x = Void then ...


ΠΈ для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΈΡΠ²ΠΎΠΈΡ‚ΡŒ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ссылкС это Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅:


x := Void


Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ послСднСго присваивания происходит отсоСдинСниС ссылки ΠΎΡ‚ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°, ΠΈ ΠΎΠ½Π° становится пустой. Π­Ρ‚Π° ситуация ΠΏΠΎΠΊΠ°Π·Π°Π½Π° Π½Π° ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ рисункС:

Рис. 8.14.  ΠžΡ‚соСдинСниС ссылки ΠΎΡ‚ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°

ΠŸΡ€ΠΈΡΠ²Π°ΠΈΠ²Π°Π½ΠΈΠ΅ Void ссылкС Π½Π΅ ΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π½ΠΈΠΊΠ°ΠΊΠΎΠ³ΠΎ влияния Π½Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, Ρ€Π°Π½Π΅Π΅ присоСдинСнный ΠΊ ссылкС, - разрываСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ связь ΠΌΠ΅ΠΆΠ΄Ρƒ ссылкой ΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ. Π‘Ρ‹Π»ΠΎ Π±Ρ‹ Π½Π΅ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎ Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Ρ‚ΡŒ эту ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΡŽ ΠΊΠ°ΠΊ освобоТдСниС памяти, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ссылки ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°Ρ‚ΡŒ Π±Ρ‹Ρ‚ΡŒ связанными с ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ (Π½Π° рисункС x ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ отсоСдинСно ΠΎΡ‚ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° O1, Π½ΠΎ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ссылки ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ Π΅Ρ‰Π΅ присоСдинСны ΠΊ Π½Π΅ΠΌΡƒ). Об ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠΈ ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ смотри ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΡƒΡŽ Π»Π΅ΠΊΡ†ΠΈΡŽ.

ΠšΠ»ΠΎΠ½ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈ сравнСниС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ²

БсылочноС присваиваниС ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ Ρ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ Π΄Π²Π΅ ΠΈΠ»ΠΈ нСсколько ссылок ΠΏΡ€ΠΈΡΠΎΠ΅Π΄ΠΈΠ½ΡΡŽΡ‚ΡΡ ΠΊ ΠΎΠ΄Π½ΠΎΠΌΡƒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρƒ. Иногда Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠ° другая Ρ„ΠΎΡ€ΠΌΠ° присваивания, Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Π½Π΅ копию ссылки, Π° копию ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°. Π­Ρ‚Π° Ρ†Π΅Π»ΡŒ достигаСтся ΠΏΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ клонирования clone.

Если y присоСдинСно ΠΊ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρƒ OY, Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅


clone (y)


ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ созданиС Π½ΠΎΠ²ΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° OX , Ρ‚Π°ΠΊΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‚Π΅ ΠΆΠ΅ поля, Ρ‡Ρ‚ΠΎ ΠΈ OY, ΠΈ всС ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ поля ΠΈΠΌΠ΅ΡŽΡ‚ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ‡Π½Ρ‹Π΅ значСния. Если y Ρ€Π°Π²Π½ΠΎ void, Ρ‚ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ clone (y) Ρ‚Π°ΠΊΠΆΠ΅ void.

Π‘ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ присоСдинСнный ΠΊ y ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΠΈ ΡΠ²ΡΠ·Π°Ρ‚ΡŒ копию со ссылкой x позволяСт присваиваниС:


[1]

x := clone (y)


Π’ΠΎΡ‚ ΠΈΠ»Π»ΡŽΡΡ‚Ρ€Π°Ρ†ΠΈΡ этого ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠ°:

Рис. 8.15.  ΠšΠ»ΠΎΠ½ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°

Наряду со сравнСниСм ссылок Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰ΠΈΠΉ ΡΡ€Π°Π²Π½ΠΈΠ²Π°Ρ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹. Π­Ρ‚ΠΎΠΉ Ρ†Π΅Π»ΠΈ слуТит функция equal . Π’Ρ‹Π·ΠΎΠ²:


equal (x, y)


Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ true, Ссли ΠΈ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ссли x ΠΈ y ΠΎΠ±Π° ΠΈΠΌΠ΅ΡŽΡ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ void ΠΈΠ»ΠΈ присоСдинСны ΠΊ Π΄Π²ΡƒΠΌ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌ с ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ‡Π½Ρ‹ΠΌΠΈ полями. ПослС выполнСния присваивания с ΠΊΠ»ΠΎΠ½ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ [1], состояниС, нСпосрСдствСнно ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅ Π·Π° присваиваниСм, удовлСтворяСт equal (x, y).

Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π²Ρ‹ ΡƒΠ΄ΠΈΠ²Π»ΡΠ΅Ρ‚Π΅ΡΡŒ, ΠΏΠΎΡ‡Π΅ΠΌΡƒ Ρƒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ clone Π΅ΡΡ‚ΡŒ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚, Π° Ρƒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ equal - ΠΈΡ… Π΄Π²Π°. Для ОО-стиля Ρ…Π°Ρ€Π°ΠΊΡ‚Π΅Ρ€Π΅Π½ ΠΊΠ²Π°Π»ΠΈΡ„ΠΈΡ†ΠΈΡ€ΡƒΠ΅ΠΌΡ‹ΠΉ Π²Ρ‹Π·ΠΎΠ² Π² Ρ„ΠΎΡ€ΠΌΠ΅: y.twin ΠΈ x.is_equal (y). ΠžΡ‚Π²Π΅Ρ‚ появится Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ обсуТдСния, Π½ΠΎ это Π±ΡƒΠ΄Π΅Ρ‚ Π΅Ρ‰Π΅ Π½Π΅ скоро, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ ΠΏΠΎΠΏΡ‹Ρ‚Π°ΠΉΡ‚Π΅ΡΡŒ Π΄ΠΎΠ³Π°Π΄Π°Ρ‚ΡŒΡΡ сами.

ΠšΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ²

Ѐункция clone создаСт Π½ΠΎΠ²ΡƒΡŽ копию ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°. Иногда Ρ†Π΅Π»Π΅Π²ΠΎΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΡƒΠΆΠ΅ сущСствуСт, ΠΈ всС, Ρ‡Ρ‚ΠΎ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ, это ΡΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ значСния ΠΏΠΎΠ»Π΅ΠΉ. ΠŸΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π° copy выполняСт эту Ρ€Π°Π±ΠΎΡ‚Ρƒ. Она вызываСтся ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:


x.copy (y)


Бущности x ΠΈ y Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈ Ρ‚ΠΎΠ³ΠΎ ΠΆΠ΅ Ρ‚ΠΈΠΏΠ°; эффСкт ΠΎΡ‚ выполнСния - ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΠΎΠ»Π΅ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°, присоСдинСнного ΠΊ y, Π² ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ поля ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°, присоСдинСнного ΠΊ x.

Как ΠΈ Π²ΠΎ всСх Π²Ρ‹Π·ΠΎΠ²Π°Ρ… ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°, Π²Ρ‹Π·ΠΎΠ² copy Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Ρ†Π΅Π»Π΅Π²ΠΎΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ x Π±Ρ‹Π» Π½Π΅ пуст. Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ трСбуСтся, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈ y Π±Ρ‹Π» Π½Π΅ пуст. Π­Ρ‚Π° Π½Π΅ΡΠΏΠΎΡΠΎΠ±Π½ΠΎΡΡ‚ΡŒ ΠΈΠΌΠ΅Ρ‚ΡŒ Π΄Π΅Π»ΠΎ с пустыми ссылками ΠΎΡ‚Π»ΠΈΡ‡Π°Π΅Ρ‚ copy ΠΎΡ‚ clone.

Π’Ρ€Π΅Π±ΠΎΠ²Π°Π½ΠΈΠ΅ Π½Π΅ пустоты y Π½Π°ΡΡ‚ΠΎΠ»ΡŒΠΊΠΎ Π²Π°ΠΆΠ½ΠΎ, Ρ‡Ρ‚ΠΎ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ способ для Π΅Π³ΠΎ Ρ„ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ выраТСния. ЀактичСски Ρ€Π΅Ρ‡ΡŒ ΠΈΠ΄Π΅Ρ‚ ΠΎ Π±ΠΎΠ»Π΅Π΅ ΠΎΠ±Ρ‰Π΅ΠΉ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ΅: ΠΊΠ°ΠΊ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° ΠΌΠΎΠΆΠ΅Ρ‚ Π·Π°Π΄Π°Ρ‚ΡŒ прСдусловия Π½Π° Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹, ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Π΅ΠΌΡ‹Π΅ ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠΌ ΠΏΡ€ΠΈ Π΅Π΅ Π²Ρ‹Π·ΠΎΠ²Π΅. Π’Π°ΠΊΠΈΠ΅ прСдусловия, являясь частным случаСм ΠΎΠ±Ρ‰Π΅Π³ΠΎ понятия "ΡƒΡ‚Π²Π΅Ρ€ΠΆΠ΄Π΅Π½ΠΈΠ΅" Π² дСталях Π±ΡƒΠ΄ΡƒΡ‚ ΠΎΠ±ΡΡƒΠΆΠ΄Π°Ρ‚ΡŒΡΡ Π² ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… лСкциях. Аналогично, Π½Π°ΠΌ Ρ…ΠΎΡ‚Π΅Π»ΠΎΡΡŒ Π±Ρ‹ ΡƒΠΌΠ΅Ρ‚ΡŒ Π²Ρ‹Ρ€Π°ΠΆΠ°Ρ‚ΡŒ Π² Π²ΠΈΠ΄Π΅ постусловия сСмантичСскоС свойство, ΠΎΡ‚ΠΌΠ΅Ρ‡Π΅Π½Π½ΠΎΠ΅ Π²Ρ‹ΡˆΠ΅, - Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ выполнСния clone удовлСтворяСт equal.

ΠŸΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π° copy ΠΌΠΎΠΆΠ΅Ρ‚ ΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒΡΡ Π±ΠΎΠ»Π΅Π΅ Ρ„ΡƒΠ½Π΄Π°ΠΌΠ΅Π½Ρ‚Π°Π»ΡŒΠ½ΠΎΠΉ, Ρ‡Π΅ΠΌ функция clone Π² Ρ‚ΠΎΠΌ смыслС, Ρ‡Ρ‚ΠΎ, ΠΏΠΎ мСньшСй ΠΌΠ΅Ρ€Π΅, для класса Π±Π΅Π· ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹ создания ΠΌΠΎΠΆΠ½ΠΎ Π²Ρ‹Ρ€Π°Π·ΠΈΡ‚ΡŒ clone Π² Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Ρ… copy ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:


clone (y: SOME_TYPE) is

-- Void Ссли y Ρ€Π°Π²Π½ΠΎ void; ΠΈΠ½Π°Ρ‡Π΅ Π΄ΡƒΠ±Π»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ присоСдинСнный ΠΊ y ΠΎΠ±ΡŠΠ΅ΠΊΡ‚

do

if y /= Void then

create Result --ΠŸΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² отсутствиС ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€ создания

Result.copy (y)

end

end


ΠŸΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΡΡƒΡ‰Π½ΠΎΡΡ‚ΡŒ Result автоматичСски инициализируСтся Π² соотвСтствии с ΠΎΠ±Ρ‰ΠΈΠΌΠΈ ΠΏΡ€Π°Π²ΠΈΠ»Π°ΠΌΠΈ для Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ². Π’ΠΎΡ‚ ΠΏΠΎΡ‡Π΅ΠΌΡƒ Π½Π΅Ρ‚ нСобходимости Π² Π²Π΅Ρ‚Π²ΠΈ else условного ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π°: Result инициализируСтся Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ Void , Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π±ΡƒΠ΄Π΅Ρ‚ void , Ссли Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ y это void.

Π“Π»ΡƒΠ±ΠΎΠΊΠΎΠ΅ ΠΊΠ»ΠΎΠ½ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈ сравнСниС

Π€ΠΎΡ€ΠΌΡ‹ копирования ΠΈ сравнСния, Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅ΠΌΡ‹Π΅ ΠΏΠΎΠ΄ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°ΠΌΠΈ clone, equal ΠΈ copy , Π½Π°Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ повСрхностными, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΎΠ½ΠΈ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ с ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌΠΈ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π½Π° ΠΏΠ΅Ρ€Π²ΠΎΠΌ ΡƒΡ€ΠΎΠ²Π½Π΅, Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ ΠΏΡ‹Ρ‚Π°ΡΡΡŒ ΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚ΡŒ Π²Π³Π»ΡƒΠ±ΡŒ ΠΏΠΎ ссылкам. Π’ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΡΡ‚ΡŒ для Π³Π»ΡƒΠ±ΠΎΠΊΠΈΡ… Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ΠΎΠ² этих ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ, рСкурсивно Π΄ΡƒΠ±Π»ΠΈΡ€ΡƒΡŽΡ‰ΠΈΡ… ΠΏΠΎΠ»Π½ΡƒΡŽ структуру.

Для понимания Ρ€Π°Π·Π½ΠΈΡ†Ρ‹ рассмотрим ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΏΠΎΠΊΠ°Π·Π°Π½Π½Ρ‹ΠΉ Π½Π° рис.8.16. ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ Π½Π°Ρ‡ΠΈΠ½Π°Π΅ΠΌ Π² Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠΌ состоянии A, Π³Π΄Π΅ ΡΡƒΡ‰Π½ΠΎΡΡ‚ΡŒaприсоСдинСна ΠΊ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρƒ O1.

Рис. 8.16.  Π Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ Ρ„ΠΎΡ€ΠΌΡ‹ присваивания ΠΈ клонирования

Рассмотрим простоС присваиваниС ссылки:


b := a


Π’ состоянии B, ΠΏΠΎΠΊΠ°Π·Π°Π½Π½ΠΎΠΌ Π½Π° рисункС, Ρ†Π΅Π»ΡŒ b Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ присваивания присоСдинСна ΠΊ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρƒ O1, ΠΊ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ присоСдинСн источник a. Никаких Π½ΠΎΠ²Ρ‹Ρ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Π½Π΅ создаСтся.

Π”Π°Π»Π΅Π΅ рассмотрим ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΡŽ клонирования:


c := clone (a)


Π­Ρ‚Π° инструкция, ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Ρ€Π°Π·Π΄Π΅Π» C нашСго рисунка, создаСт Π½ΠΎΠ²Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ O4, с полями, ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ‡Π½Ρ‹ΠΌΠΈ полям ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° O1. Π‘ΡƒΠ΄ΡƒΡ‚ скопированы Π΄Π²Π° ссылочных поля, ΠΈ значСния ссылок Π±ΡƒΠ΄ΡƒΡ‚ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ Π½Π° Ρ‚Π΅ ΠΆΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ O1 ΠΈ O3, ΠΊΠ°ΠΊ ΠΈ поля ΠΎΡ€ΠΈΠ³ΠΈΠ½Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° O1. Но, Π·Π°ΠΌΠ΅Ρ‚ΡŒΡ‚Π΅, Π½Π΅ происходит дублирования самого ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° O3, ΠΈ Π½ΠΈΠΊΠ°ΠΊΠΎΠ³ΠΎ Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° ΠΏΠΎΠΌΠΈΠΌΠΎ дублирования O1. По этой ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π΅ базисная опСрация clone называСтся повСрхностным ΠΊΠ»ΠΎΠ½ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ, - ΠΎΠ½Π° останавливаСтся Π½Π° ΠΏΠ΅Ρ€Π²ΠΎΠΌ ΡƒΡ€ΠΎΠ²Π½Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½ΠΎΠΉ структуры.

Π—Π°ΠΌΠ΅Ρ‚ΡŒΡ‚Π΅, ΠΏΡ€ΠΈ ΠΊΠ»ΠΎΠ½ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ исчСзли ссылки Π½Π° сСбя. Бсылка landlord ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° O1 Π±Ρ‹Π»Π° присоСдинСна ΠΊ самому ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρƒ O1. Π£ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° O4 это ΠΏΠΎΠ»Π΅ становится ссылкой Π½Π° ΠΎΡ€ΠΈΠ³ΠΈΠ½Π°Π» O1.

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

НиТняя Ρ‡Π°ΡΡ‚ΡŒ Π½Π° рисункС - Ρ€Π°Π·Π΄Π΅Π» D - ΠΈΠ»Π»ΡŽΡΡ‚Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ этой ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ: