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

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ «Освой ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ Π‘++ Π·Π° 21 дСнь.Β». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 33

Автор ДТСсс Π›ΠΈΠ±Π΅Ρ€Ρ‚ΠΈ

39: {

40:    // устанавливаСм ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ-Ρ‡Π»Π΅Π½ itsAge Ρ€Π°Π²Π½ΠΎΠΉ

41:    // Π·Π½Π°Ρ‡Π΅Π½ΠΈΡŽ, ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Π½ΠΎΠΌΡƒ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠΌ age

42:    itsAge = age;

43: }

44:

45: // ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° Meow

46: // Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ void

47: // ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² Π½Π΅Ρ‚

48: // ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для Π²Ρ‹Π²ΠΎΠ΄Π° Π½Π° экран тСкста "Meow"

49: void Cat::Meow()

50: {

51:    cout << "Meow.\n";

52: }

53:

54: // Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΡƒΡŽ ΠΊΠΎΡˆΠΊΡƒ, устанавливаСм Π΅Π΅ возраст, Ρ€Π°Π·Ρ€Π΅ΡˆΠ°Π΅ΠΌ

55: // Π΅ΠΉ ΠΌΡΡƒΠΊΠ½ΡƒΡ‚ΡŒ, сообщаСм Π΅Π΅ возраст, Π·Π°Ρ‚Π΅ΠΌ снова "мяукаСм" ΠΈ измСняСм возраст кошки.

56: int main()

57: {

58:    Cat Frisky(5);

59:    Frisky.Meow();

60:    cout << "Frisky is Π° cat who is ";

61:    cout << Frisky.QetAge() << " years old.\n";

62:    Frisky.Meow();

63:    Frisky.SetAge(7);

64;    cout << "Now Frisky is ";

65:    cout << Frisky. GeMje() << " years old.\n";

66:    return 0;

67: }


Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚:

Meow.

Frisky is a cat who is 5 years old.

Meow.

Now Frisky is 7 years old.


Анализ: Листинг 6.4 ΠΏΠΎΠ΄ΠΎΠ±Π΅Π½ листингу Π±.Π— Π·Π° ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ Π² строкС 9 добавляСтся конструктор, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Π² качСствС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° цСлочислСнноС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅. Π’ строкС 10 ΠΎΠ±ΡŠΡΠ²Π»ΡΠ΅Ρ‚ΡΡ дСструктор, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½Π΅ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Π½ΠΈΠΊΠ°ΠΊΠΈΡ… ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ². ΠŸΠΎΠΌΠ½ΠΈΡ‚Π΅, Ρ‡Ρ‚ΠΎ дСструкторы Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°ΡŽΡ‚ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ²; ΠΊΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, Π½ΠΈ конструкторы, Π½ΠΈ дСструкторы Π½Π΅ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‚ Π½ΠΈΠΊΠ°ΠΊΠΈΡ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ β€” Π΄Π°ΠΆΠ΅ значСния Ρ‚ΠΈΠΏΠ° void.

Π’ строках 19β€”22 опрСдСляСтся Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ конструктора, Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½ΠΎΠ΅ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ доступа SetAge(), которая Ρ‚Π°ΠΊΠΆΠ΅ Π½Π΅ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π½ΠΈΠΊΠ°ΠΊΠΎΠ³ΠΎ значСния.

Π’ строках 24β€”26 опрСдСляСтся дСструктор ~Cat(). Π­Ρ‚Π° функция Π½Π΅ выполняСт Π½ΠΈΠΊΠ°ΠΊΠΈΡ… дСйствий, Π½ΠΎ коль Π²Ρ‹ ΠΎΠ±ΡŠΡΠ²Π»ΡΠ΅Ρ‚Π΅ Π΅Π΅ Π² классС, Π½ΡƒΠΆΠ½ΠΎ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ ΠΈ Π΅Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅.

Π’ строкС 58 содСрТится ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° класса Cat с ΠΈΠΌΠ΅Π½Π΅ΠΌ Frisky. Π’ конструктор ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Frisky пСрСдаСтся Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 5. Π’ Π΄Π°Π½Π½ΠΎΠΌ случаС Π½Π΅Ρ‚ Π½ΠΈΠΊΠ°ΠΊΠΎΠΉ нСобходимости Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ-Ρ‡Π»Π΅Π½ SetAge(), ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Frisky создавался с использованиСм значСния 5, присвоСнного ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ-Ρ‡Π»Π΅Π½Ρƒ itsAge, ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π² строкС 61. Π’ строкС 63 ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ itsAge ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Frisky присваиваСтся Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 7, Π½Π° этот Ρ€Π°Π· с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ SetAge(). НовоС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ выводится Π½Π° экран Π² строкС 65.


РСкомСндуСтся:Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ конструкторы для ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ².


He рСкомСндуСтся:НС ΠΏΡ‹Ρ‚Π°ΠΉΡ‚Π΅ΡΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ конструктора ΠΈΠ»ΠΈ дСструктора Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Ρ‚ΡŒ ΠΊΠ°ΠΊΠΎΠ΅ Π±Ρ‹ Ρ‚ΠΎ Π½ΠΈ Π±Ρ‹Π»ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅.

НС ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°ΠΉΡ‚Π΅ дСструкторам ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹.

ОбъявлСниС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ-Ρ‡Π»Π΅Π½ΠΎΠ² со спСцификатором const

Π’ языкС C++ прСдусмотрСна Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΎΠ±ΡŠΡΠ²ΠΈΡ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄ класса Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠΌΡƒ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρƒ Π±ΡƒΠ΄Π΅Ρ‚ Π·Π°ΠΏΡ€Π΅Ρ‰Π΅Π½ΠΎ ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ значСния ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…-Ρ‡Π»Π΅Π½ΠΎΠ² класса. Для этого Π² объявлСнии Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово const, стоящСС послС ΠΊΡ€ΡƒΠ³Π»Ρ‹Ρ… скобок, Π½ΠΎ ΠΏΠ΅Ρ€Π΅Π΄ Ρ‚ΠΎΡ‡ΠΊΠΎΠΉ с запятой. НапримСр, объявим Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ-Ρ‡Π»Π΅Π½ SomeFunction(), которая Π½Π΅ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠ° void:


void SomeFunction() const;


Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ доступа ΠΊ Π΄Π°Π½Π½Ρ‹ΠΌ часто ΠΎΠ±ΡŠΡΠ²Π»ΡΡŽΡ‚ΡΡ со спСцификатором const. Π’ классС Cat Π΅ΡΡ‚ΡŒ Π΄Π²Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ доступа:


void SetAge(int anAge);

int GetAge();


Ѐункция SetAge() Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ объявлСна со спСцификатором const, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΎΠ½Π° измСняСт Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ-Ρ‡Π»Π΅Π½Π° itsAge. А Π² объявлСнии Ρ„ΡƒΠ½ΠΊΠ¦ΠΈΠΈ.^АдС() ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈ Π΄Π°ΠΆΠ΅ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ спСцификатор const, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΎΠ½Π° Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½Π° Π½ΠΈΡ‡Π΅Π³ΠΎ ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ Π² классС. Ѐункция GetAge() просто Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ-Ρ‡Π»Π΅Π½Π° itsAge. Π‘Π»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, объявлСниС этих Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π·Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ Π² Ρ‚Π°ΠΊΠΎΠΌ Π²ΠΈΠ΄Π΅:


void SetAge(int anAge);

int GetAge() const;


Если нСкоторая функция объявлСна с использованиСм спСцификатора const, Π° Π² Π΅Π΅ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ происходит ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΠΊΠ°ΠΊΠΎΠ³ΠΎ-Π»ΠΈΠ±ΠΎ Ρ‡Π»Π΅Π½Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°, Ρ‚ΠΎ компилятор ΠΏΠΎΠΊΠ°ΠΆΠ΅Ρ‚ сообщСниС ΠΎΠ± ошибкС. НапримСр, Ссли Π·Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ GetAge() Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ½Π° подсчитывала, сколько Ρ€Π°Π· Π·Π°ΠΏΡ€Π°ΡˆΠΈΠ²Π°Π»ΡΡ возраст ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Cat, Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ сгСнСрирована ошибка компиляции, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΏΡ€ΠΈ Ρ‚Π°ΠΊΠΎΠΌ подсчСтС (Ρ‚.Π΅. ΠΏΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ GetAge()) происходит ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Cat.


ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅:Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ спСцификатор const Π²Π΅Π·Π΄Π΅ Π² ΠΎΠ±ΡŠΡΠ²Π»Π΅Π½ΠΈΡΡ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ-Ρ‡Π»Π΅Π½ΠΎΠ², Ссли ΠΎΠ½ΠΈ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚. Π­Ρ‚ΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ компилятору Π»ΡƒΡ‡ΡˆΠ΅ ΠΎΡ‚ΡΠ»Π΅ΠΆΠΈΠ²Π°Ρ‚ΡŒ ошибки ΠΈ ΠΏΠΎΠΌΠΎΠΆΠ΅Ρ‚ Π²Π°ΠΌ ΠΏΡ€ΠΈ ΠΎΡ‚Π»Π°Π΄ΠΊΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹.


Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ const Π² ΠΎΠ±ΡŠΡΠ²Π»Π΅Π½ΠΈΡΡ… ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ², Π½Π΅ ΠΈΠ·ΠΌΠ΅Π½ΡΡŽΡ‰ΠΈΡ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, считаСтся Ρ…ΠΎΡ€ΠΎΡˆΠΈΠΌ стилСм программирования. Π­Ρ‚ΠΎ позволяСт компилятору Π»ΡƒΡ‡ΡˆΠ΅ ΠΎΡ‚ΡΠ»Π΅ΠΆΠΈΠ²Π°Ρ‚ΡŒ ошибки Π΅Ρ‰Π΅ Π΄ΠΎ запуска ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π½Π° Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅.


Π§Π΅ΠΌ отличаСтся интСрфСйс ΠΎΡ‚ выполнСния класса

Как ΡƒΠΆΠ΅ ΡƒΠΏΠΎΠΌΠΈΠ½Π°Π»ΠΎΡΡŒ, ΠΊΠ»ΠΈΠ΅Π½Ρ‚Ρ‹ β€” это составныС части ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΡΠΎΠ·Π΄Π°ΡŽΡ‚ ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ вашСго класса. ΠžΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΉ интСрфСйс класса (объявлСниС класса) ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ сСбС Π² Π²ΠΈΠ΄Π΅ соглашСния с этими ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°ΠΌΠΈ, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΡƒΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ способы взаимодСйствия ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠ² с классом.

НапримСр, Π² объявлСнии класса Cat указываСтся, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°-ΠΊΠ»ΠΈΠ΅Π½Ρ‚ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ любой возраст ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° этого класса с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ доступа SetAge() ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ это Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ доступа GetAge(). ΠŸΡ€ΠΈ этом гарантируСтся, Ρ‡Ρ‚ΠΎ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ класса Cat смоТСт вывСсти сообщСниС Meow Π½Π° экран с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ-Ρ‡Π»Π΅Π½Π° Meow(). ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ Π² ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΠΎΠΌ интСрфСйсС класса Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅ говорится ΠΎ Π·Π°ΠΊΡ€Ρ‹Ρ‚ΠΎΠΉ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ-Ρ‡Π»Π΅Π½Π΅ itsAge, которая ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΏΡ€ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ класса ΠΈ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½Π° ΠΈΠ½Ρ‚Π΅Ρ€Π΅ΡΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠ². Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ возраста ΠΌΠΎΠΆΠ½ΠΎ Π²ΠΎΠ·Π²Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ ΠΈΠ· ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ GetAge() ΠΈ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ SetAge(), Π½ΠΎ сама пСрСмСнная itsAge, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ хранится это Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, скрыта ΠΎΡ‚ ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠ².

Если ΠΎΠ±ΡŠΡΠ²ΠΈΡ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ GetAge() со спСцификатором const, Π° ΠΈΠΌΠ΅Π½Π½ΠΎ этого Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‚ ΠΏΡ€Π°Π²ΠΈΠ»Π° Ρ…ΠΎΡ€ΠΎΡˆΠ΅Π³ΠΎ Ρ‚ΠΎΠ½Π° программирования, Π² соглашСниС Ρ‚Π°ΠΊΠΆΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ внСсСн ΠΏΡƒΠ½ΠΊΡ‚ ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ GetAge() нСльзя ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ для измСнСния Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° класса Cat.

Π’ языкС C++ осущСствляСтся строгий ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒ Π·Π° Ρ‚ΠΈΠΏΠ°ΠΌΠΈ Π΄Π°Π½Π½Ρ‹Ρ…, поэтому ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎΠ΅ соглашСниС ΠΌΠ΅ΠΆΠ΄Ρƒ классом ΠΈ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°ΠΌΠΈ Π±ΡƒΠ΄Π΅Ρ‚ Π·Π°ΠΊΠΎΠ½ΠΎΠΌ для компилятора, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ сгСнСрируСт ΠΎΡˆΠΈΠ±ΠΊΡƒ компиляции Π² случаС Π½Π°Ρ€ΡƒΡˆΠ΅Π½ΠΈΡ этого соглашСния. Π’ листингС 6.5 ΠΏΠΎΠΊΠ°Π·Π°Π½ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ Π½Π΅ удастся ΡΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΠ·-Π·Π° Π½Π°Ρ€ΡƒΡˆΠ΅Π½ΠΈΡ этих самых соглашСний.


ΠŸΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π΅Π½ΠΈΠ΅:Листинг 6.5 Π½Π΅ компилируСтся!


Листинг 6.5. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Π½Π°Ρ€ΡƒΡˆΠ΅Π½ΠΈΡ соглашСний интСрфСйса

1: // ΠŸΡ€ΠΈΠΌΠ΅Ρ€ ошибки компиляции, связанной

2: // с Π½Π°Ρ€ΡƒΡˆΠ΅Π½ΠΈΡΠΌΠΈ соглашСний интСрфСйса класса

3:

4: #include <iostream.h> // для ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° cout

5:

6: class Cat

7: {

8: public:

9:    Cat(int initialAge);

10:    ~Cat();

11:    int GetAge() const; // ΠΌΠ΅Ρ‚ΠΎΠ΄ доступа const

12:    void SetAge (int age);

13:    void Meow();

14: private:

15:    int itsAge;

16: };

17:

18: // конструктор класса Cat

19: Cat::Cat(int initialAge)

20: {

21:    itsAge = initialAge;

22:    cout << "Cat constructor\n";

23: }

24: Cat::~Cat() // дСструктор, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½Π΅ выполняСт Π½ΠΈΠΊΠ°ΠΊΠΈΡ… дСйствий

25: {

26:    cout << "Cat destructor\n";

27: }

28: // функция GetAge объявлСна ΠΊΠ°ΠΊ const,

29: // Π½ΠΎ ΠΌΡ‹ Π½Π°Ρ€ΡƒΡˆΠ°Π΅ΠΌ это условиС!

30: int Cat::GetAge() const

31: {

32:    return (itsAge++); // это Π½Π°Ρ€ΡƒΡˆΠ΅Π½ΠΈΠ΅ соглашСния интСрфСйса!

33: }

34:

35: // ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ SetAge ΠΊΠ°ΠΊ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΠΎΠ³ΠΎ

36: // ΠΌΠ΅Ρ‚ΠΎΠ΄Π° доступа ΠΊ Π΄Π°Π½Π½Ρ‹ΠΌ класса

37:

38: void Cat::SetAge(int age)

39: {

40:    // присваиваСм ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ-Ρ‡Π»Π΅Π½Ρƒ itsAge

41:    // Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΠΏΠ°Ρ€ΠΉΠΌΠ΅Ρ‚Ρ€Π° age

42:    itsAge = age;

43: }

44:

45: // ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° Meow

46: // Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ void

47: // ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² Π½Π΅Ρ‚

48: // ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для Π²Ρ‹Π²ΠΎΠ΄Π° Π½Π° экран тСкста "Meow"

49: void Cat::Meow()

50: {

51:    cout << "Meow.\n";

52: }

53:

54: // дСмонстрируСт Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ Π½Π°Ρ€ΡƒΡˆΠ΅Π½ΠΈΡ

55: // интСрфСйса, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ ошибкам компиляции

56: int main()

57: {

58:    Cat Frisky; // Π½Π΅ соотвСтствуСт обьявлСнию

59:    Frisky.Meow();

60:    Frisky.Bark(); // НСт, кошки Π½Π΅ Π»Π°ΡŽΡ‚.

61:    Frisky.itsAge = 7; // пСрСмСнная itsAge Π·Π°ΠΊΡ€Ρ‹Ρ‚Π°

62:    return 0;

63: }


Анализ: Как ΡƒΠΏΠΎΠΌΠΈΠ½Π°Π»ΠΎΡΡŒ Π²Ρ‹ΡˆΠ΅, эта ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π½Π΅ компилируСтся. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ ΠΈ ΠΎΡ‚ΡΡƒΡ‚ΡΡ‚Π²ΡƒΡŽΡ‚ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ Π΅Π΅ Ρ€Π°Π±ΠΎΡ‚Ρ‹.

Π­Ρ‚Ρƒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ Π±Ρ‹Π»ΠΎ Π·Π°Π±Π°Π²Π½ΠΎ ΠΏΠΈΡΠ°Ρ‚ΡŒ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π² Π½Π΅Π΅ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎ Π·Π°ΠΊΠ»Π°Π΄Ρ‹Π²Π°Π»ΠΈΡΡŒ ошибки.

Π’ строкС 11 GetAge( )ΠΎΠ±ΡŠΡΠ²Π»ΡΠ΅Ρ‚ΡΡ ΠΊΠ°ΠΊ функция доступа ΠΊ Π΄Π°Π½Π½Ρ‹ΠΌ-Ρ‡Π»Π΅Π½Π°ΠΌ класса Π±Π΅Π· ΠΏΡ€Π°Π²Π° ΠΈΡ… измСнСния, Π½Π° Ρ‡Ρ‚ΠΎ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ спСцификатор const. Однако Π² Ρ‚Π΅Π»Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ GetAge(), Π° ΠΈΠΌΠ΅Π½Π½ΠΎ Π² строкС 32, выполняСтся ΠΏΡ€ΠΈΡ€Π°Ρ‰Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ-Ρ‡Π»Π΅Π½Π° itsAge. А ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ этот ΠΌΠ΅Ρ‚ΠΎΠ΄ объявлСн ΠΊΠ°ΠΊ const, ΠΎΠ½ Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ ΠΏΡ€Π°Π²Π° ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ itsAge. Π‘Π»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, Π²ΠΎ врСмя компиляции ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π½Π° этой строкС Π±ΡƒΠ΄Π΅Ρ‚ зафиксирована ошибка.

Π’ строкС 13 ΠΎΠ±ΡŠΡΠ²Π»ΡΠ΅Ρ‚ΡΡ ΠΌΠ΅Ρ‚ΠΎΠ΄ Meow(), Π² этот Ρ€Π°Π· Π±Π΅Π· использования ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ³ΠΎ слова const. И хотя Ρ‚Π°ΠΊΠΎΠ΅ ΡƒΠΏΡƒΡ‰Π΅Π½ΠΈΠ΅ Π½Π΅ являСтся ошибкой, это Π΄Π°Π»Π΅ΠΊΠΎ Π½Π΅ Π»ΡƒΡ‡ΡˆΠΈΠΉ ΡΡ‚ΠΈΠ»ΡŒ программирования. Если ΡƒΡ‡Π΅ΡΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ этот ΠΌΠ΅Ρ‚ΠΎΠ΄ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ значСния ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…-Ρ‡Π»Π΅Π½ΠΎΠ² класса Cat, Ρ‚ΠΎ Π΅Π³ΠΎ слСдовало Π±Ρ‹ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ со спСцификатором const.