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

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

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

Record lookup(Phone);

Record lookup(const Phone);  // ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎ ΠΎΠ±ΡŠΡΠ²Π»ΡΠ΅Ρ‚ Record lookup(Phone)

Record lookup(Phone*);

Record lookup(Phone* const); // ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎ ΠΎΠ±ΡŠΡΠ²Π»ΡΠ΅Ρ‚

                             // Record lookup(Phone*)

Π—Π΄Π΅ΡΡŒ Π²Ρ‚ΠΎΡ€Ρ‹Π΅ объявлСния ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎ ΠΎΠ±ΡŠΡΠ²Π»ΡΠ΅Ρ‚ Ρ‚Ρƒ ΠΆΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, Ρ‡Ρ‚ΠΎ ΠΈ ΠΏΠ΅Ρ€Π²Ρ‹Π΅. Π‘ Π΄Ρ€ΡƒΠ³ΠΎΠΉ стороны, Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅Π³Ρ€ΡƒΠ·ΠΈΡ‚ΡŒ Π½Π° основании Ρ‚ΠΎΠ³ΠΎ, являСтся Π»ΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ ссылкой (ΠΈΠ»ΠΈ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΌ) Π½Π° ΠΊΠΎΠ½ΡΡ‚Π°Π½Ρ‚Π½ΡƒΡŽ ΠΈΠ»ΠΈ Π½Π΅ΠΊΠΎΠ½ΡΡ‚Π°Π½Ρ‚Π½ΡƒΡŽ Π²Π΅Ρ€ΡΠΈΡŽ Ρ‚ΠΎΠ³ΠΎ ΠΆΠ΅ Ρ‚ΠΈΠΏΠ°; Ρ€Π΅Ρ‡ΡŒ ΠΈΠ΄Π΅Ρ‚ ΠΎ спСцификаторС const Π½ΠΈΠΆΠ½Π΅Π³ΠΎ уровня:

// Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΏΠΎΠ»ΡƒΡ‡Π°ΡŽΡ‰ΠΈΠ΅ ΠΊΠΎΠ½ΡΡ‚Π°Π½Ρ‚Π½ΡƒΡŽ ΠΈ Π½Π΅ΠΊΠΎΠ½ΡΡ‚Π°Π½Ρ‚Π½ΡƒΡŽ ссылку (ΠΈΠ»ΠΈ

// ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ), ΠΈΠΌΠ΅ΡŽΡ‚ Ρ€Π°Π·Π½Ρ‹Π΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹

Record lookup(Account&);       // функция ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ ссылку Π½Π° Account

Record lookup(const Account&); // новая функция ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ ΠΊΠΎΠ½ΡΡ‚Π°Π½Ρ‚Π½ΡƒΡŽ

                               // ссылку

Record lookup(Account*);       // новая функция ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ

                               // Π½Π° Account

Record lookup(const Account*); // новая функция ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π°

                               // константу

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

Π‘ΠΎΠ²Π΅Ρ‚. Когда Π½Π΅ слСдуСт ΠΏΠ΅Ρ€Π΅Π³Ρ€ΡƒΠΆΠ°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ

Π₯отя ΠΏΠ΅Ρ€Π΅Π³Ρ€ΡƒΠ·ΠΊΠ° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ позволяСт ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ нСобходимости ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ ΠΈ Π·Π°ΠΏΠΎΠΌΠΈΠ½Π°Ρ‚ΡŒ ΠΈΠΌΠ΅Π½Π° общСпринятых ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ, ΠΎΠ½Π° Π½Π΅ всСгда цСлСсообразна. Π’ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… случаях Ρ€Π°Π·Π½Ρ‹Π΅ ΠΈΠΌΠ΅Π½Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‚ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ, которая ΡƒΠΏΡ€ΠΎΡ‰Π°Π΅Ρ‚ ΠΏΠΎΠ½ΠΈΠΌΠ°Π½ΠΈΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. Π”Π°Π²Π°ΠΉΡ‚Π΅ рассмотрим Π½Π°Π±ΠΎΡ€ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ-Ρ‡Π»Π΅Π½ΠΎΠ² класса Screen, ΠΎΡ‚Π²Π΅Ρ‡Π°ΡŽΡ‰ΠΈΡ… Π·Π° ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠ΅ курсора.

Screen& moveHome();

Screen& moveAbs(int, int);

Screen& moveRel(int, int, string direction);

На ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ взгляд ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ, Ρ‡Ρ‚ΠΎ этот Π½Π°Π±ΠΎΡ€ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΈΠΌΠ΅Π΅Ρ‚ смысл ΠΏΠ΅Ρ€Π΅Π³Ρ€ΡƒΠ·ΠΈΡ‚ΡŒ ΠΏΠΎΠ΄ ΠΈΠΌΠ΅Π½Π΅ΠΌ move:

Screen& move();

Screen& move(int, int);

Screen& move(int, int, string direction);

Однако ΠΏΡ€ΠΈ ΠΏΠ΅Ρ€Π΅Π³Ρ€ΡƒΠ·ΠΊΠ΅ этих Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΌΡ‹ потСряли ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ, которая Π±Ρ‹Π»Π° унаслСдована ΠΈΠΌΠ΅Π½Π°ΠΌΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. Π₯отя ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠ΅ курсора β€” это общая опСрация, совмСстно ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠ°Ρ всСми этими функциями, спСцифичСский Ρ…Π°Ρ€Π°ΠΊΡ‚Π΅Ρ€ пСрСмСщСния ΡƒΠ½ΠΈΠΊΠ°Π»Π΅Π½ для ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΈΠ· этих Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ. Рассмотрим, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ moveHome(), ΠΎΡΡƒΡ‰Π΅ΡΡ‚Π²Π»ΡΡŽΡ‰ΡƒΡŽ Π²ΠΏΠΎΠ»Π½Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠ΅ курсора. КакоС ΠΈΠ· Π΄Π²ΡƒΡ… ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹Ρ… Π½ΠΈΠΆΠ΅ ΠΎΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠΉ понятнСС ΠΏΡ€ΠΈ Ρ‡Ρ‚Π΅Π½ΠΈΠΈ ΠΊΠΎΠ΄Π°?

// которая ΠΈΠ· записСй понятнСй?

myScreen.moveHome(); // вСроятно, эта!

myScreen.move();

ΠžΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ const_cast ΠΈ ΠΏΠ΅Ρ€Π΅Π³Ρ€ΡƒΠ·ΠΊΠ°

Π’ Ρ€Π°Π·Π΄Π΅Π»Π΅ 4.11.3 ΡƒΠΏΠΎΠΌΠΈΠ½Π°Π»ΠΎΡΡŒ, Ρ‡Ρ‚ΠΎ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ const_cast особСнно ΠΏΠΎΠ»Π΅Π·Π΅Π½ Π² контСкстС ΠΏΠ΅Ρ€Π΅Π³Ρ€ΡƒΠΆΠ΅Π½Π½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ. Π’ качСствС ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° вСрнСмся ΠΊ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ shorterString() ΠΈΠ· Ρ€Π°Π·Π΄Π΅Π»Π° 6.3.2:

// Π²ΠΎΠ·Π²Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ ссылку Π½Π° строку, которая ΠΊΠΎΡ€ΠΎΡ‡Π΅

const string &shorterString (const string &s1, const string &s2) {

 return s1.size() <= s2.size() ? s1 : s2;

}

Π­Ρ‚Π° функция ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ссылки Π½Π° ΠΊΠΎΠ½ΡΡ‚Π°Π½Ρ‚Π½ΡƒΡŽ строку. ΠœΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ с двумя нСконстантными строковыми Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°ΠΌΠΈ, Π½ΠΎ ΠΊΠ°ΠΊ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ ссылку Π½Π° ΠΊΠΎΠ½ΡΡ‚Π°Π½Ρ‚Π½ΡƒΡŽ строку. Могла Π±Ρ‹ ΠΏΠΎΠ½Π°Π΄ΠΎΠ±ΠΈΡ‚ΡŒΡΡ вСрсия Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ shorterString(), которая, ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ² нСконстантныС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹, Π²ΠΎΠ·Π²Ρ€Π°Ρ‚ΠΈΡ‚ ΠΎΠ±Ρ‹Ρ‡Π½ΡƒΡŽ ссылку. ΠœΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ эту Π²Π΅Ρ€ΡΠΈΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ const_cast:

string &shorterString(string &s1, string &s2) {

 auto &r = shorterString(const_cast<const string&>(s1),

                         const_cast<const string&>(s2));

 return const_cast<string&>(r);

}

Π­Ρ‚Π° вСрсия Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ ΠΊΠΎΠ½ΡΡ‚Π°Π½Ρ‚Π½ΡƒΡŽ Π²Π΅Ρ€ΡΠΈΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ shorterString() ΠΏΡ€ΠΈ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ΠΈΠΈ Ρ‚ΠΈΠΏΠΎΠ² Π΅Π΅ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² ΠΊ ссылкам Π½Π° константу. Ѐункция Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ссылку Π½Π° Ρ‚ΠΈΠΏ const string, которая, ΠΊΠ°ΠΊ извСстно, привязана ΠΊ ΠΎΠ΄Π½ΠΎΠΌΡƒ ΠΈΠ· исходных, нСконстантных Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ². Π‘Π»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ этой строки Π½Π°Π·Π°Π΄ ΠΊ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠΉ ссылкС string& ΠΏΡ€ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π΅Π½ΠΈΠΈ Π²ΠΏΠΎΠ»Π½Π΅ бСзопасно.

Π’Ρ‹Π·ΠΎΠ² ΠΏΠ΅Ρ€Π΅Π³Ρ€ΡƒΠΆΠ΅Π½Π½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ

Когда Π½Π°Π±ΠΎΡ€ ΠΏΠ΅Ρ€Π΅Π³Ρ€ΡƒΠΆΠ΅Π½Π½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠ° Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ ΠΈΡ… с ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΌΠΈ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°ΠΌΠΈ. ΠŸΠΎΠ΄Π±ΠΎΡ€ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ (function matching), извСстный Ρ‚Π°ΠΊΠΆΠ΅ ΠΊΠ°ΠΊ поиск ΠΏΠ΅Ρ€Π΅Π³Ρ€ΡƒΠΆΠ΅Π½Π½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ (overload resolution), β€” это процСсс, Π² Ρ…ΠΎΠ΄Π΅ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Π²Ρ‹Π·ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ассоциируСтся с ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠΉ вСрсиСй ΠΈΠ· Π½Π°Π±ΠΎΡ€Π° ΠΏΠ΅Ρ€Π΅Π³Ρ€ΡƒΠΆΠ΅Π½Π½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ. ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ‚ΠΎΡ€ опрСдСляСт, ΠΊΠ°ΠΊΡƒΡŽ ΠΈΠΌΠ΅Π½Π½ΠΎ Π²Π΅Ρ€ΡΠΈΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅, сравнивая Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ Π²Ρ‹Π·ΠΎΠ²Π° с ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°ΠΌΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π² Π½Π°Π±ΠΎΡ€Π΅.

Как ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ, вовсС нСслоТно Π²Ρ‹ΡΡΠ½ΠΈΡ‚ΡŒ, допустим Π»ΠΈ Π²Ρ‹Π·ΠΎΠ², ΠΈ Ссли ΠΎΠ½ допустим, Ρ‚ΠΎ какая ΠΈΠ· вСрсий Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π±ΡƒΠ΄Π΅Ρ‚ использована компилятором. Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π² Π½Π°Π±ΠΎΡ€Π΅ ΠΏΠ΅Ρ€Π΅Π³Ρ€ΡƒΠΆΠ΅Π½Π½Ρ‹Ρ… вСрсий ΠΎΡ‚Π»ΠΈΡ‡Π°ΡŽΡ‚ΡΡ количСством ΠΈΠ»ΠΈ Ρ‚ΠΈΠΏΠΎΠΌ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ². Π’ Ρ‚Π°ΠΊΠΈΡ… случаях ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ просто. ΠŸΠΎΠ΄Π±ΠΎΡ€ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ услоТняСтся Π² случаС, ΠΊΠΎΠ³Π΄Π° количСство ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΠΎ ΠΈ ΠΎΠ½ΠΈ Π΄ΠΎΠΏΡƒΡΠΊΠ°ΡŽΡ‚ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ (см. Ρ€Π°Π·Π΄Π΅Π» 4.11) ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Π½Ρ‹Ρ… Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ². РаспознаваниС Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² компилятором ΠΏΡ€ΠΈ Π½Π°Π»ΠΈΡ‡ΠΈΠΈ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠΉ рассматриваСтся Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ 6.6, Π° ΠΏΠΎΠΊΠ° слСдуСт ΠΏΠΎΠ½ΡΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈ любом Π²Ρ‹Π·ΠΎΠ²Π΅ ΠΏΠ΅Ρ€Π΅Π³Ρ€ΡƒΠΆΠ΅Π½Π½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π²ΠΎΠ·ΠΌΠΎΠΆΠ΅Π½ ΠΎΠ΄ΠΈΠ½ ΠΈΠ· Ρ‚Ρ€Π΅Ρ… Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ².

β€’ ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ‚ΠΎΡ€ Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ ΠΎΠ΄Π½Ρƒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, которая являСтся Π½Π°ΠΈΠ»ΡƒΡ‡ΡˆΠΈΠΌ соотвСтствиСм (best match) для фактичСских Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ², ΠΈ создаСт ΠΊΠΎΠ΄ Π΅Π΅ Π²Ρ‹Π·ΠΎΠ²Π°.

β€’ ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ‚ΠΎΡ€ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π½Π°ΠΉΡ‚ΠΈ Π½ΠΈ ΠΎΠ΄Π½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‚ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°ΠΌ Π²Ρ‹Π·ΠΎΠ²Π°. Π’ этом случаС компилятор сообщаСт ΠΎΠ± ошибкС отсутствия соотвСтствия (no match).

β€’ ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ‚ΠΎΡ€ Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ нСсколько Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π² ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠ΅ подходят, Π½ΠΎ Π½ΠΈ ΠΎΠ΄Π½Π° ΠΈΠ· Π½ΠΈΡ… Π½Π΅ соотвСтствуСт ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ. Π’ этом случаС компилятор Ρ‚Π°ΠΊΠΆΠ΅ сообщаСт ΠΎΠ± ошибкС, ΠΎΠ± ошибкС нСоднозначности Π²Ρ‹Π·ΠΎΠ²Π° (ambiguous call).

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

Π£ΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ 6.39. ΠžΠ±ΡŠΡΡΠ½ΠΈΡ‚Π΅ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Π²Ρ‚ΠΎΡ€ΠΎΠ³ΠΎ объявлСния Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΠΈΠ· ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… Π½Π°Π±ΠΎΡ€ΠΎΠ². Π£ΠΊΠ°ΠΆΠΈΡ‚Π΅, ΠΊΠ°ΠΊΠΎΠ΅ ΠΈΠ· Π½ΠΈΡ… (Ссли Π΅ΡΡ‚ΡŒ) нСдопустимо.

(a) int calc(int, int);

    int calc(const int, const int);

(b) int get();

    double get();

(c) int *reset(int *);

    double *reset(double *);

6.4.1. ΠŸΠ΅Ρ€Π΅Π³Ρ€ΡƒΠ·ΠΊΠ° ΠΈ ΠΎΠ±Π»Π°ΡΡ‚ΡŒ видимости

ΠžΠ±Ρ‹Ρ‡Π½ΠΎ ΠΎΠ±ΡŠΡΠ²Π»ΡΡ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ локально Π½Π΅ΠΆΠ΅Π»Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ. Но Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ±ΡŠΡΡΠ½ΠΈΡ‚ΡŒ, ΠΊΠ°ΠΊ ΠΎΠ±Π»Π°ΡΡ‚ΡŒ видимости взаимодСйствуСт с ΠΏΠ΅Ρ€Π΅Π³Ρ€ΡƒΠ·ΠΊΠΎΠΉ, ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ Π½Π°Ρ€ΡƒΡˆΠ°Ρ‚ΡŒ это ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹Π΅ объявлСниС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ.

Новички Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ Π½Π° языкС Π‘++ Π·Π°Ρ‡Π°ΡΡ‚ΡƒΡŽ Π½Π΅ ΠΏΠΎΠ½ΠΈΠΌΠ°ΡŽΡ‚ взаимодСйствия ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΎΠ±Π»Π°ΡΡ‚ΡŒΡŽ видимости ΠΈ ΠΏΠ΅Ρ€Π΅Π³Ρ€ΡƒΠ·ΠΊΠΎΠΉ. Однако Ρƒ ΠΏΠ΅Ρ€Π΅Π³Ρ€ΡƒΠ·ΠΊΠΈ Π½Π΅Ρ‚ Π½ΠΈΠΊΠ°ΠΊΠΈΡ… ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Ρ… свойств ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ области видимости. Как ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ, Ссли имя объявлСно Π²ΠΎ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅ΠΉ области видимости, ΠΎΠ½ΠΎ скрываСт (hidden name) Ρ‚Π°ΠΊΠΎΠ΅ ΠΆΠ΅ имя, объявлСнноС Π²ΠΎ внСшнСй области видимости. ИмСна Π½Π΅ ΠΏΠ΅Ρ€Π΅Π³Ρ€ΡƒΠΆΠ°ΡŽΡ‚ Π² областях видимости:

string read();

void print(const string &);

void print(double); // ΠΏΠ΅Ρ€Π΅Π³Ρ€ΡƒΠΆΠ°Π΅Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ print

void fooBar(int ival) {

 bool read = false; // новая ΠΎΠ±Π»Π°ΡΡ‚ΡŒ видимости: скрываСт

                    // ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅Π΅ объявлСниС ΠΈΠΌΠ΅Π½ΠΈ read

 string s = read(); // ошибка: read - пСрСмСнная Ρ‚ΠΈΠΏΠ° bool, Π° Π½Π΅

                    // функция

 // ΠΏΠ»ΠΎΡ…ΠΎΠΉ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄: ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ Π½Π΅ слСдуСт ΠΎΠ±ΡŠΡΠ²Π»ΡΡ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π² локальной

 // области видимости

 void print(int);  // новая ΠΎΠ±Π»Π°ΡΡ‚ΡŒ видимости: скрываСт ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΠ΅

                   // экзСмпляры Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ print

 print("Value: "); // ошибка: print(const string &) скрыта

 print(ival);      // ok: print (int) Π²ΠΈΠ΄ΠΈΠΌΠ°

 print(3.14);      // ok: Π²Ρ‹Π·ΠΎΠ² print(int); print(double) скрыта

}

Π‘ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ Ρ‡ΠΈΡ‚Π°Ρ‚Π΅Π»Π΅ΠΉ Π½Π΅ ΡƒΠ΄ΠΈΠ²ΠΈΡ‚ ошибка ΠΏΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ read(). Когда компилятор ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ Π²Ρ‹Π·ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ read(), ΠΎΠ½ Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ локальноС ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΈΠΌΠ΅Π½ΠΈ read. Π­Ρ‚ΠΎ имя ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠΈΡ‚ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ Ρ‚ΠΈΠΏΠ° bool, Π° Π½Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. Π‘Π»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, Π²Ρ‹Π·ΠΎΠ² Π½Π΅ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π΅Π½.

Π’ΠΎΡ‡Π½ΠΎ Ρ‚ΠΎΡ‚ ΠΆΠ΅ процСсс ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΏΡ€ΠΈ распознавании Π²Ρ‹Π·ΠΎΠ²Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ print(). ОбъявлСниС print(int) Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ fooBar скрываСт ΠΏΡ€Π΅ΠΆΠ½Π΅Π΅ Π΅Π΅ объявлСниС. Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ Π±ΡƒΠ΄Π΅Ρ‚ доступна Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄Π½Π° функция print(), Ρ‚Π°, которая ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ ΠΎΠ΄ΠΈΠ½ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ Ρ‚ΠΈΠΏΠ° int.