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

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

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

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

typedef double Money;

class Account {

public:

 Money balance() { return bal; } // ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ имя Money ΠΈΠ· внСшнСй

                                 // ΠΎΠ±Π»Π°ΡΡ‚ΡŒ видимости

private:

 typedef double Money; // ошибка: нСльзя ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Money

 Money bal;

 // ...

};

Π‘Π»Π΅Π΄ΡƒΠ΅Ρ‚ Π·Π°ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ хотя ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠ° Money Π² классС Account ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Ρ‚ΠΎΡ‚ ΠΆΠ΅ Ρ‚ΠΈΠΏ, Ρ‡Ρ‚ΠΎ ΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π²ΠΎ внСшнСй области видимости, этот ΠΊΠΎΠ΄ всС ΠΆΠ΅ ΠΎΡˆΠΈΠ±ΠΎΡ‡Π΅Π½.

Π₯отя ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΈΠΌΠ΅Π½ΠΈ Ρ‚ΠΈΠΏΠ° являСтся ошибкой, Π½Π΅ всС компиляторы ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠ°Ρ‚ эту ΠΎΡˆΠΈΠ±ΠΊΡƒ. НСкоторыС спокойно ΠΏΡ€ΠΈΠΌΡƒΡ‚ Ρ‚Π°ΠΊΠΎΠΉ ΠΊΠΎΠ΄, Π΄Π°ΠΆΠ΅ Ссли ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° ΠΎΡˆΠΈΠ±ΠΎΡ‡Π½Π°.

ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΡ ΠΈΠΌΠ΅Π½ Ρ‚ΠΈΠΏΠΎΠ² ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ Ρ€Π°ΡΠΏΠΎΠ»Π°Π³Π°ΡŽΡ‚ΡΡ Π² Π½Π°Ρ‡Π°Π»Π΅ класса. Π’Π°ΠΊ, любой Ρ‡Π»Π΅Π½ класса, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ этот Ρ‚ΠΈΠΏ, Π±ΡƒΠ΄Π΅Ρ‚ располоТСн послС опрСдСлСния Π΅Π³ΠΎ ΠΈΠΌΠ΅Π½ΠΈ.

ΠŸΡ€ΠΈ поискС ΠΈΠΌΠ΅Π½ Π² областях видимости Ρ‡Π»Π΅Π½Ρ‹ класса ΡΠ»Π΅Π΄ΡƒΡŽΡ‚ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΌ ΠΏΡ€Π°Π²ΠΈΠ»Π°ΠΌ

Поиск ΠΈΠΌΠ΅Π½ΠΈ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠΎΠ³ΠΎ Π² Ρ‚Π΅Π»Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ-Ρ‡Π»Π΅Π½Π°, осущСствляСтся ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ.

β€’ Π‘Π½Π°Ρ‡Π°Π»Π° поиск объявлСния ΠΈΠΌΠ΅Π½ΠΈ осущСствляСтся Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ-Ρ‡Π»Π΅Π½Π΅. Как ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ, Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°ΡŽΡ‚ΡΡ объявлСния Π² Ρ‚Π΅Π»Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΡ€Π΅Π΄ΡˆΠ΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ мСсту использования ΠΈΠΌΠ΅Π½ΠΈ.

β€’ Π•сли Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ-Ρ‡Π»Π΅Π½Π΅ объявлСниС Π½Π΅ Π½Π°ΠΉΠ΄Π΅Π½ΠΎ, поиск продолТаСтся Π² классС. ΠŸΡ€ΠΎΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°ΡŽΡ‚ΡΡ всС Ρ‡Π»Π΅Π½Ρ‹ класса.

β€’ Π•сли объявлСниС ΠΈΠΌΠ΅Π½ΠΈ Π² классС Π½Π΅ Π½Π°ΠΉΠ΄Π΅Π½ΠΎ, поиск продолТится Π² области видимости ΠΏΠ΅Ρ€Π΅Π΄ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ-Ρ‡Π»Π΅Π½Π°.

ΠžΠ±Ρ‹Ρ‡Π½ΠΎ Π½Π΅ стоит ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ имя Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ Ρ‡Π»Π΅Π½Π° класса ΠΊΠ°ΠΊ имя ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ-Ρ‡Π»Π΅Π½Π΅. Но для дСмонстрации поиска ΠΈΠΌΠ΅Π½ΠΈ Π½Π°Ρ€ΡƒΡˆΠΈΠΌ это ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ dummy_fcn():

// ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅: это сугубо дСмонстрационный ΠΊΠΎΠ΄, ΠΎΡ‚Ρ€Π°ΠΆΠ°ΡŽΡ‰ΠΈΠΉ

// ΠΏΠ»ΠΎΡ…ΡƒΡŽ ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΡƒ программирования. ΠžΠ±Ρ‹Ρ‡Π½ΠΎ Π½Π΅ стоит ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ

// ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΠΎΠ΅ имя для ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ-Ρ‡Π»Π΅Π½Π°

int height; // опрСдСляСт имя, впослСдствии ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠΎΠ΅ Π² Screen

class Screen {

public:

 typedef std::string::size_type pos;

 void dummy_fcn(pos height) {

  cursor = width * height; // ΠΊΠ°ΠΊΠΎΠ΅ имя height имССтся Π² Π²ΠΈΠ΄Ρƒ?

 }

private:

 pos cursor = 0;

 pos height = 0, width = 0;

};

Когда компилятор ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ умноТСния Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ dummy_fcn(), ΠΎΠ½ ΠΈΡ‰Π΅Ρ‚ ΠΈΠΌΠ΅Π½Π° сначала Π² ΠΏΡ€Π΅Π΄Π΅Π»Π°Ρ… Π΄Π°Π½Π½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ находятся Π² области видимости Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, имя height, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠΎΠ΅ Π² Ρ‚Π΅Π»Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ dummy_fcn(), ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠΈΡ‚ Π΅Π΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρƒ.

Π’ Π΄Π°Π½Π½ΠΎΠΌ случаС имя height ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° скрываСт имя height ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ-Ρ‡Π»Π΅Π½Π° класса. Если Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹Π΅ ΠΏΡ€Π°Π²ΠΈΠ»Π° поиска, Ρ‚ΠΎ это ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Ρ‚Π°ΠΊ:

// ΠΏΠ»ΠΎΡ…ΠΎΠΉ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄: ΠΈΠΌΠ΅Π½Π°, Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹Π΅ для Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ-Ρ‡Π»Π΅Π½ΠΎΠ², Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹

// ΡΠΊΡ€Ρ‹Π²Π°Ρ‚ΡŒ ΠΈΠΌΠ΅Π½Π° ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…-Ρ‡Π»Π΅Π½ΠΎΠ² класса

void Screen::dummy_fcn(pos height) {

 cursor = width * this->height; // пСрСмСнная-Ρ‡Π»Π΅Π½ height

 // Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π½Ρ‹ΠΉ способ указания ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ-Ρ‡Π»Π΅Π½Π°

 cursor = width * Screen::height; // пСрСмСнная-Ρ‡Π»Π΅Π½ height

}

НСсмотря Π½Π° Ρ‚ΠΎ Ρ‡Ρ‚ΠΎ Ρ‡Π»Π΅Π½ класса скрыт, Π΅Π³ΠΎ всС Ρ€Π°Π²Π½ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ. Достаточно ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ Π΅Π³ΠΎ ΠΏΠΎΠ»Π½ΠΎΠ΅ имя, Π²ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‰Π΅Π΅ имя класса, Π»ΠΈΠ±ΠΎ явно ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ this.

Π—Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΏΡ€ΠΎΡ‰Π΅ ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΡ‚ΡŒ доступ ΠΊ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ-Ρ‡Π»Π΅Π½Ρƒ height, присвоив ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρƒ Π΄Ρ€ΡƒΠ³ΠΎΠ΅ имя:

// Ρ…ΠΎΡ€ΠΎΡˆΠΈΠΉ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄: Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ ΠΈΠΌΠ΅Π½Π° ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…-Ρ‡Π»Π΅Π½ΠΎΠ² для

// ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² ΠΈΠ»ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΡ… Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹Ρ… ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…

void Screen::dummy_fcn(pos ht) {

 cursor = width * height; // пСрСмСнная-Ρ‡Π»Π΅Π½ height

}

Π’Π΅ΠΏΠ΅Ρ€ΡŒ, ΠΊΠΎΠ³Π΄Π° компилятор Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡΠΊΠ°Ρ‚ΡŒ имя height, Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ dummy_fcn() ΠΎΠ½ Π΅Π³ΠΎ Π½Π΅ Π½Π°ΠΉΠ΄Π΅Ρ‚. Π—Π°Ρ‚Π΅ΠΌ компилятор просмотрит класс Screen. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ имя height ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ-Ρ‡Π»Π΅Π½Π΅ dummy_fcn(), компилятор просмотрит всС объявлСния Ρ‡Π»Π΅Π½ΠΎΠ² класса. НСсмотря Π½Π° Ρ‚ΠΎ Ρ‡Ρ‚ΠΎ объявлСниС ΠΈΠΌΠ΅Π½ΠΈ height располоТСно послС мСста Π΅Π³ΠΎ использования Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ dummy_fcn(), компилятор Ρ€Π΅ΡˆΠ°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ ΠΎΠ½ΠΎ относится ΠΊ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ-Ρ‡Π»Π΅Π½Ρƒ height.

ПослС поиска Π² области видимости класса продолТаСтся поиск Π² ΠΎΠΊΡ€ΡƒΠΆΠ°ΡŽΡ‰Π΅ΠΉ области видимости

Если компилятор Π½Π΅ Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ имя Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈΠ»ΠΈ Π² области видимости класса, ΠΎΠ½ ΠΈΡ‰Π΅Ρ‚ Π΅Π³ΠΎ Π² ΠΎΠΊΡ€ΡƒΠΆΠ°ΡŽΡ‰Π΅ΠΉ области видимости. Π’ Π΄Π°Π½Π½ΠΎΠΌ случаС имя height объявлСно Π²ΠΎ внСшнСй области видимости, ΠΏΠ΅Ρ€Π΅Π΄ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ΠΌ класса Screen. Однако ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Π²ΠΎ внСшнСй области видимости скрываСтся ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ-Ρ‡Π»Π΅Π½ΠΎΠΌ класса ΠΏΠΎ ΠΈΠΌΠ΅Π½ΠΈ height. Если Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ имя ΠΈΠ· внСшнСй области видимости, ΠΊ Π½Π΅ΠΌΡƒ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚ΡŒΡΡ явно, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ области видимости:

// ΠΏΠ»ΠΎΡ…ΠΎΠΉ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄: Π½Π΅ скрывайтС Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Π΅ ΠΈΠΌΠ΅Π½Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅

// ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Ρ‹ Π² ΠΎΠΊΡ€ΡƒΠΆΠ°ΡŽΡ‰ΠΈΡ… областях видимости

void Screen::dummy_fcn(pos height) {

 cursor = width * ::height; // ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ height? Π“Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹ΠΉ

}

НСсмотря Π½Π° Ρ‚ΠΎ Ρ‡Ρ‚ΠΎ Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Π±Ρ‹Π» скрыт, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ области видимости, доступ ΠΊ Π½Π΅ΠΌΡƒ Π²ΠΏΠΎΠ»Π½Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ.

Поиск ΠΈΠΌΠ΅Π½ распространяСтся ΠΏΠΎ всСму Ρ„Π°ΠΉΠ»Ρƒ, Π³Π΄Π΅ ΠΎΠ½ΠΈ Π±Ρ‹Π»ΠΈ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½Ρ‹

Когда Ρ‡Π»Π΅Π½ класса ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ Π²Π½Π΅ опрСдСлСния класса, Ρ‚Ρ€Π΅Ρ‚ΠΈΠΉ этап поиска Π΅Π³ΠΎ ΠΈΠΌΠ΅Π½ΠΈ происходит Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² ΠΎΠ±ΡŠΡΠ²Π»Π΅Π½ΠΈΡΡ… глобальной области видимости, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ располоТСны нСпосрСдствСнно ΠΏΠ΅Ρ€Π΅Π΄ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ΠΌ класса Screen, Π½ΠΎ ΠΈ распространяСтся Π½Π° ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Π΅ объявлСния Π² глобальной области видимости. Рассмотрим ΠΏΡ€ΠΈΠΌΠ΅Ρ€.

int height; // опрСдСляСт имя, впослСдствии ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠΎΠ΅ Π² Screen

class Screen {

public:

 typedef std::string::size_type pos;

 void setHeight(pos);

 pos height = 0; // скрываСт объявлСниС height ΠΈΠ· внСшнСй

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

};


Screen::pos verify(Screen::pos);

void Screen::setHeight(pos var) {

 // var: относится ΠΊ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρƒ

 // height: относится ΠΊ Ρ‡Π»Π΅Π½Ρƒ класса

 // verify: относится ΠΊ глобальной Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ

 height = verify(var);

}

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ объявлСниС глобальной Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ verify() Π½Π΅ Π²ΠΈΠ΄ΠΈΠΌΠΎ ΠΏΠ΅Ρ€Π΅Π΄ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ΠΌ класса Screen. Но Ρ‚Ρ€Π΅Ρ‚ΠΈΠΉ этап поиска ΠΈΠΌΠ΅Π½ΠΈ Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ ΠΎΠ±Π»Π°ΡΡ‚ΡŒ видимости, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ присутствуСт ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Ρ‡Π»Π΅Π½Π° класса. Π’ Π΄Π°Π½Π½ΠΎΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ объявлСниС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ verify() располоТСно ΠΏΠ΅Ρ€Π΅Π΄ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ setHeight(), a ΠΏΠΎΡ‚ΠΎΠΌΡƒ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ.

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

Π£ΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ 7.34. Π§Ρ‚ΠΎ ΠΏΡ€ΠΎΠΈΠ·ΠΎΠΉΠ΄Π΅Ρ‚, Ссли ΠΏΠΎΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠ° pos Π² послСднюю строку класса Screen?

Π£ΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ 7.35. ΠžΠ±ΡŠΡΡΠ½ΠΈΡ‚Π΅ ΠΊΠΎΠ΄, ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹ΠΉ Π½ΠΈΠΆΠ΅. Π£ΠΊΠ°ΠΆΠΈΡ‚Π΅, ΠΊΠ°ΠΊΠΎΠ΅ ΠΈΠ· ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠΉ, Type ΠΈΠ»ΠΈ initVal, Π±ΡƒΠ΄Π΅Ρ‚ использовано для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΈΠ· ΠΈΠΌΠ΅Π½. Если здСсь Π΅ΡΡ‚ΡŒ ошибки, Π½Π°ΠΉΠ΄ΠΈΡ‚Π΅ ΠΈ ΠΈΡΠΏΡ€Π°Π²ΡŒΡ‚Π΅ ΠΈΡ….

typedef string Type;

Type initVal();

class Exercise {

public:

 typedef double Type;

 Type setVal(Type);

 Type initVal();

private:

 int val;

};

Type Exercise::setVal(Type parm) {

 val = parm + initVal();

 return val;

}

7.5. Π‘Π½ΠΎΠ²Π° ΠΎ конструкторах

ΠšΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ‚ΠΎΡ€Ρ‹ β€” ΠΊΠ»ΡŽΡ‡Π΅Π²Π°Ρ Ρ‡Π°ΡΡ‚ΡŒ любого класса Π‘++. ΠžΡΠ½ΠΎΠ²Ρ‹ конструкторов Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Π»ΠΈΡΡŒ Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ 7.1.4, Π° Π² этом Ρ€Π°Π·Π΄Π΅Π»Π΅ описаны Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΠ· Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… возмоТностСй конструкторов ΠΈ подробности ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π»Π°, ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠ³ΠΎ Ρ€Π°Π½Π΅Π΅.

7.5.1. Бписок ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ конструктора

Когда ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ΡΡ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅, ΠΎΠ½ΠΈ, ΠΊΠ°ΠΊ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ, ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΡŽΡ‚ΡΡ сразу, Π° Π½Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ΡΡ ΠΈ ΠΏΡ€ΠΈΡΠ²Π°ΠΈΠ²Π°ΡŽΡ‚ΡΡ впослСдствии:

string foo = "Hello World!"; // ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ ΠΈ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ

string bar;           // инициализация ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ пустой строкой

bar = "Hello World!"; // присвоСниС Π½ΠΎΠ²ΠΎΠ³ΠΎ значСния ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ bar

АналогичноС Ρ€Π°Π·Π»ΠΈΡ‡ΠΈΠ΅ ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠ΅ΠΉ ΠΈ присвоСниСм относится ΠΊ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌ-Ρ‡Π»Π΅Π½Π°ΠΌ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ². Если Π½Π΅ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ-Ρ‡Π»Π΅Π½ явно Π² спискС ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ конструктора, ΠΎΠ½Π° инициализируСтся Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΠΏΡ€Π΅ΠΆΠ΄Π΅, Ρ‡Π΅ΠΌ выполнится Ρ‚Π΅Π»ΠΎ конструктора. НапримСр:

// допустимый, Π½ΠΎ Π½Π΅ самый Π»ΡƒΡ‡ΡˆΠΈΠΉ способ создания конструктора