// ΠΠ±ΡΡΠ²Π»ΡΠ΅ΠΌ ΠΊΠΎΠΏΠΈΡΡΡΡΠΈΠΉ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡ ΠΊΠ°ΠΊ explicit (Ρ Π΄Π°Π½Π½ΠΎΠ³ΠΎ
// ΡΠ΅ΡΠ΅Π½ΠΈΡ ΠΈΠΌΠ΅Π΅ΡΡΡ ΠΏΠΎΠ±ΠΎΡΠ½ΠΎΠ΅ Π΄Π΅ΠΉΡΡΠ²ΠΈΠ΅, ΡΠ°ΠΊ ΡΡΠΎ ΡΡΠ΅Π±ΡΠ΅ΡΡΡ
// ΡΠ»ΡΡΡΠ΅Π½ΠΈΠ΅ ΡΡΠΎΠ³ΠΎ ΠΌΠ΅ΡΠΎΠ΄Π°)
class B { // ...
public:
explicit B(const B& rhs);
};
class D : public B { /* ... */ };
ΠΡΠ·ΡΠ²Π°ΡΡΠΈΠΉ ΠΊΠΎΠ΄ Π²ΡΠ΅ ΡΠ°Π²Π½ΠΎ Π² ΡΠΎΡΡΠΎΡΠ½ΠΈΠΈ Π²ΡΠΏΠΎΠ»Π½ΠΈΡΡ ΡΡΠ΅Π·ΠΊΡ, Π΅ΡΠ»ΠΈ ΡΡΠΎ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ, Π½ΠΎ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π΄Π΅Π»Π°ΡΡ ΡΡΠΎ ΡΠ²Π½ΠΎ:
void Transmogrify(B obj); // Π’Π΅ΠΏΠ΅ΡΡ ΡΡΠ° ΡΡΠ½ΠΊΡΠΈΡ Π²ΠΎΠΎΠ±ΡΠ΅ Π½Π΅
// ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ Π²ΡΠ·Π²Π°Π½Π° (!)
void Transmogrify2(const B& obj) // ΠΠ΄ΠΈΠΎΠΌΠ° Π΄Π»Ρ Π½Π°ΠΌΠ΅ΡΠ΅Π½ΠΈΡ Π²
{ // Π»ΡΠ±ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ ΠΏΠΎΠ»ΡΡΠΈΡΡ
Π b( obj ); // ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ obj ΠΏΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΡ
// ... // (Ρ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΠΉ ΡΡΠ΅Π·ΠΊΠΎΠΉ)
}
B b; // ΠΠ°Π·ΠΎΠ²ΡΠ΅ ΠΊΠ»Π°ΡΡΡ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ Π±ΡΡΡ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΡΠΌΠΈ
D d; // (ΡΠΌ. ΡΠ΅ΠΊΠΎΠΌΠ΅Π½Π΄Π°ΡΠΈΡ 35), Π½ΠΎ Π΄ΠΎΠΏΡΡΡΠΈΠΌ ΡΡΠΎ
Transmogrify(b); // ΠΠΎΠ»ΠΆΠ½Π° Π±ΡΡΡ ΠΎΡΠΈΠ±ΠΊΠ° (ΡΠΌ. ΠΏΡΠΈΠΌΠ΅ΡΠ°Π½ΠΈΠ΅)
Transmogrify(d); // ΠΠΎΠ»ΠΆΠ½Π° Π±ΡΡΡ ΠΎΡΠΈΠ±ΠΊΠ° (ΡΠΌ. ΠΏΡΠΈΠΌΠ΅ΡΠ°Π½ΠΈΠ΅)
Transmogrify2(d); // ΠΡΠ΅ Π² ΠΏΠΎΡΡΠ΄ΠΊΠ΅
ΠΡΠΈΠΌΠ΅ΡΠ°Π½ΠΈΠ΅: Π½Π° ΠΌΠΎΠΌΠ΅Π½Ρ Π½Π°ΠΏΠΈΡΠ°Π½ΠΈΡ Π΄Π°Π½Π½ΠΎΠΉ ΡΠ΅ΠΊΠΎΠΌΠ΅Π½Π΄Π°ΡΠΈΠΈ Π½Π΅ΠΊΠΎΡΠΎΡΡΠ΅ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡΡ ΠΎΡΠΈΠ±ΠΎΡΠ½ΠΎ Π΄ΠΎΠΏΡΡΠΊΠ°Π»ΠΈ ΠΎΠ΄ΠΈΠ½ ΠΈΠ»ΠΈ ΠΎΠ±Π° ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½Π½ΡΡ Π²ΡΠ·ΠΎΠ²Π° ΡΡΠ½ΠΊΡΠΈΠΈ Transmogrify. ΠΡΠ° ΠΈΠ΄ΠΈΠΎΠΌΠ° Π²ΠΏΠΎΠ»Π½Π΅ ΡΡΠ°Π½Π΄Π°ΡΡΠ½Π°, Π½ΠΎ (ΠΏΠΎΠΊΠ° ΡΡΠΎ) Π½Π΅ ΠΏΠΎΠ»Π½ΠΎΡΡΡΡ ΠΏΠ΅ΡΠ΅Π½ΠΎΡΠΈΠΌΠ°.
ΠΠΌΠ΅Π΅ΡΡΡ Π»ΡΡΡΠΈΠΉ ΡΠΏΠΎΡΠΎΠ± ΠΏΡΠ΅Π΄ΡΠΏΡΠ΅ΠΆΠ΄Π΅Π½ΠΈΡ ΡΡΠ΅Π·ΠΊΠΈ, Ρ Π±ΠΎΠ»Π΅Π΅ Π²ΡΡΠΎΠΊΠΎΠΉ ΡΡΠ΅ΠΏΠ΅Π½ΡΡ ΠΏΠ΅ΡΠ΅Π½ΠΎΡΠΈΠΌΠΎΡΡΠΈ. ΠΡΡΡΡ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΡΡΠ½ΠΊΡΠΈΡ Π½Π°ΠΏΠΎΠ΄ΠΎΠ±ΠΈΠ΅ Transmogrify Π² Π΄Π΅ΠΉΡΡΠ²ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ Ρ ΠΎΡΠ΅Ρ ΠΏΠΎΠ»ΡΡΠΈΡΡ ΠΏΠΎΠ»Π½ΡΡ Π³Π»ΡΠ±ΠΎΠΊΡΡ ΠΊΠΎΠΏΠΈΡ Π±Π΅Π· ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ ΠΎ Π΄Π΅ΠΉΡΡΠ²ΠΈΡΠ΅Π»ΡΠ½ΠΎΠΌ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄Π½ΠΎΠΌ ΡΠΈΠΏΠ΅ ΠΏΠ΅ΡΠ΅Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΠΎΠ±ΡΠ΅ΠΊΡΠ°. ΠΠΎΠ»Π΅Π΅ ΠΎΠ±ΡΠ΅Π΅ ΠΈΠ΄ΠΈΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΎΠ΅ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ ΡΠΎΡΡΠΎΠΈΡ Π² ΡΠΎΠΌ, ΡΡΠΎΠ±Ρ ΡΠ΄Π΅Π»Π°ΡΡ ΠΊΠΎΠΏΠΈΡΡΡΡΠΈΠΉ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡ Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ ΠΊΠ»Π°ΡΡΠ° Π·Π°ΡΠΈΡΠ΅Π½Π½ΡΠΌ (ΡΡΠΎΠ±Ρ ΡΡΠ½ΠΊΡΠΈΡ Π½Π°ΠΏΠΎΠ΄ΠΎΠ±ΠΈΠ΅ Transmogrify Π½Π΅ ΠΌΠΎΠ³Π»Π° ΡΠ»ΡΡΠ°ΠΉΠ½ΠΎ Π΅Π³ΠΎ Π²ΡΠ·Π²Π°ΡΡ), Π° Π²ΠΌΠ΅ΡΡΠΎ Π½Π΅Π³ΠΎ Π²ΠΎΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ Π²ΠΈΡΡΡΠ°Π»ΡΠ½ΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠ΅ΠΉ Clone:
// Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ Clone (ΡΠΆΠ΅ Π»ΡΡΡΠ΅, Π½ΠΎ Π²ΡΠ΅ Π΅ΡΠ΅ ΡΡΠ΅Π±ΡΠ΅ΡΡΡ
// ΡΡΠΎΠ²Π΅ΡΡΠ΅Π½ΡΡΠ²ΠΎΠ²Π°Π½ΠΈΠ΅)
class B { // ...
public:
virtual B* Clone() const = 0;
protected:
B(const B&);
};
class D : public B { // ...
public:
virtual D* Clone() const { return new D(*this); }
protected:
D( const D& rhs ): B(rhs) {/*...*/ }
};
Π’Π΅ΠΏΠ΅ΡΡ ΠΏΠΎΠΏΡΡΠΊΠ° ΡΡΠ΅Π·ΠΊΠΈ Π±ΡΠ΄Π΅Ρ (ΠΏΠ΅ΡΠ΅Π½ΠΎΡΠΈΠΌΠΎ) Π³Π΅Π½Π΅ΡΠΈΡΠΎΠ²Π°ΡΡ ΠΎΡΠΈΠ±ΠΊΡ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΈΠΈ, Π° ΠΎΠ±ΡΡΠ²Π»Π΅Π½ΠΈΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ Clone ΠΊΠ°ΠΊ ΡΠΈΡΡΠΎ Π²ΠΈΡΡΡΠ°Π»ΡΠ½ΠΎΠΉ Π·Π°ΡΡΠ°Π²Π»ΡΠ΅Ρ Π½Π΅ΠΏΠΎΡΡΠ΅Π΄ΡΡΠ²Π΅Π½Π½ΡΠΉ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄Π½ΡΠΉ ΠΊΠ»Π°ΡΡ ΠΏΠ΅ΡΠ΅ΠΊΡΡΡΡ Π΅Π΅. Π ΡΠΎΠΆΠ°Π»Π΅Π½ΠΈΡ, Ρ Π΄Π°Π½Π½ΡΠΌ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ΠΌ Π²ΡΠ΅ Π΅ΡΠ΅ ΡΠ²ΡΠ·Π°Π½Ρ Π΄Π²Π΅ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡ Π½Π΅ Π² ΡΠΎΡΡΠΎΡΠ½ΠΈΠΈ ΠΎΠ±Π½Π°ΡΡΠΆΠΈΡΡ: Π² ΠΊΠ»Π°ΡΡΠ΅, ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄Π½ΠΎΠΌ ΠΎΡ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄Π½ΠΎΠ³ΠΎ, ΡΡΠ½ΠΊΡΠΈΡ Clone ΠΌΠΎΠΆΠ΅Ρ ΠΎΠΊΠ°Π·Π°ΡΡΡΡ Π½Π΅ΠΏΠ΅ΡΠ΅ΠΊΡΡΡΠΎΠΉ, Π° ΠΏΠ΅ΡΠ΅ΠΊΡΡΡΠΈΠ΅ Clone ΠΌΠΎΠΆΠ΅Ρ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°ΡΡ Π΅Π΅ Π½Π΅ΠΊΠΎΡΡΠ΅ΠΊΡΠ½ΠΎ, ΡΠ°ΠΊ ΡΡΠΎ ΠΊΠΎΠΏΠΈΡ Π±ΡΠ΄Π΅Ρ Π½Π΅ ΡΠΎΠ³ΠΎ ΠΆΠ΅ ΡΠΈΠΏΠ°, ΡΡΠΎ ΠΈ ΠΎΡΠΈΠ³ΠΈΠ½Π°Π». Π€ΡΠ½ΠΊΡΠΈΡ Clone Π΄ΠΎΠ»ΠΆΠ½Π° ΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΡ ΡΠ°Π±Π»ΠΎΠ½Ρ ΠΏΡΠΎΠ΅ΠΊΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ Nonvirtual Interface (NVI; ΡΠΌ. ΡΠ΅ΠΊΠΎΠΌΠ΅Π½Π΄Π°ΡΠΈΡ 39), ΠΊΠΎΡΠΎΡΡΠΉ ΡΠ°Π·Π΄Π΅Π»ΡΠ΅Ρ ΠΎΡΠΊΡΡΡΡΡ ΠΈ Π²ΠΈΡΡΡΠ°Π»ΡΠ½ΡΡ ΠΏΡΠΈΡΠΎΠ΄Ρ Clone ΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ Π²Π°ΠΌ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΡΠ΄ Π²Π°ΠΆΠ½ΡΡ ΠΏΡΠΎΠ²Π΅ΡΠΎΠΊ:
class Π { // ...
publiΡ:
B* Clone() const { // ΠΠ΅Π²ΠΈΡΡΡΠ°Π»ΡΠ½Π°Ρ ΡΡΠ½ΠΊΡΠΈΡ
B* Ρ = DoClone();
assert(typeid(*p) == typeid(*this) &&
"DoClone incorrectly overridden");
return p; // ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° ΡΠΈΠΏΠ°, Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΠΌΠΎΠ³ΠΎ DoClone
}
protected:
B(const B&);
private:
virtual B* DoClone() const = 0;
};
Π€ΡΠ½ΠΊΡΠΈΡ Clone ΡΠ΅ΠΏΠ΅ΡΡ ΡΠ²Π»ΡΠ΅ΡΡΡ Π½Π΅Π²ΠΈΡΡΡΠ°Π»ΡΠ½ΡΠΌ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠΎΠΌ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΠΌ Π²ΡΠ·ΡΠ²Π°ΡΡΠΈΠΌ ΠΊΠΎΠ΄ΠΎΠΌ. ΠΡΠΎΠΈΠ·Π²ΠΎΠ΄Π½ΡΠ΅ ΠΊΠ»Π°ΡΡΡ Π΄ΠΎΠ»ΠΆΠ½Ρ ΠΏΠ΅ΡΠ΅ΠΊΡΡΡΡ ΡΡΠ½ΠΊΡΠΈΡ DoClone. ΠΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½Π°Ρ ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° ΠΎΠ±Π½Π°ΡΡΠΆΠΈΡ Π²ΡΠ΅ ΠΊΠΎΠΏΠΈΠΈ, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΈΠΌΠ΅ΡΡ ΡΠΈΠΏ, ΠΎΡΠ»ΠΈΡΠ½ΡΠΉ ΠΎΡ ΠΎΡΠΈΠ³ΠΈΠ½Π°Π»Π°, ΡΠ΅ΠΌ ΡΠ°ΠΌΡΠΌ ΠΎΠΏΠΎΠ²Π΅ΡΠ°Ρ, ΡΡΠΎ Π² Π½Π΅ΠΊΠΎΡΠΎΡΠΎΠΌ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»Π°ΡΡΠ΅ Π½Π΅ ΠΏΠ΅ΡΠ΅ΠΊΡΡΡΠ° ΡΡΠ½ΠΊΡΠΈΡ DoClone; Π² ΠΊΠΎΠ½ΡΠ΅ ΠΊΠΎΠ½ΡΠΎΠ², Π·Π°Π΄Π°ΡΠ° assert ΡΠΎΡΡΠΎΠΈΡ ΠΈΠΌΠ΅Π½Π½ΠΎ Π² ΠΎΠ±Π½Π°ΡΡΠΆΠ΅Π½ΠΈΠΈ ΠΈ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΈ ΠΎ ΡΠ°ΠΊΠΈΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ½ΡΡ ΠΎΡΠΈΠ±ΠΊΠ°Ρ (ΡΠΌ. ΡΠ΅ΠΊΠΎΠΌΠ΅Π½Π΄Π°ΡΠΈΠΈ 68 ΠΈ 70).
ΠΡΠΊΠ»ΡΡΠ΅Π½ΠΈΡΠΠ΅ΠΊΠΎΡΠΎΡΡΠ΅ ΠΏΡΠΎΠ΅ΠΊΡΠ½ΡΠ΅ ΡΠ΅ΡΠ΅Π½ΠΈΡ ΠΌΠΎΠ³ΡΡ ΡΡΠ΅Π±ΠΎΠ²Π°ΡΡ, ΡΡΠΎΠ±Ρ ΠΊΠΎΠΏΠΈΡΡΡΡΠΈΠ΅ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡΡ Π±Π°Π·ΠΎΠ²ΡΡ ΠΊΠ»Π°ΡΡΠΎΠ² ΠΎΡΡΠ°Π²Π°Π»ΠΈΡΡ ΠΎΡΠΊΡΡΡΡΠΌΠΈ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΊΠΎΠ³Π΄Π° ΡΠ°ΡΡΡ Π²Π°ΡΠ΅ΠΉ ΠΈΠ΅ΡΠ°ΡΡ ΠΈΠΈ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΠ΅Ρ ΡΠΎΠ±ΠΎΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΡ ΡΡΠΎΡΠΎΠ½Π½Π΅Π³ΠΎ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»Ρ). Π ΡΠ°ΠΊΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ ΡΠ»Π΅Π΄ΡΠ΅Ρ ΠΏΡΠ΅Π΄ΠΏΠΎΡΠ΅ΡΡΡ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡ ΠΏΠΎΡΡΠ΅Π΄ΡΡΠ²ΠΎΠΌ (ΠΈΠ½ΡΠ΅Π»Π»Π΅ΠΊΡΡΠ°Π»ΡΠ½ΠΎΠ³ΠΎ) ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΠ΅ ΠΏΠΎ ΡΡΡΠ»ΠΊΠ΅; ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π² ΡΠ΅ΠΊΠΎΠΌΠ΅Π½Π΄Π°ΡΠΈΠΈ 25, ΠΏΠ΅ΡΠ΅Π΄Π°ΡΠ° ΠΏΠΎΡΡΠ΅Π΄ΡΡΠ²ΠΎΠΌ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ ΡΡΡΠ΅ΡΡΠ²Π΅Π½Π½ΠΎ ΠΌΠ΅Π½Π΅Π΅ ΠΏΠΎΠ΄Π²Π΅ΡΠΆΠ΅Π½Π° ΡΡΠ΅Π·ΠΊΠ΅ ΠΈ Π½Π΅ΠΆΠ΅Π»Π°ΡΠ΅Π»ΡΠ½ΠΎΠΌΡ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ Π²ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ².
Π‘ΡΡΠ»ΠΊΠΈ[Dewhurst03] Β§30, Β§76, Β§94 β’ [Meyers96] Β§13 β’ [Meyers97] Β§22 β’ [Stroustrup94] Β§11.4.4 β’ [Stroustrup00] Β§12.2.3
55. ΠΡΠ΅Π΄ΠΏΠΎΡΠΈΡΠ°ΠΉΡΠ΅ ΠΊΠ°Π½ΠΎΠ½ΠΈΡΠ΅ΡΠΊΠΈΠΉ Π²ΠΈΠ΄ ΠΏΡΠΈΡΠ²Π°ΠΈΠ²Π°Π½ΠΈΡ
ΠΡΠΈ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΠ° operator= ΠΏΡΠ΅Π΄ΠΏΠΎΡΠΈΡΠ°ΠΉΡΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΊΠ°Π½ΠΎΠ½ΠΈΡΠ΅ΡΠΊΠΈΠΉ Π²ΠΈΠ΄ β Π½Π΅Π²ΠΈΡΡΡΠ°Π»ΡΠ½ΡΠΉ Ρ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠΉ ΡΠΈΠ³Π½Π°ΡΡΡΠΎΠΉ.
ΠΠ±ΡΡΠΆΠ΄Π΅Π½ΠΈΠ΅ΠΡΠ΅Π΄ΠΏΠΎΡΡΠΈΡΠ΅Π»ΡΠ½ΠΎ ΠΎΠ±ΡΡΠ²Π»ΡΡΡ ΠΊΠΎΠΏΠΈΡΡΡΡΠ΅Π΅ ΠΏΡΠΈΡΠ²Π°ΠΈΠ²Π°Π½ΠΈΠ΅ Π΄Π»Ρ ΡΠΈΠΏΠ° T Ρ ΠΎΠ΄Π½ΠΎΠΉ ΠΈΠ· ΡΠ»Π΅Π΄ΡΡΡΠΈΡ ΡΠΈΠ³Π½Π°ΡΡΡ (ΡΠΌ. [Stroustrup00] ΠΈ [Alexandrescu03a]):
T& operator=(const T&); // ΠΊΠ»Π°ΡΡΠΈΡΠ΅ΡΠΊΠΈΠΉ Π²ΠΈΠ΄
T& operator=(T); // ΠΏΠΎΡΠ΅Π½ΡΠΈΠ°Π»ΡΠ½ΠΎ ΠΎΠΏΡΠΈΠΌΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π½ΡΠΉ
// Π²ΠΈΠ΄ (ΡΠΌ. ΡΠ΅ΠΊΠΎΠΌΠ΅Π½Π΄Π°ΡΠΈΡ 27)
ΠΡΠΎΡΠΎΠΉ Π²Π°ΡΠΈΠ°Π½Ρ ΠΈΠΌΠ΅Π΅Ρ ΡΠΌΡΡΠ» ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ, Π΅ΡΠ»ΠΈ Π²Π°ΠΌ Π² Π»ΡΠ±ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ ΡΡΠ΅Π±ΡΠ΅ΡΡΡ ΠΊΠΎΠΏΠΈΡ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠ° Π² ΡΠ΅Π»Π΅ Π²Π°ΡΠ΅Π³ΠΎ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΠ°, ΠΊΠ°ΠΊ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΏΡΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠΈ ΠΈΠ΄ΠΈΠΎΠΌΡ, ΠΎΡΠ½ΠΎΠ²Π°Π½Π½ΠΎΠΉ Π½Π° ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ ΠΎΠ±ΠΌΠ΅Π½Π° (ΡΠΌ. ΡΠ΅ΠΊΠΎΠΌΠ΅Π½Π΄Π°ΡΠΈΡ 56).
ΠΠ·Π±Π΅Π³Π°ΠΉΡΠ΅ Π΄Π΅Π»Π°ΡΡ Π»ΡΠ±ΠΎΠΉ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡ ΠΏΡΠΈΡΠ²Π°ΠΈΠ²Π°Π½ΠΈΡ Π²ΠΈΡΡΡΠ°Π»ΡΠ½ΡΠΌ (ΡΠΌ. [Meyers96] Β§33 ΠΈ [Sutter04] Β§19). ΠΡΠ»ΠΈ Π²Ρ ΠΏΠΎΠ»Π°Π³Π°Π΅ΡΠ΅, ΡΡΠΎ Π²Π°ΠΌ ΡΡΠ΅Π±ΡΠ΅ΡΡΡ Π²ΠΈΡΡΡΠ°Π»ΡΠ½ΠΎΠ΅ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ ΠΏΡΠΈΡΠ²Π°ΠΈΠ²Π°Π½ΠΈΡ, ΠΎΠ±ΡΠ°ΡΠΈΡΠ΅ΡΡ ΡΠ½Π°ΡΠ°Π»Π° ΠΊ ΡΠΊΠ°Π·Π°Π½Π½ΠΎΠΉ Π»ΠΈΡΠ΅ΡΠ°ΡΡΡΠ΅. ΠΡΠ»ΠΈ ΠΈ ΠΏΠΎΡΠ»Π΅ ΡΡΠΎΠ³ΠΎ Π²Ρ ΡΡΠΎΠΈΡΠ΅ Π½Π° ΡΠ²ΠΎΠ΅ΠΌ, ΡΠΎ Π»ΡΡΡΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π²ΠΈΡΡΡΠ°Π»ΡΠ½ΡΡ ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½ΡΡ ΡΡΠ½ΠΊΡΠΈΡ, Π° Π½Π΅ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, virtual void Assign(const T&);).
He Π²ΠΎΠ·Π²ΡΠ°ΡΠ°ΠΉΡΠ΅ const T&. Π₯ΠΎΡΡ ΡΡΠΎΡ ΡΠΈΠΏ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΠΌΠΎΠ³ΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΡ ΠΈΠΌΠ΅Π΅Ρ ΡΠΎ ΠΏΡΠ΅ΠΈΠΌΡΡΠ΅ΡΡΠ²ΠΎ, ΡΡΠΎ Π·Π°ΡΠΈΡΠ°Π΅Ρ ΠΎΡ ΡΡΡΠ°Π½Π½ΡΡ ΠΏΡΠΈΡΠ²Π°ΠΈΠ²Π°Π½ΠΈΠΉ Π½Π°ΠΏΠΎΠ΄ΠΎΠ±ΠΈΠ΅ (a=b)=c, Π³Π»Π°Π²Π½ΡΠΌ Π΅Π³ΠΎ Π½Π΅Π΄ΠΎΡΡΠ°ΡΠΊΠΎΠΌ ΡΠ²Π»ΡΠ΅ΡΡΡ ΡΠΎ, ΡΡΠΎ Π²Ρ Π½Π΅ ΡΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΏΠΎΠΌΠ΅ΡΡΠΈΡΡ ΠΎΠ±ΡΠ΅ΠΊΡΡ ΡΠΈΠΏΠ° T Π² ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΡ ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΠΎΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ; ΡΡΠΈ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΡ ΡΡΠ΅Π±ΡΡΡ, ΡΡΠΎΠ±Ρ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡ ΠΏΡΠΈΡΠ²Π°ΠΈΠ²Π°Π½ΠΈΡ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π» ΡΠΈΠΏ T&.
ΠΡΠ΅Π³Π΄Π° Π΄Π΅Π»Π°ΠΉΡΠ΅ ΠΊΠΎΠΏΠΈΡΡΡΡΠ΅Π΅ ΠΏΡΠΈΡΠ²Π°ΠΈΠ²Π°Π½ΠΈΠ΅ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΡΠΌ Π² ΡΠΌΡΡΠ»Π΅ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠΉ, ΠΏΡΠΈΡΠ΅ΠΌ ΠΏΡΠ΅Π΄ΠΏΠΎΡΡΠΈΡΠ΅Π»ΡΠ½Π° ΡΡΡΠΎΠ³Π°Ρ Π³Π°ΡΠ°Π½ΡΠΈΡ (ΡΠΌ. ΡΠ΅ΠΊΠΎΠΌΠ΅Π½Π΄Π°ΡΠΈΡ 71).
Π£Π±Π΅Π΄ΠΈΡΠ΅ΡΡ, ΡΡΠΎ Π²Π°Ρ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡ ΠΏΡΠΈΡΠ²Π°ΠΈΠ²Π°Π½ΠΈΡ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ΅Π½ Π² ΡΠΌΡΡΠ»Π΅ ΠΏΡΠΈΡΠ²Π°ΠΈΠ²Π°Π½ΠΈΡ ΡΠ°ΠΌΠΎΠΌΡ ΡΠ΅Π±Π΅. ΠΠ·Π±Π΅Π³Π°ΠΉΡΠ΅ Π½Π°ΠΏΠΈΡΠ°Π½ΠΈΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΠ° ΠΊΠΎΠΏΠΈΡΡΡΡΠ΅Π³ΠΎ ΠΏΡΠΈΡΠ²Π°ΠΈΠ²Π°Π½ΠΈΡ, ΠΊΠΎΡΠΎΡΡΠΉ Π΄Π»Ρ ΠΊΠΎΡΡΠ΅ΠΊΡΠ½ΠΎΠΉ ΡΠ°Π±ΠΎΡΡ ΠΏΠΎΠ»Π°Π³Π°Π΅ΡΡΡ Π½Π° ΠΏΡΠΎΠ²Π΅ΡΠΊΡ ΠΏΡΠΈΡΠ²Π°ΠΈΠ²Π°Π½ΠΈΡ ΡΠ°ΠΌΠΎΠΌΡ ΡΠ΅Π±Π΅; Π·Π°ΡΠ°ΡΡΡΡ ΡΡΠΎ Π³ΠΎΠ²ΠΎΡΠΈΡ ΠΎ Π½Π΅Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎΠΉ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡΠΈ Π² ΡΠΌΡΡΠ»Π΅ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠΉ. ΠΡΠ»ΠΈ Π²Ρ ΠΏΠΈΡΠ΅ΡΠ΅ ΠΊΠΎΠΏΠΈΡΡΡΡΠ΅Π΅ ΠΏΡΠΈΡΠ²Π°ΠΈΠ²Π°Π½ΠΈΠ΅ Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ ΠΈΠ΄ΠΈΠΎΠΌΡ ΠΎΠ±ΠΌΠ΅Π½Π° (ΡΠΌ. ΡΠ΅ΠΊΠΎΠΌΠ΅Π½Π΄Π°ΡΠΈΡ 56), ΡΠΎ Π²Ρ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΠ²Π°Π΅ΡΠ΅ ΠΊΠ°ΠΊ ΡΡΡΠΎΠ³ΡΡ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡΡ Π² ΡΠΌΡΡΠ»Π΅ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠΉ, ΡΠ°ΠΊ ΠΈ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡΡ Π² ΡΠΌΡΡΠ»Π΅ ΠΏΡΠΈΡΠ²Π°ΠΈΠ²Π°Π½ΠΈΡ ΡΠ°ΠΌΠΎΠΌΡ ΡΠ΅Π±Π΅. ΠΡΠ»ΠΈ ΠΏΡΠΈΡΠ²Π°ΠΈΠ²Π°Π½ΠΈΠ΅ ΡΠ°ΠΌΠΎΠΌΡ ΡΠ΅Π±Π΅ ΡΠ°ΡΡΠΎ Π²ΡΡΡΠ΅ΡΠ°Π΅ΡΡΡ Π² ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ΅ ΠΈΠ·-Π·Π° ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ ΡΡΡΠ»ΠΎΡΠ½ΡΡ ΡΠΈΠ½ΠΎΠ½ΠΈΠΌΠΎΠ² ΠΈΠ»ΠΈ ΠΏΠΎ ΠΊΠ°ΠΊΠΈΠΌ-ΡΠΎ ΠΈΠ½ΡΠΌ ΠΏΡΠΈΡΠΈΠ½Π°ΠΌ, ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° ΠΏΡΠΈΡΠ²Π°ΠΈΠ²Π°Π½ΠΈΡ ΡΠ°ΠΌΠΎΠΌΡ ΡΠ΅Π±Π΅ ΠΌΠΎΠΆΠ΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΡΡΠ΅Π΄ΡΡΠ²Π° ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΠΈ Π²ΠΎ ΠΈΠ·Π±Π΅ΠΆΠ°Π½ΠΈΠ΅ Π»ΠΈΡΠ½Π΅ΠΉ ΡΠ°Π±ΠΎΡΡ.
Π―Π²Π½ΠΎ Π²ΡΠ·ΡΠ²Π°ΠΉΡΠ΅ Π²ΡΠ΅ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΡ ΠΏΡΠΈΡΠ²Π°ΠΈΠ²Π°Π½ΠΈΡ Π±Π°Π·ΠΎΠ²ΡΡ ΠΊΠ»Π°ΡΡΠΎΠ² ΠΈ Π²ΡΠ΅Ρ Π΄Π°Π½Π½ΡΡ -ΡΠ»Π΅Π½ΠΎΠ² ([Meyers97] Β§16); ΠΎΠ±ΡΠ°ΡΠΈΡΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, ΡΡΠΎ ΠΈΠ΄ΠΈΠΎΠΌΠ° ΠΎΠ±ΠΌΠ΅Π½Π° Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ Π·Π°Π±ΠΎΡΠΈΡΡΡ ΠΎΠ±ΠΎ Π²ΡΠ΅Ρ ΡΡΠΈΡ Π²Π΅ΡΠ°Ρ . ΠΠΎΠ·Π²ΡΠ°ΡΠ°ΠΉΡΠ΅ ΠΈΠ· ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΠ° ΠΏΡΠΈΡΠ²Π°ΠΈΠ²Π°Π½ΠΈΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ *this ([Meyers97] Β§15).
Π‘ΡΡΠ»ΠΊΠΈ[Alexandrescu03a] β’ [Cargill92] pp. 41-42, 95 β’ [Cline99] Β§24.01-12 β’ [Koenig97] Β§4 β’ [Meyers96] Β§33 β’ [Meyers97] Β§17 β’ [Murray93] Β§2.2.1 β’ [Stroustrup00] Β§10.4.4.1, Β§10.4.6.3 β’ [Sutter00] Β§13, Β§38, Β§41 β’ [Sutter04] Β§19
56. ΠΠ±Π΅ΡΠΏΠ΅ΡΡΡΠ΅ Π±Π΅ΡΡΠ±ΠΎΠΉΠ½ΡΡ ΡΡΠ½ΠΊΡΠΈΡ ΠΎΠ±ΠΌΠ΅Π½Π°
ΠΠ±ΡΡΠ½ΠΎ ΠΈΠΌΠ΅Π΅Ρ ΡΠΌΡΡΠ» ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²ΠΈΡΡ Π΄Π»Ρ ΠΊΠ»Π°ΡΡΠ° ΡΡΠ½ΠΊΡΠΈΡ swap Π² ΡΠ΅Π»ΡΡ ΡΡΡΠ΅ΠΊΡΠΈΠ²Π½ΠΎΠ³ΠΎ ΠΈ Π±Π΅ΡΡΠ±ΠΎΠΉΠ½ΠΎΠ³ΠΎ ΠΎΠ±ΠΌΠ΅Π½Π° Π²Π½ΡΡΡΠ΅Π½Π½Π΅Π³ΠΎ ΡΠΎΠ΄Π΅ΡΠΆΠΈΠΌΠΎΠ³ΠΎ ΠΎΠ±ΡΠ΅ΠΊΡΠ° Ρ Π²Π½ΡΡΡΠ΅Π½Π½ΠΈΠΌ ΡΠΎΠ΄Π΅ΡΠΆΠΈΠΌΡΠΌ Π΄ΡΡΠ³ΠΎΠ³ΠΎ ΠΎΠ±ΡΠ΅ΠΊΡΠ°. Π’Π°ΠΊΠ°Ρ ΡΡΠ½ΠΊΡΠΈΡ ΠΌΠΎΠΆΠ΅Ρ ΠΏΡΠΈΠ³ΠΎΠ΄ΠΈΡΡΡΡ Π΄Π»Ρ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΡΡΠ΄Π° ΠΈΠ΄ΠΈΠΎΠΌ, ΠΎΡ ΠΏΡΠΎΡΡΠΎΠ³ΠΎ ΠΏΠ΅ΡΠ΅ΠΌΠ΅ΡΠ΅Π½ΠΈΡ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ² Π΄ΠΎ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΠΏΡΠΈΡΠ²Π°ΠΈΠ²Π°Π½ΠΈΡ, Π»Π΅Π³ΠΊΠΎ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΠ²Π°ΡΡΠ΅Π³ΠΎ ΡΡΠ½ΠΊΡΠΈΡ ΠΏΡΠΈΠ½ΡΡΠΈΡ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠΎΠ² ΡΠ°Π±ΠΎΡΡ ΡΠΎ ΡΡΡΠΎΠ³ΠΈΠΌΠΈ Π³Π°ΡΠ°Π½ΡΠΈΡΠΌΠΈ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡΠΈ Π΄Π»Ρ Π²ΡΠ·ΡΠ²Π°ΡΡΠ΅Π³ΠΎ ΠΊΠΎΠ΄Π° (ΡΠΌ. ΡΠ°ΠΊΠΆΠ΅ ΡΠ΅ΠΊΠΎΠΌΠ΅Π½Π΄Π°ΡΠΈΡ 51).
ΠΠ±ΡΡΠΆΠ΄Π΅Π½ΠΈΠ΅ΠΠ±ΡΡΠ½ΠΎ ΡΡΠ½ΠΊΡΠΈΡ swap Π²ΡΠ³Π»ΡΠ΄ΠΈΡ ΠΏΡΠΈΠΌΠ΅ΡΠ½ΠΎ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ (Π·Π΄Π΅ΡΡ U β Π½Π΅ΠΊΠΎΡΠΎΡΡΠΉ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΈΠΉ ΡΠΈΠΏ):
class T { // ...
public:
void swap(T& rhs) {
member1_.swap(rhs.member1_);
std::swap(member2_, rhs.member2_);
}
private:
U member1_;
int member2_;
};
ΠΠ»Ρ ΠΏΡΠΈΠΌΠΈΡΠΈΠ²Π½ΡΡ ΡΠΈΠΏΠΎΠ² ΠΈ ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΡΡ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠΎΠ² ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ std::swap. ΠΡΡΠ³ΠΈΠ΅ ΠΊΠ»Π°ΡΡΡ ΠΌΠΎΠ³ΡΡ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²ΡΠ²Π°ΡΡ ΠΎΠ±ΠΌΠ΅Π½ Π² Π²ΠΈΠ΄Π΅ ΡΡΠ½ΠΊΡΠΈΠΉ-ΡΠ»Π΅Π½ΠΎΠ² Ρ ΡΠ°Π·Π»ΠΈΡΠ½ΡΠΌΠΈ ΠΈΠΌΠ΅Π½Π°ΠΌΠΈ.
Π Π°ΡΡΠΌΠΎΡΡΠΈΠΌ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ swap Π΄Π»Ρ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΠΊΠΎΠΏΠΈΡΡΡΡΠ΅Π³ΠΎ ΠΏΡΠΈΡΠ²Π°ΠΈΠ²Π°Π½ΠΈΡ ΠΏΠΎΡΡΠ΅Π΄ΡΡΠ²ΠΎΠΌ ΠΊΠΎΠΏΠΈΡΡΡΡΠ΅Π³ΠΎ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡΠ°. ΠΡΠΈΠ²Π΅Π΄Π΅Π½Π½Π°Ρ Π΄Π°Π»Π΅Π΅ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΠ° operator= ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΠ²Π°Π΅Ρ ΡΡΡΠΎΠ³ΡΡ Π³Π°ΡΠ°Π½ΡΠΈΡ (ΡΠΌ. ΡΠ΅ΠΊΠΎΠΌΠ΅Π½Π΄Π°ΡΠΈΡ 71), Ρ ΠΎΡΡ ΠΈ ΡΠ΅Π½ΠΎΠΉ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΠΎΠ³ΠΎ ΠΎΠ±ΡΠ΅ΠΊΡΠ°, ΡΡΠΎ ΠΌΠΎΠΆΠ΅Ρ ΠΎΠΊΠ°Π·Π°ΡΡΡΡ Π½Π΅ΠΏΡΠΈΠ΅ΠΌΠ»Π΅ΠΌΡΠΌ, Π΅ΡΠ»ΠΈ ΠΈΠΌΠ΅Π΅ΡΡΡ Π±ΠΎΠ»Π΅Π΅ ΡΡΡΠ΅ΠΊΡΠΈΠ²Π½ΡΠΉ ΡΠΏΠΎΡΠΎΠ± Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΠ³ΠΎ ΠΏΡΠΈΡΠ²Π°ΠΈΠ²Π°Π½ΠΈΡ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ² ΡΠΈΠΏΠ° T: