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

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

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

namespace A {

 int i;

 int k;

 class C1 {

 public:

  C1(): i(0), j(0) { }   // ok: ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅Ρ‚ C1::i ΠΈ C1::j

  int f1() { return k; } // Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ A::k

  int f2() { return h; } // ошибка: h Π½Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π°

  int f3();

 private:

  int i; // скрываСт A::i Π² C1

  int j;

 };

 int h = i; // инициализируСтся Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ A::i

}

// Ρ‡Π»Π΅Π½ f3() ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ Π²Π½Π΅ класса C1 ΠΈ Π²Π½Π΅ пространства ΠΈΠΌΠ΅Π½ A

int A::C1::f3() { return h; } // ok: Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ A::h

Π—Π° ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ-Ρ‡Π»Π΅Π½ΠΎΠ², располоТСнных Π² Ρ‚Π΅Π»Π΅ класса (см. Ρ€Π°Π·Π΄Π΅Π» 7.4.1), области видимости всСгда ΠΏΡ€ΠΎΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°ΡŽΡ‚ΡΡ снизу Π²Π²Π΅Ρ€Ρ…: имя Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ объявлСно ΠΏΡ€Π΅ΠΆΠ΄Π΅ Π΅Π³ΠΎ примСнСния. Π‘Π»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ return Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ f2() Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΡ‚ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Π½. Он попытаСтся ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚ΡŒΡΡ ΠΊ ΠΈΠΌΠ΅Π½ΠΈ h ΠΈΠ· пространства ΠΈΠΌΠ΅Π½ А, Π½ΠΎ Ρ‚Π°ΠΌ ΠΎΠ½ΠΎ Π΅Ρ‰Π΅ Π½Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΎ. Если Π±Ρ‹ это имя h Π±Ρ‹Π»ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΎ Π² пространствС ΠΈΠΌΠ΅Π½ А ΠΏΡ€Π΅ΠΆΠ΄Π΅ опрСдСлСния класса C1, Π΅Π³ΠΎ использованиС Π±Ρ‹Π»ΠΎ Π±Ρ‹ Π²ΠΏΠΎΠ»Π½Π΅ допустимо. Аналогично использованиС ΠΈΠΌΠ΅Π½ΠΈ h Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ f3() Π²ΠΏΠΎΠ»Π½Π΅ допустимо, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ функция f3() ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π° ΡƒΠΆΠ΅ послС опрСдСлСния А::h.

ΠŸΠΎΡ€ΡΠ΄ΠΎΠΊ просмотра областСй видимости ΠΏΡ€ΠΈ поискС ΠΈΠΌΠ΅Π½ΠΈ опрСдСляСтся ΠΏΠΎ ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ ΠΊΠ²Π°Π»ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠΌΡƒ ΠΈΠΌΠ΅Π½ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. ΠŸΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ ΠΊΠ²Π°Π»ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ΅ имя ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π² ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠΌ порядкС области видимости, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… происходит поиск.

Π‘ΠΏΠ΅Ρ†ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Ρ‹ A::C1::f3() ΡƒΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‚ ΠΎΠ±Ρ€Π°Ρ‚Π½Ρ‹ΠΉ порядок, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΏΡ€ΠΎΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°ΡŽΡ‚ΡΡ области видимости класса ΠΈ пространств ΠΈΠΌΠ΅Π½. ΠŸΠ΅Ρ€Π²Π°Ρ ΠΎΠ±Π»Π°ΡΡ‚ΡŒ видимости β€” это функция f3(). Π”Π°Π»Π΅Π΅ слСдуСт ΠΎΠ±Π»Π°ΡΡ‚ΡŒ видимости Π΅Π΅ класса C1. ΠžΠ±Π»Π°ΡΡ‚ΡŒ видимости пространства ΠΈΠΌΠ΅Π½ А просматриваСтся Π² послСднюю ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ, ΠΏΠ΅Ρ€Π΅Π΄ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΎΠΌ ΠΊ области видимости, содСрТащСй ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ f3().

Зависимый ΠΎΡ‚ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° поиск ΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ Ρ‚ΠΈΠΏΠ° класса

Рассмотрим ΠΏΡ€ΠΎΡΡ‚ΡƒΡŽ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ:

std::string s;

std::cin >> s;

Как извСстно, этот Π²Ρ‹Π·ΠΎΠ² эквивалСнтСн ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌΡƒ (см. Ρ€Π°Π·Π΄Π΅Π» 14.1):

operator>>(std::cin, s);

Ѐункция operator>> ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π° Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΎΠΉ string, которая Π² свою ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ опрСдСляСтся Π² пространствС ΠΈΠΌΠ΅Π½ std. Но всС ΠΆΠ΅ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ >> ΠΌΠΎΠΆΠ½ΠΎ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ Π±Π΅Π· спСцификатора std:: ΠΈ Π±Π΅Π· объявлСния using.

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

Π’ этом ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅, ΠΊΠΎΠ³Π΄Π° компилятор встрСчаСт "Π²Ρ‹Π·ΠΎΠ²" ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° operator>>, ΠΎΠ½ ΠΈΡ‰Π΅Ρ‚ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ Π² Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ области видимости, Π²ΠΊΠ»ΡŽΡ‡Π°Ρ области видимости, ΠΎΠΊΡ€ΡƒΠΆΠ°ΡŽΡ‰ΠΈΠ΅ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ Π²Ρ‹Π²ΠΎΠ΄Π°. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Π²Ρ‹Π²ΠΎΠ΄Π° ΠΈΠΌΠ΅Π΅Ρ‚ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ Ρ‚ΠΈΠΏΠ° класса, компилятор ΠΈΡ‰Π΅Ρ‚ Ρ‚Π°ΠΊΠΆΠ΅ Π² пространствах ΠΈΠΌΠ΅Π½, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ΡΡ Ρ‚ΠΈΠΏΡ‹ cin ΠΈ s. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, для этого Π²Ρ‹Π·ΠΎΠ²Π° компилятор просмотрит пространство ΠΈΠΌΠ΅Π½ std, ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‰Π΅Π΅ Ρ‚ΠΈΠΏΡ‹ istream ΠΈ string. ΠŸΡ€ΠΈ поискС Π² пространствС ΠΈΠΌΠ΅Π½ std компилятор Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ Π²Ρ‹Π²ΠΎΠ΄Π° класса string.

Π­Ρ‚ΠΎ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΈΠ· ΠΏΡ€Π°Π²ΠΈΠ» поиска позволяСт Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Π½Π΅ ΡΠ²Π»ΡΡŽΡ‰Π΅ΠΉΡΡ Ρ‡Π»Π΅Π½ΠΎΠΌ класса, Π±Ρ‹Ρ‚ΡŒ ΠΊΠΎΠ½Ρ†Π΅ΠΏΡ‚ΡƒΠ°Π»ΡŒΠ½ΠΎ Ρ‡Π°ΡΡ‚ΡŒΡŽ интСрфСйса ΠΊ классу ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π±Π΅Π· ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ объявлСния using. Π‘Π΅Π· этого ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ ΠΈΠ· ΠΏΡ€Π°Π²ΠΈΠ» поиска для ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° Π²Ρ‹Π²ΠΎΠ΄Π° всСгда ΠΏΡ€ΠΈΡˆΠ»ΠΎΡΡŒ Π±Ρ‹ ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π΅ объявлСниС using:

using std::operator>>; // Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ΡŒ cin >> s

Π›ΠΈΠ±ΠΎ ΠΏΡ€ΠΈΡˆΠ»ΠΎΡΡŒ Π±Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ„ΠΎΡ€ΠΌΡƒ записи Π²Ρ‹Π·ΠΎΠ²Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Π²ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‰ΡƒΡŽ спСцификатор пространства ΠΈΠΌΠ΅Π½:

std::operator>>(std::cin, s); // ok: явноС использованиС std::>>

He Π±Ρ‹Π»ΠΎ Π±Ρ‹ Π½ΠΈΠΊΠ°ΠΊΠΎΠ³ΠΎ способа ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ синтаксис ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π°. Π›ΡŽΠ±ΠΎΠ΅ ΠΈΠ· этих объявлСний выглядит Π½Π΅ΡƒΠΊΠ»ΡŽΠΆΠ΅ ΠΈ сущСствСнно Π·Π°Ρ‚Ρ€ΡƒΠ΄Π½ΠΈΠ»ΠΎ Π±Ρ‹ использованиС Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ Π²Π²ΠΎΠ΄Π°-Π²Ρ‹Π²ΠΎΠ΄Π°.

Поиск ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ std::move() ΠΈ std::forward()

Многим, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π΄Π°ΠΆΠ΅ Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Ρƒ программистов Π‘++ Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ понадобится зависимый ΠΎΡ‚ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° поиск. ΠžΠ±Ρ‹Ρ‡Π½ΠΎ, Ссли ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ опрСдСляСт имя, ΡƒΠΆΠ΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ΅ Π² Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ΅, истинно ΠΎΠ΄Π½ΠΎ ΠΈΠ· Π΄Π²ΡƒΡ…: Π»ΠΈΠ±ΠΎ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹Π΅ ΠΏΡ€Π°Π²ΠΈΠ»Π° ΠΏΠ΅Ρ€Π΅Π³Ρ€ΡƒΠ·ΠΊΠΈ опрСдСлят, относится Π»ΠΈ Π΄Π°Π½Π½Ρ‹ΠΉ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹ΠΉ Π²Ρ‹Π·ΠΎΠ² ΠΊ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅Ρ‡Π½ΠΎΠΉ вСрсии Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΈΠ»ΠΈ ΠΊ вСрсии прилоТСния, ΠΈΠ»ΠΈ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ смоТСт ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅Ρ‡Π½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ рассмотритС Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅Ρ‡Π½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ move() ΠΈ forward(). ОбС ΡΠ²Π»ΡΡŽΡ‚ΡΡ шаблонами Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, ΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° опрСдСляСт ΠΈΡ… вСрсии с ΠΎΠ΄Π½ΠΈΠΌ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π² Π²ΠΈΠ΄Π΅ ссылки Π½Π° r-Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅. Как ΡƒΠΆΠ΅ ΡƒΠΏΠΎΠΌΠΈΠ½Π°Π»ΠΎΡΡŒ, ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρƒ ссылки Π½Π° r-Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π² шаблонС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ любой Ρ‚ΠΈΠΏ (см. Ρ€Π°Π·Π΄Π΅Π» 16.2.6). Если ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ опрСдСляСт Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ΠΏΠΎ ΠΈΠΌΠ΅Π½ΠΈ move(), ΠΏΠΎΠ»ΡƒΡ‡Π°ΡŽΡ‰ΡƒΡŽ ΠΎΠ΄ΠΈΠ½ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€, Ρ‚ΠΎ (Π²Π½Π΅ зависимости ΠΎΡ‚ Ρ‚ΠΈΠΏΠ° ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°) вСрсия Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ move() ΠΈΠ· прилоТСния вступит Π² ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚ с Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅Ρ‡Π½ΠΎΠΉ вСрсиСй. Π­Ρ‚ΠΎ справСдливо ΠΈ для Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ forward().

Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚Ρ‹ ΠΈΠΌΠ΅Π½ для Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ move() (ΠΈ forward()) Π±ΠΎΠ»Π΅Π΅ вСроятны, Ρ‡Π΅ΠΌ для Π΄Ρ€ΡƒΠ³ΠΈΡ… Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅Ρ‡Π½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ move() ΠΈ forward() ΠΎΡΡƒΡ‰Π΅ΡΡ‚Π²Π»ΡΡŽΡ‚ вСсьма спСцифичСскиС для Ρ‚ΠΈΠΏΠ° манипуляции, Π²Π΅Ρ€ΠΎΡΡ‚Π½ΠΎΡΡ‚ΡŒ Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ Π² ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ этих Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, довольно ΠΌΠ°Π»Π°.

Π’ΠΎΡ‚ Ρ„Π°ΠΊΡ‚, Ρ‡Ρ‚ΠΎ ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚Ρ‹ ΠΈΠΌΠ΅Π½ с этими функциями Π±ΠΎΠ»Π΅Π΅ вСроятны (ΠΈ ΠΌΠ΅Π½Π΅Π΅ вСроятно, Ρ‡Ρ‚ΠΎ Π½Π°ΠΌΠ΅Ρ€Π΅Π½Π½Ρ‹ΠΌΠΈ), ΠΎΠ±ΡŠΡΡΠ½ΡΠ΅Ρ‚, ΠΏΠΎΡ‡Π΅ΠΌΡƒ ΠΈΡ… ΠΈΠΌΠ΅Π½Π° всСгда слСдуСт ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ ΠΊΠ²Π°Π»ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΌΠΈ (см. Ρ€Π°Π·Π΄Π΅Π» 12.1.5). Π€ΠΎΡ€ΠΌΠ° записи std::move(), Π° Π½Π΅ просто move() Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ вСрсии ΠΈΠ· стандартной Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ.

ДруТСствСнныС объявлСния ΠΈ зависимый ΠΎΡ‚ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° поиск

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

namespace A {

 class Π‘ {

  // Π΄Π²Π° Π΄Ρ€ΡƒΠ³Π°; Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅ объявлСно ΠΊΡ€ΠΎΠΌΠ΅ друТСствСнных ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠΉ

  // эти Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ нСявно ΡΠ²Π»ΡΡŽΡ‚ΡΡ Ρ‡Π»Π΅Π½Π°ΠΌΠΈ пространства ΠΈΠΌΠ΅Π½ A

  friend void f2(); // Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Π½Π°ΠΉΠ΄Π΅Π½ΠΎ, Ссли Π½Π΅ объявлСно ΠΈΠ½ΠΎΠ΅

  friend void f(const C&); // Π½Π°ΠΉΠ΄Π΅Π½ΠΎ зависимым ΠΎΡ‚ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°

                           // поиском

 };

}

Π—Π΄Π΅ΡΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ f() ΠΈ f2() ΡΠ²Π»ΡΡŽΡ‚ΡΡ Ρ‡Π»Π΅Π½Π°ΠΌΠΈ пространства ΠΈΠΌΠ΅Π½ А. Зависимый ΠΎΡ‚ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° поиск позволяСт Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ f(), Π΄Π°ΠΆΠ΅ Ссли для Π½Π΅Π΅ Π½Π΅Ρ‚ Π½ΠΈΠΊΠ°ΠΊΠΎΠ³ΠΎ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ объявлСния:

int main() {

 A::C cobj;

 f(cobj); // ok: Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ A::f() ΠΏΠΎ объявлСнию друТСствСнным Π² A::C

 f2();    // ошибка: A::f2() Π½Π΅ объявлСна

}

ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ функция f() ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ Ρ‚ΠΈΠΏΠ° класса ΠΈ нСявно ΠΎΠ±ΡŠΡΠ²Π»ΡΠ΅Ρ‚ΡΡ Π² Ρ‚ΠΎΠΌ ΠΆΠ΅ пространствС ΠΈΠΌΠ΅Π½, Ρ‡Ρ‚ΠΎ ΠΈ C, ΠΏΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ ΠΎΠ½Π° Π±ΡƒΠ΄Π΅Ρ‚ Π½Π°ΠΉΠ΄Π΅Π½Π°. Π’Π°ΠΊ ΠΊΠ°ΠΊ Ρƒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ f2() Π½ΠΈΠΊΠ°ΠΊΠΎΠ³ΠΎ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° Π½Π΅Ρ‚, ΠΎΠ½Π° Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Π½Π°ΠΉΠ΄Π΅Π½Π°.

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

Π£ΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ 18.18. Π‘ ΡƒΡ‡Π΅Ρ‚ΠΎΠΌ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π³ΠΎ Ρ‚ΠΈΠΏΠΈΡ‡Π½ΠΎΠ³ΠΎ опрСдСлСния Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ swap() Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ 13.3 ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚Π΅, какая Π΅Π΅ вСрсия ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ, Ссли mem1 ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‚ΠΈΠΏ string. Π§Ρ‚ΠΎ, Ссли mem1 ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‚ΠΈΠΏ int? ΠžΠ±ΡŠΡΡΠ½ΠΈΡ‚Π΅, ΠΊΠ°ΠΊ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΎΡ…ΠΎΠ΄ΠΈΡ‚ΡŒ поиск ΠΈΠΌΠ΅Π½ Π² ΠΎΠ±ΠΎΠΈΡ… случаях.

void swap(T v1, T v2) {

 using std::swap;

 swap(v1.mem1, v2.mem1);

 // ΠΎΠ±ΠΌΠ΅Π½ ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Ρ… Ρ‡Π»Π΅Π½ΠΎΠ² Ρ‚ΠΈΠΏΠ° Π’

}

Π£ΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ 18.19. Π§Ρ‚ΠΎ, Ссли Π±Ρ‹ Π²Ρ‹Π·ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ swap() Π±Ρ‹Π» Π±Ρ‹ Ρ‚Π°ΠΊΠΈΠΌ

std::swap(v1.mem1, v2.mem1)?

18.2.4. ΠŸΠ΅Ρ€Π΅Π³Ρ€ΡƒΠ·ΠΊΠ° ΠΈ пространства ΠΈΠΌΠ΅Π½

ΠŸΡ€ΠΎΡΡ‚Ρ€Π°Π½ΡΡ‚Π²Π° ΠΈΠΌΠ΅Π½ ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΠΎΠ²Π»ΠΈΡΡ‚ΡŒ Π½Π° ΠΏΠΎΠ΄Π±ΠΎΡ€ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ (см. Ρ€Π°Π·Π΄Π΅Π» 6.4) двумя способами. Один ΠΈΠ· Π½ΠΈΡ… Π²ΠΏΠΎΠ»Π½Π΅ ΠΎΡ‡Π΅Π²ΠΈΠ΄Π΅Π½: объявлСниС ΠΈΠ»ΠΈ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Π° using ΠΌΠΎΠΆΠ΅Ρ‚ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ Π² Π½Π°Π±ΠΎΡ€ ΠΊΠ°Π½Π΄ΠΈΠ΄Π°Ρ‚ΠΎΠ². Π’Ρ‚ΠΎΡ€ΠΎΠΉ способ ΠΌΠ΅Π½Π΅Π΅ ΠΎΡ‡Π΅Π²ΠΈΠ΄Π΅Π½.

Зависимый ΠΎΡ‚ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° поиск ΠΈ ΠΏΠ΅Ρ€Π΅Π³Ρ€ΡƒΠ·ΠΊΠ°

Как ΡƒΠΏΠΎΠΌΠΈΠ½Π°Π»ΠΎΡΡŒ Π² ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΌ Ρ€Π°Π·Π΄Π΅Π»Π΅, поиск ΠΈΠΌΠ΅Π½ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, ΠΈΠΌΠ΅ΡŽΡ‰ΠΈΡ… ΠΎΠ΄ΠΈΠ½ ΠΈΠ»ΠΈ нСсколько Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² Ρ‚ΠΈΠΏΠ° класса, осущСствляСтся Ρ‚Π°ΠΊΠΆΠ΅ ΠΈ Π² пространствС ΠΈΠΌΠ΅Π½, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ класс ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°. Π­Ρ‚ΠΎ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ влияСт Ρ‚Π°ΠΊΠΆΠ΅ ΠΈ Π½Π° Π²Ρ‹Π±ΠΎΡ€ ΠΊΠ°Π½Π΄ΠΈΠ΄Π°Ρ‚ΠΎΠ². КаТдоС пространство ΠΈΠΌΠ΅Π½, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ класс, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹ΠΉ Π² качСствС Ρ‚ΠΈΠΏΠ° ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° (Π° Ρ‚Π°ΠΊΠΆΠ΅ Ρ‚Π΅, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Ρ‹ Π΅Π³ΠΎ Π±Π°Π·ΠΎΠ²Ρ‹Π΅ классы), участвуСт Π² поискС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ-ΠΊΠ°Π½Π΄ΠΈΠ΄Π°Ρ‚Π°. ВсС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ этих пространств ΠΈΠΌΠ΅Π½, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΠΌΠ΅ΡŽΡ‚ имя, ΡΠΎΠ²ΠΏΠ°Π΄Π°ΡŽΡ‰Π΅Π΅ с ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Π½Π½Ρ‹ΠΌ ΠΏΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅, Π±ΡƒΠ΄ΡƒΡ‚ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Ρ‹ Π² Π½Π°Π±ΠΎΡ€ ΠΊΠ°Π½Π΄ΠΈΠ΄Π°Ρ‚ΠΎΠ². Π­Ρ‚ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π±ΡƒΠ΄ΡƒΡ‚ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Ρ‹ Π΄Π°ΠΆΠ΅ Ρ‚ΠΎΠ³Π΄Π°, ΠΊΠΎΠ³Π΄Π° ΠΎΠ½ΠΈ Π½Π΅ Π²ΠΈΠ΄ΠΈΠΌΡ‹ Π² Ρ‚ΠΎΡ‡ΠΊΠ΅ обращСния: