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

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«Π‘ΠΏΡ€Π°Π²ΠΎΡ‡Π½ΠΎΠ΅ руководство ΠΏΠΎ C++Β». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 26

Автор Π‘ΡŒΡΡ€Π½ Бтраустрап

(3) X ΠΈΠΌΠ΅Π΅Ρ‚ конструктор ΠΈ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΈΠ· Π½ΠΈΡ… Π·Π°Π΄Π°Π΅Ρ‚ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€-ctor (Β§R.12.6.2) для Ρ‡Π»Π΅Π½Π° M.

Π’ случаС 2 ΠΏΡ€ΠΈ создании составного ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° вызываСтся стандартный конструктор. Если Ρ‡Π»Π΅Π½ составного ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° ΠΈΠΌΠ΅Π΅Ρ‚ дСструктор, Ρ‚ΠΎ ΠΎΠ½ вызываСтся ΠΏΡ€ΠΈ ΡƒΠ½ΠΈΡ‡Ρ‚ΠΎΠΆΠ΅Π½ΠΈΠΈ составного ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°.

ΠšΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ‚ΠΎΡ€Ρ‹ для Π½Π΅Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹Ρ… статичСских ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ Π² Ρ‚ΠΎΠΌ порядкС, Π² ΠΊΠ°ΠΊΠΎΠΌ ΠΎΠ½ΠΈ ΠΈΠ΄ΡƒΡ‚ Π² тСкстС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, дСструкторы Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ Π² ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠΌ порядкС, см. Ρ‚Π°ΠΊΠΆΠ΅ Β§R.3.4, Β§R.6.7, Β§R.9.4.

R.12.6.2 Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡ Ρ‡Π»Π΅Π½ΠΎΠ² ΠΈ Π±Π°Π·ΠΎΠ²Ρ‹Ρ… классов

Π’ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠΈ конструктора ΠΌΠΎΠΆΠ½ΠΎ Π·Π°Π΄Π°Ρ‚ΡŒ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ прямых Π±Π°Π·ΠΎΠ²Ρ‹Ρ… классов ΠΈ Ρ‡Π»Π΅Π½ΠΎΠ², Π½Π΅ наслСдуСмых ΠΈΠ· Π±Π°Π·ΠΎΠ²Ρ‹Ρ… классов. Π­Ρ‚ΠΎ особСнно ΠΏΠΎΠ»Π΅Π·Π½ΠΎ для Ρ‚Π΅Ρ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ², констант ΠΈ ссылок, для ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Ρ€Π°Π·Π»ΠΈΡ‡Π°ΡŽΡ‚ΡΡ сСмантики присваивания ΠΈ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ. ΠšΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€-ctor ΠΈΠΌΠ΅Π΅Ρ‚ Π²ΠΈΠ΄

ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€-ctor:

 : список-ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ΠΎΠ²-Ρ‡Π»Π΅Π½ΠΎΠ²

список-ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ΠΎΠ²-Ρ‡Π»Π΅Π½ΠΎΠ²:

 ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€-Ρ‡Π»Π΅Π½Π°

 ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€-Ρ‡Π»Π΅Π½Π° , список-ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ΠΎΠ²-Ρ‡Π»Π΅Π½Π°

ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€-Ρ‡Π»Π΅Π½Π°:

 ΠΏΠΎΠ»Π½ΠΎΠ΅-имя-класса ( список-Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ opt )

 ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€

Бписок ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ нСстатичСских Ρ‡Π»Π΅Π½ΠΎΠ² ΠΈΠ»ΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ класса. Π­Ρ‚ΠΎ СдинствСнный способ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ нСстатичСских Ρ‡Π»Π΅Π½ΠΎΠ², ΡΠ²Π»ΡΡŽΡ‰ΠΈΡ…ΡΡ ссылками ΠΈΠ»ΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌΠΈ Ρ‚ΠΈΠΏΠ° const, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€:

struct B1 { B1(int); /*… */ };

struct B2 { B2(int); /*… */ };


struct D: B1, B2 {

 D(int);

 B1 b;

 const c;

};


D::D(int a): B2(a+1), B1(a+2), c(a+3), b(a+4)

{/*… */}

D d(10);

Π’ Π½Π°Ρ‡Π°Π»Π΅ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΡŽΡ‚ΡΡ Π±Π°Π·ΠΎΠ²Ρ‹Π΅ классы Π² порядкС ΠΈΡ… описания (нСзависимо ΠΎΡ‚ порядка ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ΠΎΠ²-Ρ‡Π»Π΅Π½ΠΎΠ²), Π·Π°Ρ‚Π΅ΠΌ ΠΏΠΎ Ρ‚ΠΎΠΉ ΠΆΠ΅ схСмС ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΡŽΡ‚ΡΡ Ρ‡Π»Π΅Π½Ρ‹, ΠΈ Π½Π°ΠΊΠΎΠ½Π΅Ρ† выполняСтся Ρ‚Π΅Π»ΠΎ D::D() (Β§R.12.1). ΠŸΠΎΡ€ΡΠ΄ΠΎΠΊ описания выдСрТиваСтся для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ ΠΈ Ρ‡Π»Π΅Π½Ρ‹ Π±ΡƒΠ΄ΡƒΡ‚ ΡƒΠ½ΠΈΡ‡Ρ‚ΠΎΠΆΠ°Ρ‚ΡŒΡΡ Π² порядкС, ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠΌ ΠΈΡ… ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ.

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

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

class V {

public:

 V();

 V(int);

 //…

};


class A: public virtual V {

public:

 A();

 A(int);

 //…

};


class B: public virtual V {

public:

 B();

 B(int);

 //…

};


class C: public A, public B, private virtual V {

public:

 C();

 C(int);

 //…

};


A::A(int i): V(i) {/*… */}

B::B(int i) {/*… */}

C::C(int i) {/*… */}


V v(1); // use V(int)

A a(2); // use V(int)

B b(3); // use V()

C c(4); // use V()

Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€-Ρ‡Π»Π΅Π½Π° вычисляСтся Π² области видимости конструктора, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΎΠ½ появился. НапримСр, Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚Π΅

class X {

 int a;

public:

 const int& r;

 X()::r(a) {}

};

X::r инициализируСтся для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° класса X ссылкой Π½Π° X::a.

R.12.7 ΠšΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ‚ΠΎΡ€Ρ‹ ΠΈ дСструкторы

Π’ конструкторах ΠΈ дСструкторах ΠΌΠΎΠΆΠ½ΠΎ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ-Ρ‡Π»Π΅Π½. ΠžΡ‚ΡΡŽΠ΄Π° слСдуСт, Ρ‡Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ (нСпосрСдствСнно ΠΈΠ»ΠΈ косвСнно) Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. ВызываСмая функция Π΄ΠΎΠ»ΠΆΠ½Π° Π±Ρ‹Ρ‚ΡŒ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π° Π² классС самого конструктора ΠΈΠ»ΠΈ дСструктора ΠΈΠ»ΠΈ Π² Π±Π°Π·ΠΎΠ²Ρ‹Ρ… классах, Π½ΠΎ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½Π° Π±Ρ‹Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ, которая ΠΈΡ… подавляСт Π² ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½ΠΎΠΌ классС. Π­Ρ‚ΠΈΠΌ обСспСчиваСтся Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Π΅Ρ‰Π΅ нСсозданныС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Π½Π΅ Π±ΡƒΠ΄ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Π½Ρ‹ ΠΏΡ€ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ конструктора ΠΈΠ»ΠΈ дСструктора. Рассмотрим ΠΏΡ€ΠΈΠΌΠ΅Ρ€:

class X {

public:

 virtual void f();

 X() { f(); } // Π²Ρ‹Π·ΠΎΠ² X::f()

 ~X() { f(); } // Π²Ρ‹Π·ΠΎΠ² X::f()

};


class Y: public X {

 int& r;

public:

 void f()

 {

  r++; // Π±Π΅Π΄Π°, Ссли `r' Π½Π΅ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½ΠΎ

 }

 Y(int& rr)::r(rr) {}

};

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ нСпосрСдствСнного ΠΈΠ»ΠΈ косвСнного Π²Ρ‹Π·ΠΎΠ²Π° ΠΈΠ· конструктора чистой Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ для ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅ΠΌΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Π½Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½, Ссли Ρ‚ΠΎΠ»ΡŒΠΊΠΎ явно Π½Π΅ использовано ΡƒΡ‚ΠΎΡ‡Π½Π΅Π½ΠΈΠ΅ ΠΈΠΌΠ΅Π½ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ (Β§R.10.3).

R.12.8 ΠšΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² класса

ΠžΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ класса ΠΌΠΎΠ³ΡƒΡ‚ ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ двумя способами: Π»ΠΈΠ±ΠΎ присваиваниСм (Β§R.5.17), Π»ΠΈΠ±ΠΎ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠ΅ΠΉ (Β§R.12.1, Β§R.8.4), которая ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΎΠΈΡΡ…ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΏΡ€ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² (Β§R.5.2.2) ΠΈΠ»ΠΈ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ (Β§R.6.6.3). Для класса X эти Π΄Π²Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ ΠΊΠΎΠ½Ρ†Π΅ΠΏΡ‚ΡƒΠ°Π»ΡŒΠ½ΠΎ Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΡŽΡ‚ΡΡ ΠΊΠ°ΠΊ опСрация присваивания ΠΈ конструктор копирования (Β§R.12.1). Π’ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ ΠΈΠ»ΠΈ ΠΎΠ΄Π½Ρƒ ΠΈΠ· Π½ΠΈΡ…, ΠΈΠ»ΠΈ ΠΎΠ±Π΅. Если ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Π½Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠ» ΠΈΡ… Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅, Ρ‚ΠΎ ΠΎΠ½ΠΈ Π±ΡƒΠ΄ΡƒΡ‚ для всСх Ρ‡Π»Π΅Π½ΠΎΠ² класса X ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡ‚ΡŒΡΡ соотвСтствСнно ΠΊΠ°ΠΊ присваиваниС ΠΏΠΎ Ρ‡Π»Π΅Π½Π°ΠΌ ΠΈ инициализация ΠΏΠΎ Ρ‡Π»Π΅Π½Π°ΠΌ.

Если всС Π±Π°Π·ΠΎΠ²Ρ‹Π΅ классы ΠΈ всС Ρ‡Π»Π΅Π½Ρ‹ класса X ΠΈΠΌΠ΅ΡŽΡ‚ конструктор копирования, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ допустимы Π² качСствС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Ρ‚ΠΈΠΏΠ° const, Ρ‚ΠΎ ΠΏΠΎΡ€ΠΎΠΆΠ΄Π°Π΅ΠΌΡ‹ΠΉ конструктор копирования для X Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ СдинствСнный ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ Ρ‚ΠΈΠΏΠ° const X& ΠΈ Π·Π°ΠΏΠΈΡΡ‹Π²Π°Ρ‚ΡŒΡΡ Ρ‚Π°ΠΊ:

X::X(const X&)

Π˜Π½Π°Ρ‡Π΅, Ρƒ Π½Π΅Π³ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ СдинствСнный ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ Ρ‚ΠΈΠΏΠ° X&:

X::X(X&)

ΠΈ инициализация ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Ρ‚ΠΈΠΏΠ° const класса X Π±ΡƒΠ΄Π΅Ρ‚ Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Π°.

Аналогично, Ссли всС Π±Π°Π·ΠΎΠ²Ρ‹Π΅ классы ΠΈ Ρ‡Π»Π΅Π½Ρ‹ класса X ΠΈΠΌΠ΅ΡŽΡ‚ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΡŽ присваивания, Π΄ΠΎΠΏΡƒΡΠΊΠ°ΡŽΡ‰ΡƒΡŽ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ Ρ‚ΠΈΠΏΠ° const, Ρ‚ΠΎΠ³Π΄Π° пороТдаСмая для X опСрация присваивания Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ СдинствСнный ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ Ρ‚ΠΈΠΏΠ° const X& ΠΈ Π·Π°ΠΏΠΈΡΡ‹Π²Π°Ρ‚ΡŒΡΡ Ρ‚Π°ΠΊ:

X& X::operator=(const X&)

Π˜Π½Π°Ρ‡Π΅, Ρƒ Π½Π΅Π΅ Π±ΡƒΠ΄Π΅Ρ‚ СдинствСнный ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ Ρ‚ΠΈΠΏΠ° X&:

X& X::operator=(X&)

ΠΈ присваиваниС ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² класса X Ρ‚ΠΈΠΏΠ° const Π±ΡƒΠ΄Π΅Ρ‚ Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ. Бтандартная опСрация присваивания Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ссылку Π½Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½ΡƒΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ.

ΠžΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹, ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΠΈΠ΅ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Π΅ Π±Π°Π·ΠΎΠ²Ρ‹Π΅ классы, Π±ΡƒΠ΄ΡƒΡ‚ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π· с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΏΠΎΡ€ΠΎΠΆΠ΄Π°Π΅ΠΌΠΎΠ³ΠΎ конструктора копирования. ΠžΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹, ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΠΈΠ΅ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Π΅ Π±Π°Π·ΠΎΠ²Ρ‹Π΅ классы, Π΄ΠΎΠΏΡƒΡΠΊΠ°ΡŽΡ‚ присваивания ΠΈΠΌ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π· с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΏΠΎΡ€ΠΎΠΆΠ΄Π°Π΅ΠΌΠΎΠΉ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ присваивания.

ΠŸΡ€ΠΈΡΠ²Π°ΠΈΠ²Π°Π½ΠΈΠ΅ ΠΏΠΎ Ρ‡Π»Π΅Π½Π°ΠΌ ΠΈ инициализация ΠΏΠΎ Ρ‡Π»Π΅Π½Π°ΠΌ ΠΎΠ·Π½Π°Ρ‡Π°ΡŽΡ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅: Ссли класс X ΠΈΠΌΠ΅Π΅Ρ‚ Π² качСствС Ρ‡Π»Π΅Π½Π° класс M, для Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ присваивания ΠΈ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Ρ‡Π»Π΅Π½Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ присваивания Π² M ΠΈ конструктор копирования M соотвСтствСнно. Если класс ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‡Π»Π΅Π½ Ρ‚ΠΈΠΏΠ° const, ΠΈΠ»ΠΈ Ρ‡Π»Π΅Π½, ΡΠ²Π»ΡΡŽΡ‰ΠΈΠΉΡΡ ссылкой, ΠΈΠ»ΠΈ Ρ‡Π»Π΅Π½ ΠΈΠ»ΠΈ Π±Π°Π·ΠΎΠ²Ρ‹ΠΉ класс Ρ‚Π°ΠΊΠΎΠ³ΠΎ класса, Π³Π΄Π΅ функция operator=() являСтся частной, Ρ‚ΠΎ для Π½Π΅Π³ΠΎ стандартная опСрация присваивания Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ создана. Аналогично, Ссли Ρ‡Π»Π΅Π½ ΠΈΠ»ΠΈ Π±Π°Π·ΠΎΠ²Ρ‹ΠΉ класс класса M ΠΈΠΌΠ΅Π΅Ρ‚ частный конструктор копирования, Ρ‚ΠΎ стандартный конструктор копирования для Ρ‚Π°ΠΊΠΎΠ³ΠΎ класса Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ создан.

Пока Π½Π΅ появится Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΡΡ‚ΡŒ Π² ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠΈ, стандартныС присваиваниС ΠΈ конструктор копирования Π±ΡƒΠ΄ΡƒΡ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ описаны (Ρ‚.Π΅. Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ создано Ρ‚Π΅Π»ΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ). Π˜Π½Ρ‹ΠΌΠΈ словами, функция X::operator=() Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΡ€ΠΎΠΆΠ΄Π΅Π½Π° Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‚ΠΎΠ³Π΄Π°, ΠΊΠΎΠ³Π΄Π° Π½Π΅Ρ‚ явного описания ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ присваивания, Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ класса X присваиваСтся ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρƒ класса X ΠΈΠ»ΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρƒ класса, ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΎΡ‚ X, ΠΈΠ»ΠΈ вычисляСтся адрСс Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ X::operator=(). Аналогичная ситуация с ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠ΅ΠΉ.

Если присваиваниС ΠΈ конструктор копирования описаны нСявно, Ρ‚ΠΎ ΠΎΠ½ΠΈ Π±ΡƒΠ΄ΡƒΡ‚ ΠΎΠ±Ρ‰ΠΈΠΌΠΈ функциями-Ρ‡Π»Π΅Π½Π°ΠΌΠΈ ΠΈ опСрация присваивания для класса X опрСдСляСтся Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π΅Π΅ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠΌ являСтся ссылка Ρ‚ΠΈΠΏΠ° X& Π½Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ ΠΏΡ€ΠΈΡΠ²Π°ΠΈΠ²Π°ΡŽΡ‚.

Если Π² классС X Π΅ΡΡ‚ΡŒ функция X::operator=(), ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠΌ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ являСтся сам класс X, Ρ‚ΠΎ стандартноС присваиваниС Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΡ€ΠΎΠΆΠ΄Π°Ρ‚ΡŒΡΡ. Если Π² классС ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ ΠΊΠ°ΠΊΠΎΠΉ-Π»ΠΈΠ±ΠΎ конструктор копирования, Ρ‚ΠΎ стандартный конструктор копирования Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΡ€ΠΎΠΆΠ΄Π°Ρ‚ΡŒΡΡ. ΠŸΡ€ΠΈΠ²Π΅Π΄Π΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€:

class X {

 //…

public:

 X(int);