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

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

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

 // Π΄Ρ€ΡƒΠ³ΠΈΠ΅ Ρ‡Π»Π΅Π½Ρ‹

};

Π§Π°ΡΡ‚ΡŒ = delete ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ компилятору (ΠΈ читатСлям ΠΊΠΎΠ΄Π°), Ρ‡Ρ‚ΠΎ эти Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ-Ρ‡Π»Π΅Π½Ρ‹ Π½Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ΡΡ ΠΏΡ€Π΅Π΄Π½Π°ΠΌΠ΅Ρ€Π΅Π½Π½ΠΎ.

Π’ ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ части = default, Ρ‡Π°ΡΡ‚ΡŒ = delete Π΄ΠΎΠ»ΠΆΠ½Π° ΠΏΡ€ΠΈΡΡƒΡ‚ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ Π² ΠΏΠ΅Ρ€Π²ΠΎΠΌ объявлСнии ΡƒΠ΄Π°Π»Π΅Π½Π½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. Π­Ρ‚ΠΎ Ρ€Π°Π·Π»ΠΈΡ‡ΠΈΠ΅ согласуСтся со смыслом Π΄Π°Π½Π½Ρ‹Ρ… объявлСний. Π§Π°ΡΡ‚ΡŒ = default влияСт Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π½Π° Ρ‚ΠΎ, ΠΊΠ°ΠΊΠΎΠΉ ΠΊΠΎΠ΄ создаСт компилятор; ΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, ΠΎΠ½Π° Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠ°, Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΠΎΠΊΠ° компилятор Π½Π΅ создаст ΠΊΠΎΠ΄. Π‘ Π΄Ρ€ΡƒΠ³ΠΎΠΉ стороны, компилятор Π΄ΠΎΠ»ΠΆΠ΅Π½ Π·Π½Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ функция ΡƒΠ΄Π°Π»Π΅Π½Π°, ΠΈ Π·Π°ΠΏΡ€Π΅Ρ‚ΠΈΡ‚ΡŒ Π΅Π΅ использованиС Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ функциями.

Π’Π°ΠΊΠΆΠ΅ Π² ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ части = default, Ρ‡Π°ΡΡ‚ΡŒ = delete ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚ΡŒ для любой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ (= default ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΠΌΠ° Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΊ стандартному конструктору ΠΈΠ»ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ-Ρ‡Π»Π΅Π½Ρƒ управлСния ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ компилятор ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΈΠ½Ρ‚Π΅Π·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ). Π₯отя ΠΈΠ·Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎ ΡƒΠ΄Π°Π»Π΅Π½Π½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π°Π»ΠΈΡΡŒ для подавлСния Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ-Ρ‡Π»Π΅Π½ΠΎΠ² управлСния ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ, ΠΎΠ½ΠΈ ΠΈΠ½ΠΎΠ³Π΄Π° ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΠΌΡ‹ Ρ‚Π°ΠΊΠΆΠ΅ для воздСйствия Π½Π° процСсс ΠΏΠΎΠ΄Π±ΠΎΡ€Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ.

ДСструктор Π½Π΅ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ ΡƒΠ΄Π°Π»Π΅Π½Π½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ-Ρ‡Π»Π΅Π½ΠΎΠΌ

Π‘Π»Π΅Π΄ΡƒΠ΅Ρ‚ Π·Π°ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΡƒΠ΄Π°Π»ΡΡ‚ΡŒ дСструктор нСльзя. Если Π΅Π³ΠΎ ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ, Ρ‚ΠΎ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Π½ΠΈΠΊΠ°ΠΊΠΎΠ³ΠΎ способа ΠΎΡΠ²ΠΎΠ±ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ этого Ρ‚ΠΈΠΏΠ°. ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ‚ΠΎΡ€ Π½Π΅ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡ‚ΡŒ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ ΠΈΠ»ΠΈ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ Π²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Ρ‚ΠΈΠΏΠ°, Ρƒ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΡƒΠ΄Π°Π»Π΅Π½ дСструктор. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, нСльзя ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡ‚ΡŒ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ ΠΈΠ»ΠΈ Π²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ класса, ΠΎΠ±Π»Π°Π΄Π°ΡŽΡ‰Π΅Π³ΠΎ Ρ‡Π»Π΅Π½ΠΎΠΌ, Ρƒ Ρ‚ΠΈΠΏΠ° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΡƒΠ΄Π°Π»Π΅Π½ дСструктор. Если Ρƒ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ-Ρ‡Π»Π΅Π½Π° класса ΡƒΠ΄Π°Π»Π΅Π½ дСструктор, Ρ‚ΠΎ ΠΎΠ½Π° Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ освобоТдСна. Если Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΡƒΠ΄Π°Π»Π΅Π½Π° пСрСмСнная-Ρ‡Π»Π΅Π½, Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΡƒΠ΄Π°Π»Π΅Π½ ΠΈ вСсь ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Π² Ρ†Π΅Π»ΠΎΠΌ.

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

struct NoDtor {

 NoDtor() = default; // ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ синтСзируСмый стандартный

                     // конструктор

 ~NoDtor() = delete; // нСльзя ΡƒΠ΄Π°Π»ΡΡ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Ρ‚ΠΈΠΏΠ° NoDtor

};

NoDtor nd; // ошибка: Ρƒ NoDtor ΡƒΠ΄Π°Π»Π΅Π½Π½Ρ‹ΠΉ дСструктор

NoDtor *p = new NoDtor(); // ok: Π½ΠΎ нСльзя ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ p

delete p; // ошибка: Ρƒ NoDtor ΡƒΠ΄Π°Π»Π΅Π½Π½Ρ‹ΠΉ дСструктор

НСвозмоТно ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΠΈΠ»ΠΈ ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° динамичСски созданный ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Ρ‚ΠΈΠΏΠ° с ΡƒΠ΄Π°Π»Π΅Π½Π½Ρ‹ΠΌ дСструктором.

Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ-Ρ‡Π»Π΅Π½Ρ‹ управлСния ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ синтСзированы ΠΊΠ°ΠΊ ΡƒΠ΄Π°Π»Π΅Π½Π½Ρ‹Π΅

Как ΡƒΠΆΠ΅ ΡƒΠΏΠΎΠΌΠΈΠ½Π°Π»ΠΎΡΡŒ, Ссли Π½Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Ρ‹ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ-Ρ‡Π»Π΅Π½Ρ‹ управлСния ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ, компилятор ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ ΠΈΡ… сам. Аналогично, Ссли класс Π½Π΅ опрСдСляСт конструктор, компилятор синтСзируСт стандартный конструктор для этого класса сам (см. Ρ€Π°Π·Π΄Π΅Π» 7.1.4). Для Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… классов компилятор опрСдСляСт эти синтСзируСмыС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ-Ρ‡Π»Π΅Π½Ρ‹ ΠΊΠ°ΠΊ ΡƒΠ΄Π°Π»Π΅Π½Π½Ρ‹Π΅.

β€’ Π‘ΠΈΠ½Ρ‚Π΅Π·ΠΈΡ€ΡƒΠ΅ΠΌΡ‹ΠΉ дСструктор опрСдСляСтся ΠΊΠ°ΠΊ ΡƒΠ΄Π°Π»Π΅Π½Π½Ρ‹ΠΉ, Ссли Ρƒ класса Π΅ΡΡ‚ΡŒ пСрСмСнная-Ρ‡Π»Π΅Π½, собствСнный дСструктор ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΡƒΠ΄Π°Π»Π΅Π½ ΠΈΠ»ΠΈ нСдоступСн (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, private).

β€’ Π‘ΠΈΠ½Ρ‚Π΅Π·ΠΈΡ€ΡƒΠ΅ΠΌΡ‹ΠΉ конструктор ΠΊΠΎΠΏΠΈΠΉ опрСдСляСтся ΠΊΠ°ΠΊ ΡƒΠ΄Π°Π»Π΅Π½Π½Ρ‹ΠΉ, Ссли Ρƒ класса Π΅ΡΡ‚ΡŒ пСрСмСнная-Ρ‡Π»Π΅Π½, собствСнный дСструктор ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΡƒΠ΄Π°Π»Π΅Π½ ΠΈΠ»ΠΈ нСдоступСн. Он Ρ‚Π°ΠΊΠΆΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ ΡƒΠ΄Π°Π»Π΅Π½Π½Ρ‹ΠΌ, Ссли Ρƒ класса Π΅ΡΡ‚ΡŒ пСрСмСнная-Ρ‡Π»Π΅Π½ с ΡƒΠ΄Π°Π»Π΅Π½Π½Ρ‹ΠΌ ΠΈΠ»ΠΈ нСдоступным дСструктором.

β€’ Π‘ΠΈΠ½Ρ‚Π΅Π·ΠΈΡ€ΡƒΠ΅ΠΌΡ‹ΠΉ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ присвоСния ΠΊΠΎΠΏΠΈΠΈ опрСдСляСтся ΠΊΠ°ΠΊ ΡƒΠ΄Π°Π»Π΅Π½Π½Ρ‹ΠΉ, Ссли Ρƒ класса Π΅ΡΡ‚ΡŒ пСрСмСнная-Ρ‡Π»Π΅Π½ с ΡƒΠ΄Π°Π»Π΅Π½Π½Ρ‹ΠΌ ΠΈΠ»ΠΈ нСдоступным ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠΌ присвоСния ΠΊΠΎΠΏΠΈΠΈ, Π»ΠΈΠ±ΠΎ Ссли Ρƒ класса Π΅ΡΡ‚ΡŒ константный ΠΈΠ»ΠΈ ссылочный Ρ‡Π»Π΅Π½.

β€’ Π‘ΠΈΠ½Ρ‚Π΅Π·ΠΈΡ€ΡƒΠ΅ΠΌΡ‹ΠΉ стандартный конструктор опрСдСляСтся ΠΊΠ°ΠΊ ΡƒΠ΄Π°Π»Π΅Π½Π½Ρ‹ΠΉ, Ссли Ρƒ класса Π΅ΡΡ‚ΡŒ пСрСмСнная-Ρ‡Π»Π΅Π½ с ΡƒΠ΄Π°Π»Π΅Π½Π½Ρ‹ΠΌ ΠΈΠ»ΠΈ нСдоступным дСструктором; ΠΈΠ»ΠΈ имССтся ссылочный Ρ‡Π»Π΅Π½ Π±Π΅Π· внутриклассового ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π° (см. Ρ€Π°Π·Π΄Π΅Π» 2.6.1); ΠΈΠ»ΠΈ Π΅ΡΡ‚ΡŒ константная пСрСмСнная-Ρ‡Π»Π΅Π½, Ρ‚ΠΈΠΏ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π½Π΅ опрСдСляСт стандартный конструктор явно ΠΈ Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ внутриклассового ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π°.

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

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

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

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

Как Π±ΡƒΠ΄Π΅Ρ‚ продСмонстрировано Π² Ρ€Π°Π·Π΄Π΅Π»Π°Ρ… 13.6.2, 15.7.2 ΠΈ 19.6, Π΅ΡΡ‚ΡŒ ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ аспСкты, Π² связи с ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ-Ρ‡Π»Π΅Π½Ρ‹ копирования ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Ρ‹ ΠΊΠ°ΠΊ ΡƒΠ΄Π°Π»Π΅Π½Π½Ρ‹Π΅.

Как ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ, Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ-Ρ‡Π»Π΅Π½Ρ‹ управлСния ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ ΡΠΈΠ½Ρ‚Π΅Π·ΠΈΡ€ΡƒΡŽΡ‚ΡΡ ΠΊΠ°ΠΊ ΡƒΠ΄Π°Π»Π΅Π½Π½Ρ‹Π΅, ΠΊΠΎΠ³Π΄Π° Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ ΡΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ, ΠΏΡ€ΠΈΡΠ²ΠΎΠΈΡ‚ΡŒ ΠΈΠ»ΠΈ ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ Ρ‡Π»Π΅Π½ класса.

Π—Π°ΠΊΡ€Ρ‹Ρ‚Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ управлСния ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ

Π”ΠΎ появлСния Π½ΠΎΠ²ΠΎΠ³ΠΎ стандарта классы ΠΏΡ€Π΅Π΄ΠΎΡ‚Π²Ρ€Π°Ρ‰Π°Π»ΠΈ ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅, объявляя свой конструктор ΠΊΠΎΠΏΠΈΠΉ ΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ присвоСния ΠΊΠΎΠΏΠΈΠΈ ΠΊΠ°ΠΊ Π·Π°ΠΊΡ€Ρ‹Ρ‚Ρ‹Π΅ (private):

class PrivateCopy {

 // Π½Π΅Ρ‚ спСцификатора доступа; ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ Ρ‡Π»Π΅Π½Ρ‹ ΡΠ²Π»ΡΡŽΡ‚ΡΡ Π·Π°ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΌΠΈ

 // ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ; см. p. 7.2

 // Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ управлСния ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ Π·Π°ΠΊΡ€Ρ‹Ρ‚Ρ‹, Π° ΠΏΠΎΡ‚ΠΎΠΌΡƒ нСдоступны

 // ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠΌΡƒ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠΌΡƒ ΠΊΠΎΠ΄Ρƒ

 PrivateCopy(const PrivateCopy&);

 PrivateCopy &operator=(const PrivateCopy&);

 // Π΄Ρ€ΡƒΠ³ΠΈΠ΅ Ρ‡Π»Π΅Π½Ρ‹

public:

 PrivateCopy() = default; // ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ синтСзируСмый стандартный

                          // конструктор

 ~PrivateCopy(); // ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΠΈ ΠΌΠΎΠ³ΡƒΡ‚ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ этого Ρ‚ΠΈΠΏΠ°,

                 // Π½ΠΎ Π½Π΅ ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΡ…

};

ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ дСструктор являСтся ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΌ (public), ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΠΈ смогут ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ класса PrivateCopy. Но Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ конструктор ΠΊΠΎΠΏΠΈΠΉ ΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ присвоСния ΠΊΠΎΠΏΠΈΠΈ ΡΠ²Π»ΡΡŽΡ‚ΡΡ Π·Π°ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΌΠΈ (private), ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ ΠΊΠΎΠ΄ Π½Π΅ смоТСт ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚Π°ΠΊΠΈΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹. Но друТСствСнныС классы ΠΈ Ρ‡Π»Π΅Π½Ρ‹ класса Π²ΠΏΠΎΠ»Π½Π΅ ΠΌΠΎΠ³ΡƒΡ‚ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ ΠΊΠΎΠΏΠΈΠΈ. Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€Π΅Π΄ΠΎΡ‚Π²Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈ Π΄Ρ€ΡƒΠ·ΡŒΡΠΌΠΈ, ΠΈ Ρ‡Π»Π΅Π½Π°ΠΌΠΈ класса, эти Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ-Ρ‡Π»Π΅Π½Ρ‹ ΠΎΠ±ΡŠΡΠ²Π»ΡΡŽΡ‚ Π·Π°ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΌΠΈ ΠΈ Π½Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ ΠΈΡ….

Π—Π° ΠΎΠ΄Π½ΠΈΠΌ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ, рассматриваСмым Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ 15.2.1, Π²ΠΏΠΎΠ»Π½Π΅ допустимо ΠΎΠ±ΡŠΡΠ²Π»ΡΡ‚ΡŒ, Π½ΠΎ Π½Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ-Ρ‡Π»Π΅Π½Ρ‹ (см. Ρ€Π°Π·Π΄Π΅Π» 6.1.2). ΠŸΠΎΠΏΡ‹Ρ‚ΠΊΠ° использования Π½Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ-Ρ‡Π»Π΅Π½Π° ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Ρ‚ ΠΊ ΠΎΡ‚ΠΊΠ°Π·Ρƒ Π²ΠΎ врСмя ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΊΠΈ. ΠŸΡ€ΠΈ объявлСнии (Π±Π΅Π· опрСдСлСния) Π·Π°ΠΊΡ€Ρ‹Ρ‚ΠΎΠ³ΠΎ конструктора ΠΊΠΎΠΏΠΈΠΉ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€Π΅Π΄ΠΎΡ‚Π²Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ Π»ΡŽΠ±ΡƒΡŽ ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΡƒ ΡΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ класса: ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ ΠΊΠΎΠ΄, ΠΏΡ‹Ρ‚Π°ΡŽΡ‰ΠΈΠΉΡΡ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ копию, Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΠΌΠ΅Ρ‡Π΅Π½ ΠΊΠ°ΠΊ ΠΎΡˆΠΈΠ±ΠΎΡ‡Π½Ρ‹ΠΉ Π²ΠΎ врСмя компиляции; ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠΈ копирования Π² функциях-Ρ‡Π»Π΅Π½Π°Ρ… ΠΈΠ»ΠΈ друТСствСнных классах Π±ΡƒΠ΄ΡƒΡ‚ ΠΎΡ‚ΠΌΠ΅Ρ‡Π΅Π½Ρ‹ ΠΊΠ°ΠΊ ошибка Π²ΠΎ врСмя рСдактирования.

Для классов, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΏΡ€Π΅Π΄ΠΎΡ‚Π²Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅, слСдуСт ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ собствСнный конструктор ΠΊΠΎΠΏΠΈΠΉ ΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ присвоСния ΠΊΠΎΠΏΠΈΠΈ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Ρ‡Π°ΡΡ‚ΡŒ = delete вмСсто объявлСния ΠΈΡ… Π·Π°ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΌΠΈ.

УпраТнСния Ρ€Π°Π·Π΄Π΅Π»Π° 13.1.6

Π£ΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ 13.18. ΠžΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚Π΅ класс Employee, содСрТащий имя сотрудника ΠΈ Π΅Π³ΠΎ ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€. Π‘Π½Π°Π±Π΄ΠΈΡ‚Π΅ класс стандартным конструктором ΠΈ конструктором, ΠΏΠΎΠ»ΡƒΡ‡Π°ΡŽΡ‰ΠΈΠΌ строку, ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΡƒΡŽ имя сотрудника. ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ конструктор Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ Π·Π° счСт приращСния статичСской ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ-Ρ‡Π»Π΅Π½Π°.

Π£ΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ 13.19. Π”ΠΎΠ»ΠΆΠ΅Π½ Π»ΠΈ класс Employee ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ собствСнныС вСрсии Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ-Ρ‡Π»Π΅Π½ΠΎΠ² управлСния ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ? Если Π΄Π°, Ρ‚ΠΎ ΠΏΠΎΡ‡Π΅ΠΌΡƒ? Если Π½Π΅Ρ‚, Ρ‚ΠΎ Ρ‚ΠΎΠΆΠ΅ ΠΏΠΎΡ‡Π΅ΠΌΡƒ? Π Π΅Π°Π»ΠΈΠ·ΡƒΠΉΡ‚Π΅ всС Ρ‡Π»Π΅Π½Ρ‹ управлСния ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ…, Π½Π° ваш взгляд, нуТдаСтся класс Employee.

Π£ΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ 13.20. ΠžΠ±ΡŠΡΡΠ½ΠΈΡ‚Π΅, Ρ‡Ρ‚ΠΎ происходит ΠΏΡ€ΠΈ ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ, присвоСнии ΠΈ ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² классов TextQuery ΠΈ QueryResult ΠΈΠ· Ρ€Π°Π·Π΄Π΅Π»Π° 12.3.