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

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

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

β€’ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° ΠΊΠ°ΠΊ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρƒ Π½Π΅ ссылочного Ρ‚ΠΈΠΏΠ°;

β€’ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π΅Π½ΠΈΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° ΠΈΠ· Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ с Π½Π΅ ссылочным Ρ‚ΠΈΠΏΠΎΠΌ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ³ΠΎ значСния;

β€’ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ списком Π² скобках элСмСнтов массива ΠΈΠ»ΠΈ Ρ‡Π»Π΅Π½ΠΎΠ² Π°Π³Ρ€Π΅Π³Π°Ρ‚Π½ΠΎΠ³ΠΎ класса (см. Ρ€Π°Π·Π΄Π΅Π» 7.5.5)

НСкоторыС классы ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ Ρ‚Π°ΠΊΠΆΠ΅ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ ΠΊΠΎΠΏΠΈΠ΅ΠΉ для Ρ€Π΅Π·Π΅Ρ€Π²ΠΈΡ€ΡƒΠ΅ΠΌΡ‹Ρ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ². НапримСр, Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅Ρ‡Π½Ρ‹Π΅ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Ρ‹ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΡŽΡ‚ ΠΊΠΎΠΏΠΈΠ΅ΠΉ свои элСмСнты ΠΏΡ€ΠΈ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π°, Π»ΠΈΠ±ΠΎ ΠΏΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ insert() ΠΈΠ»ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ push() элСмСнта (см. Ρ€Π°Π·Π΄Π΅Π» 9.3.1). Π­Π»Π΅ΠΌΠ΅Π½Ρ‚Ρ‹, созданныС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ emplace(), Π½Π°ΠΏΡ€ΠΎΡ‚ΠΈΠ², ΠΎΡ‚Π»ΠΈΡ‡Π°ΡŽΡ‚ΡΡ прямой ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠ΅ΠΉ (см. Ρ€Π°Π·Π΄Π΅Π» 9.3.1).

ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΡ‹Π΅ значСния

Π’ΠΎ врСмя Π²Ρ‹Π·ΠΎΠ²Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ с ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°ΠΌΠΈ Π½Π΅ ссылочного Ρ‚ΠΈΠΏΠ° осущСствляСтся инициализация ΠΊΠΎΠΏΠΈΠ΅ΠΉ (см. Ρ€Π°Π·Π΄Π΅Π» 6.2.1). Π’ΠΎΡ‡Π½ΠΎ Ρ‚Π°ΠΊ ΠΆΠ΅, ΠΊΠΎΠ³Π΄Π° Ρƒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π½Π΅ ссылочный Ρ‚ΠΈΠΏ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ³ΠΎ значСния, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π² Ρ‚ΠΎΡ‡ΠΊΠ΅ Π²Ρ‹Π·ΠΎΠ²Π° для ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΊΠΎΠΏΠΈΠ΅ΠΉ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π° ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° Π²Ρ‹Π·ΠΎΠ²Π° (см. Ρ€Π°Π·Π΄Π΅Π» 6.3.2).

Π’ΠΎΡ‚ Ρ„Π°ΠΊΡ‚, Ρ‡Ρ‚ΠΎ конструктор ΠΊΠΎΠΏΠΈΠΉ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Π½Π΅ ссылочных ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² Ρ‚ΠΈΠΏΠ° класса, ΠΎΠ±ΡŠΡΡΠ½ΡΠ΅Ρ‚, ΠΏΠΎΡ‡Π΅ΠΌΡƒ собствСнный ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ конструктора ΠΊΠΎΠΏΠΈΠΉ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ ссылкой. Если Π±Ρ‹ этот ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ Π½Π΅ Π±Ρ‹Π» ссылкой, Ρ‚ΠΎ Π²Ρ‹Π·ΠΎΠ² Π½Π΅ Π±Ρ‹Π» Π±Ρ‹ ΡƒΡΠΏΠ΅ΡˆΠ½Ρ‹ΠΌ β€” ΠΏΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ конструктора ΠΊΠΎΠΏΠΈΠΉ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ использован конструктор ΠΊΠΎΠΏΠΈΠΉ для копирования Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°, Π½ΠΎ для копирования Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° слСдуСт Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ конструктор ΠΊΠΎΠΏΠΈΠΉ ΠΈ Ρ‚Π°ΠΊ Π΄Π°Π»Π΅Π΅ Π΄ΠΎ бСсконСчности.

ΠžΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΡ Π½Π° ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ ΠΊΠΎΠΏΠΈΠ΅ΠΉ

Как ΡƒΠΆΠ΅ ΡƒΠΏΠΎΠΌΠΈΠ½Π°Π»ΠΎΡΡŒ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π»ΠΈ инициализация ΠΊΠΎΠΏΠΈΠ΅ΠΉ ΠΈΠ»ΠΈ прямая инициализация, Ссли ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€, Ρ‚ΠΎ потрСбуСтся ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ Π² явный конструктор (см. Ρ€Π°Π·Π΄Π΅Π» 7.5.4):

vector<int> v1(10);  // ok: прямая инициализация

vector<int> v2 = 10; // ошибка: конструктор, ΠΏΠΎΠ»ΡƒΡ‡Π°ΡŽΡ‰ΠΈΠΉ Ρ€Π°Π·ΠΌΠ΅Ρ€,

                     // ΡΠ²Π»ΡΠ΅Ρ‚ся ΡΠ²Π½Ρ‹ΠΌ

void f(vector<int>); // ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ f() инициализируСтся ΠΊΠΎΠΏΠΈΠ΅ΠΉ

f(10); // ошибка: нСльзя ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ явный конструктор для

       // ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°

f(vector<int>(10));  // ok: нСпосрСдствСнно ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Π²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΉ Π²Π΅ΠΊΡ‚ΠΎΡ€

                     // ΠΈΠ· int

ΠŸΡ€ΡΠΌΠ°Ρ инициализация Π²Π΅ΠΊΡ‚ΠΎΡ€Π° v1 ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½Π°, Π½ΠΎ Π½Π° ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ взгляд эквивалСнтная инициализация ΠΊΠΎΠΏΠΈΠ΅ΠΉ Π²Π΅ΠΊΡ‚ΠΎΡ€Π° v2 ΠΎΡˆΠΈΠ±ΠΎΡ‡Π½Π°, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ конструктор Π²Π΅ΠΊΡ‚ΠΎΡ€Π°, ΠΏΠΎΠ»ΡƒΡ‡Π°ΡŽΡ‰ΠΈΠΉ ΠΎΠ΄ΠΈΠ½ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ Ρ€Π°Π·ΠΌΠ΅Ρ€Π°, являСтся явным. По Ρ‚Π΅ΠΌ ΠΆΠ΅ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π°ΠΌ нСдопустима инициализация ΠΊΠΎΠΏΠΈΠ΅ΠΉ Π²Π΅ΠΊΡ‚ΠΎΡ€Π° v2 β€” нСльзя нСявно ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ явный конструктор ΠΏΡ€ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π΅ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° ΠΈΠ»ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π΅Π½ΠΈΠΈ значСния ΠΈΠ· Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. Если Π½ΡƒΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ явный конструктор, Ρ‚ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ это слСдуСт явно, ΠΊΠ°ΠΊ Π² послСднСй строкС ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°, ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠ³ΠΎ Π²Ρ‹ΡˆΠ΅.

ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ‚ΠΎΡ€ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠ±ΠΎΠΉΡ‚ΠΈ конструктор ΠΊΠΎΠΏΠΈΠΉ

Π’ΠΎ врСмя ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΊΠΎΠΏΠΈΠ΅ΠΉ компилятору ΠΌΠΎΠΆΠ½ΠΎ (Π½ΠΎ Π½Π΅ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ) ΠΏΡ€ΠΎΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ конструктор ΠΊΠΎΠΏΠΈΠΉ ΠΈΠ»ΠΈ пСрСмСщСния ΠΈ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ нСпосрСдствСнно. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, ΠΊΠΎΠ΄

string null_book = "9-999-99999-9"; // инициализация ΠΊΠΎΠΏΠΈΠ΅ΠΉ

компилятор ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ Ρ‚Π°ΠΊ:

string null_book("9-999-99999-9"); // компилятор пропускаСт конструктор

                                   // ΠΊΠΎΠΏΠΈΠΉ

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

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

Π£ΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ 13.1. Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ конструктор ΠΊΠΎΠΏΠΈΠΉ? Когда ΠΎΠ½ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ?

Π£ΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ 13.2. ΠžΠ±ΡŠΡΡΠ½ΠΈΡ‚Π΅, ΠΏΠΎΡ‡Π΅ΠΌΡƒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅ объявлСниС нСдопустимо:

Sales_data::Sales_data(Sales_data rhs);

Π£ΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ 13.3. ΠžΠ±ΡŠΡΡΠ½ΠΈΡ‚Π΅, Ρ‡Ρ‚ΠΎ происходит ΠΏΡ€ΠΈ ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² классов StrBlob ΠΈ StrBlobPtr?

Π£ΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ 13.4. ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, класс Point ΠΈΠΌΠ΅Π΅Ρ‚ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΉ конструктор ΠΊΠΎΠΏΠΈΠΉ. Π£ΠΊΠ°ΠΆΠΈΡ‚Π΅ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ случай использования конструктора ΠΊΠΎΠΏΠΈΠΉ Π² этом Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚Π΅ ΠΊΠΎΠ΄Π°:

Point global;

Point foo_bar(Point arg) {

 Point local = arg, *heap = new Point(global);

 *heap = local;

 Point pa[4] = { local, *heap };

 return *heap;

}

Π£ΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ 13.5. ΠΠ°ΠΏΠΈΡˆΠΈΡ‚Π΅ с ΡƒΡ‡Π΅Ρ‚ΠΎΠΌ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π³ΠΎ эскиза класса конструктор ΠΊΠΎΠΏΠΈΠΉ, ΠΊΠΎΠΏΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ всС ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅-Ρ‡Π»Π΅Π½Ρ‹. ΠšΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ‚ΠΎΡ€ Π΄ΠΎΠ»ΠΆΠ΅Π½ динамичСски Ρ€Π΅Π·Π΅Ρ€Π²ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π½ΠΎΠ²ΡƒΡŽ строку (см. Ρ€Π°Π·Π΄Π΅Π» 12.1.2) ΠΈ ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ ps, Π° Π½Π΅ сам ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ ps.

class HasPtr {

public:

 HasPtr(const std::string &s = std::string()) :

  ps(new std::string(s)), i(0) { }

private:

 std::string *ps;

 int i;

};

13.1.2. ΠžΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ присвоСния ΠΊΠΎΠΏΠΈΠΈ

Подобно Ρ‚ΠΎΠΌΡƒ, ΠΊΠ°ΠΊ класс ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ своих ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ², ΠΎΠ½ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΠΈΡ€ΡƒΠ΅Ρ‚ Ρ‚Π°ΠΊΠΆΠ΅ присваиваниС своих ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ²:

Sales_data trans, accum;

trans = accum; // ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ присвоСния ΠΊΠΎΠΏΠΈΠΈ

               // ΠΊΠ»Π°ΡΡΠ° Sales_data

ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ‚ΠΎΡ€ сам синтСзируСт ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ присвоСния ΠΊΠΎΠΏΠΈΠΈ, Ссли ΠΎΠ½ Π½Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ Π² классС явно.

ΠŸΠ΅Ρ€Π΅Π³Ρ€ΡƒΠΆΠ΅Π½Π½Ρ‹ΠΉ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ присвоСния

ΠŸΡ€Π΅ΠΆΠ΄Π΅ Ρ‡Π΅ΠΌ ΠΏΠ΅Ρ€Π΅ΠΉΡ‚ΠΈ ΠΊ синтСзируСмому ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρƒ присвоСния, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΎΠ·Π½Π°ΠΊΠΎΠΌΠΈΡ‚ΡŒΡΡ с ΠΏΠ΅Ρ€Π΅Π³Ρ€ΡƒΠ·ΠΊΠΎΠΉ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ² (overloaded operator), ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎ рассматриваСмой Π² Π³Π»Π°Π²Π΅ 14.

ΠŸΠ΅Ρ€Π΅Π³Ρ€ΡƒΠΆΠ΅Π½Π½Ρ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ β€” это Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΈΠΌΠ΅Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… состоят ΠΈΠ· слова operator ΠΈ символа опрСдСляСмого ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π°. Π‘Π»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ присвоСния β€” это функция operator=. Подобно любой Π΄Ρ€ΡƒΠ³ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Ρƒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° Π΅ΡΡ‚ΡŒ Ρ‚ΠΈΠΏ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ³ΠΎ значСния ΠΈ список ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ².

ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°ΠΌΠΈ ΠΏΠ΅Ρ€Π΅Π³Ρ€ΡƒΠΆΠ΅Π½Π½ΠΎΠ³ΠΎ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° ΡΠ²Π»ΡΡŽΡ‚ΡΡ Π΅Π³ΠΎ ΠΎΠΏΠ΅Ρ€Π°Π½Π΄Ρ‹. НСкоторыС ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ присвоСниС, Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Ρ‹, ΠΊΠ°ΠΊ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ-Ρ‡Π»Π΅Π½Ρ‹. Когда ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ являСтся Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ-Ρ‡Π»Π΅Π½ΠΎΠΌ, Π»Π΅Π²Ρ‹ΠΉ ΠΎΠΏΠ΅Ρ€Π°Π½Π΄ связан с нСявным ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠΌ this (см. Ρ€Π°Π·Π΄Π΅Π» 7.1.2). ΠŸΡ€Π°Π²Ρ‹ΠΉ ΠΎΠΏΠ΅Ρ€Π°Π½Π΄ Π±ΠΈΠ½Π°Ρ€Π½ΠΎΠ³ΠΎ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π°, Ρ‚Π°ΠΊΠΎΠ³ΠΎ ΠΊΠ°ΠΊ присвоСниС, пСрСдаСтся ΠΊΠ°ΠΊ явный ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€. ΠžΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ присвоСния ΠΊΠΎΠΏΠΈΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ Ρ‚ΠΎΠ³ΠΎ ΠΆΠ΅ Ρ‚ΠΈΠΏΠ°, Ρ‡Ρ‚ΠΎ ΠΈ класс:

class Foo {

public:

 Foo& operator=(const Foo&); // ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ присвоСния

 // ...

};

Для совмСстимости с ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠΌ присвоСния встроСнных Ρ‚ΠΈΠΏΠΎΠ² (см. Ρ€Π°Π·Π΄Π΅Π» 4.4) ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ присвоСния ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‚ ссылку Π½Π° свой Π»Π΅Π²Ρ‹ΠΉ ΠΎΠΏΠ΅Ρ€Π°Π½Π΄. Π‘Π»Π΅Π΄ΡƒΠ΅Ρ‚ Ρ‚Π°ΠΊΠΆΠ΅ Π·Π°ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ ΠΎΡ‚ Ρ‚ΠΈΠΏΠΎΠ², Ρ…Ρ€Π°Π½ΠΈΠΌΡ‹Ρ… Π² ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π΅, наличия ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ² присвоСния, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‰ΠΈΡ… ссылку Π½Π° Π»Π΅Π²Ρ‹ΠΉ ΠΎΠΏΠ΅Ρ€Π°Π½Π΄.

ΠžΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ присвоСния ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Ρ‚ΡŒ ссылку Π½Π° свой Π»Π΅Π²Ρ‹ΠΉ ΠΎΠΏΠ΅Ρ€Π°Π½Π΄.

Π‘ΠΈΠ½Ρ‚Π΅Π·ΠΈΡ€ΡƒΠ΅ΠΌΡ‹ΠΉ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ присвоСния ΠΊΠΎΠΏΠΈΠΈ

Подобно конструктору ΠΊΠΎΠΏΠΈΠΉ, компилятор создаСт синтСзируСмый ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ присвоСния ΠΊΠΎΠΏΠΈΠΈ (synthesized assignment operator) для класса, Ссли Π² Π½Π΅ΠΌ Π½Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ собствСнный. Аналогично конструктору ΠΊΠΎΠΏΠΈΠΉ, Ρƒ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… классов синтСзируСмый ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ присвоСния ΠΊΠΎΠΏΠΈΠΈ Π½Π΅ ΠΏΠΎΠ΄Ρ€Π°Π·ΡƒΠΌΠ΅Π²Π°Π΅Ρ‚ присвоСния (Ρ€Π°Π·Π΄Π΅Π» 13.1.6). Π’ ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС ΠΎΠ½ присваиваСт Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ нСстатичСской ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ-Ρ‡Π»Π΅Π½Π° ΠΏΡ€Π°Π²ΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΉ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ-Ρ‡Π»Π΅Π½Ρƒ Π»Π΅Π²ΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° с использованиСм ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° присвоСния ΠΊΠΎΠΏΠΈΠΈ Ρ‚ΠΈΠΏΠ° этой ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ. ΠœΠ°ΡΡΠΈΠ²Ρ‹ ΠΏΡ€ΠΈΡΠ²Π°ΠΈΠ²Π°ΡŽΡ‚ΡΡ поэлСмСнтно. Π‘ΠΈΠ½Ρ‚Π΅Π·ΠΈΡ€ΡƒΠ΅ΠΌΡ‹ΠΉ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ присвоСния ΠΊΠΎΠΏΠΈΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ссылку Π½Π° свой Π»Π΅Π²Ρ‹ΠΉ ΠΎΠΏΠ΅Ρ€Π°Π½Π΄.

НапримСр, ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΊΠΎΠ΄ эквивалСнтСн синтСзируСмому ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρƒ присвоСния ΠΊΠΎΠΏΠΈΠΈ класса Sales_data:

// эквивалСнт синтСзируСмого ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° присвоСния ΠΊΠΎΠΏΠΈΠΈ

Sales_data&

Sales_data::operator=(const Sales_data &rhs) {

 bookNo = rhs.bookNo;         // Π²Ρ‹Π·ΠΎΠ² string::operator=

 units_sold = rhs.units_sold; // ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ встроСнноС присвоСниС

 int revenue = rhs.revenue;   // ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ встроСнноС

                              // ΠΏΡ€ΠΈΡΠ²ΠΎΠ΅Π½ΠΈΠ΅ double

 return *this;                // Π²ΠΎΠ·Π²Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ этот ΠΎΠ±ΡŠΠ΅ΠΊΡ‚

}

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

Π£ΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ 13.6. Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ присвоСния ΠΊΠΎΠΏΠΈΠΈ? Когда ΠΎΠ½ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ? Π§Ρ‚ΠΎ Π΄Π΅Π»Π°Π΅Ρ‚ синтСзируСмый ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ присвоСния ΠΊΠΎΠΏΠΈΠΈ? Когда ΠΎΠ½ синтСзируСтся?

Π£ΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ 13.7. Π§Ρ‚ΠΎ ΠΏΡ€ΠΎΠΈΠ·ΠΎΠΉΠ΄Π΅Ρ‚ ΠΏΡ€ΠΈ присвоСнии ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° класса StrBlob Π΄Ρ€ΡƒΠ³ΠΎΠΌΡƒ? Π§Ρ‚ΠΎ ΠΏΡ€ΠΎΠΈΠ·ΠΎΠΉΠ΄Π΅Ρ‚ ΠΏΡ€ΠΈ присвоСнии ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² класса StrBlobPtr?

Π£ΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ 13.8. ΠΠ°ΠΏΠΈΡˆΠΈΡ‚Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ присвоСния для класса HasPtr ΠΈΠ· упраТнСния 13.5 Ρ€Π°Π·Π΄Π΅Π»Π° 13.1.1. Подобно конструктору ΠΊΠΎΠΏΠΈΠΉ, Π΄Π°Π½Π½Ρ‹ΠΉ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ присвоСния Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Ρ€s.

13.1.3. ДСструктор

ДСйствиС дСструктора ΠΏΡ€ΠΎΡ‚ΠΈΠ²ΠΎΠΏΠΎΠ»ΠΎΠΆΠ½ΠΎ Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡŽ конструктора: конструкторы ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΡŽΡ‚ нСстатичСскиС ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅-Ρ‡Π»Π΅Π½Ρ‹ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°, Π° Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠ³ΡƒΡ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ дСйствия; дСструкторы ΠΎΡΡƒΡ‰Π΅ΡΡ‚Π²Π»ΡΡŽΡ‚ всС дСйствия, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Π΅ для освобоТдСния ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Π½Π½Ρ‹Ρ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ рСсурсов ΠΈ удалСния нСстатичСских ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…-Ρ‡Π»Π΅Π½ΠΎΠ² ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°.