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

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

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

NamedObject<int>no1(β€œSmallest Prime Number”, 2);

NamedObject<int>no2(no1); // вызываСтся конструктор копирования


ΠšΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ‚ΠΎΡ€ копирования, сгСнСрированный компилятором, Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ no2.nameValue ΠΈ no2.objectValue, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ nol.nameValue ΠΈ nol.objectValue соотвСтствСнно. Π§Π»Π΅Π½ nameValue ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‚ΠΈΠΏ string, Π° Π² стандартном классС string объявлСн конструктор копирования, поэтому no2. nameValue Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½ Π²Ρ‹Π·ΠΎΠ²ΠΎΠΌ конструктора копирования string с Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² nol.nameValue. Π‘ Π΄Ρ€ΡƒΠ³ΠΎΠΉ стороны, Ρ‡Π»Π΅Π½ NameObject<int>::objectValue ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‚ΠΈΠΏ int (ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ T Π΅ΡΡ‚ΡŒ int Π² Π΄Π°Π½Π½ΠΎΠΉ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚ΠΈΠ·Π°Ρ†ΠΈΠΈ шаблона), Π° int – встроСнный Ρ‚ΠΈΠΏ, поэтому no2.objectValue Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½ ΠΏΠΎΠ±ΠΈΡ‚ΠΎΠ²Ρ‹ΠΌ ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ nol.objectValue.

Π‘Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ компилятором ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ присваивания для класса Named-Object<int> Π±ΡƒΠ΄Π΅Ρ‚ вСсти сСбя Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½Ρ‹ΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Π½ΠΎ, Π²ΠΎΠΎΠ±Ρ‰Π΅ говоря, сгСнСрированная компилятором вСрсия ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° присваивания Π²Π΅Π΄Π΅Ρ‚ сСбя Ρ‚Π°ΠΊ, ΠΊΠ°ΠΊ я описал, Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² Ρ‚ΠΎΠΌ случаС, ΠΊΠΎΠ³Π΄Π° Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ получаСтся ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½Ρ‹ΠΉ ΠΈ осмыслСнный ΠΊΠΎΠ΄. Π’ ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС компилятор Π½Π΅ сгСнСрируСт operator=.

НапримСр, ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Ρ‡Ρ‚ΠΎ класс NamedObject ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½, ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π½ΠΈΠΆΠ΅. ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ nameValue – ссылка Π½Π° string, Π° objectValue ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‚ΠΈΠΏ const T:


template<class T>

class NamedObject {

public:

// этот конструктор Π±ΠΎΠ»Π΅Π΅ Π½Π΅ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ const name, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ nameValue –

// Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ссылка Π½Π° Π½Π΅ΠΊΠΎΠ½ΡΡ‚Π°Π½Ρ‚Π½ΡƒΡŽ строку. ΠšΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ‚ΠΎΡ€ с Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠΌ Ρ‚ΠΈΠΏΠ°

// char* ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π½Π°ΠΌ Π½ΡƒΠΆΠ½Π° строка, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΡΠ»Π°Ρ‚ΡŒΡΡ

NamedObject(std::string& name, const T& value);

... // ΠΊΠ°ΠΊ ΠΈ Ρ€Π°Π½Π΅Π΅, ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π΅ΠΌ,

// Ρ‡Ρ‚ΠΎ operator= Π½Π΅ объявлСн

private:

std::string& nameValue; // Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ это ссылка

const T objectValue; // Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ const

};


ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΠΌ, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΎΠΈΠ·ΠΎΠΉΠ΄Π΅Ρ‚ Π² ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΌ Π½ΠΈΠΆΠ΅ ΠΊΠΎΠ΄Π΅:


std::string newDog(β€œPersephone”);

std::string oldDog(β€œSatch”);

NamedObject<int> p(newDog, 2); // Когда я Π²ΠΏΠ΅Ρ€Π²Ρ‹Π΅ написал это,

// наша собака ΠŸΠ΅Ρ€ΡΠ΅Ρ„ΠΎΠ½Π° ΡΠΎΠ±ΠΈΡ€Π°Π»Π°ΡΡŒ

// Π²ΡΡ‚Ρ€Π΅Ρ‚ΠΈΡ‚ΡŒ свой Π²Ρ‚ΠΎΡ€ΠΎΠΉ дСнь роТдСния

NamedObject<int> s(oldDog, 36); // Π‘Π΅ΠΌΠ΅ΠΉΠ½ΠΎΠΌΡƒ псу Π‘Π°Ρ‚Ρ‡Ρƒ (ΠΈΠ· ΠΌΠΎΠ΅Π³ΠΎ

// дСтства) Π±Ρ‹Π»ΠΎ Π±Ρ‹ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ 36 Π»Π΅Ρ‚

p = s; // Π§Ρ‚ΠΎ Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΠΏΡ€ΠΎΠΈΠ·ΠΎΠΉΡ‚ΠΈ

// с Π΄Π°Π½Π½Ρ‹ΠΌΠΈ-Ρ‡Π»Π΅Π½Π°ΠΌΠΈ p?


ΠŸΠ΅Ρ€Π΅Π΄ присваиваниСм ΠΈ p.nameValue, ΠΈ s.nameValue ΡΡΡ‹Π»Π°Π»ΠΈΡΡŒ Π½Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ string, хотя ΠΈ Π½Π° Ρ€Π°Π·Π½Ρ‹Π΅. Π§Ρ‚ΠΎ Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΠΏΡ€ΠΎΠΈΠ·ΠΎΠΉΡ‚ΠΈ с Ρ‡Π»Π΅Π½ΠΎΠΌ p.nameValue Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ присваивания? Π”ΠΎΠ»ΠΆΠ΅Π½ Π»ΠΈ ΠΎΠ½ ΡΡΡ‹Π»Π°Ρ‚ΡŒΡΡ Π½Π° Ρ‚Ρƒ ΠΆΠ΅ строку, Ρ‡Ρ‚ΠΎ ΠΈ s.nameValue, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ Π΄ΠΎΠ»ΠΆΠ½Π° Π»ΠΈ ΠΌΠΎΠ΄ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ ссылка? Если Π΄Π°, это ΠΏΠΎΠ΄Ρ€Ρ‹Π²Π°Π΅Ρ‚ основы, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ C++ Π½Π΅ позволяСт ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ ссылка. Но, Π±Ρ‹Ρ‚ΡŒ ΠΌΠΎΠΆΠ΅Ρ‚, Π΄ΠΎΠ»ΠΆΠ½Π° ΠΌΠΎΠ΄ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ строка, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ссылаСтся Ρ‡Π»Π΅Π½ p.nameValue, ΠΈ Ρ‚ΠΎΠ³Π΄Π° Π±ΡƒΠ΄ΡƒΡ‚ Π·Π°Ρ‚Ρ€ΠΎΠ½ΡƒΡ‚Ρ‹ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹, содСрТащиС ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ ΠΈΠ»ΠΈ ссылки Π½Π° эту строку, хотя ΠΎΠ½ΠΈ ΠΈ Π½Π΅ участвовали нСпосрСдствСнно Π² присваивании? Π­Ρ‚ΠΎ Π»ΠΈ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π΄Π΅Π»Π°Ρ‚ΡŒ сгСнСрированный компилятором ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ присваивания?

Π‘Ρ‚Π°Π»ΠΊΠΈΠ²Π°ΡΡΡŒ с ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎΠΉ Π³ΠΎΠ»ΠΎΠ²ΠΎΠ»ΠΎΠΌΠΊΠΎΠΉ, C++ просто отказываСтся ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ этот ΠΊΠΎΠ΄. Если Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Ρ‚ΡŒ присваиваниС Π² классС, Π²ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‰Π΅ΠΌ Π² сСбя Ρ‡Π»Π΅Π½-ссылку, Ρ‚ΠΎ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ присваивания ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ. Аналогичным ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ компилятор Π²Π΅Π΄Π΅Ρ‚ сСбя с классами, содСрТащими константныС Ρ‡Π»Π΅Π½Ρ‹ (Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ objectValue Π²ΠΎ Π²Ρ‚ΠΎΡ€ΠΎΠΌ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π΅ класса NamedObject Π²Ρ‹ΡˆΠ΅). ΠœΠΎΠ΄ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ константныС Ρ‡Π»Π΅Π½Ρ‹ Π·Π°ΠΏΡ€Π΅Ρ‰Π΅Π½ΠΎ, поэтому компилятор Π½Π΅ Π·Π½Π°Π΅Ρ‚, ΠΊΠ°ΠΊ ΠΏΠΎΡΡ‚ΡƒΠΏΠ°Ρ‚ΡŒ ΠΏΡ€ΠΈ нСявной Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° присваивания. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, компилятор Π½Π΅ станСт нСявно Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ присваивания Π² ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½ΠΎΠΌ классС, Ссли Π² Π΅Π³ΠΎ Π±Π°Π·ΠΎΠ²ΠΎΠΌ объявлСн Π·Π°ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΉ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ присваивания. И Π½Π°ΠΊΠΎΠ½Π΅Ρ†, прСдполагаСтся, Ρ‡Ρ‚ΠΎ сгСнСрированныС компилятором ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ присваивания для ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹Ρ… классов Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ части Π±Π°Π·ΠΎΠ²Ρ‹Ρ… классов (см. ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ 12), Π½ΠΎ ΠΏΡ€ΠΈ этом ΠΎΠ½ΠΈ ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎ ΠΆΠ΅ Π½Π΅ ΠΌΠΎΠ³ΡƒΡ‚ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ-Ρ‡Π»Π΅Π½Ρ‹, доступ ΠΊ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ для Π½ΠΈΡ… Π·Π°ΠΏΡ€Π΅Ρ‰Π΅Π½.

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

β€’ ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ‚ΠΎΡ€ ΠΌΠΎΠΆΠ΅Ρ‚ нСявно Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ для класса конструктор ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ, конструктор копирования, ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ присваивания ΠΈ дСструктор.

ΠŸΡ€Π°Π²ΠΈΠ»ΠΎ 6: Π―Π²Π½ΠΎ Π·Π°ΠΏΡ€Π΅Ρ‰Π°ΠΉΡ‚Π΅ компилятору Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²Π°ΠΌ Π½Π΅ Π½ΡƒΠΆΠ½Ρ‹

АгСнты ΠΏΠΎ ΠΏΡ€ΠΎΠ΄Π°ΠΆΠ΅ нСдвиТимости ΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹Π΅ систСмы, ΠΎΠ±ΡΠ»ΡƒΠΆΠΈΠ²Π°ΡŽΡ‰ΠΈΠ΅ ΠΈΡ… Π΄Π΅ΡΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ, ΠΌΠΎΠ³ΡƒΡ‚ Π½ΡƒΠΆΠ΄Π°Ρ‚ΡŒΡΡ Π² классС, ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‰Π΅ΠΌ Π΄ΠΎΠΌΠ°, выставлСнныС Π½Π° ΠΏΡ€ΠΎΠ΄Π°ΠΆΡƒ:


class HomeForSale {...};


Π›ΡŽΠ±ΠΎΠΉ Π°Π³Π΅Π½Ρ‚ ΠΏΠΎ ΠΏΡ€ΠΎΠ΄Π°ΠΆΠ΅ нСдвиТимости скаТСт Π²Π°ΠΌ, Ρ‡Ρ‚ΠΎ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΡƒΠ½ΠΈΠΊΠ°Π»Π΅Π½ – Π½Π΅ Π±Ρ‹Π²Π°Π΅Ρ‚ Π΄Π²ΡƒΡ…, Π² точности ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹Ρ…. Π’ΠΎΡ‚ ΠΏΠΎΡ‡Π΅ΠΌΡƒ идСя создания ΠΊΠΎΠΏΠΈΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° HomeForSale бСссмыслСнна. Как ΠΌΠΎΠΆΠ½ΠΎ ΡΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π½Π΅Ρ‡Ρ‚ΠΎ, ΠΏΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΡŽ, ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½ΠΎΠ΅? ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ Ρ…ΠΎΡ‚Π΅Π»ΠΎΡΡŒ Π±Ρ‹, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠΈ ΡΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ HomeForSale Π½Π΅ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Π»ΠΈΡΡŒ:


HomeForSale h1;

HomeForSale h2;

HomeForSale h3(h1); // ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠ° ΡΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ h1 –

// Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ!

h1 = h2; // ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠ° ΡΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ h2 –

// Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ!


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

ΠŸΠΎΡ…ΠΎΠΆΠ΅ Π½Π° Π±Π΅Π·Π²Ρ‹Ρ…ΠΎΠ΄Π½ΠΎΠ΅ ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅. Если Π²Ρ‹ сами Π½Π΅ ΠΎΠ±ΡŠΡΠ²ΠΈΡ‚Π΅ конструктор копирования ΠΈΠ»ΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ присваивания, Ρ‚ΠΎ ΠΈΡ… сгСнСрируСт компилятор. И ваш класс Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Ρ‚ΡŒ ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅. Но Ρ‚ΠΎ ΠΆΠ΅ самоС ΠΏΡ€ΠΎΠΈΠ·ΠΎΠΉΠ΄Π΅Ρ‚, Ссли Π²Ρ‹ ΠΎΠ±ΡŠΡΠ²ΠΈΡ‚Π΅ эти Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ. Однако наша Ρ†Π΅Π»ΡŒ – ΠΏΡ€Π΅Π΄ΠΎΡ‚Π²Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅!

ΠšΠ»ΡŽΡ‡ ΠΊ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡŽ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ всС сгСнСрированныС компилятором Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΡΠ²Π»ΡΡŽΡ‚ΡΡ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΌΠΈ. Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€Π΅Π΄ΠΎΡ‚Π²Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ автоматичСскоС Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅, Π²Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΎΠ±ΡŠΡΠ²ΠΈΡ‚ΡŒ ΠΈΡ… ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ, Π½ΠΎ Π½ΠΈΠΊΡ‚ΠΎ Π½Π΅ Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ½ΠΈ Π±Ρ‹Π»ΠΈ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΌΠΈ. Ну Ρ‚Π°ΠΊ ΠΈ ΠΎΠ±ΡŠΡΠ²ΠΈΡ‚Π΅ конструктор копирования ΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ присваивания Π·Π°ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΌΠΈ. Объявляя явно Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ-Ρ‡Π»Π΅Π½, Π²Ρ‹ ΠΏΡ€Π΅Π΄ΠΎΡ‚Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚Π΅ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π΅Π΅ компилятором, Π° сдСлав Π΅Π΅ Π·Π°ΠΊΡ€Ρ‹Ρ‚ΠΎΠΉ, Π½Π΅ позволяСтС ΠΊΠΎΠΌΡƒ-Π»ΠΈΠ±ΠΎ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ Π΅Π΅.

Π‘Ρ…Π΅ΠΌΠ° Π½Π΅ идСальна, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ Ρ‡Π»Π΅Π½Ρ‹ класса ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ-Π΄Ρ€ΡƒΠ·ΡŒΡ ΠΏΠΎ-ΠΏΡ€Π΅ΠΆΠ½Π΅ΠΌΡƒ ΠΌΠΎΠ³ΡƒΡ‚ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ Π·Π°ΠΊΡ€Ρ‹Ρ‚Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. Если Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π²Ρ‹ Π½Π΅ Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅ лишь объявлСниС, опустив ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅. Π’ΠΎΠ³Π΄Π° Ссли ΠΊΡ‚ΠΎ-Ρ‚ΠΎ случайно Π²Ρ‹Π·ΠΎΠ²Π΅Ρ‚ Ρ‚Π°ΠΊΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, Ρ‚ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ сообщСниС ΠΎΠ± ошибкС Π½Π° этапС ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΊΠΈ. Π­Ρ‚ΠΎΡ‚ Ρ‚Ρ€ΡŽΠΊ – объявлСниС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ-Ρ‡Π»Π΅Π½ΠΎΠ² Π·Π°ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΌΠΈ ΠΈ ΡΠΎΠ·Π½Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΎΡ‚ΠΊΠ°Π· ΠΎΡ‚ ΠΈΡ… Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ – ΠΊΠ°ΠΊ Ρ€Π°Π· ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для прСдотвращСния копирования Π² Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… классах Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ iostreams. ВзглянитС, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π½Π° объявлСния классов ios_base, basic_ios ΠΈ sentry Π² вашСй Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ стандартной Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ. Π’Ρ‹ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΡ‚Π΅, Ρ‡Ρ‚ΠΎ Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΌ случаС ΠΊΠ°ΠΊ конструктор копирования, Ρ‚Π°ΠΊ ΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ присваивания ΠΎΠ±ΡŠΡΠ²Π»Π΅Π½Ρ‹ Π·Π°ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΌΠΈ ΠΈ Π½ΠΈΠ³Π΄Π΅ Π½Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Ρ‹.

ΠŸΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚ΡŒ эту ΡƒΠ»ΠΎΠ²ΠΊΡƒ Π² классС HomeForSale нСслоТно:


class HomeForSale {

public:

...

private:

HomeForSale(const HomeForSale&); // Ρ‚ΠΎΠ»ΡŒΠΊΠΎ объявлСния

HomeForSale& oparetor=( const HomeForSale&);

};


Π—Π°ΠΌΠ΅Ρ‚ΡŒΡ‚Π΅, Ρ‡Ρ‚ΠΎ я Π½Π΅ ΡƒΠΊΠ°Π·Π°Π» ΠΈΠΌΠ΅Π½Π° ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ. Π­Ρ‚ΠΎ Π½Π΅ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, просто Ρ‚Π°ΠΊΠΎΠ²ΠΎ ΠΎΠ±Ρ‰Π΅Π΅ соглашСниС. Π’Π΅Π΄ΡŒ Ρ€Π°Π· эти Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ Π±ΡƒΠ΄ΡƒΡ‚ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Ρ‹Π²Π°Ρ‚ΡŒΡΡ ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ, Ρ‚ΠΎ ΠΊΠ°ΠΊΠΎΠΉ смысл Π·Π°Π΄Π°Π²Π°Ρ‚ΡŒ ΠΈΠΌΠ΅Π½Π° ΠΈΡ… ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ²?

ΠŸΡ€ΠΈ Ρ‚Π°ΠΊΠΎΠΌ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠΈ компилятор Π±ΡƒΠ΄Π΅Ρ‚ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π»ΡŽΠ±Ρ‹Π΅ ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠΈ ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠ² ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ HomeForSale, Π° Ссли Π²Ρ‹ случайно ΠΏΠΎΠΏΡ‹Ρ‚Π°Π΅Ρ‚Π΅ΡΡŒ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ это Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ-Ρ‡Π»Π΅Π½Π΅ ΠΈΠ»ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ-Π΄Ρ€ΡƒΠ³Π΅ класса, Ρ‚ΠΎ ΠΎΠ± ошибкС сообщит ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²Ρ‰ΠΈΠΊ.

БущСствуСт Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ ΠΎΡˆΠΈΠ±ΠΊΡƒ с этапа ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΊΠΈ Π½Π° этап компиляции (это всСгда ΠΏΠΎΠ»Π΅Π·Π½ΠΎ – Π»ΡƒΡ‡ΡˆΠ΅ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΡ‚ΡŒ ΠΎΡˆΠΈΠ±ΠΊΡƒ ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π°Π½ΡŒΡˆΠ΅), Ссли ΠΎΠ±ΡŠΡΠ²ΠΈΡ‚ΡŒ конструктор копирования ΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ присваивания Π·Π°ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΌΠΈ Π½Π΅ Π² самом классС HomeForSale, Π° Π² Π΅Π³ΠΎ Π±Π°Π·ΠΎΠ²ΠΎΠΌ классС, ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎ созданном для прСдотвращСния копирования. Π’Π°ΠΊΠΎΠΉ Π±Π°Π·ΠΎΠ²Ρ‹ΠΉ класс ΠΎΡ‡Π΅Π½ΡŒ прост:


class Uncopyable {

protected:

Uncopyable() {} // Ρ€Π°Π·Ρ€Π΅ΡˆΠΈΡ‚ΡŒ конструированиС

~Uncopyable() {} // ΠΈ ΡƒΠ½ΠΈΡ‡Ρ‚ΠΎΠΆΠ΅Π½ΠΈΠ΅

// ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹Ρ… классов

private:

Uncopyable(const Uncopyable&); // Π½ΠΎ ΠΏΡ€Π΅Π΄ΠΎΡ‚Π²Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅

Uncopyable& operator=(const Uncopyable&);

};


Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€Π΅Π΄ΠΎΡ‚Π²Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² HomeForSale, Π½ΡƒΠΆΠ½ΠΎ лишь ΡƒΠ½Π°ΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚ΡŒ Π΅Π³ΠΎ ΠΎΡ‚ Uncopyable:


class HomeForSale : private Uncopyable { // Π² этом класс большС Π½Π΅Ρ‚ Π½ΠΈ

... // конструктора копирования, Π½ΠΈ

} // ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° присваивания


Π’Π°ΠΊΠΎΠ΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ компилятор пытаСтся Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ конструктор копирования ΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ присваивания, Ссли Π³Π΄Π΅-Ρ‚ΠΎ – ΠΏΡƒΡΡ‚ΡŒ Π΄Π°ΠΆΠ΅ Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ-Ρ‡Π»Π΅Π½Π΅ ΠΈΠ»ΠΈ друТСствСнной Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ – производится ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠ° ΡΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ HomeForSale. Как ΠΎΠ±ΡŠΡΡΠ½ΡΠ΅Ρ‚ΡΡ Π² ΠΏΡ€Π°Π²ΠΈΠ»Π΅ 12, сгСнСрированныС компилятором вСрсии Π±ΡƒΠ΄ΡƒΡ‚ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈΠ· Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ класса. Но это Π½Π΅ получится, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ Π² Π±Π°Π·ΠΎΠ²ΠΎΠΌ классС ΠΎΠ½ΠΈ ΠΎΠ±ΡŠΡΠ²Π»Π΅Π½Ρ‹ Π·Π°ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΌΠΈ.

РСализация ΠΈ использованиС класса Uncopyable сопряТСна с Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌΠΈ тонкостями. НапримСр, наслСдованиС ΠΎΡ‚ Uncopyable Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΌ (см. ΠΏΡ€Π°Π²ΠΈΠ»Π° 32 ΠΈ 39), Π° дСструктор Uncopyable Π½Π΅ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹ΠΌ (см. ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ 7). ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Uncopyable Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ Π΄Π°Π½Π½Ρ‹Ρ…-Ρ‡Π»Π΅Π½ΠΎΠ², Ρ‚ΠΎ компилятор ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΈΠ±Π΅Π³Π½ΡƒΡ‚ΡŒ ΠΊ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ пустых Π±Π°Π·ΠΎΠ²Ρ‹Ρ… классов, описанной Π² ΠΏΡ€Π°Π²ΠΈΠ»Π΅ 39, Π½ΠΎ коль скоро этот класс Π±Π°Π·ΠΎΠ²Ρ‹ΠΉ, Ρ‚ΠΎ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΈΠ΅ мноТСствСнного наслСдования (см. ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ 40). А мноТСствСнноС наслСдованиС Π² Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… случаях Π½Π΅ Π΄Π°Π΅Ρ‚ возмоТности провСсти ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΡŽ пустых Π±Π°Π·ΠΎΠ²Ρ‹Ρ… классов (см. ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ 39). Π’ΠΎΠΎΠ±Ρ‰Π΅ говоря, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ эти тонкости ΠΈ просто ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Uncopyable, ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π²Ρ‹ΡˆΠ΅. ΠœΠΎΠΆΠ΅Ρ‚Π΅ Ρ‚Π°ΠΊΠΆΠ΅ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ вСрсиСй ΠΈΠ· Π±ΠΈΠ»ΠΈΠΎΡ‚Π΅ΠΊΠΈ Boost (см. ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ 55). Π’ Π½Π΅ΠΉ этот класс называСтся noncopyable. Π­Ρ‚ΠΎ Ρ…ΠΎΡ€ΠΎΡˆΠΈΠΉ класс, Π½ΠΎ ΠΌΠ½Π΅ просто показалось, Ρ‡Ρ‚ΠΎ Π΅Π³ΠΎ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ, скаТСм Ρ‚Π°ΠΊ, нССстСствСнноС.