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

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

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

Π”ΠΎ сих ΠΏΠΎΡ€ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅-Ρ‡Π»Π΅Π½Ρ‹ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² задавались прямо Π² Ρ‚Π΅Π»Π΅ конструктора. Π’Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ конструктора происходит Π² Π΄Π²Π° этапа: инициализация ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Ρ‚Π΅Π»Π° конструктора.

Π‘ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π·Π°Π΄Π°Π½ΠΎ Π½Π° любом ΠΈΠ· этих этапов: ΠΊΠ°ΠΊ Π²ΠΎ врСмя ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ, Ρ‚Π°ΠΊ ΠΈ Π²ΠΎ врСмя выполнСния конструктора. Но логичСски ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Π΅Π΅, Π° Π·Π°Ρ‡Π°ΡΡ‚ΡƒΡŽ ΠΈ эффСктивнСС, ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅-Ρ‡Π»Π΅Π½Ρ‹ Π²ΠΎ врСмя ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ конструктора. Π’ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΏΠΎΠΊΠ°Π·Π°Π½Π° инициализация ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…-Ρ‡Π»Π΅Π½ΠΎΠ²:

CAT(): // имя конструктора ΠΈ список ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ²

itsAge(5), // инициализация списка

itsWeigth(8)

{} // Ρ‚Π΅Π»ΠΎ конструктора

ПослС скобки закрытия списка ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² конструктора ставится Π΄Π²ΠΎΠ΅Ρ‚ΠΎΡ‡ΠΈΠ΅. Π—Π°Ρ‚Π΅ΠΌ ΠΏΠ΅Ρ€Π΅Ρ‡ΠΈΡΠ»ΡΡŽΡ‚ΡΡ ΠΈΠΌΠ΅Π½Π° ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…-Ρ‡Π»Π΅Π½ΠΎΠ². ΠŸΠ°Ρ€Π° ΠΊΡ€ΡƒΠ³Π»Ρ‹Ρ… скобок со Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ Π·Π° ΠΈΠΌΠ΅Π½Π΅ΠΌ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ этой ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ. Если инициализируСтся сразу нСсколько ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…, Ρ‚ΠΎ ΠΎΠ½ΠΈ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ ΠΎΡ‚Π΄Π΅Π»Π΅Π½Ρ‹ запятыми. Π’ листингС 10.4 ΠΏΠΎΠΊΠ°Π·Π°Π½Π° инициализация ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… конструкторов, взятых ΠΈΠ· листинга 10.3. Π’ Π΄Π°Π½Π½ΠΎΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ инициализация ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ вмСсто присвоСния ΠΈΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ Π² Ρ‚Π΅Π»Π΅ конструктора.

Листинг 10.4. Π€Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π° с ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠ΅ΠΉ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…-Ρ‡Π»Π΅Π½ΠΎΠ²

1: Rectangle::Rectangle():

2:    itsWidth(5),

3:    itsLength(10)

4: {

5: }

6:

7: Rectangle::Rectangle (int width, int length):

8:    itsWidth(width),

9:    itsLength(length)

10: {

11: }


Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚: ΠžΡ‚ΡΡƒΡ‚ΡΡ‚Π²ΡƒΠ΅Ρ‚


Анализ: НСкоторыС ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ ΠΌΠΎΠΆΠ½ΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΈ нСльзя ΠΏΡ€ΠΈΡΠ²Π°ΠΈΠ²Π°Ρ‚ΡŒ ΠΈΠΌ значСния: Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π² случаС использования ссылок ΠΈ констант. БСзусловно, ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ-Ρ‡Π»Π΅Π½Ρƒ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΈΡΠ²ΠΎΠΈΡ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ прямо Π² Ρ‚Π΅Π»Π΅ конструктора, Π½ΠΎ для упрощСния ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π»ΡƒΡ‡ΡˆΠ΅ ΠΏΠΎ возмоТности ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Ρ‚ΡŒ значСния ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…-Ρ‡Π»Π΅Π½ΠΎΠ² Π½Π° этапС ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ конструктора.

ΠšΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ‚ΠΎΡ€-ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Ρ‰ΠΈΠΊ

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

Когда ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ пСрСдаСтся ΠΊΠ°ΠΊ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π»ΠΈΠ±ΠΎ Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, Π»ΠΈΠ±ΠΎ ΠΈΠ· Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π² Π²ΠΈΠ΄Π΅ Π²ΠΎΠ·Π²Ρ€Π°Ρ‚Π°, всСгда создаСтся Π΅Π³ΠΎ врСмСнная копия. Если Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ обрабатываСтся ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, созданный ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ, Ρ‚ΠΎ для выполнСния этих ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ вызываСтся конструктор- ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Ρ‰ΠΈΠΊ класса, ΠΊΠ°ΠΊ Π±Ρ‹Π»ΠΎ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π½Π° ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΌ занятии Π² листингС 9.6.

ВсС ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Ρ‰ΠΈΠΊΠΈ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°ΡŽΡ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ β€” ссылку Π½Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Π² Ρ‚ΠΎΠΌ ΠΆΠ΅ классС. Π Π°Π·ΡƒΠΌΠ½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ эту ссылку константной, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ конструктор Π½Π΅ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Π΅ΠΌΡ‹ΠΉ Π² Π½Π΅Π³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚. НапримСр:

CAT(const CAT & theCat);

Π’ Π΄Π°Π½Π½ΠΎΠΌ случаС конструктор CAT ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ ΠΊΠΎΠ½ΡΡ‚Π°Π½Ρ‚Π½ΡƒΡŽ ссылку Π½Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ класса CAT. ЦСль использования конструктора-ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Ρ‰ΠΈΠΊΠ° состоит Π² создании ΠΊΠΎΠΏΠΈΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° theCat.

ΠšΠΎΠΏΠΈΡ€ΠΎΠ²Ρ‰ΠΈΠΊ, Π·Π°Π΄Π°Π½Π½Ρ‹ΠΉ компилятором ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ, просто ΠΊΠΎΠΏΠΈΡ€ΡƒΠ΅Ρ‚ всС ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅-Ρ‡Π»Π΅Π½Ρ‹ ΠΈΠ· ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠ³ΠΎ Π² ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Π² ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅-Ρ‡Π»Π΅Π½Ρ‹ Π½ΠΎΠ²ΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°. Π’Π°ΠΊΠΎΠ΅ ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ называСтся повСрхностным; ΠΈ, хотя ΠΎΠ½ΠΎ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΈΡ‚ для Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π° случаСв, ΠΌΠΎΠ³ΡƒΡ‚ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΡƒΡ‚ΡŒ ΡΠ΅Ρ€ΡŒΠ΅Π·Π½Ρ‹Π΅ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹, Ссли ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅-Ρ‡Π»Π΅Π½Ρ‹ окаТутся указатСлями Π½Π° ячСйки динамичСской памяти.

ΠŸΠΎΠ²Π΅Ρ€Ρ…Π½ΠΎΡΡ‚Π½ΠΎΠ΅ ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ создаСт нСсколько ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…-Ρ‡Π»Π΅Π½ΠΎΠ² Π² Ρ€Π°Π·Π½Ρ‹Ρ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°Ρ…, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΡΡΡ‹Π»Π°ΡŽΡ‚ΡΡ Π½Π° ΠΎΠ΄Π½ΠΈ ΠΈ Ρ‚Π΅ ΠΆΠ΅ ячСйки памяти. Π“Π»ΡƒΠ±ΠΈΠ½Π½ΠΎΠ΅ ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ пСрСписываСт значСния ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… ΠΏΠΎ Π½ΠΎΠ²Ρ‹ΠΌ адрСсам.

НапримСр, класс CAT содСрТит ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ-Ρ‡Π»Π΅Π½ theCat, которая ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π½Π° ячСйку Π² области динамичСской памяти, Π³Π΄Π΅ сохранСно Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ цСлочислСнноС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅. ΠšΠΎΠΏΠΈΡ€ΠΎΠ²Ρ‰ΠΈΠΊ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ скопируСт ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ theCat ΠΈΠ· старого класса CAT Π² ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ theCat Π² Π½ΠΎΠ²ΠΎΠΌ классС CAT. ΠŸΡ€ΠΈ этом ΠΎΠ±Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Π±ΡƒΠ΄ΡƒΡ‚ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ Π½Π° ΠΎΠ΄Π½Ρƒ ΠΈ Ρ‚Ρƒ ΠΆΠ΅ ячСйку памяти (рис. 10.1).

Рис. 10.1. ИспользованиС ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Ρ‰ΠΈΠΊΠ°, Π·Π°Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ


ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ ΠΌΠΎΠ³ΡƒΡ‚ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΡƒΡ‚ΡŒ, Ссли ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π²Ρ‹ΠΉΠ΄Π΅Ρ‚ Π·Π° ΠΎΠ±Π»Π°ΡΡ‚ΡŒ видимости ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠ· классов CAT. Как ΡƒΠΆΠ΅ ΠΎΡ‚ΠΌΠ΅Ρ‡Π°Π»ΠΎΡΡŒ ΠΏΡ€ΠΈ ΠΈΠ·ΡƒΡ‡Π΅Π½ΠΈΠΈ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ, Π½Π°Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ дСструктора состоит Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΡ‡ΠΈΡ‰Π°Ρ‚ΡŒ ΠΏΠ°ΠΌΡΡ‚ΡŒ ΠΎΡ‚ Π½Π΅Π½ΡƒΠΆΠ½Ρ‹Ρ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ². Если дСструктор исходного класса CAT очистит свои ячСйки памяти, Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Π½ΠΎΠ²ΠΎΠ³ΠΎ класса CAT всС Ρ‚Π°ΠΊ ΠΆΠ΅ Π±ΡƒΠ΄ΡƒΡ‚ ΡΡΡ‹Π»Π°Ρ‚ΡŒΡΡ Π½Π° эти ячСйки, Ρ‚ΠΎ Π½Π°Π΄ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠΉ нависнСт ΡΠΌΠ΅Ρ€Ρ‚Π΅Π»ΡŒΠ½Π°Ρ ΠΎΠΏΠ°ΡΠ½ΠΎΡΡ‚ΡŒ. Π­Ρ‚Π° ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° ΠΏΡ€ΠΎΠΈΠ»Π»ΡŽΡΡ‚Ρ€ΠΈΡ€ΠΎΠ²Π°Π½Π° Π½Π° рис. 10.2.

Рис. 10.2 Π’ΠΎΠ·Π½ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΈΠ΅ ΠΎΡˆΠΈΠ±ΠΎΡ‡Π½ΠΎΠ³ΠΎ указатСля


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

Листинг 10.5. ΠšΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ‚ΠΎΡ€-ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Ρ‰ΠΈΠΊ

1: // Листинг 10.5.

2: // ΠšΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ‚ΠΎΡ€-ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Ρ‰ΠΈΠΊ

3:

4: #include <iostream.h>

5:

6: class CAT

7: {

8:    public:

9:       CAT(); // конструктор ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ

10:      CAT (const CAT &); // конструктор-ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Ρ‰ΠΈΠΊ

11:      ~CAT(); // дСструктор

12:      int GetAge() const { return *itsAge; }

13:      int GetWeight() const { return *itsWeight; }

14:      void SetAge(int age) { *itsAge = age; }

15:

16:   private:

17:      int *itsAge;

18:      int *itsWeight;

19: };

20:

21: CAT::CAT()

22: {

23:    itsAge = new int;

24:    itsWeight = new int;

25:    *itsAge = 5;

26:    *itsWeight = 9;

27: }

28:

29: CAT::CAT(const CAT & rhs)

30: {

31:    itsAge = new int;

32:    itsWeight = new int;

33:    *itsAge = rhs.GetAge(); // ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄ доступа

34:    *itsWeight = *(rhs.itsWeight); // Π·Π°ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄ доступа

35: }

36:

37: CAT::~CAT()

38: {

39:    delete itsAge;

40:    itsAge = 0;

41:    delete itsWeight;

42:    itsWeight = 0;

43: }

44:

45: int main()

46: {

47:    CAT frisky;

48:    cout << "frisky's age: " << frisky.GetAge() << endl;

49:    cout << "Setting frisky to 6...\n";

50:    frisky.SetAge(6);

51:    cout << "Creating boots from frisky\n";

52:    CAT boots(frisky);

53:    cout << "frisky's age: " << frisky.GetAge() << endl;

54:    cout << "boots' age; " << boots.GetAge() << endl;

55:    cout << "setting frisky to 7...\n";

56:    frisky.SetAge(7);

57:    cout << "frisky's age: " << frisky.GetAge() << endl;

58:    cout << "boot's age: " << boots.GetAge() << endl;

59:    return 0;

60: }


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

frisky's age: 5

Setting frisky to 6...

Creating boots from frisky

frisky's age: 6

boots' age: 6

setting frisky to 7...

frisky's age: 7

boots' age: 6


Анализ: Π’ строках ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ с 6 ΠΏΠΎ 19 ΠΎΠ±ΡŠΡΠ²Π»ΡΠ΅Ρ‚ΡΡ класс CAT. ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ Π² строкС 9 ΠΎΠ±ΡŠΡΠ²Π»ΡΠ΅Ρ‚ΡΡ конструктор ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ, Π° Π² строкС 10 β€” конструктор-ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Ρ‰ΠΈΠΊ.

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

ΠšΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ‚ΠΎΡ€ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Π² строках с 21 ΠΏΠΎ 27 выдСляСт для ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… области динамичСской памяти ΠΈ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅Ρ‚ эти ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅.

Π Π°Π±ΠΎΡ‚Π° ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Ρ‰ΠΈΠΊΠ° начинаСтся со строки 29. ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ Π² ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Ρ‰ΠΈΠΊΠ΅ Π·Π°Π΄Π°Π½ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ rhs. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π² ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°Ρ… ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Ρ‰ΠΈΠΊΠΎΠ² символику rhs, Ρ‡Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ right-hand side (стоящий справа), β€” общСпринятая ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ°. Если Π²Ρ‹ посмотритС Π½Π° строки 33 ΠΈ 34, Ρ‚ΠΎ ΡƒΠ²ΠΈΠ΄ΠΈΡ‚Π΅, Ρ‡Ρ‚ΠΎ Π² выраТСниях присваивания ΠΈΠΌΠ΅Π½Π° ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Ρ‰ΠΈΠΊΠ° Ρ€Π°ΡΠΏΠΎΠ»Π°Π³Π°ΡŽΡ‚ΡΡ справа ΠΎΡ‚ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° присваивания (Π·Π½Π°ΠΊΠ° равСнства).

Π’ΠΎΡ‚ ΠΊΠ°ΠΊ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Ρ‰ΠΈΠΊ. Π‘Ρ‚Ρ€ΠΎΠΊΠΈ 31 ΠΈ 32 Π²Ρ‹Π΄Π΅Π»ΡΡŽΡ‚ свободныС ячСйки Π² области динамичСской памяти. Π—Π°Ρ‚Π΅ΠΌ, Π² строках 33 ΠΈ 34 Π² Π½ΠΎΠ²Ρ‹Π΅ ячСйки ΠΏΠ΅Ρ€Π΅ΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‚ΡΡ значСния ΠΈΠ· ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ класса CAT.

ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ rhs соотвСтствуСт ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρƒ классу CAT, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ пСрСдаСтся Π² ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Ρ‰ΠΈΠΊ Π² Π²ΠΈΠ΄Π΅ константной ссылки. Как ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ класса CAT, rhs содСрТит всС ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅- Ρ‡Π»Π΅Π½Ρ‹ любого Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ класса CAT.

Π›ΡŽΠ±ΠΎΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ класса CAT ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΡŒ доступ ΠΊ Π·Π°ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΌ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌ-Ρ‡Π»Π΅Π½Π°ΠΌ для любого Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° класса CAT. Π’ Ρ‚ΠΎ ΠΆΠ΅ врСмя для Π²Π½Π΅ΡˆΠ½ΠΈΡ… ΠΎΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠΉ всСгда Π»ΡƒΡ‡ΡˆΠ΅ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹Π΅ Ρ‡Π»Π΅Π½Ρ‹, Π³Π΄Π΅ это Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ. Ѐункция-Ρ‡Π»Π΅Π½ rhs.GetAge() Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, сохранСнноС Π² ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ-Ρ‡Π»Π΅Π½Π΅ itsAge, адрСс ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ прСдставлСн Π² rhs.

ΠŸΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹, осущСствляСмыС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΎΠΉ, продСмонстрированы Π½Π° рис. 10.3. Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΡΡΡ‹Π»Π°Π»Π°ΡΡŒ пСрСмСнная-Ρ‡Π»Π΅Π½ исходного класса CAT, копируСтся Π² Π½ΠΎΠ²ΡƒΡŽ ячСйку памяти, адрСс ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ прСдставлСн Π² Ρ‚Π°ΠΊΠΎΠΉ ΠΆΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ-Ρ‡Π»Π΅Π½Π΅ Π½ΠΎΠ²ΠΎΠ³ΠΎ класса CAT.

Π’ строкС 47 вызываСтся ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ frisky ΠΈΠ· класса CAT. Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ возраста, Π·Π°Π΄Π°Π½Π½ΠΎΠ΅ Π² frisky, выводится Π½Π° экран, послС Ρ‡Π΅Π³ΠΎ Π² строкС 50 ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ возраста присваиваСтся Π½ΠΎΠ²ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ β€” 6. Π’ строкС 52 ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ копирования ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° frisky создаСтся Π½ΠΎΠ²Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ boots класса CAT. Если Π±Ρ‹ Π² качСствС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° пСрСдавался ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ frisky, Ρ‚ΠΎ Π²Ρ‹Π·ΠΎΠ² ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Ρ‰ΠΈΠΊΠ° осущСствлялся Π±Ρ‹ компилятором.