result = oneHalf * 2; // ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΠΎ
result = 2 * oneHalf; // ΠΎΡΠΈΠ±ΠΊΠ°!
ΠΡΠΎ ΠΏΠ»ΠΎΡ ΠΎΠΉ Π·Π½Π°ΠΊ. Π£ΠΌΠ½ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±ΡΡΡ ΠΊΠΎΠΌΠΌΡΡΠ°ΡΠΈΠ²Π½ΡΠΌ (Π½Π΅ Π·Π°Π²ΠΈΡΠ΅ΡΡ ΠΎΡ ΠΏΠΎΡΡΠ΄ΠΊΠ° ΡΠΎΠΌΠ½ΠΎΠΆΠΈΡΠ΅Π»Π΅ΠΉ), ΠΏΠΎΠΌΠ½ΠΈΡΠ΅?
ΠΡΡΠΎΡΠ½ΠΈΠΊ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ ΡΡΠ°Π½ΠΎΠ²ΠΈΡΡΡ ΠΏΠΎΠ½ΡΡΠ½ΡΠΌ, Π΅ΡΠ»ΠΈ ΠΏΠ΅ΡΠ΅ΠΏΠΈΡΠ°ΡΡ Π΄Π²Π° ΠΏΠΎΡΠ»Π΅Π΄Π½ΠΈΡ Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΡ Π² ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»ΡΠ½ΠΎΠΉ ΡΠΎΡΠΌΠ΅:
result = oneHalf.operator*(2); // ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΠΎ
result = 2.operator*(oneHalf); // ΠΎΡΠΈΠ±ΠΊΠ°!
ΠΠ±ΡΠ΅ΠΊΡ oneHalf β ΡΡΠΎ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡ ΠΊΠ»Π°ΡΡΠ°, Π²ΠΊΠ»ΡΡΠ°ΡΡΠ΅Π³ΠΎ Π² ΡΠ΅Π±Ρ operator*, ΠΏΠΎΡΡΠΎΠΌΡ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡ Π²ΡΠ·ΡΠ²Π°Π΅Ρ ΡΡΡ ΡΡΠ½ΠΊΡΠΈΡ. ΠΠΎ Ρ ΡΠ΅Π»ΡΠΌ ΡΠΈΡΠ»ΠΎΠΌ 2 Π½Π΅ Π°ΡΡΠΎΡΠΈΠΈΡΠΎΠ²Π°Π½ Π½ΠΈΠΊΠ°ΠΊΠΎΠΉ ΠΊΠ»Π°ΡΡ, Π° Π·Π½Π°ΡΠΈΡ, Π½Π΅Ρ Π΄Π»Ρ Π½Π΅Π³ΠΎ ΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ operator*. ΠΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡ Π±ΡΠ΄Π΅Ρ ΡΠ°ΠΊΠΆΠ΅ ΠΈΡΠΊΠ°ΡΡ ΡΡΠ½ΠΊΡΠΈΠΈ operator*, Π½Π΅ ΡΠ²Π»ΡΡΡΠΈΠ΅ΡΡ ΡΠ»Π΅Π½Π°ΠΌΠΈ ΠΊΠ»Π°ΡΡΠ° (Π² ΡΠ΅ΠΊΡΡΠ΅ΠΌ ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²Π΅ ΠΈΠΌΠ΅Π½ ΠΈΠ»ΠΈ Π² Π³Π»ΠΎΠ±Π°Π»ΡΠ½ΠΎΠΉ ΠΎΠ±Π»Π°ΡΡΠΈ Π²ΠΈΠ΄ΠΈΠΌΠΎΡΡΠΈ):
result = operator*(2, oneHalf); // ΠΎΡΠΈΠ±ΠΊΠ°!
ΠΠΎ Π² Π΄Π°Π½Π½ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ Π½Π΅Ρ ΠΈ ΡΠ²ΠΎΠ±ΠΎΠ΄Π½ΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ operator*, ΠΊΠΎΡΠΎΡΠ°Ρ ΠΏΡΠΈΠ½ΠΈΠΌΠ°Π»Π° Π±Ρ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΡ int ΠΈ Rational, ΠΏΠΎΡΡΠΎΠΌΡ ΠΏΠΎΠΈΡΠΊ Π·Π°Π²Π΅ΡΡΠΈΡΡΡ Π½ΠΈΡΠ΅ΠΌ.
ΠΠΎΡΠΌΠΎΡΡΠΈΠΌ Π΅ΡΠ΅ ΡΠ°Π· Π½Π° ΡΡΠΏΠ΅ΡΠ½ΡΠΉ Π²ΡΠ·ΠΎΠ². ΠΠΈΠ΄ΠΈΡΠ΅, ΡΡΠΎ Π²ΡΠΎΡΠΎΠΉ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ β ΡΠ΅Π»ΠΎΠ΅ ΡΠΈΡΠ»ΠΎ 2, Ρ ΠΎΡΡ Rational::operator* ΠΏΡΠΈΠ½ΠΈΠΌΠ°Π΅Ρ Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠ° ΠΎΠ±ΡΠ΅ΠΊΡ Rational. Π§ΡΠΎ ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡ? ΠΠΎΡΠ΅ΠΌΡ 2 ΡΠ°Π±ΠΎΡΠ°Π΅Ρ Π² ΠΎΠ΄Π½ΠΎΠΉ ΠΏΠΎΠ·ΠΈΡΠΈΠΈ ΠΈ Π½Π΅ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ Π² Π΄ΡΡΠ³ΠΎΠΉ?
ΠΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡ Π½Π΅ΡΠ²Π½ΠΎΠ΅ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ ΡΠΈΠΏΠ°. ΠΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡ Π·Π½Π°Π΅Ρ, ΡΡΠΎ Π²Ρ ΠΏΠ΅ΡΠ΅Π΄Π°Π»ΠΈ int, Π° ΡΡΠ½ΠΊΡΠΈΡ ΡΡΠ΅Π±ΡΠ΅Ρ Rational, Π½ΠΎ ΠΎΠ½ ΡΠ°ΠΊΠΆΠ΅ Π·Π½Π°Π΅Ρ, ΡΡΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡΡΠΈΡΡ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ΡΡΠΈΠΉ ΠΎΠ±ΡΠ΅ΠΊΡ, Π΅ΡΠ»ΠΈ Π²ΡΠ·Π²Π°ΡΡ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡ Rational c ΠΏΠ΅ΡΠ΅Π΄Π°Π½Π½ΡΠΌ Π²Π°ΠΌΠΈ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΎΠΌ int. Π’Π°ΠΊ ΠΎΠ½ ΠΈ ΠΏΠΎΡΡΡΠΏΠ°Π΅Ρ. ΠΠ½ΡΠΌΠΈ ΡΠ»ΠΎΠ²Π°ΠΌΠΈ, ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡ ΡΡΠ°ΠΊΡΡΠ΅Ρ ΠΏΠΎΠΊΠ°Π·Π°Π½Π½ΡΠΉ Π²ΡΡΠ΅ Π²ΡΠ·ΠΎΠ², ΠΊΠ°ΠΊ Π΅ΡΠ»ΠΈ Π±Ρ ΠΎΠ½ Π±ΡΠ» Π½Π°ΠΏΠΈΡΠ°Π½ ΠΏΡΠΈΠΌΠ΅ΡΠ½ΠΎ ΡΠ°ΠΊ:
const Rational temp(2); // ΡΠΎΠ·Π΄Π°ΡΡ Π²ΡΠ΅ΠΌΠ΅Π½Π½ΡΠΉ ΠΎΠ±ΡΠ΅ΠΊΡ Rational ΠΈΠ· 2
result = oneHalf * temp; // ΡΠΎ ΠΆΠ΅, ΡΡΠΎ oneHalf.operator*(temp);
ΠΠΎΠ½Π΅ΡΠ½ΠΎ, ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡ Π΄Π΅Π»Π°Π΅Ρ ΡΡΠΎ ΡΠΎΠ»ΡΠΊΠΎ ΠΏΠΎΡΠΎΠΌΡ, ΡΡΠΎ Π΅ΡΡΡ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡ, ΠΎΠ±ΡΡΠ²Π»Π΅Π½Π½ΡΠΉ Π±Π΅Π· ΠΊΠ²Π°Π»ΠΈΡΠΈΠΊΠ°ΡΠΎΡΠ° explicit. ΠΡΠ»ΠΈ Π±Ρ ΠΊΠ²Π°Π»ΠΈΡΠΈΠΊΠ°ΡΠΎΡ explicit ΠΏΡΠΈΡΡΡΡΡΠ²ΠΎΠ²Π°Π», ΡΠΎ Π½ΠΈ ΠΎΠ΄Π½ΠΎ ΠΈΠ· ΡΠ»Π΅Π΄ΡΡΡΠΈΡ ΠΏΡΠ΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΠΉ Π½Π΅ ΡΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΠΎΠ²Π°Π»ΠΎΡΡ Π±Ρ:
result = oneHalf * 2; // ΠΎΡΠΈΠ±ΠΊΠ°! (ΠΏΡΠΈ Π½Π°Π»ΠΈΡΠΈΠΈ explicit-ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡΠ°):
// Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°ΡΡ 2 Π² Ratinal
result = 2 * oneHalf; // ΡΠ° ΠΆΠ΅ ΠΎΡΠΈΠ±ΠΊΠ°, ΡΠ° ΠΆΠ΅ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ°
Π‘ΠΎ ΡΠΌΠ΅ΡΠ°Π½Π½ΠΎΠΉ Π°ΡΠΈΡΠΌΠ΅ΡΠΈΠΊΠΎΠΉ ΠΏΡΠΈ ΡΠ°ΠΊΠΎΠΌ ΠΏΠΎΠ΄Ρ ΠΎΠ΄Π΅ ΠΏΡΠΈΠ΄Π΅ΡΡΡ ΡΠ°ΡΠΏΡΠΎΡΡΠΈΡΡΡΡ, Π½ΠΎ, ΠΏΠΎ ΠΊΡΠ°ΠΉΠ½Π΅ΠΉ ΠΌΠ΅ΡΠ΅, ΡΠ°ΠΊΠΎΠ΅ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Π½Π΅ΠΏΡΠΎΡΠΈΠ²ΠΎΡΠ΅ΡΠΈΠ²ΠΎ.
ΠΠ°ΡΠ° ΡΠ΅Π»Ρ, ΠΎΠ΄Π½Π°ΠΊΠΎ, β ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΡΡ ΠΈ ΡΠΎΠ³Π»Π°ΡΠΎΠ²Π°Π½Π½ΠΎΡΡΡ, ΠΈ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΡ ΡΠΌΠ΅ΡΠ°Π½Π½ΠΎΠΉ Π°ΡΠΈΡΠΌΠ΅ΡΠΈΠΊΠΈ, ΡΠΎ Π΅ΡΡΡ Π½ΡΠΆΠ½ΠΎ Π½Π°ΠΉΡΠΈ ΡΠ°ΠΊΠΎΠ΅ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅, ΠΏΡΠΈ ΠΊΠΎΡΠΎΡΠΎΠΌ ΠΎΠ±Π° ΠΏΡΠ΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΡ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΡΡΡΡΡ. ΠΡΠΎ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ Π½Π°Ρ ΠΊ Π²ΠΎΠΏΡΠΎΡΡ ΠΎ ΡΠΎΠΌ, ΠΏΠΎΡΠ΅ΠΌΡ Π΄Π°ΠΆΠ΅ ΠΏΡΠΈ Π½Π°Π»ΠΈΡΠΈΠΈ explicit-ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡΠ° Π² ΠΊΠ»Π°ΡΡΠ΅ Rational ΠΎΠ΄Π½ΠΎ ΠΈΠ· Π½ΠΈΡ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΡΠ΅ΡΡΡ, Π° Π΄ΡΡΠ³ΠΎΠ΅ β Π½Π΅Ρ:
result = oneHalf * 2; // ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΠΎ (ΠΏΡΠΈ Π½Π΅ explicit-ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡΠ΅)
result = 2 * oneHalf; // ΠΎΡΠΈΠ±ΠΊΠ°! (Π΄Π°ΠΆΠ΅ ΠΏΡΠΈ Π½Π΅ explicit-ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡΠ΅)
ΠΠΊΠ°Π·ΡΠ²Π°Π΅ΡΡΡ, ΡΡΠΎ ΠΊ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠ°ΠΌ ΠΏΡΠΈΠΌΠ΅Π½ΠΈΠΌΡ Π½Π΅ΡΠ²Π½ΡΠ΅ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°Π½ΠΈΡ, ΡΠΎΠ»ΡΠΊΠΎ Π΅ΡΠ»ΠΈ ΠΎΠ½ΠΈ ΠΏΠ΅ΡΠ΅ΡΠΈΡΠ»Π΅Π½Ρ Π² ΡΠΏΠΈΡΠΊΠ΅ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠ². ΠΠ΅ΡΠ²Π½ΡΠΉ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ, ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠΈΠΉ ΠΎΠ±ΡΠ΅ΠΊΡΡ, ΡΡΡ ΡΡΠ½ΠΊΡΠΈΡ-ΡΠ»Π΅Π½ Π²ΡΠ·ΡΠ²Π°Π΅ΡΡΡ (ΡΠΎΡ, Π½Π° ΠΊΠΎΡΠΎΡΡΠΉ ΡΠΊΠ°Π·ΡΠ²Π°Π΅Ρ this), Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ ΠΏΠΎΠ΄Π²Π΅ΡΠ³Π°Π΅ΡΡΡ Π½Π΅ΡΠ²Π½ΠΎΠΌΡ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°Π½ΠΈΡ. ΠΠΎΡ ΠΏΠΎΡΠ΅ΠΌΡ ΠΏΠ΅ΡΠ²ΡΠΉ Π²ΡΠ·ΠΎΠ² ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΡΠ΅ΡΡΡ, Π° Π²ΡΠΎΡΠΎΠΉ β Π½Π΅Ρ. Π ΠΏΠ΅ΡΠ²ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ ΡΠΊΠ°Π·Π°Π½ Π² ΡΠΏΠΈΡΠΊΠ΅ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠ² ΡΡΠ½ΠΊΡΠΈΠΈ, Π° Π²ΠΎ Π²ΡΠΎΡΠΎΠΌ β Π½Π΅Ρ.
ΠΠ΄Π½Π°ΠΊΠΎ Π²Π°ΠΌ Ρ ΠΎΡΠ΅Π»ΠΎΡΡ Π±Ρ ΠΏΠΎΠ»ΡΡΠΈΡΡ ΠΏΠΎΠ»Π½ΠΎΡΠ΅Π½Π½ΡΡ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΡ ΡΠΌΠ΅ΡΠ°Π½Π½ΠΎΠΉ Π°ΡΠΈΡΠΌΠ΅ΡΠΈΠΊΠΈ, ΠΈ ΡΠ΅ΠΏΠ΅ΡΡ ΡΡΠ½ΠΎ, ΠΊΠ°ΠΊ Π΅Π΅ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΡΡ: Π½ΡΠΆΠ΅Π½ operator* Π² Π²ΠΈΠ΄Π΅ ΡΠ²ΠΎΠ±ΠΎΠ΄Π½ΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ, ΡΠΎΠ³Π΄Π° ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡ ΡΠΌΠΎΠΆΠ΅Ρ Π²ΡΠΏΠΎΠ»Π½ΠΈΡΡ Π½Π΅ΡΠ²Π½ΠΎΠ΅ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ Π²ΡΠ΅Ρ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΎΠ²:
class Rational {
... // Π½Π΅ ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ operator*
};
const Rational operator*(const Rational& lhs, // ΡΠ΅ΠΏΠ΅ΡΡ ΡΠ²ΠΎΠ±ΠΎΠ΄Π½Π°Ρ ΡΡΠ½ΠΊΡΠΈΡ
const Rational& rhs)
{
return Rational(lhs.numerator() * rhs.numerator(),
lhs.denominator() * rhs.denominator());
}
Rational oneFourth(1, 4);
Rational result;
result = oneFourth * 2; // ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΠΎ
result = 2 * oneFourth; // ΡΡΠ°, ΡΠ°Π±ΠΎΡΠ°Π΅Ρ!
ΠΡΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π±ΡΠ»ΠΎ Π±Ρ Π½Π°Π·Π²Π°ΡΡ ΡΡΠ°ΡΡΠ»ΠΈΠ²ΡΠΌ ΠΊΠΎΠ½ΡΠΎΠΌ, Π΅ΡΠ»ΠΈ Π±Ρ Π½Π΅ ΠΎΠ΄Π½ΠΎ Β«Π½ΠΎΒ». ΠΠΎΠ»ΠΆΠ΅Π½ Π»ΠΈ operator* Π±ΡΡΡ Π΄ΡΡΠ³ΠΎΠΌ ΠΊΠ»Π°ΡΡΠ° Rational?
Π Π΄Π°Π½Π½ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ ΠΎΡΠ²Π΅ΡΠΎΠΌ Π±ΡΠ΄Π΅Ρ Β«Π½Π΅ΡΒ», ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ operator* ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½ ΠΏΠΎΠ»Π½ΠΎΡΡΡΡ Π² ΡΠ΅ΡΠΌΠΈΠ½Π°Ρ ΠΎΡΠΊΡΡΡΠΎΠ³ΠΎ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ° Rational. ΠΡΠΈΠ²Π΅Π΄Π΅Π½Π½ΡΠΉ Π²ΡΡΠ΅ ΠΊΠΎΠ΄ ΠΏΠΎΠΊΠ°Π·ΡΠ²Π°Π΅Ρ, ΠΊΠ°ΠΊ ΡΡΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°ΡΡ. Π ΠΌΡ ΠΏΡΠΈΡ ΠΎΠ΄ΠΈΠΌ ΠΊ Π²Π°ΠΆΠ½ΠΎΠΌΡ Π²ΡΠ²ΠΎΠ΄Ρ: ΠΏΡΠΎΡΠΈΠ²ΠΎΠΏΠΎΠ»ΠΎΠΆΠ½ΠΎΡΡΡΡ ΡΡΠ½ΠΊΡΠΈΠΈ-ΡΠ»Π΅Π½Π° ΡΠ²Π»ΡΠ΅ΡΡΡ ΡΠ²ΠΎΠ±ΠΎΠ΄Π½Π°Ρ ΡΡΠ½ΠΊΡΠΈΡ, Π° ΡΡΠ½ΠΊΡΠΈΡ β Π΄ΡΡΠ³ ΠΊΠ»Π°ΡΡΠ°. ΠΠ½ΠΎΠ³ΠΈΠ΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΡΡ Π½Π° C++ ΠΏΠΎΠ»Π°Π³Π°ΡΡ, ΡΡΠΎ ΡΠ°Π· ΡΡΠ½ΠΊΡΠΈΡ ΠΈΠΌΠ΅Π΅Ρ ΠΎΡΠ½ΠΎΡΠ΅Π½ΠΈΠ΅ ΠΊ ΠΊΠ»Π°ΡΡΡ ΠΈ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½Π° Π±ΡΡΡ Π΅Π³ΠΎ ΡΠ»Π΅Π½ΠΎΠΌ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΈΠ·-Π·Π° Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎΡΡΠΈ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²ΡΠ²Π°ΡΡ ΡΠΈΠΏΡ Π²ΡΠ΅Ρ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΎΠ²), ΡΠΎ ΠΎΠ½Π° Π΄ΠΎΠ»ΠΆΠ½Π° Π±ΡΡΡ Π΄ΡΡΠ³ΠΎΠΌ. ΠΡΠΎΡ ΠΏΡΠΈΠΌΠ΅Ρ ΠΏΠΎΠΊΠ°Π·ΡΠ²Π°Π΅Ρ, ΡΡΠΎ ΡΠ°ΠΊΠΎΠ΅ ΠΏΡΠ΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π½Π΅ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΠΎ. ΠΡΠ»ΠΈ Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΈΠ·Π±Π΅ΠΆΠ°ΡΡ Π½Π°Π·Π½Π°ΡΠ΅Π½ΠΈΡ ΡΡΠ½ΠΊΡΠΈΠΈ Π΄ΡΡΠ³ΠΎΠΌ ΠΊΠ»Π°ΡΡΠ°, ΡΠΎ Π΄ΠΎΠ»ΠΆΠ½Ρ ΡΠ°ΠΊ ΠΈ ΠΏΠΎΡΡΡΠΏΠΈΡΡ, ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ, ΠΊΠ°ΠΊ ΠΈ Π² ΡΠ΅Π°Π»ΡΠ½ΠΎΠΉ ΠΆΠΈΠ·Π½ΠΈ, Π΄ΡΡΠ·ΡΡ ΡΠ°ΡΡΠΎ Π΄ΠΎΡΡΠ°Π²Π»ΡΡΡ Π±ΠΎΠ»ΡΡΠ΅ Ρ Π»ΠΎΠΏΠΎΡ, ΡΠ΅ΠΌ Ρ ΠΎΡΠ΅Π»ΠΎΡΡ Π±Ρ. ΠΠΎΠ½Π΅ΡΠ½ΠΎ, ΠΈΠ½ΠΎΠ³Π΄Π° ΠΎΡΠ½ΠΎΡΠ΅Π½ΠΈΡ Π΄ΡΡΠΆΠ΅ΡΡΠ²Π΅Π½Π½ΠΎΡΡΠΈ ΠΎΠΏΡΠ°Π²Π΄Π°Π½Ρ, Π½ΠΎ ΡΠ°ΠΊΡ ΠΎΡΡΠ°Π΅ΡΡΡ ΡΠ°ΠΊΡΠΎΠΌ: Π΅ΡΠ»ΠΈ ΡΡΠ½ΠΊΡΠΈΡ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½Π° Π±ΡΡΡ ΡΠ»Π΅Π½ΠΎΠΌ, ΡΡΠΎ Π½Π΅ ΠΎΠ·Π½Π°ΡΠ°Π΅Ρ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ, ΡΡΠΎ ΠΎΠ½Π° Π΄ΠΎΠ»ΠΆΠ½Π° Π±ΡΡΡ Π΄ΡΡΠ³ΠΎΠΌ.
Π‘ΠΊΠ°Π·Π°Π½Π½ΠΎΠ΅ Π²ΡΡΠ΅ ΠΏΡΠ°Π²Π΄Π°, ΠΈ Π½ΠΈΡΠ΅Π³ΠΎ, ΠΊΡΠΎΠΌΠ΅ ΠΏΡΠ°Π²Π΄Ρ, Π½ΠΎ ΡΡΠΎ Π½Π΅ Π²ΡΡ ΠΏΡΠ°Π²Π΄Π°. ΠΠΎΠ³Π΄Π° Π²Ρ ΠΏΠ΅ΡΠ΅Ρ ΠΎΠ΄ΠΈΡΠ΅ ΠΎΡ Β«ΠΠ±ΡΠ΅ΠΊΡΠ½ΠΎ-ΠΎΡΠΈΠ΅Π½ΡΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ C++Β» ΠΊ Β«C++ Ρ ΡΠ°Π±Π»ΠΎΠ½Π°ΠΌΠΈΒ» (ΡΠΌ. ΠΏΡΠ°Π²ΠΈΠ»ΠΎ 1) ΠΈ ΠΏΡΠ΅Π²ΡΠ°ΡΠ°Π΅ΡΠ΅ Rational ΠΈΠ· ΠΊΠ»Π°ΡΡΠ° Π² ΡΠ°Π±Π»ΠΎΠ½ ΠΊΠ»Π°ΡΡΠ°, ΡΠΎ Π²ΡΡΡΠΏΠ°ΡΡ Π² ΡΠΈΠ»Ρ Π½ΠΎΠ²ΡΠ΅ ΡΠ°ΠΊΡΠΎΡΡ, Π½ΠΎΠ²ΡΠ΅ ΡΠΏΠΎΡΠΎΠ±Ρ ΠΈΡ ΡΡΠ΅ΡΠ°, ΠΈ ΠΏΠΎΡΠ²Π»ΡΡΡΡΡ Π½Π΅ΠΎΠΆΠΈΠ΄Π°Π½Π½ΡΠ΅ ΠΏΡΠΎΠ΅ΠΊΡΠ½ΡΠ΅ ΡΠ΅ΡΠ΅Π½ΠΈΡ. ΠΡΠ΅ ΡΡΠΎ ΡΠ²Π»ΡΠ΅ΡΡΡ ΡΠ΅ΠΌΠΎΠΉ ΠΏΡΠ°Π²ΠΈΠ»Π° 46.
Π§ΡΠΎ ΡΠ»Π΅Π΄ΡΠ΅Ρ ΠΏΠΎΠΌΠ½ΠΈΡΡβ’ ΠΡΠ»ΠΈ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ ΡΠΈΠΏΠΎΠ² Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±ΡΡΡ ΠΏΡΠΈΠΌΠ΅Π½ΠΈΠΌΠΎ ΠΊΠΎ Π²ΡΠ΅ΠΌ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠ°ΠΌ ΡΡΠ½ΠΊΡΠΈΠΈ (Π²ΠΊΠ»ΡΡΠ°Ρ ΠΈ ΡΠΊΡΡΡΡΠΉ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ this), ΡΠΎ ΡΡΠ½ΠΊΡΠΈΡ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½Π° Π±ΡΡΡ ΡΠ»Π΅Π½ΠΎΠΌ ΠΊΠ»Π°ΡΡΠ°.
ΠΡΠ°Π²ΠΈΠ»ΠΎ 25: ΠΠΎΠ΄ΡΠΌΠ°ΠΉΡΠ΅ ΠΎ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ swap, Π½Π΅ Π²ΠΎΠ·Π±ΡΠΆΠ΄Π°ΡΡΠ΅ΠΉ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠΉ
swap β ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ½Π°Ρ ΡΡΠ½ΠΊΡΠΈΡ. ΠΠ·Π½Π°ΡΠ°Π»ΡΠ½ΠΎ ΠΎΠ½Π° ΠΏΠΎΡΠ²ΠΈΠ»Π°ΡΡ Π² Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ΅ STL ΠΈ Ρ ΡΠ΅Ρ ΠΏΠΎΡ ΡΡΠ°Π»Π°, Π²ΠΎ-ΠΏΠ΅ΡΠ²ΡΡ , ΠΎΡΠ½ΠΎΠ²ΠΎΠΉ Π΄Π»Ρ Π½Π°ΠΏΠΈΡΠ°Π½ΠΈΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌ, Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΡΡ Π² ΡΠΌΡΡΠ»Π΅ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠΉ (ΡΠΌ. ΠΏΡΠ°Π²ΠΈΠ»ΠΎ 29), Π° Π²ΠΎ-Π²ΡΠΎΡΡΡ , ΠΎΠ±ΡΠΈΠΌ ΠΌΠ΅Ρ Π°Π½ΠΈΠ·ΠΌΠΎΠΌ ΡΠ΅ΡΠ΅Π½ΠΈΡ Π·Π°Π΄Π°ΡΠΈ ΠΈ ΠΏΡΠΈΡΠ²Π°ΠΈΠ²Π°Π½ΠΈΡ ΡΠ°ΠΌΠΎΠΌΡ ΡΠ΅Π±Π΅ (ΡΠΌ. ΠΏΡΠ°Π²ΠΈΠ»ΠΎ 11). Π Π°Π· ΡΠΆ swap Π½Π°ΡΡΠΎΠ»ΡΠΊΠΎ ΠΏΠΎΠ»Π΅Π·Π½Π°, ΡΠΎ Π²Π°ΠΆΠ½ΠΎ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°ΡΡ Π΅Π΅ ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΠΎ, Π½ΠΎ ΡΡΠΊΠ° ΠΎΠ± ΡΡΠΊΡ Ρ ΠΎΡΠΎΠ±ΠΎΠΉ Π²Π°ΠΆΠ½ΠΎΡΡΡΡ ΠΈΠ΄ΡΡ ΠΈ ΠΎΡΠΎΠ±ΡΠ΅ ΡΠ»ΠΎΠΆΠ½ΠΎΡΡΠΈ. Π ΡΡΠΎΠΌ ΠΏΡΠ°Π²ΠΈΠ»Π΅ ΠΌΡ ΠΈΡΡΠ»Π΅Π΄ΡΠ΅ΠΌ, ΡΡΠΎ ΠΎΠ½ΠΈ ΡΠΎΠ±ΠΎΠΉ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΡΡ ΠΈ ΠΊΠ°ΠΊ Ρ Π½ΠΈΠΌΠΈ Π±ΠΎΡΠΎΡΡΡΡ.
Π§ΡΠΎΠ±Ρ ΠΎΠ±ΠΌΠ΅Π½ΡΡΡ (swap) Π·Π½Π°ΡΠ΅Π½ΠΈΡ Π΄Π²ΡΡ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ², Π½ΡΠΆΠ½ΠΎ ΠΏΡΠΈΡΠ²ΠΎΠΈΡΡ ΠΊΠ°ΠΆΠ΄ΠΎΠΌΡ ΠΈΠ· Π½ΠΈΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ Π΄ΡΡΠ³ΠΎΠ³ΠΎ. ΠΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ ΡΠ°ΠΊΠΎΠΉ ΠΎΠ±ΠΌΠ΅Π½ ΠΎΡΡΡΠ΅ΡΡΠ²Π»ΡΠ΅Ρ ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΡΠΉ Π°Π»Π³ΠΎΡΠΈΡΠΌ swap. ΠΠ³ΠΎ ΡΠΈΠΏΠΈΡΠ½Π°Ρ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ Π½Π΅ ΡΠ°ΡΡ ΠΎΠ΄ΠΈΡΡΡ Ρ Π²Π°ΡΠΈΠΌΠΈ ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΡΠΌΠΈ:
namespace std {
template <typename T> // ΡΠΈΠΏΠΈΡΠ½Π°Ρ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ std::swap
void swap(T& a, T& b) // ΠΌΠ΅Π½ΡΠ΅Ρ ΠΌΠ΅ΡΡΠ°ΠΌΠΈ Π·Π½Π°ΡΠ΅Π½ΠΈΡ a ΠΈ b
{
T temp(a);
a = b;
b = temp;
}
}
ΠΠΎΠ»Ρ ΡΠΊΠΎΡΠΎ ΡΠΈΠΏ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅Ρ ΠΊΠΎΠΏΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ (Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡΠ° ΠΊΠΎΠΏΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΠΈ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΠ° ΠΏΡΠΈΡΠ²Π°ΠΈΠ²Π°Π½ΠΈΡ), ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ swap ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΠΎΠ±ΡΠ΅ΠΊΡΠ°ΠΌ ΡΡΠΎΠ³ΠΎ ΡΠΈΠΏΠ° ΠΎΠ±ΠΌΠ΅Π½ΠΈΠ²Π°ΡΡΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΡΠΌΠΈ Π±Π΅Π· Π²ΡΡΠΊΠΈΡ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΡ ΡΡΠΈΠ»ΠΈΠΉ Ρ Π²Π°ΡΠ΅ΠΉ ΡΡΠΎΡΠΎΠ½Ρ.
Π‘ΡΠ°Π½Π΄Π°ΡΡΠ½Π°Ρ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ swap, ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ, Π½Π΅ ΠΏΡΠΈΠ²Π΅Π΄Π΅Ρ Π²Π°Ρ Π² Π²ΠΎΡΡΠΎΡΠ³. ΠΠ½Π° Π²ΠΊΠ»ΡΡΠ°Π΅Ρ ΠΊΠΎΠΏΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΡΡΠ΅Ρ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ²: a Π² temp, b Π² a ΠΈ temp β Π² b. ΠΠ»Ρ Π½Π΅ΠΊΠΎΡΠΎΡΡΡ ΡΠΈΠΏΠΎΠ² Π½ΠΈ ΠΎΠ΄Π½Π° ΠΈΠ· ΡΡΠΈΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΡ Π² Π΄Π΅ΠΉΡΡΠ²ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ Π½Π΅ ΡΠ²Π»ΡΠ΅ΡΡΡ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎΠΉ. ΠΠ»Ρ ΡΠ°ΠΊΠΈΡ ΡΠΈΠΏΠΎΠ² swap ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ β Π±ΡΡΡΡΡΠΉ ΠΏΡΡΡ Π½Π° ΠΌΠ΅Π΄Π»Π΅Π½Π½ΡΡ Π΄ΠΎΡΠΎΠΆΠΊΡ.
Π‘ΡΠ΅Π΄ΠΈ ΡΠ°ΠΊΠΈΡ ΡΠΈΠΏΠΎΠ² ΡΡΠ°Π·Ρ ΡΡΠΎΠΈΡ Π²ΡΠ΄Π΅Π»ΠΈΡΡ ΡΠ΅, ΡΡΠΎ ΡΠΎΡΡΠΎΡΡ Π² ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠΌ ΠΈΠ· ΡΠΊΠ°Π·Π°ΡΠ΅Π»Π΅ΠΉ Π½Π° Π΄ΡΡΠ³ΠΎΠΉ ΡΠΈΠΏ, ΡΠΎΠ΄Π΅ΡΠΆΠ°ΡΠΈΠΉ ΡΠ΅Π°Π»ΡΠ½ΡΠ΅ Π΄Π°Π½Π½ΡΠ΅. ΠΠ±ΡΠ΅Π΅ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ Π΄Π»Ρ ΡΠ°ΠΊΠΈΡ ΠΏΡΠΎΠ΅ΠΊΡΠ½ΡΡ ΡΠ΅ΡΠ΅Π½ΠΈΠΉ: Β«ΠΈΠ΄ΠΈΠΎΠΌΠ° pimplΒ» (pointer to implementation β ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ Π½Π° ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ β ΡΠΌ. ΠΏΡΠ°Π²ΠΈΠ»ΠΎ 31). Π‘ΠΏΡΠΎΠ΅ΠΊΡΠΈΡΠΎΠ²Π°Π½Π½ΡΠΉ ΡΠ°ΠΊ ΠΊΠ»Π°ΡΡ Widget ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΠΎΠ±ΡΡΠ²Π»Π΅Π½ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ:
class WidgetImpl { // ΠΊΠ»Π°ΡΡ Π΄Π»Ρ Π΄Π°Π½Π½ΡΡ Widget
public: // Π΄Π΅ΡΠ°Π»ΠΈ Π½Π΅ΡΡΡΠ΅ΡΡΠ²Π΅Π½Π½Ρ
...
private:
int a,b,c; // Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, ΠΌΠ½ΠΎΠ³ΠΎ Π΄Π°Π½Π½ΡΡ β
std::vector<double> v; // ΠΊΠΎΠΏΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΠΎΠ±ΠΎΠΉΠ΄Π΅ΡΡΡ Π΄ΠΎΡΠΎΠ³ΠΎ
...
};
class Widget { // ΠΊΠ»Π°ΡΡ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΠΈΠΉ ΠΈΠ΄ΠΈΠΎΠΌΡ pimpl
public:
Widget(const Widget& rhs);
Widget& operator=(const Widget& rhs) // ΡΡΠΎΠ± ΡΠΊΠΎΠΏΠΈΡΠΎΠ²Π°ΡΡ Widget, ΠΊΠΎΠΏΠΈΡΡΠ΅ΠΌ
{ // Π΅Π³ΠΎ ΠΎΠ±ΡΠ΅ΠΊΡ WidgetImpl. ΠΠ΅ΡΠ°Π»ΠΈ
... // ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ operator= ΠΊΠ°ΠΊ ΡΠ°ΠΊΠΎΠ²ΠΎΠ³ΠΎ
*pimpl = *(rhs.pimpl); // ΡΠΌ. Π² ΠΏΡΠ°Π²ΠΈΠ»Π°Ρ 10, 11 ΠΈ 12
...
}
...
private:
WidgetImpl *pimpl; // ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ Π½Π° ΠΎΠ±ΡΠ΅ΠΊΡ Ρ Π΄Π°Π½Π½ΡΠΌΠΈ
}; // ΡΡΠΎΠ³ΠΎ Widget
Π§ΡΠΎΠ±Ρ ΠΎΠ±ΠΌΠ΅Π½ΡΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΡ Π΄Π²ΡΡ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ² Widget, Π½ΡΠΆΠ½ΠΎ Π»ΠΈΡΡ ΠΎΠ±ΠΌΠ΅Π½ΡΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΡΠΌΠΈ ΠΈΡ ΡΠΊΠ°Π·Π°ΡΠ΅Π»ΠΈ pimpl, Π½ΠΎ Π°Π»Π³ΠΎΡΠΈΡΠΌ swap ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ ΠΎΠ± ΡΡΠΎΠΌ Π·Π½Π°ΡΡ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ. ΠΠΌΠ΅ΡΡΠΎ ΡΡΠΎΠ³ΠΎ ΠΎΠ½ Π½Π΅ ΡΠΎΠ»ΡΠΊΠΎ ΡΡΠΈΠΆΠ΄Ρ Π²ΡΠΏΠΎΠ»Π½ΠΈΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΡ ΠΊΠΎΠΏΠΈΡΠΎΠ²Π°Π½ΠΈΡ Widget, Π½ΠΎ Π΅ΡΠ΅ ΠΈ ΡΡΠΈ ΡΠ°Π·Π° ΡΠΊΠΎΠΏΠΈΡΡΠ΅Ρ Widgetlmpl. ΠΡΠ΅Π½Ρ Π½Π΅ΡΡΡΠ΅ΠΊΡΠΈΠ²Π½ΠΎ!
Π Π½Π°ΠΌ Π±Ρ Ρ ΠΎΡΠ΅Π»ΠΎΡΡ ΡΠΎΠΎΠ±ΡΠΈΡΡ ΡΡΠ½ΠΊΡΠΈΠΈ std::swap, ΡΡΠΎ ΠΏΡΠΈ ΠΎΠ±ΠΌΠ΅Π½Π΅ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ² Widget Π½ΡΠΆΠ½ΠΎ ΠΎΠ±ΠΌΠ΅Π½ΡΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΡ Ρ ΡΠ°Π½ΡΡΠΈΡ ΡΡ Π² Π½ΠΈΡ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Π΅ΠΉ pimpl. Π ΡΠ°ΠΊΠΎΠΉ ΡΠΏΠΎΡΠΎΠ± ΡΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ: ΡΠΏΠ΅ΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°ΡΡ std::swap Π΄Π»Ρ ΠΊΠ»Π°ΡΡΠ° Widget. ΠΠΈΠΆΠ΅ ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½Π° ΠΎΡΠ½ΠΎΠ²Π½Π°Ρ ΠΈΠ΄Π΅Ρ, Ρ ΠΎΡΡ Π² ΡΠ°ΠΊΠΎΠΌ Π²ΠΈΠ΄Π΅ ΠΊΠΎΠ΄ Π½Π΅ ΡΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΡΠ΅ΡΡΡ:
namespace std {
template <> // ΡΡΠΎ ΡΠΏΠ΅ΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π½Π°Ρ Π²Π΅ΡΡΠΈΡ
void swap<Widget>(Widget& a, // std::swap, ΠΊΠΎΠ³Π΄Π° T Π΅ΡΡΡ
Widget& b) // Widget; Π½Π΅ ΡΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΡΠ΅ΡΡΡ
{
swap(a.pimpl, b.pimpl); // Π΄Π»Ρ ΠΎΠ±ΠΌΠ΅Π½Π° Π΄Π²ΡΡ Widget ΠΏΡΠΎΡΡΠΎ
} // ΠΎΠ±ΠΌΠ΅Π½ΠΈΠ²Π°Π΅ΠΌ ΠΈΡ ΡΠΊΠ°Π·Π°ΡΠ΅Π»ΠΈ pimpl
}
Π‘ΡΡΠΎΠΊΠ° Β«template <>Β» Π² Π½Π°ΡΠ°Π»Π΅ ΡΡΠ½ΠΊΡΠΈΠΈ Π³ΠΎΠ²ΠΎΡΠΈΡ ΠΎ ΡΠΎΠΌ, ΡΡΠΎ ΡΡΠΎ ΠΏΠΎΠ»Π½Π°Ρ ΡΠΏΠ΅ΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ ΡΠ°Π±Π»ΠΎΠ½Π° std::swap, Π° Β«<Widget>Β» ΠΏΠΎΡΠ»Π΅ ΠΈΠΌΠ΅Π½ΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ Π³ΠΎΠ²ΠΎΡΠΈΡ ΠΎ ΡΠΎΠΌ, ΡΡΠΎ ΡΡΠΎ ΡΠΏΠ΅ΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ Π΄Π»Ρ ΡΠ»ΡΡΠ°Ρ, ΠΊΠΎΠ³Π΄Π° T Π΅ΡΡΡ Widget. ΠΡΡΠ³ΠΈΠΌΠΈ ΡΠ»ΠΎΠ²Π°ΠΌΠΈ, ΠΊΠΎΠ³Π΄Π° ΠΎΠ±ΡΠΈΠΉ ΡΠ°Π±Π»ΠΎΠ½ swap ΠΏΡΠΈΠΌΠ΅Π½ΡΠ΅ΡΡΡ ΠΊ Widget, ΡΠΎ Π΄ΠΎΠ»ΠΆΠ½Π° Π±ΡΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½Π° ΡΡΠ° ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ. ΠΠΎΠΎΠ±ΡΠ΅-ΡΠΎ Π½Π΅ Π΄ΠΎΠΏΡΡΠΊΠ°Π΅ΡΡΡ ΠΈΠ·ΠΌΠ΅Π½ΡΡΡ ΡΠΎΠ΄Π΅ΡΠΆΠΈΠΌΠΎΠ΅ ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²Π° ΠΈΠΌΠ΅Π½ std, Π½ΠΎ ΡΠ°Π·ΡΠ΅ΡΠ΅Π½ΠΎ Π²Π²ΠΎΠ΄ΠΈΡΡ ΠΏΠΎΠ»Π½ΡΠ΅ ΡΠΏΠ΅ΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΡΡ ΡΠ°Π±Π»ΠΎΠ½ΠΎΠ² (ΠΏΠΎΠ΄ΠΎΠ±Π½ΡΡ swap) Π΄Π»Ρ ΡΠΎΠ·Π΄Π°Π½Π½ΡΡ Π½Π°ΠΌΠΈ ΡΠΈΠΏΠΎΠ² (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Widget). Π§ΡΠΎ ΠΌΡ ΠΈ Π΄Π΅Π»Π°Π΅ΠΌ.