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

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

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

ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Ρƒ объявлСния Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π½Π΅Ρ‚ Ρ‚Π΅Π»Π°, Π½Π΅Ρ‚ Π½ΠΈΠΊΠ°ΠΊΠΎΠΉ нСобходимости Π² ΠΈΠΌΠ΅Π½Π°Ρ… ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ². ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ ΠΈΠΌΠ΅Π½Π° ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² Π·Π°Ρ‡Π°ΡΡ‚ΡƒΡŽ ΠΎΡ‚ΡΡƒΡ‚ΡΡ‚Π²ΡƒΡŽΡ‚ Π² объявлСнии. Π₯ΠΎΡ‚ΡŒ ΠΈΠΌΠ΅Π½Π° ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² ΠΈ Π½Π΅ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹, ΠΎΠ½ΠΈ Π·Π°Ρ‡Π°ΡΡ‚ΡƒΡŽ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠΌΠΎΡ‡ΡŒ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΏΠΎΠ½ΡΡ‚ΡŒ Π΅Π΅ Π½Π°Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅:

// ΠΈΠΌΠ΅Π½Π° ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² ΡƒΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‚, Ρ‡Ρ‚ΠΎ ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π°ΡŽΡ‚ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½

// Π²Ρ‹Π²ΠΎΠ΄ΠΈΠΌΡ‹Ρ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ

void print(vector<int>::const_iterator beg,

           vector<int>::const_iterator end);

Π­Ρ‚ΠΈ Ρ‚Ρ€ΠΈ элСмСнта объявлСния (Ρ‚ΠΈΠΏ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ³ΠΎ значСния, имя Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈ Ρ‚ΠΈΠΏ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ²) ΠΎΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‚ интСрфСйс (interface) Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. Они Π·Π°Π΄Π°ΡŽΡ‚ всю ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡƒΡŽ для Π²Ρ‹Π·ΠΎΠ²Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. ОбъявлСниС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π½Π°Π·Ρ‹Π²Π°ΡŽΡ‚ Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΡ€ΠΎΡ‚ΠΎΡ‚ΠΈΠΏΠΎΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ (function prototype).

ОбъявлСния Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ находятся Π² Ρ„Π°ΠΉΠ»Π°Ρ… Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ°

Напомним, Ρ‡Ρ‚ΠΎ объявлСния ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… Ρ€Π°ΡΠΏΠΎΠ»Π°Π³Π°ΡŽΡ‚ Π² Ρ„Π°ΠΉΠ»Π°Ρ… Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ° (см. Ρ€Π°Π·Π΄Π΅Π» 2.6.3), Π° опрСдСлСния β€” Π² Ρ„Π°ΠΉΠ»Π°Ρ… исходного ΠΊΠΎΠ΄Π°. По Ρ‚Π΅ΠΌ ΠΆΠ΅ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π°ΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ ΠΎΠ±ΡŠΡΠ²Π»Π΅Π½Ρ‹ Π² Ρ„Π°ΠΉΠ»Π°Ρ… Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ° ΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Ρ‹ Π² Ρ„Π°ΠΉΠ»Π°Ρ… исходного ΠΊΠΎΠ΄Π°.

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

Π€Π°ΠΉΠ» исходного ΠΊΠΎΠ΄Π°, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ функция ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π°, Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ функция объявлСна. Π’Π°ΠΊ компилятор смоТСт ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ соотвСтствиС опрСдСлСния ΠΈ объявлСния.

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

Π£ΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ 6.8. ΠΠ°ΠΏΠΈΡˆΠΈΡ‚Π΅ Ρ„Π°ΠΉΠ» Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ° ΠΏΠΎ ΠΈΠΌΠ΅Π½ΠΈ Chapter6.h, содСрТащий объявлСния Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, написанных для ΡƒΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠΉ Ρ€Π°Π·Π΄Π΅Π»Π° 6.1

6.1.3. РаздСльная компиляция

По ΠΌΠ΅Ρ€Π΅ услоТнСния ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΡΡ‚ΡŒ Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ части ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π² ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Ρ… Ρ„Π°ΠΉΠ»Π°Ρ…. НапримСр, Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, написанныС для ΡƒΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠΉ Ρ€Π°Π·Π΄Π΅Π»Π° 6.1, ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ Π±Ρ‹ ΡΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ Π² ΠΎΠ΄Π½ΠΎΠΌ Ρ„Π°ΠΉΠ»Π΅, Π° ΠΊΠΎΠ΄, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰ΠΈΠΉ ΠΈΡ…, Π² Π΄Ρ€ΡƒΠ³ΠΈΡ… Ρ„Π°ΠΉΠ»Π°Ρ… исходного ΠΊΠΎΠ΄Π°. Π―Π·Ρ‹ΠΊ Π‘++ позволяСт Ρ€Π°Π·Π΄Π΅Π»ΡΡ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π½Π° логичСскиС части, прСдоставляя срСдство, извСстноС ΠΊΠ°ΠΊ Ρ€Π°Π·Π΄Π΅Π»ΡŒΠ½Π°Ρ компиляция (separate compilation). РаздСльная компиляция позволяСт Ρ€Π°Π·Π΄Π΅Π»ΡΡ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π½Π° нСсколько Ρ„Π°ΠΉΠ»ΠΎΠ², ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΎΡ‚ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Π½ нСзависимо.

ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ†ΠΈΡ ΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΊΠ° Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… Ρ„Π°ΠΉΠ»ΠΎΠ² исходного ΠΊΠΎΠ΄Π°

ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Ρ‡Ρ‚ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ fact() находится Π² Ρ„Π°ΠΉΠ»Π΅ fact.cc, Π° Π΅Π΅ объявлСниС β€” Π² Ρ„Π°ΠΉΠ»Π΅ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ° Chapter6.h. Π€Π°ΠΉΠ» fact.cc, ΠΊΠ°ΠΊ ΠΈ любой Π΄Ρ€ΡƒΠ³ΠΎΠΉ Ρ„Π°ΠΉΠ», ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰ΠΈΠΉ эту Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, Π±ΡƒΠ΄Π΅Ρ‚ Π²ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ Chapter6.h. Π€ΡƒΠ½ΠΊΡ†ΠΈΡŽ main(), Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‰ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ fact(), Π±ΡƒΠ΄Π΅ΠΌ Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒ Π² Π΅Ρ‰Π΅ ΠΎΠ΄Π½ΠΎΠΌ Ρ„Π°ΠΉΠ»Π΅ factMain.cc.

Π§Ρ‚ΠΎΠ±Ρ‹ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ исполнимый Ρ„Π°ΠΉΠ» (executable file), слСдуСт ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ компилятору, Π³Π΄Π΅ ΠΈΡΠΊΠ°Ρ‚ΡŒ вСсь ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹ΠΉ ΠΊΠΎΠ΄. Π­Ρ‚ΠΈ Ρ„Π°ΠΉΠ»Ρ‹ ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ Π±Ρ‹ ΠΎΡ‚ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

$ CC factMain.cc fact.cc # generates factMain.exe or a.out

$ CC factMain.cc fact.cc -o main # generates main or main.exe

Π³Π΄Π΅ CC β€” имя компилятора; $ β€” систСмная подсказка; # β€” Π½Π°Ρ‡Π°Π»ΠΎ коммСнтария ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки. Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ исполняСмый Ρ„Π°ΠΉΠ», ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ Π½Π°ΡˆΡƒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ main().

Если Π±Ρ‹ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ Π±Ρ‹Π» Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ ΠΈΠ· Π½Π°ΡˆΠΈΡ… Ρ„Π°ΠΉΠ»ΠΎΠ² исходного ΠΊΠΎΠ΄Π°, Ρ‚ΠΎ ΠΏΠ΅Ρ€Π΅ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ достаточно Π±Ρ‹Π»ΠΎ Π±Ρ‹ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‚ΠΎΡ‚ Ρ„Π°ΠΉΠ», ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±Ρ‹Π» фактичСски ΠΈΠ·ΠΌΠ΅Π½Π΅Π½. Π‘ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ компиляторов прСдоставляСт Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Ρ€Π°Π·Π΄Π΅Π»ΡŒΠ½ΠΎΠΉ компиляции ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π°. ΠžΠ±Ρ‹Ρ‡Π½ΠΎ этот процСсс создаСт Ρ„Π°ΠΉΠ» с Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ΠΌ .obj (Π½Π° Windows) ΠΈΠ»ΠΈ .o (Π½Π° UNIX), ΡƒΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‰ΠΈΠΌ, Ρ‡Ρ‚ΠΎ этот Ρ„Π°ΠΉΠ» содСрТит ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ (object code).

ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ‚ΠΎΡ€ позволяСт ΡΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²Π°Ρ‚ΡŒ (link) ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹ (object file) ΠΈ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ исполняСмый Ρ„Π°ΠΉΠ». На систСмС Π°Π²Ρ‚ΠΎΡ€ΠΎΠ² Ρ€Π°Π·Π΄Π΅Π»ΡŒΠ½Π°Ρ компиляция ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ осущСствляСтся ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

$ CC -с factMain.cc            # generates factMain.o

$ CC -c fact.cc                # generates fact.o

$ CC factMain.o fact.o         # generates factMain.exe or a.out

$ CC factMain.o fact.o -o main # generates main or main.exe

Π‘Π²Π΅Ρ€ΡŒΡ‚Π΅ΡΡŒ с руководством ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ вашСго компилятора, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΡ‚ΠΎΡ‡Π½ΠΈΡ‚ΡŒ, ΠΊΠ°ΠΊ ΠΈΠΌΠ΅Π½Π½ΠΎ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΈ Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, состоящиС ΠΈΠ· Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… Ρ„Π°ΠΉΠ»ΠΎΠ² исходного ΠΊΠΎΠ΄Π°.

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

Π£ΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ 6.9. ΠΠ°ΠΏΠΈΡˆΠΈΡ‚Π΅ собствСнныС вСрсии Ρ„Π°ΠΉΠ»ΠΎΠ² fact.cc ΠΈ factMain.cc. Π­Ρ‚ΠΈ Ρ„Π°ΠΉΠ»Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π²ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ Chapter6.h ΠΈΠ· упраТнСния ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅Π³ΠΎ Ρ€Π°Π·Π΄Π΅Π»Π°. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ эти Ρ„Π°ΠΉΠ»Ρ‹ Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ½ΡΡ‚ΡŒ, ΠΊΠ°ΠΊ ваш компилятор обСспСчиваСт Ρ€Π°Π·Π΄Π΅Π»ΡŒΠ½ΡƒΡŽ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡ†ΠΈΡŽ.

6.2. ΠŸΠ΅Ρ€Π΅Π΄Π°Ρ‡Π° Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ²

Как ΡƒΠΆΠ΅ ΡƒΠΏΠΎΠΌΠΈΠ½Π°Π»ΠΎΡΡŒ, ΠΏΡ€ΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ Π²Ρ‹Π·ΠΎΠ²Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π΅Π΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ ΡΠΎΠ·Π΄Π°ΡŽΡ‚ΡΡ Π·Π°Π½ΠΎΠ²ΠΎ. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠΎΠ΅ для ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ прСдоставляСт ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚, ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Π½Ρ‹ΠΉ ΠΏΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅.

ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΡŽΡ‚ΡΡ Ρ‚ΠΎΡ‡Π½ΠΎ Ρ‚Π°ΠΊ ΠΆΠ΅, ΠΊΠ°ΠΊ ΠΈ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅.

Как ΠΈ Ρƒ любой Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ, взаимодСйствиС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° ΠΈ Π΅Π³ΠΎ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° опрСдСляСт Ρ‚ΠΈΠΏ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°. Если ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ β€” ссылка (см. Ρ€Π°Π·Π΄Π΅Π» 2.3.1), Ρ‚ΠΎ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ привязываСтся ΠΊ своСму Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρƒ. Π’ ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС, Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° копируСтся.

Когда ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ β€” ссылка, говорят, Ρ‡Ρ‚ΠΎ Π΅Π³ΠΎ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ пСрСдаСтся ΠΏΠΎ ссылкС (pass by reference) ΠΈΠ»ΠΈ Ρ‡Ρ‚ΠΎ функция вызываСтся ΠΏΠΎ ссылкС (call by reference). Подобно любой Π΄Ρ€ΡƒΠ³ΠΎΠΉ ссылкС, ссылочный ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ β€” это Ρ‚ΠΎΠ»ΡŒΠΊΠΎ псСвдоним ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°, ΠΊ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ ΠΎΠ½ привязан, Ρ‚.Π΅. ссылочный ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ β€” псСвдоним своСго Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°.

Когда Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° копируСтся, ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ ΠΈ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ β€” нСзависимыС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹. Говорят, Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΈΠ΅ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ ΠΏΠ΅Ρ€Π΅Π΄Π°ΡŽΡ‚ΡΡ ΠΏΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΡŽ (pass by value) ΠΈΠ»ΠΈ Ρ‡Ρ‚ΠΎ функция вызываСтся ΠΏΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΡŽ (call by value).

6.2.1. ΠŸΠ΅Ρ€Π΅Π΄Π°Ρ‡Π° Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° ΠΏΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΡŽ

ΠŸΡ€ΠΈ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ Π½Π΅ ссылочного Ρ‚ΠΈΠΏΠ° Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π° копируСтся. ИзмСнСния значСния ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ Π½ΠΈΠΊΠ°ΠΊ Π½Π΅ Π²Π»ΠΈΡΡŽΡ‚ Π½Π° ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€:

int n = 0; // обычная пСрСмСнная Ρ‚ΠΈΠΏΠ° int

int i = n; // i - копия значСния ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ n

i = 42;    // Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ i измСнилось, Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ n - Π½Π΅Ρ‚

ΠŸΠ΅Ρ€Π΅Π΄Π°Ρ‡Π° Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° ΠΏΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΡŽ осущСствляСтся Ρ‚ΠΎΡ‡Π½ΠΎ Ρ‚Π°ΠΊ ΠΆΠ΅; Ρ‡Ρ‚ΠΎ Π±Ρ‹ функция Π½Π΅ сдСлала с ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠΌ, Π½Π° Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ это Π½Π΅ повлияСт. НапримСр, Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ fact() (см. Ρ€Π°Π·Π΄Π΅Π» 6.1) происходит Π΄Π΅ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° val:

ret *= val--; // Π΄Π΅ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚ значСния val

Π₯отя функция fact() ΠΈΠ·ΠΌΠ΅Π½ΠΈΠ»Π° Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ val, это ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Π½ΠΈΠΊΠ°ΠΊ Π½Π΅ повлияло Π½Π° ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Π½Ρ‹ΠΉ Π΅ΠΉ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚. Π’Ρ‹Π·ΠΎΠ² fact(i) Π½Π΅ измСняСт Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ i.

ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ указатСля

Π£ΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ (см. Ρ€Π°Π·Π΄Π΅Π» 2.3.2) Π²Π΅Π΄ΡƒΡ‚ сСбя, ΠΊΠ°ΠΊ любой Π½Π΅ ссылочный Ρ‚ΠΈΠΏ. ΠŸΡ€ΠΈ ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ указатСля Π΅Π³ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ копируСтся. ПослС создания ΠΊΠΎΠΏΠΈΠΈ получаСтся Π΄Π²Π° ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Ρ… указатСля. Однако ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ обСспСчиваСт косвСнный доступ ΠΊ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρƒ, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΎΠ½ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚. Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ этого ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° ΠΌΠΎΠΆΠ½ΠΎ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ указатСля (см. Ρ€Π°Π·Π΄Π΅Π» 2.3.2):

int n = 0, i = 42;

int *p = &n, *q = &i; // p ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π½Π° n; q ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π½Π° i

*p = 42;              // Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ n измСнилось, Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ p - Π½Π΅Ρ‚

p = q;                // Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ p ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π½Π° i; значСния i ΠΈ n

                      // Π½Π΅ΠΈΠ·ΠΌΠ΅Π½Π½Ρ‹

Π’ΠΎ ΠΆΠ΅ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Ρ…Π°Ρ€Π°ΠΊΡ‚Π΅Ρ€Π½ΠΎ для ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ, ΡΠ²Π»ΡΡŽΡ‰ΠΈΡ…ΡΡ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°ΠΌΠΈ:

// функция ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ ΠΈ обнуляСт Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΎΠ½

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

void reset(int *ip) {

 *ip = 0; // измСняСт Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ ip

 ip = 0;  // измСняСт Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π»ΠΎΠΊΠ°Π»ΡŒΠ½ΡƒΡŽ копию ip; Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ Π½Π΅ΠΈΠ·ΠΌΠ΅Π½Π΅Π½

}

ПослС Π²Ρ‹Π·ΠΎΠ²Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ reset() ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚, Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠ±Π½ΡƒΠ»Π΅Π½, Π½ΠΎ сам Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚-ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π΅ измСнится:

int i = 42;

reset(&i);                   // измСняСт Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ i, Π½ΠΎ Π½Π΅ адрСс

cout << "i = " << i << endl; // Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ i = 0

ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡΡ‚Ρ‹, ΠΏΡ€ΠΈΠ²Ρ‹ΠΊΡˆΠΈΠ΅ ΠΊ языку Π‘, Π·Π°Ρ‡Π°ΡΡ‚ΡƒΡŽ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ Π² Π²ΠΈΠ΄Π΅ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ для доступа ΠΊ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌ Π²Π½Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. Π’ языкС Π‘++ для этого ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ ссылочныС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹.

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

Π£ΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ 6.10. ΠΠ°ΠΏΠΈΡˆΠΈΡ‚Π΅, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ, Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, ΠΌΠ΅Π½ΡΡŽΡ‰ΡƒΡŽ значСния Π΄Π²ΡƒΡ… Ρ†Π΅Π»Ρ‹Ρ… чисСл. ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, Π²Ρ‹Π·Π²Π°Π² Π΅Π΅ ΠΈ ΠΎΡ‚ΠΎΠ±Ρ€Π°Π·ΠΈΠ² ΠΈΠ·ΠΌΠ΅Π½Π΅Π½Π½Ρ‹Π΅ значСния.

6.2.2. ΠŸΠ΅Ρ€Π΅Π΄Π°Ρ‡Π° Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° ΠΏΠΎ ссылкС