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

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«Π―Π·Ρ‹ΠΊ программирования C++. ΠŸΡΡ‚ΠΎΠ΅ ΠΈΠ·Π΄Π°Π½ΠΈΠ΅Β». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 168

Автор Π‘Ρ‚Π΅Π½Π»ΠΈ Π›ΠΈΠΏΠΏΠΌΠ°Π½

ПослСдниС Π΄Π²Π΅ Π³Π»Π°Π²Ρ‹ этой части посвящСны ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ΅ языком Π‘++ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½ΠΎ-ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ ΠΈ ΠΎΠ±ΠΎΠ±Ρ‰Π΅Π½Π½ΠΎΠ³ΠΎ программирования.

Π“Π»Π°Π²Π° 15 рассматриваСт наслСдованиС ΠΈ динамичСскоС связываниС. Наряду с абстракциСй Π΄Π°Π½Π½Ρ‹Ρ… наслСдованиС ΠΈ динамичСскоС связываниС β€” это основы ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½ΠΎ-ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ программирования. НаслСдованиС ΠΎΠ±Π»Π΅Π³Ρ‡Π°Π΅Ρ‚ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ связанных Ρ‚ΠΈΠΏΠΎΠ², Π° динамичСскоС связываниС позволяСт ΠΏΠΈΡΠ°Ρ‚ΡŒ нСзависимый ΠΎΡ‚ Ρ‚ΠΈΠΏΠΎΠ² ΠΊΠΎΠ΄, способный ΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ различия ΠΌΠ΅ΠΆΠ΄Ρƒ Ρ‚ΠΈΠΏΠ°ΠΌΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ связаны наслСдованиСм.

Π“Π»Π°Π²Π° 16 посвящСна шаблонам классов ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ. Π¨Π°Π±Π»ΠΎΠ½Ρ‹ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΎΠ±ΠΎΠ±Ρ‰Π΅Π½Π½Ρ‹Π΅ классы ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ зависят ΠΎΡ‚ Ρ‚ΠΈΠΏΠΎΠ². Новый стандарт Π²Π²Π΅Π» мноТСство Π½ΠΎΠ²Ρ‹Ρ… срСдств, связанных с шаблонами: ΡˆΠ°Π±Π»ΠΎΠ½Ρ‹ с ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌ количСством Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ², псСвдонимы Ρ‚ΠΈΠΏΠΎΠ² шаблона ΠΈ Π½ΠΎΠ²Ρ‹Π΅ способы контроля создания экзСмпляра.

Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ собствСнных ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½ΠΎ-ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Ρ… ΠΈΠ»ΠΈ ΠΎΠ±ΠΎΠ±Ρ‰Π΅Π½Π½Ρ‹Ρ… Ρ‚ΠΈΠΏΠΎΠ² Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ довольно Ρ…ΠΎΡ€ΠΎΡˆΠ΅Π³ΠΎ понимания языка Π‘++. К ΡΡ‡Π°ΡΡ‚ΡŒΡŽ, для ΠΈΡ… использования это Π½Π΅ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ. НапримСр, стандартная Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° интСнсивно ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ срСдства, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°ΡŽΡ‚ΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² Π³Π»Π°Π²Π°Ρ… 15 ΠΈ 16, Π½ΠΎ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅Ρ‡Π½Ρ‹Π΅ Ρ‚ΠΈΠΏΡ‹ ΠΈ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΡ‹ использовались ΡƒΠΆΠ΅ с самого Π½Π°Ρ‡Π°Π»Π° ΠΊΠ½ΠΈΠ³ΠΈ, Π΄Π°ΠΆΠ΅ Π±Π΅Π· объяснСния ΠΈΡ… Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ.

ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ Ρ‡ΠΈΡ‚Π°Ρ‚Π΅Π»ΠΈ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΏΠΎΠ½ΠΈΠΌΠ°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ Ρ‡Π°ΡΡ‚ΡŒ III посвящСна довольно слоТным срСдствам. НаписаниС шаблонов ΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½ΠΎ-ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Ρ… классов Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ Ρ…ΠΎΡ€ΠΎΡˆΠ΅Π³ΠΎ понимания основ языка Π‘++ ΠΈ Π³Π»ΡƒΠ±ΠΎΠΊΠΎΠ³ΠΎ знания Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ Π±Π°Π·ΠΎΠ²Ρ‹Π΅ классы.

Π“Π»Π°Π²Π° 13

Π£ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ

Как ΡƒΠΏΠΎΠΌΠΈΠ½Π°Π»ΠΎΡΡŒ Π² Π³Π»Π°Π²Π΅ 7, ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ класс являСтся ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ΠΌ Π½ΠΎΠ²ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ° ΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠΆΠ½ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ с ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌΠΈ этого Ρ‚ΠΈΠΏΠ°. Π’ этой Π³Π»Π°Π²Π΅ ΡƒΠΏΠΎΠΌΠΈΠ½Π°Π»ΠΎΡΡŒ Ρ‚Π°ΠΊΠΆΠ΅ ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ классы ΠΌΠΎΠ³ΡƒΡ‚ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡ‚ΡŒ конструкторы, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΠΈΡ€ΡƒΡŽΡ‚ происходящСС ΠΏΡ€ΠΈ создании ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Π΄Π°Π½Π½ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ°.

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

ΠŸΡ€ΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠΈ класса Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ (явно ΠΈΠ»ΠΈ нСявно) опрСдСляСт происходящСС ΠΏΡ€ΠΈ ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ, ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠΈ, присвоСнии ΠΈ ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Π΄Π°Π½Π½ΠΎΠ³ΠΎ класса. Класс ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΠΈΡ€ΡƒΠ΅Ρ‚ эти ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ, опрСдСляя ΠΏΡΡ‚ΡŒ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ-Ρ‡Π»Π΅Π½ΠΎΠ²: конструктор ΠΊΠΎΠΏΠΈΠΉ (copy constructor), ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ присвоСния ΠΊΠΎΠΏΠΈΠΈ (copy-assignment operator), конструктор пСрСмСщСния (move constructor), ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ присваивания ΠΏΡ€ΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠΈ (move-assignment operator) ΠΈ дСструктор (destructor). ΠšΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ‚ΠΎΡ€Ρ‹ копирования ΠΈ пСрСмСщСния ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ происходящСС ΠΏΡ€ΠΈ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Π΄Π°Π½Π½Ρ‹ΠΌΠΈ ΠΈΠ· Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Ρ‚ΠΎΠ³ΠΎ ΠΆΠ΅ Ρ‚ΠΈΠΏΠ°. ΠžΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ копирования ΠΈ присваивания ΠΏΡ€ΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ происходящСС ΠΏΡ€ΠΈ присвоСнии ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Π΄Π°Π½Π½ΠΎΠ³ΠΎ класса Π΄Ρ€ΡƒΠ³ΠΎΠΌΡƒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρƒ Ρ‚ΠΎΠ³ΠΎ ΠΆΠ΅ класса. ДСструктор опрСдСляСт происходящСС Π² ΠΌΠΎΠΌΠ΅Π½Ρ‚, ΠΊΠΎΠ³Π΄Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Π΄Π°Π½Π½ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ° ΠΏΡ€Π΅ΠΊΡ€Π°Ρ‰Π°Π΅Ρ‚ сущСствованиС. ВсС эти ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ вмСстС ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ Π½Π°Π·Ρ‹Π²Π°Ρ‚ΡŒ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ΠΌ ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ (copy control).

Если класс опрСдСляСт Π½Π΅ всС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ-Ρ‡Π»Π΅Π½Ρ‹ управлСния ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ, компилятор сам ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ Π½Π΅Π΄ΠΎΡΡ‚Π°ΡŽΡ‰ΠΈΠ΅. Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ ΠΌΠ½ΠΎΠ³ΠΈΠ΅ классы ΠΌΠΎΠ³ΡƒΡ‚ Π½Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡ‚ΡŒ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ (см. Ρ€Π°Π·Π΄Π΅Π» 7.1.5). Но Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ классы Π½Π΅ ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΠΎΠ»Π°Π³Π°Ρ‚ΡŒΡΡ Π½Π° Π·Π°Π΄Π°Π½Π½Ρ‹Π΅ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ опрСдСлСния. Π—Π°Ρ‡Π°ΡΡ‚ΡƒΡŽ Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ трудная Ρ‡Π°ΡΡ‚ΡŒ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ управлСния ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ β€” это принятиС Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ ΠΎΠ± ΠΈΡ… нСобходимости.

Π£ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ β€” это ваТнСйшая Ρ‡Π°ΡΡ‚ΡŒ опрСдСлСния любого класса Π‘++. Π£ Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‰ΠΈΡ… программистов Π‘++ Π·Π°Ρ‡Π°ΡΡ‚ΡƒΡŽ Π²ΠΎΠ·Π½ΠΈΠΊΠ°ΡŽΡ‚ затруднСния ΠΏΡ€ΠΈ нСобходимости опрСдСлСния дСйствий, происходящих ΠΏΡ€ΠΈ ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ, ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠΈ, присвоСнии ΠΈ ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ². Π­Ρ‚ΠΎ Π·Π°Ρ‚Ρ€ΡƒΠ΄Π½Π΅Π½ΠΈΠ΅ обусловлСно Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ Π·Π°Π΄Π°Π²Π°Ρ‚ΡŒ ΠΈΡ… Π½Π΅ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, компилятор Π²ΠΏΠΎΠ»Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΈΡ… сам, хотя Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ этих дСйствий ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π½Π΅ совсСм Ρ‚Π°ΠΊΠΈΠΌ, ΠΊΠ°ΠΊ Ρ…ΠΎΡ‚Π΅Π»ΠΎΡΡŒ Π±Ρ‹.

13.1. ΠšΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅, присвоСниС ΠΈ ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠ΅

НачнСм с Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ простых ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ: конструктора ΠΊΠΎΠΏΠΈΠΉ, ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° присвоСния ΠΊΠΎΠΏΠΈΠΈ ΠΈ дСструктора. ΠžΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ пСрСмСщСния (Π²Π²Π΅Π΄Π΅Π½Π½Ρ‹Π΅ Π½ΠΎΠ²Ρ‹ΠΌ стандартом) Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°ΡŽΡ‚ΡΡ Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ 13.6.

13.1.1. ΠšΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ‚ΠΎΡ€ ΠΊΠΎΠΏΠΈΠΉ

Если ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ конструктора β€” ссылка Π½Π° Ρ‚ΠΈΠΏ класса, Π° всС Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ ΠΈΠΌΠ΅ΡŽΡ‚ значСния ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ, Ρ‚ΠΎ это конструктор ΠΊΠΎΠΏΠΈΠΉ:

class Foo {

public:

 Foo(); // стандартный конструктор

 Foo(const Foo&); // конструктор ΠΊΠΎΠΏΠΈΠΉ

 // ...

}

По ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π°ΠΌ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±ΡƒΠ΄ΡƒΡ‚ описаны Π½ΠΈΠΆΠ΅, ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΈΠΌΠ΅Ρ‚ΡŒ ссылочный Ρ‚ΠΈΠΏ. Он ΠΏΠΎΡ‡Ρ‚ΠΈ всСгда являСтся ссылкой Π½Π° константу, хотя Π²ΠΏΠΎΠ»Π½Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ конструктор ΠΊΠΎΠΏΠΈΠΉ, ΠΏΠΎΠ»ΡƒΡ‡Π°ΡŽΡ‰ΠΈΠΉ ссылку Π½Π° Π½Π΅ константу. ΠŸΡ€ΠΈ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΎΠ±ΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΡΡ‚Π²Π°Ρ… конструктор ΠΊΠΎΠΏΠΈΠΉ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ нСявно. Π‘Π»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, конструктор ΠΊΠΎΠΏΠΈΠΉ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ Π½Π΅ слСдуСт ΠΎΠ±ΡŠΡΠ²Π»ΡΡ‚ΡŒ ΠΊΠ°ΠΊ explicit (см. Ρ€Π°Π·Π΄Π΅Π» 7.5.4).

Π‘ΠΈΠ½Ρ‚Π΅Π·ΠΈΡ€ΡƒΠ΅ΠΌΡ‹ΠΉ конструктор ΠΊΠΎΠΏΠΈΠΉ

Если конструктор ΠΊΠΎΠΏΠΈΠΉ Π½Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ для класса явно, компилятор синтСзируСт Π΅Π³ΠΎ сам. Π’ ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ синтСзируСмого стандартного конструктора (см. Ρ€Π°Π·Π΄Π΅Π» 7.1.4), конструктор ΠΊΠΎΠΏΠΈΠΉ синтСзируСтся, Π΄Π°ΠΆΠ΅ Ссли ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Ρ‹ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ конструкторы.

Как Π±ΡƒΠ΄Π΅Ρ‚ продСмонстрировано Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ 13.1.6, синтСзируСмый конструктор ΠΊΠΎΠΏΠΈΠΉ (synthesized copy constructor) Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… классов прСпятствуСт ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡŽ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² этого Ρ‚ΠΈΠΏΠ°. Π’ ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС синтСзируСмый конструктор ΠΊΠΎΠΏΠΈΠΉ осущСствляСт ΠΏΠΎΡ‡Π»Π΅Π½Π½ΠΎΠ΅ ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ (memberwise copy) Ρ‡Π»Π΅Π½ΠΎΠ² своСго Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° Π² создаваСмый ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ (см. Ρ€Π°Π·Π΄Π΅Π» 7.1.5). ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ‚ΠΎΡ€ ΠΏΠΎ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ ΠΊΠΎΠΏΠΈΡ€ΡƒΠ΅Ρ‚ ΠΊΠ°ΠΆΠ΄ΡƒΡŽ Π½Π΅ΡΡ‚Π°Ρ‚ΠΈΡ‡Π΅ΡΠΊΡƒΡŽ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ-Ρ‡Π»Π΅Π½ Π·Π°Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Π² создаваСмый.

Бпособ копирования ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ-Ρ‡Π»Π΅Π½Π° опрСдСляСт Π΅Π΅ Ρ‚ΠΈΠΏ: для Ρ‚ΠΈΠΏΠΎΠ² класса примСняСтся конструктор ΠΊΠΎΠΏΠΈΠΉ этого класса, Π° Ρ‡Π»Π΅Π½Ρ‹ встроСнного Ρ‚ΠΈΠΏΠ° ΠΊΠΎΠΏΠΈΡ€ΡƒΡŽΡ‚ΡΡ нСпосрСдствСнно. Π₯отя нСльзя нСпосрСдствСнно ΡΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ массив (см. Ρ€Π°Π·Π΄Π΅Π» 3.5.1), синтСзируСмый конструктор ΠΊΠΎΠΏΠΈΠΉ ΠΊΠΎΠΏΠΈΡ€ΡƒΠ΅Ρ‚ Ρ‡Π»Π΅Π½Ρ‹ Ρ‚ΠΈΠΏΠ° массива поэлСмСнтно. Π­Π»Π΅ΠΌΠ΅Π½Ρ‚Ρ‹ Ρ‚ΠΈΠΏΠ° класса ΠΊΠΎΠΏΠΈΡ€ΡƒΡŽΡ‚ΡΡ с использованиСм конструкторов ΠΊΠΎΠΏΠΈΠΉ элСмСнтов.

НапримСр, синтСзируСмый конструктор ΠΊΠΎΠΏΠΈΠΉ для класса Sales_data эквивалСнтСн ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌΡƒ:

class Sales_data {

public:

 // Π΄Ρ€ΡƒΠ³ΠΈΠ΅ Ρ‡Π»Π΅Π½Ρ‹ ΠΈ конструкторы ΠΊΠ°ΠΊ ΠΏΡ€Π΅ΠΆΠ΄Π΅

 // объявлСниС, эквивалСнтноС синтСзируСмому конструктору ΠΊΠΎΠΏΠΈΠΉ

 Sales_data(const Sales_data&);

private:

 std::string bookNo;

 int units_sold = 0;

 double revenue = 0.0;

};

// эквивалСнт конструктора ΠΊΠΎΠΏΠΈΠΉ, синтСзированный для класса Sales_data

Sales_data::Sales_data(const Sales_data &orig):

 bookNo(orig.bookNo), // использованиС конструктора ΠΊΠΎΠΏΠΈΠΉ string

 units_sold(orig.units_sold), // ΠΊΠΎΠΏΠΈΡ€ΡƒΠ΅Ρ‚ orig.units_sold

 revenue(orig.revenue)        // ΠΊΠΎΠΏΠΈΡ€ΡƒΠ΅Ρ‚ orig.revenue

{ }                           // пустоС Ρ‚Π΅Π»ΠΎ

Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡ ΠΊΠΎΠΏΠΈΠ΅ΠΉ

Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ Ρ€Π°ΡΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ различия ΠΌΠ΅ΠΆΠ΄Ρƒ прямой ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠ΅ΠΉ ΠΈ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠ΅ΠΉ ΠΊΠΎΠΏΠΈΠ΅ΠΉ (см. Ρ€Π°Π·Π΄Π΅Π» 3.2.1):

string dots(10, '.');               // прямая инициализация

string s(dots);                     // прямая инициализация

strings2 = dots;                    // инициализация ΠΊΠΎΠΏΠΈΠ΅ΠΉ

string null_book = "9-999-99999-9"; // инициализация ΠΊΠΎΠΏΠΈΠ΅ΠΉ

string nines = string(100, '9');    // инициализация ΠΊΠΎΠΏΠΈΠ΅ΠΉ

ΠŸΡ€ΠΈ прямой ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΎΡ‚ компилятора трСбуСтся ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΉ Π²Ρ‹Π±ΠΎΡ€ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ (см. Ρ€Π°Π·Π΄Π΅Π» 6.4) для ΠΏΠΎΠ΄Π±ΠΎΡ€Π° конструктора, Π½Π°ΠΈΠ»ΡƒΡ‡ΡˆΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ прСдоставлСнным Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°ΠΌ. Когда ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ инициализация ΠΊΠΎΠΏΠΈΠ΅ΠΉ (copy initialization), ΠΎΡ‚ компилятора трСбуСтся ΡΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€Π°Π²Ρ‹ΠΉ ΠΎΠΏΠ΅Ρ€Π°Π½Π΄ Π² создаваСмый ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, осущСствляя прСобразования Π² случаС нСобходимости (см. Ρ€Π°Π·Π΄Π΅Π» 7.5.4).

Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡ ΠΊΠΎΠΏΠΈΠ΅ΠΉ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ конструктор ΠΊΠΎΠΏΠΈΠΉ. Но, ΠΊΠ°ΠΊ Π±ΡƒΠ΄Π΅Ρ‚ продСмонстрировано Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ 13.6.2, Ссли Ρƒ класса Π΅ΡΡ‚ΡŒ конструктор пСрСмСщСния, Ρ‚ΠΎ инициализация ΠΊΠΎΠΏΠΈΠ΅ΠΉ ΠΈΠ½ΠΎΠ³Π΄Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ конструктор пСрСмСщСния вмСсто конструктора ΠΊΠΎΠΏΠΈΠΉ, Π° ΠΏΠΎΠΊΠ° достаточно Π·Π½Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΊΠΎΠΏΠΈΠ΅ΠΉ трСбуСтся Π»ΠΈΠ±ΠΎ конструктор ΠΊΠΎΠΏΠΈΠΉ, Π»ΠΈΠ±ΠΎ конструктор пСрСмСщСния.

Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡ ΠΊΠΎΠΏΠΈΠ΅ΠΉ осущСствляСтся Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΡ€ΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… с использованиСм ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° =, Π½ΠΎ ΠΈ ΠΏΡ€ΠΈ:

β€’ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° ΠΊΠ°ΠΊ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρƒ Π½Π΅ ссылочного Ρ‚ΠΈΠΏΠ°;

β€’ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π΅Π½ΠΈΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° ΠΈΠ· Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ с Π½Π΅ ссылочным Ρ‚ΠΈΠΏΠΎΠΌ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ³ΠΎ значСния;

β€’ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ списком Π² скобках элСмСнтов массива ΠΈΠ»ΠΈ Ρ‡Π»Π΅Π½ΠΎΠ² Π°Π³Ρ€Π΅Π³Π°Ρ‚Π½ΠΎΠ³ΠΎ класса (см. Ρ€Π°Π·Π΄Π΅Π» 7.5.5)