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

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

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

// Ρ‚ΠΎ ΠΆΠ΅ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ ΠΈ Ρƒ исходного конструктора Π²Ρ‹ΡˆΠ΅

Sales_data(const std::string &s):

           bookNo(s), units_sold(0), revenue(0) { }

ΠžΠ±Ρ‹Ρ‡Π½ΠΎ для конструктора Π»ΡƒΡ‡ΡˆΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ внутриклассовый ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€, Ссли ΠΎΠ½ Π΅ΡΡ‚ΡŒ ΠΈ присваиваСт Ρ‡Π»Π΅Π½Ρƒ класса ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅. Π‘ Π΄Ρ€ΡƒΠ³ΠΎΠΉ стороны, Ссли ваш компилятор Π΅Ρ‰Π΅ Π½Π΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ внутриклассовыС ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Ρ‹, Ρ‚ΠΎ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ конструктор Π΄ΠΎΠ»ΠΆΠ΅Π½ явно ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ‡Π»Π΅Π½ встроСнного Ρ‚ΠΈΠΏΠ°.

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

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

ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ конструктора Π²Π½Π΅ Ρ‚Π΅Π»Π° класса

Π’ ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ Π½Π°ΡˆΠΈΡ… Π΄Ρ€ΡƒΠ³ΠΈΡ… конструкторов, конструктору, ΠΏΠΎΠ»ΡƒΡ‡Π°ΡŽΡ‰Π΅ΠΌΡƒ ΠΏΠΎΡ‚ΠΎΠΊ istream, Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π΅ΡΡ‚ΡŒ Ρ‡Ρ‚ΠΎ Π΄Π΅Π»Π°Ρ‚ΡŒ. Π’ своСм Ρ‚Π΅Π»Π΅ этот конструктор Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ read(), Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΈΡΠ²ΠΎΠΈΡ‚ΡŒ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌ-Ρ‡Π»Π΅Π½Π°ΠΌ Π½ΠΎΠ²Ρ‹Π΅ значСния:

Sales_data::Sales_data(std::istream &is) {

 read(is, *this); // read Ρ‡ΠΈΡ‚Π°Π΅Ρ‚ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΡŽ ΠΈΠ· is Π² Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚

}

Π£ конструкторов Π½Π΅Ρ‚ Ρ‚ΠΈΠΏΠ° Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ³ΠΎ значСния, поэтому ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ начинаСтся с ΠΈΠΌΠ΅Π½ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. Подобно любой Π΄Ρ€ΡƒΠ³ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ-Ρ‡Π»Π΅Π½Ρƒ, ΠΏΡ€ΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠΈ конструктора Π·Π° ΠΏΡ€Π΅Π΄Π΅Π»Π°ΠΌΠΈ Ρ‚Π΅Π»Π° класса Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ класс, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠΈΡ‚ конструктор. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, синтаксис Sales data::Sales_data ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ опрСдСляСм Ρ‡Π»Π΅Π½ класса Sales_data ΠΏΠΎ ΠΈΠΌΠ΅Π½ΠΈ Sales_data. Π­Ρ‚ΠΎΡ‚ Ρ‡Π»Π΅Π½ класса являСтся конструктором, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π΅Π³ΠΎ имя совпадаСт с ΠΈΠΌΠ΅Π½Π΅ΠΌ класса.

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

Π§Π»Π΅Π½Ρ‹, ΠΎΡ‚ΡΡƒΡ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ Π² спискС ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ конструктора, ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΡŽΡ‚ΡΡ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΌ внутриклассовым ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ΠΎΠΌ (Ссли ΠΎΠ½ Π΅ΡΡ‚ΡŒ) ΠΈΠ»ΠΈ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ. Для класса Sales_data это ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈ запускС Ρ‚Π΅Π»Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π½Π° Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ пСрСмСнная bookNo Π±ΡƒΠ΄Π΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ ΠΏΡƒΡΡ‚ΡƒΡŽ строку, Π° ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ units_sold ΠΈ revenue β€” Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 0.

Π§Ρ‚ΠΎΠ±Ρ‹ стало понятнСй, Π½Π°ΠΏΠΎΠΌΠ½ΠΈΠΌ, Ρ‡Ρ‚ΠΎ Π²Ρ‚ΠΎΡ€ΠΎΠΉ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ read() являСтся ссылкой Π½Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ класса Sales_data. Π’ Ρ€Π°Π·Π΄Π΅Π»Π΅ 7.1.2 ΠΌΡ‹ ΠΎΠ±Ρ€Π°Ρ‰Π°Π»ΠΈ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ this ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для доступа ΠΊ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρƒ Π² Ρ†Π΅Π»ΠΎΠΌ, Π° Π½Π΅ ΠΊ Π΅Π³ΠΎ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠΌΡƒ Ρ‡Π»Π΅Π½Ρƒ. Π’ Π΄Π°Π½Π½ΠΎΠΌ случаС для ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ "этого" ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Π² качСствС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ read() ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ синтаксис *this.

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

Π£ΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ 7.11. Π”ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ Π² класс Sales_data конструкторы ΠΈ Π½Π°ΠΏΠΈΡˆΠΈΡ‚Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰ΡƒΡŽ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΈΠ· Π½ΠΈΡ….

Π£ΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ 7.12. ΠŸΠ΅Ρ€Π΅ΠΌΠ΅ΡΡ‚ΠΈΡ‚Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ конструктора Sales_data(), ΠΏΠΎΠ»ΡƒΡ‡Π°ΡŽΡ‰Π΅Π³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ istream, Π² Ρ‚Π΅Π»ΠΎ класса Sales_data.

Π£ΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ 7.13. ΠŸΠ΅Ρ€Π΅ΠΏΠΈΡˆΠΈΡ‚Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ ΠΈΠ· Ρ€Π°Π·Π΄Π΅Π»Π° 7.1.1 Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ конструктор с ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠΌ istream.

Π£ΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ 7.14. ΠΠ°ΠΏΠΈΡˆΠΈΡ‚Π΅ Π²Π΅Ρ€ΡΠΈΡŽ стандартного конструктора, явно ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΡŽΡ‰ΡƒΡŽ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅-Ρ‡Π»Π΅Π½Ρ‹ значСниями, прСдоставлСнными внутриклассовыми ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π°ΠΌΠΈ.

Π£ΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ 7.15. Π”ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ конструкторы Π² класс Person.

7.1.5. ΠšΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅, присвоСниС ΠΈ ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠ΅

ΠšΡ€ΠΎΠΌΠ΅ опрСдСлСния способа ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ своих ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ², классы ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΠΈΡ€ΡƒΡŽΡ‚ Ρ‚Π°ΠΊΠΆΠ΅ Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ происходит ΠΏΡ€ΠΈ ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ, присвоСнии ΠΈ ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² класса. ΠžΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ ΠΊΠΎΠΏΠΈΡ€ΡƒΡŽΡ‚ΡΡ Π²ΠΎ ΠΌΠ½ΠΎΠ³ΠΈΡ… случаях: ΠΏΡ€ΠΈ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ, ΠΏΡ€ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π΅ ΠΈΠ»ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π΅Π½ΠΈΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° ΠΏΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΡŽ (см. Ρ€Π°Π·Π΄Π΅Π» 6.2.1 ΠΈ Ρ€Π°Π·Π΄Π΅Π» 6.3.2). ΠžΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ ΠΏΡ€ΠΈΡΠ²Π°ΠΈΠ²Π°ΡŽΡ‚ΡΡ ΠΏΡ€ΠΈ использовании ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° присвоСния (см. Ρ€Π°Π·Π΄Π΅Π» 4.4). ΠžΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ ΡƒΠ΄Π°Π»ΡΡŽΡ‚ΡΡ, ΠΊΠΎΠ³Π΄Π° ΠΎΠ½ΠΈ ΠΏΡ€Π΅ΠΊΡ€Π°Ρ‰Π°ΡŽΡ‚ сущСствованиС, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΏΡ€ΠΈ Π²Ρ‹Ρ…ΠΎΠ΄Π΅ локального ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° ΠΈΠ· Π±Π»ΠΎΠΊΠ°, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΎΠ½ Π±Ρ‹Π» создан (см. Ρ€Π°Π·Π΄Π΅Π» 6.1.1). ΠžΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹, Ρ…Ρ€Π°Π½ΠΈΠΌΡ‹Π΅ Π² Π²Π΅ΠΊΡ‚ΠΎΡ€Π΅ (ΠΈΠ»ΠΈ массивС), ΡƒΠ΄Π°Π»ΡΡŽΡ‚ΡΡ ΠΏΡ€ΠΈ ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠΈ Π²Π΅ΠΊΡ‚ΠΎΡ€Π° (ΠΈΠ»ΠΈ массива).

Если ΠΌΡ‹ Π½Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠΌ эти ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ, компилятор создаст ΠΈΡ… сам. ΠžΠ±Ρ‹Ρ‡Π½ΠΎ создаваСмыС компилятором вСрсии Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ΡΡ, копируя, присваивая ΠΈΠ»ΠΈ удаляя ΠΊΠ°ΠΆΠ΄ΡƒΡŽ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ-Ρ‡Π»Π΅Π½ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°. НапримСр, ΠΊΠΎΠ³Π΄Π° Π² ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ ΠΊΠ½ΠΈΠΆΠ½ΠΎΠ³ΠΎ ΠΌΠ°Π³Π°Π·ΠΈΠ½Π° (см. Ρ€Π°Π·Π΄Π΅Π» 7.1.1) компилятор выполняСт ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅ присвоСниС:

total = trans; // ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΡƒΡŽ ΠΊΠ½ΠΈΠ³Ρƒ

ΠΎΠ½ΠΎ выполняСтся, ΠΊΠ°ΠΊ Π±ΡƒΠ΄Ρ‚ΠΎ Π±Ρ‹Π»ΠΎ написано Ρ‚Π°ΠΊ:

// присвоСниС ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ для Sales_data эквивалСнтно ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌΡƒ:

total.bookNo = trans.bookNo;

total.units_sold = trans.units_sold;

total.revenue = trans.revenue;

Π‘ΠΎΠ»Π΅Π΅ подробная информация ΠΎΠ± ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠΈ собствСнных вСрсий этих ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ² ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π° Π² Π³Π»Π°Π²Π΅ 13.

НСкоторыС классы Π½Π΅ ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΠΎΠ»Π°Π³Π°Ρ‚ΡŒΡΡ Π½Π° синтСзируСмыС вСрсии

Π₯отя компилятор ΠΈ создаСт сам ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ копирования, присвоСния ΠΈ удалСния, Π²Π°ΠΆΠ½ΠΎ ΠΏΠΎΠ½ΠΈΠΌΠ°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ Ρƒ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… классов ΠΈΡ… стандартныС вСрсии Π²Π΅Π΄ΡƒΡ‚ сСбя Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ. Π’ частности, синтСзируСмыС вСрсии вряд Π»ΠΈ Π±ΡƒΠ΄ΡƒΡ‚ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с классами, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ€Π΅Π·Π΅Ρ€Π²ΠΈΡ€ΡƒΡŽΡ‚ рСсурсы, Ρ€Π°ΡΠΏΠΎΠ»Π°Π³Π°ΡŽΡ‰ΠΈΠ΅ΡΡ Π²Π½Π΅ самих ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² класса. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ рСзСрвирования ΠΈ управлСния динамичСской ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ Π² Π³Π»Π°Π²Π΅ 12. Как Π±ΡƒΠ΄Π΅Ρ‚ продСмонстрировано Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ 13.6, классы, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΡƒΠΏΡ€Π°Π²Π»ΡΡŽΡ‚ динамичСской ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ, Π²ΠΎΠΎΠ±Ρ‰Π΅ Π½Π΅ ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΠΎΠ»Π°Π³Π°Ρ‚ΡŒΡΡ Π½Π° синтСзируСмыС вСрсии этих ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ.

Однако слСдуСт Π·Π°ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ классов, Π½ΡƒΠΆΠ΄Π°ΡŽΡ‰ΠΈΡ…ΡΡ Π² динамичСской памяти, способны (ΠΈ Π΄ΠΎΠ»ΠΆΠ½Ρ‹) ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ классы vector ΠΈΠ»ΠΈ string, Ссли ΠΈΠΌ Π½ΡƒΠΆΠ½ΠΎ управляСмоС Ρ…Ρ€Π°Π½Π΅Π½ΠΈΠ΅. ΠšΠ»Π°ΡΡΡ‹, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰ΠΈΠ΅ Π²Π΅ΠΊΡ‚ΠΎΡ€Ρ‹ ΠΈ строки, ΠΈΠ·Π±Π΅Π³Π°ΡŽΡ‚ слоТностСй, связанных с Ρ€Π΅Π·Π΅Ρ€Π²ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ ΠΈ освобоТдСниСм памяти.

ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, синтСзируСмыС вСрсии ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ² копирования, присвоСния ΠΈ удалСния ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ для классов, Ρƒ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π΅ΡΡ‚ΡŒ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅-Ρ‡Π»Π΅Π½Ρ‹ класса vector ΠΈΠ»ΠΈ string. ΠŸΡ€ΠΈ ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ ΠΈΠ»ΠΈ присвоСнии ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°, ΠΎΠ±Π»Π°Π΄Π°ΡŽΡ‰Π΅Π³ΠΎ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ-Ρ‡Π»Π΅Π½ΠΎΠΌ класса vector, этот класс сам позаботится ΠΎ ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ ΠΈ присвоСнии своих элСмСнтов. Когда ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ удаляСтся, пСрСмСнная-Ρ‡Π»Π΅Π½ класса vector Ρ‚ΠΎΠΆΠ΅ удаляСтся, Ρ‡Ρ‚ΠΎ Π² свою ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ удаляСт элСмСнты Π²Π΅ΠΊΡ‚ΠΎΡ€Π°. Класс string Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½ΠΎ.

Пока Π²Ρ‹ Π΅Ρ‰Π΅ Π½Π΅ Π·Π½Π°Π΅Ρ‚Π΅, ΠΊΠ°ΠΊ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹, описанныС Π² Π³Π»Π°Π²Π΅ 13, рСсурсы, Ρ€Π΅Π·Π΅Ρ€Π²ΠΈΡ€ΡƒΠ΅ΠΌΡ‹Π΅ вашими классами, Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒΡΡ нСпосрСдствСнно ΠΊΠ°ΠΊ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅-Ρ‡Π»Π΅Π½Ρ‹ класса.

7.2. Π£ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ доступом ΠΈ инкапсуляция

На настоящий ΠΌΠΎΠΌΠ΅Π½Ρ‚ для нашСго класса ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ интСрфСйс; ΠΎΠ΄Π½Π°ΠΊΠΎ Π½ΠΈΡ‡Ρ‚ΠΎ Π½Π΅ Π²Ρ‹Π½ΡƒΠΆΠ΄Π°Π΅Ρ‚ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π΅Π³ΠΎ. Наш класс Π΅Ρ‰Π΅ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ ΠΈΠ½ΠΊΠ°ΠΏΡΡƒΠ»ΡΡ†ΠΈΡŽ β€” ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΠΈ Π²ΠΏΠΎΠ»Π½Π΅ ΠΌΠΎΠ³ΡƒΡ‚ ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚ΡŒΡΡ ΠΊ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρƒ Sales_data ΠΈ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π΅Π³ΠΎ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠ΅ΠΉ. Для обСспСчСния инкапсуляции Π² языкС Π‘++ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ спСцификаторы доступа (access specifier).

β€’ Π§Π»Π΅Π½Ρ‹ класса, ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Π΅ послС спСцификатора public, доступны для всСх частСй ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. ΠžΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹Π΅ Ρ‡Π»Π΅Π½Ρ‹ (public member) ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ интСрфСйс ΠΊ классу.

β€’ Π§Π»Π΅Π½Ρ‹, ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Π΅ послС спСцификатора private, ΡΠ²Π»ΡΡŽΡ‚ΡΡ Π·Π°ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΌΠΈ (private member), ΠΎΠ½ΠΈ доступны для Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ-Ρ‡Π»Π΅Π½ΠΎΠ² класса, Π½ΠΎ Π½Π΅ доступны для ΠΊΠΎΠ΄Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ класс. Π Π°Π·Π΄Π΅Π»Ρ‹ private ΠΈΠ½ΠΊΠ°ΠΏΡΡƒΠ»ΠΈΡ€ΡƒΡŽΡ‚ (Ρ‚.Π΅. ΡΠΊΡ€Ρ‹Π²Π°ΡŽΡ‚) Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ.

ΠŸΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠ² класс Sales_data Π΅Ρ‰Π΅ Ρ€Π°Π·, ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅:

class Sales_data {

public: // Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ спСцификатор доступа

 Sales_data() = default;

 Sales_data(const std::string &s, unsigned n, double p):

         bookNo(s), units_sold(n), revenue(p*n) { }

 Sales_data(const std::string &s): bookNo(s) { }

 Sales_data(std::istream&);

 std::string isbn() const { return bookNo; }

 Sales_data &combine(const Sales_data&);

private: // Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ спСцификатор доступа

 double avg_price() const

  { return units_sold ? revenue/units_sold : 0; }

 std::string bookNo;

 unsigned units_sold = 0;

 double revenue = 0.0;

};

ΠšΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ‚ΠΎΡ€Ρ‹ ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ-Ρ‡Π»Π΅Π½Ρ‹, ΡΠ²Π»ΡΡŽΡ‰ΠΈΠ΅ΡΡ Ρ‡Π°ΡΡ‚ΡŒΡŽ интСрфСйса (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, isbn() ΠΈ combine()), Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Ρ€Π°ΡΠΏΠΎΠ»Π°Π³Π°Ρ‚ΡŒΡΡ Π·Π° спСцификатором public; ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅-Ρ‡Π»Π΅Π½Ρ‹ ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΡΠ²Π»ΡΡŽΡ‰ΠΈΠ΅ΡΡ Ρ‡Π°ΡΡ‚ΡŒΡŽ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ, Ρ€Π°ΡΠΏΠΎΠ»Π°Π³Π°ΡŽΡ‚ΡΡ Π·Π° спСцификатором private.

Класс ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ любоС количСство спСцификаторов доступа; Π½Π΅Ρ‚ Π½ΠΈΠΊΠ°ΠΊΠΈΡ… ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠΉ Π½Π° Ρ‚ΠΎ, ΠΊΠ°ΠΊ часто ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ спСцификатор. ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ спСцификатор опрСдСляСт ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ доступа ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… Ρ‡Π»Π΅Π½ΠΎΠ². Π—Π°Π΄Π°Π½Π½Ρ‹ΠΉ ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ доступа остаСтся Π² силС Π΄ΠΎ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π³ΠΎ спСцификатора доступа ΠΈΠ»ΠΈ Π΄ΠΎ ΠΊΠΎΠ½Ρ†Π° Ρ‚Π΅Π»Π° класса.