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

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

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

};

Класс Screen ΠΎΠ±ΡŠΡΠ²Π»ΡΠ΅Ρ‚ Π΄Ρ€ΡƒΠ³ΠΎΠΌ Π²Π΅Ρ€ΡΠΈΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ storeOn, ΠΏΠΎΠ»ΡƒΡ‡Π°ΡŽΡ‰Π΅ΠΉ ΠΏΠΎΡ‚ΠΎΠΊ ostream&. ВСрсия, ΠΏΠΎΠ»ΡƒΡ‡Π°ΡŽΡ‰Π°Ρ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ BitMap&, особых ΠΏΡ€Π°Π² доступа ΠΊ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌ класса Screen Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚.

ОбъявлСниС друТСствСнных ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠΉ ΠΈ ΠΎΠ±Π»Π°ΡΡ‚ΡŒ видимости

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

Π”Π°ΠΆΠ΅ Ссли ΠΌΡ‹ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ Π² классС, Π΅Π΅ всС Ρ€Π°Π²Π½ΠΎ придСтся ΠΎΠ±ΡŠΡΠ²ΠΈΡ‚ΡŒ Π·Π° ΠΏΡ€Π΅Π΄Π΅Π»Π°ΠΌΠΈ класса, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Π²ΠΈΠ΄ΠΈΠΌΠΎΠΉ. ОбъявлСниС Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΡƒΠΆΠ΅ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ, Π΄Π°ΠΆΠ΅ Ссли вызываСтся друТСствСнная функция:

struct X {

 friend void f() { /* друТСствСнная функция ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π°

                      Π² Ρ‚Π΅Π»Π΅ класса */ }

 X() { f(); } // ошибка: Π½Π΅Ρ‚ объявлСния для f

 void g();

 void h();

};

void X::g() { return f(); } // ошибка: f Π½Π΅ Π±Ρ‹Π»Π° объявлСна

void f();                   // ΠΎΠ±ΡŠΡΠ²Π»ΡΠ΅Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΡƒΡŽ Π² X

void X::h() { return f(); } // ok: объявлСниС f Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Π² области

                            // видимости

Π’Π°ΠΆΠ½ΠΎ ΠΏΠΎΠ½ΠΈΠΌΠ°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ объявлСниС друТСствСнной Π·Π°Ρ‚Ρ€Π°Π³ΠΈΠ²Π°Π΅Ρ‚ доступ, Π½ΠΎ Π½Π΅ являСтся объявлСниСм Π² ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠΌ смыслС.

ΠŸΠΎΠΌΠ½ΠΈΡ‚Π΅: Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ компиляторы Π½Π΅ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ ΠΏΡ€Π°Π²ΠΈΠ» поиска ΠΈΠΌΠ΅Π½ Π΄Ρ€ΡƒΠ·Π΅ΠΉ (см. Ρ€Π°Π·Π΄Π΅Π» 7.2.1).

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

Π£ΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ 7.32. ΠžΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚Π΅ собствСнныС вСрсии классов Screen ΠΈ Window_mgr, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… функция clear() являСтся Ρ‡Π»Π΅Π½ΠΎΠΌ класса Window_mgr ΠΈ Π΄Ρ€ΡƒΠ³ΠΎΠΌ класса Screen.

7.4. ΠžΠ±Π»Π°ΡΡ‚ΡŒ видимости класса

ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ класс опрСдСляСт ΡΠΎΠ±ΡΡ‚Π²Π΅Π½Π½ΡƒΡŽ ΠΎΠ±Π»Π°ΡΡ‚ΡŒ видимости. Π’Π½Π΅ области видимости класса (class scope) ΠΊ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΌ Π΄Π°Π½Π½Ρ‹ΠΌ ΠΈ функциям Π΅Π³ΠΎ Ρ‡Π»Π΅Π½Ρ‹ ΠΌΠΎΠ³ΡƒΡ‚ ΠΎΠ±Ρ€Π°Ρ‰Π°Ρ‚ΡŒΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‡Π΅Ρ€Π΅Π· ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, ссылку ΠΈΠ»ΠΈ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ доступа ΠΊ Ρ‡Π»Π΅Π½Ρƒ (см. Ρ€Π°Π·Π΄Π΅Π» 4.6). Для доступа ΠΊ Ρ‡Π»Π΅Π½Π°ΠΌ Ρ‚ΠΈΠΏΠ° ΠΈΠ· класса ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ области видимости. Π’ любом случаС ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅ Π·Π° ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠΌ имя Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ Ρ‡Π»Π΅Π½ΠΎΠΌ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ класса.

Screen::pos ht = 24, wd = 80; // использованиС Ρ‚ΠΈΠΏΠ° pos, ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ³ΠΎ

                              // Π² классС Screen

Screen scr(ht, wd, ' ');

Screen *p = &scr;

char c = scr.get(); // доступ ΠΊ Ρ‡Π»Π΅Π½Ρƒ get() ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°

scr c = p->get();   // доступ ΠΊ Ρ‡Π»Π΅Π½Ρƒ get() ΠΈΠ· ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ

                    // ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ p

ΠžΠ±Π»Π°ΡΡ‚ΡŒ видимости ΠΈ Ρ‡Π»Π΅Π½Ρ‹, ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Π΅ Π²Π½Π΅ класса

Π’ΠΎΡ‚ Ρ„Π°ΠΊΡ‚, Ρ‡Ρ‚ΠΎ класс опрСдСляСт ΠΎΠ±Π»Π°ΡΡ‚ΡŒ видимости, ΠΎΠ±ΡŠΡΡΠ½ΡΠ΅Ρ‚, ΠΏΠΎΡ‡Π΅ΠΌΡƒ слСдуСт ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ имя класса Π½Π°Ρ€Π°Π²Π½Π΅ с ΠΈΠΌΠ΅Π½Π΅ΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΏΡ€ΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ-Ρ‡Π»Π΅Π½Π° Π²Π½Π΅ Π΅Π΅ класса (см. Ρ€Π°Π·Π΄Π΅Π» 7.1.2). Π—Π° ΠΏΡ€Π΅Π΄Π΅Π»Π°ΠΌΠΈ класса ΠΈΠΌΠ΅Π½Π° Π΅Π΅ Ρ‡Π»Π΅Π½ΠΎΠ² скрыты.

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

ВСрнСмся, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΊ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ-Ρ‡Π»Π΅Π½Ρƒ clear() класса Window_mgr (см. Ρ€Π°Π·Π΄Π΅Π» 7.3.4). ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ этой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‚ΠΈΠΏ, ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΉ Π² классС Window_mgr:

void Window_mgr::clear(ScreenIndex i) {

 Screen &s = screens[i];

 s.contents = string(s.height * s.width, ' ');

}

ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ компилятор Π²ΠΈΠ΄ΠΈΡ‚ ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ список ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² ΠΈ Π½ΠΈΡ‡Π΅Π³ΠΎ ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎΠ³ΠΎ Π² области видимости класса WindowMgr, Π½Π΅Ρ‚ Π½ΠΈΠΊΠ°ΠΊΠΎΠΉ нСобходимости ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ трСбуСтся Ρ‚ΠΈΠΏ ScreenIndex, ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΉ Π² классС WindowMgr. По Ρ‚ΠΎΠΉ ΠΆΠ΅ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π΅ использованиС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° screens Π² Ρ‚Π΅Π»Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ относится ΠΊ ΠΈΠΌΠ΅Π½ΠΈ, ΠΎΠ±ΡŠΡΠ²Π»Π΅Π½Π½ΠΎΠΌΡƒ Π² классС Window_mgr.

Π‘ Π΄Ρ€ΡƒΠ³ΠΎΠΉ стороны, Ρ‚ΠΈΠΏ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ³ΠΎ значСния Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ располагаСтся ΠΏΠ΅Ρ€Π΅Π΄ ΠΈΠΌΠ΅Π½Π΅ΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. Когда функция-Ρ‡Π»Π΅Π½ опрСдСляСтся Π²Π½Π΅ Ρ‚Π΅Π»Π° класса, любоС имя, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠΎΠ΅ Π² Ρ‚ΠΈΠΏΠ΅ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ³ΠΎ значСния, находится Π²Π½Π΅ области видимости класса. Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ Ρ‚ΠΈΠΏ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ³ΠΎ значСния Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡ‚ΡŒ класс, Ρ‡Π»Π΅Π½ΠΎΠΌ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΠΎΠ½ являСтся. НапримСр, ΠΌΡ‹ ΠΌΠΎΠ³Π»ΠΈ Π±Ρ‹ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π² класс Window_mgr Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ addScreen(), Π΄ΠΎΠ±Π°Π²Π»ΡΡŽΡ‰ΡƒΡŽ Π΅Ρ‰Π΅ ΠΎΠ΄Π½ΠΎ ΠΎΠΊΠ½ΠΎ Π½Π° экран. Π­Ρ‚ΠΎΡ‚ Ρ‡Π»Π΅Π½ класса Π²ΠΎΠ·Π²Ρ€Π°Ρ‚ΠΈΡ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠ° ScreenIndex, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ впослСдствии смоТСт ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ для поиска этого ΠΎΠΊΠ½Π°:

class Window_mgr {

public:

 // Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΎΠΊΠ½ΠΎ Π½Π° экран ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ Π΅Π³ΠΎ индСкс

 ScreenIndex addScreen(const Screen&);

 // Π΄Ρ€ΡƒΠ³ΠΈΠ΅ Ρ‡Π»Π΅Π½Ρ‹, ΠΊΠ°ΠΊ ΠΏΡ€Π΅ΠΆΠ΄Π΅

};

// Ρ‚ΠΈΠΏ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ³ΠΎ значСния Π²ΠΈΠ΄ΠΈΠΌ ΠΏΡ€Π΅ΠΆΠ΄Π΅, Ρ‡Π΅ΠΌ начинаСтся ΠΎΠ±Π»Π°ΡΡ‚ΡŒ

// видимости класса Window_mgr

Window_mgr::ScreenIndex

Window_mgr::addScreen(const Screen &s) {

 screens.push_back(s);

 return screens.size() - 1;

}

ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Ρ‚ΠΈΠΏ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ³ΠΎ значСния встрСчаСтся ΠΏΡ€Π΅ΠΆΠ΄Π΅ ΠΈΠΌΠ΅Π½ΠΈ класса, ΠΎΠ½ΠΎ находится Π²Π½Π΅ области видимости класса Window_mgr. Π§Ρ‚ΠΎΠ±Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚ΠΈΠΏ ScreenIndex для Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ³ΠΎ значСния, слСдуСт ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ класс, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ опрСдСляСтся этот Ρ‚ΠΈΠΏ.

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

Π£ΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ 7.33. Π§Ρ‚ΠΎ Π±ΡƒΠ΄Π΅Ρ‚, Ссли Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π² класс Screen ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ-Ρ‡Π»Π΅Π½ size(), ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΡƒΡŽ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ? Π˜ΡΠΏΡ€Π°Π²ΡŒΡ‚Π΅ всС ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠ΅Π½Π½Ρ‹Π΅ ошибки.

pos Screen::size() const {

 return height * width;

}

7.4.1. Поиск ΠΈΠΌΠ΅Π½ Π² области видимости класса

Π’ рассмотрСнных Π΄ΠΎ сих ΠΏΠΎΡ€ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°Ρ… поиск ΠΈΠΌΠ΅Π½ (name lookup) (процСсс поиска объявлСния, ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ Π΄Π°Π½Π½ΠΎΠΌΡƒ ΠΈΠΌΠ΅Π½ΠΈ) Π±Ρ‹Π» ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ прост.

β€’ Π‘Π½Π°Ρ‡Π°Π»Π° поиск объявлСния осущСствляСтся Π² Ρ‚ΠΎΠΌ Π±Π»ΠΎΠΊΠ΅ ΠΊΠΎΠ΄Π°, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ имя. ΠŸΡ€ΠΈΡ‡Π΅ΠΌ Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°ΡŽΡ‚ΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‚Π΅ ΠΈΠΌΠ΅Π½Π°, объявлСния ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… располоТСны ΠΏΠ΅Ρ€Π΅Π΄ мСстом примСнСния.

β€’ Π•сли имя Π½Π΅ Π½Π°ΠΉΠ΄Π΅Π½ΠΎ, поиск продолТаСтся Π² ΠΈΠ΅Ρ€Π°Ρ€Ρ…ΠΈΠΈ областСй видимости, начиная с Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ.

β€’ Π•сли объявлСниС Ρ‚Π°ΠΊ ΠΈ Π½Π΅ Π½Π°ΠΉΠ΄Π΅Π½ΠΎ, происходит ошибка.

Когда поиск ΠΈΠΌΠ΅Π½ осущСствляСтся Π² функциях-Ρ‡Π»Π΅Π½Π°Ρ…, ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Ρ… Π² классС, ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ происходит Π½Π΅ ΠΏΠΎ ΠΏΡ€Π°Π²ΠΈΠ»Π°ΠΌ поиска. Но Π² Π΄Π°Π½Π½ΠΎΠΌ случаС внСшний Π²ΠΈΠ΄ ΠΎΠ±ΠΌΠ°Π½Ρ‡ΠΈΠ². ΠžΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠΉ классов осущСствляСтся Π² Π΄Π²Π° этапа.

β€’ Π‘Π½Π°Ρ‡Π°Π»Π° ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΡŽΡ‚ΡΡ объявлСния Ρ‡Π»Π΅Π½ΠΎΠ² класса.

β€’ Π’Π΅Π»Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΡŽΡ‚ΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ послС Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ Π²ΠΈΠ΄Π΅Π½ вСсь класс.

ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΡ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ-Ρ‡Π»Π΅Π½ΠΎΠ² ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°ΡŽΡ‚ΡΡ послС Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ компилятор ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ всС объявлСния Π² классС.

ΠšΠ»Π°ΡΡΡ‹ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°ΡŽΡ‚ΡΡ Π² Π΄Π²Π° этапа, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ±Π»Π΅Π³Ρ‡ΠΈΡ‚ΡŒ ΠΎΡ€Π³Π°Π½ΠΈΠ·Π°Ρ†ΠΈΡŽ ΠΊΠΎΠ΄Π° класса. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Ρ‚Π΅Π»Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ-Ρ‡Π»Π΅Π½ΠΎΠ² Π½Π΅ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°ΡŽΡ‚ΡΡ, ΠΏΠΎΠΊΠ° вСсь класс Π½Π΅ станСт Π²ΠΈΠ΄ΠΈΠΌΡ‹ΠΌ, ΠΎΠ½ΠΈ смогут ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ любоС имя, ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ΅ Π² классС. Если Π±Ρ‹ опрСдСлСния Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π»ΠΈΡΡŒ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ с объявлСниями ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…-Ρ‡Π»Π΅Π½ΠΎΠ², Ρ‚ΠΎ ΠΏΡ€ΠΈΡˆΠ»ΠΎΡΡŒ Π±Ρ‹ Ρ€Π°ΡΠΏΠΎΠ»Π°Π³Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ-Ρ‡Π»Π΅Π½Ρ‹ Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ½ΠΈ ΠΎΠ±Ρ€Π°Ρ‰Π°Π»ΠΈΡΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΊ Ρ‚Π΅ΠΌ ΠΈΠΌΠ΅Π½Π°ΠΌ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΡƒΠΆΠ΅ Π²ΠΈΠ΄ΠΈΠΌΡ‹.

Поиск ΠΈΠΌΠ΅Π½ для объявлСний Ρ‡Π»Π΅Π½ΠΎΠ² класса

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

typedef double Money;

string bal;

class Account {

public:

 Money balance() { return bal; }

private:

 Money bal;

 // ...

};

Когда компилятор Π²ΠΈΠ΄ΠΈΡ‚ объявлСниС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ balance(), ΠΎΠ½ ΠΈΡ‰Π΅Ρ‚ объявлСниС ΠΈΠΌΠ΅Π½ΠΈ Money Π² классС Account. ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ‚ΠΎΡ€ рассматриваСт Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‚Π΅ объявлСния Π² классС Account, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ располоТСны ΠΏΠ΅Ρ€Π΅Π΄ использованиСм ΠΈΠΌΠ΅Π½ΠΈ Money. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π΅Π³ΠΎ объявлСниС ΠΊΠ°ΠΊ Ρ‡Π»Π΅Π½Π° класса Π½Π΅ Π½Π°ΠΉΠ΄Π΅Π½ΠΎ, компилятор ΠΈΡ‰Π΅Ρ‚ имя Π² ΠΎΠΊΡ€ΡƒΠΆΠ°ΡŽΡ‰Π΅ΠΉ области видимости. Π’ этом ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ компилятор Π½Π°ΠΉΠ΄Π΅Ρ‚ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠ° (typedef) Money. Π­Ρ‚ΠΎΡ‚ Ρ‚ΠΈΠΏ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΈ для Ρ‚ΠΈΠΏΠ° Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ³ΠΎ значСния Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ balance(), ΠΈ ΠΊΠ°ΠΊ Ρ‚ΠΈΠΏ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ-Ρ‡Π»Π΅Π½Π° bal. Π‘ Π΄Ρ€ΡƒΠ³ΠΎΠΉ стороны, Ρ‚Π΅Π»ΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ balance() обрабатываСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ послС Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ Π²ΠΈΠ΄ΠΈΠΌΡ‹ΠΌ становится вСсь класс. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ return Π² этой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ-Ρ‡Π»Π΅Π½ ΠΏΠΎ ΠΈΠΌΠ΅Π½ΠΈ bal, Π° Π½Π΅ строку ΠΈΠ· внСшнСй области видимости.

ИмСна Ρ‚ΠΈΠΏΠΎΠ² ΠΈΠΌΠ΅ΡŽΡ‚ особСнности

ΠžΠ±Ρ‹Ρ‡Π½ΠΎ внутрСнняя ΠΎΠ±Π»Π°ΡΡ‚ΡŒ видимости ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ имя ΠΈΠ· внСшнСй области видимости, Π΄Π°ΠΆΠ΅ Ссли это имя ΡƒΠΆΠ΅ использовалось Π²ΠΎ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅ΠΉ области видимости. Но Ссли Ρ‡Π»Π΅Π½ класса ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ имя ΠΈΠ· внСшнСй области видимости ΠΈ это имя Ρ‚ΠΈΠΏΠ°, Ρ‚ΠΎ класс Π½Π΅ смоТСт впослСдствии ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ это имя: