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

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

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

int j = ci;       // ok: Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ci копируСтся Π² j

Π₯отя пСрСмСнная ci ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‚ΠΈΠΏ const int, Π΅Π΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‚ΠΈΠΏ int. ΠšΠΎΠ½ΡΡ‚Π°Π½Ρ‚Π½ΠΎΡΡ‚ΡŒ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ ci ΠΈΠΌΠ΅Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ³Π»ΠΈ Π±Ρ‹ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Π΅Π΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅. ΠŸΡ€ΠΈ ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ ci для ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ j Π΅Π΅ ΠΊΠΎΠ½ΡΡ‚Π°Π½Ρ‚Π½ΠΎΡΡ‚ΡŒ Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ значСния. ΠšΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Π½Π΅ измСняСт Π΅Π³ΠΎ. Как Ρ‚ΠΎΠ»ΡŒΠΊΠΎ копия сдСлана, Ρƒ Π½ΠΎΠ²ΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Π½Π΅Ρ‚ Π½ΠΈΠΊΠ°ΠΊΠΎΠΉ дальнСйшСй связи с исходным ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ.

По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ константныС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹ для Ρ„Π°ΠΉΠ»Π°

Когда константный ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ инициализируСтся константой Π²ΠΎ врСмя компиляции, Ρ‚Π°ΠΊΠΎΠΉ ΠΊΠ°ΠΊ bufSize Π² ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠΈ Π½ΠΈΠΆΠ΅, компилятор ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ замСняСт ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡƒΡŽ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ Π΅Π΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ Π²ΠΎ врСмя компиляции.

const int bufSize = 512; // Ρ€Π°Π·ΠΌΠ΅Ρ€ Π±ΡƒΡ„Π΅Ρ€Π° Π²Π²ΠΎΠ΄Π°

Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, компилятор создаст исполняСмый ΠΊΠΎΠ΄, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰ΠΈΠΉ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 512 Π² Ρ‚Π΅Ρ… мСстах, Π³Π΄Π΅ исходный ΠΊΠΎΠ΄ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ bufSize.

Π§Ρ‚ΠΎΠ±Ρ‹ Π·Π°ΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ, компилятор Π΄ΠΎΠ»ΠΆΠ΅Π½ Π²ΠΈΠ΄Π΅Ρ‚ΡŒ Π΅Π΅ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€. ΠŸΡ€ΠΈ Ρ€Π°Π·Π΄Π΅Π»Π΅Π½ΠΈΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π½Π° нСсколько Ρ„Π°ΠΉΠ»ΠΎΠ², Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ константа, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌ доступ ΠΊ Π΅Π΅ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Ρƒ. Для этого пСрСмСнная Π΄ΠΎΠ»ΠΆΠ½Π° Π±Ρ‹Ρ‚ΡŒ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π° Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΌ Ρ„Π°ΠΉΠ»Π΅, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π΅Π΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ (см. Ρ€Π°Π·Π΄Π΅Π» 2.2.2). Для обСспСчСния Ρ‚Π°ΠΊΠΎΠ³ΠΎ повСдСния, Π½ΠΎ всС ΠΆΠ΅ Π±Π΅Π· ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½Ρ‹Ρ… ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠΉ Ρ‚ΠΎΠΉ ΠΆΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ, константныС ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ΡΡ ΠΊΠ°ΠΊ Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹Π΅ для Ρ„Π°ΠΉΠ»Π°. ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ константы с Ρ‚Π΅ΠΌ ΠΆΠ΅ ΠΈΠΌΠ΅Π½Π΅ΠΌ Π² Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… Ρ„Π°ΠΉΠ»Π°Ρ… ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎ написанию опрСдСлСния для ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Ρ… ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΌ Ρ„Π°ΠΉΠ»Π΅.

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

Для опрСдСлСния Π΅Π΄ΠΈΠ½ΠΎΠ³ΠΎ экзСмпляра константной ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово extern ΠΊΠ°ΠΊ Π² Π΅Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠΈ, Ρ‚Π°ΠΊ ΠΈ Π² Π΅Π΅ ΠΎΠ±ΡŠΡΠ²Π»Π΅Π½ΠΈΡΡ….

// Π€Π°ΠΉΠ» file_1.cc. ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΈ инициализация константы, которая

// доступна для Π΄Ρ€ΡƒΠ³ΠΈΡ… Ρ„Π°ΠΉΠ»ΠΎΠ²

extern const int bufSize = fcn();

// Π€Π°ΠΉΠ» file_1.h

extern const int bufSize; // Ρ‚Π° ΠΆΠ΅ bufSize, опрСдСлСнная Π² file_1.cc

Π—Π΄Π΅ΡΡŒ пСрСмСнная bufSize опрСдСляСтся ΠΈ инициализируСтся Π² Ρ„Π°ΠΉΠ»Π΅ file_1.cc. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ это объявлСниС Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€, ΠΎΠ½ΠΎ (ΠΊΠ°ΠΊ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ) являСтся ΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ΠΌ. Но ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ bufSize константа, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово extern, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π΅Π΅ Π² Π΄Ρ€ΡƒΠ³ΠΈΡ… Ρ„Π°ΠΉΠ»Π°Ρ….

ОбъявлСниС Π² Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ΅ file_1.h Ρ‚Π°ΠΊΠΆΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово extern. Π’ Π΄Π°Π½Π½ΠΎΠΌ случаС это дСмонстрируСт, Ρ‡Ρ‚ΠΎ имя bufSize Π½Π΅ являСтся Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΌ для этого Ρ„Π°ΠΉΠ»Π° ΠΈ Ρ‡Ρ‚ΠΎ Π΅Π³ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ находится Π² Π΄Ρ€ΡƒΠ³ΠΎΠΌ мСстС.

Π§Ρ‚ΠΎΠ±Ρ‹ совмСстно ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ константный ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Π² Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… Ρ„Π°ΠΉΠ»Π°Ρ…, Π΅Π³ΠΎ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ с использованиСм ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ³ΠΎ слова extern.

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

Π£ΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ 2.26. Π§Ρ‚ΠΎ ΠΈΠ· ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠ³ΠΎ Π½ΠΈΠΆΠ΅ допустимо? Если Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ нСдопустимо, Ρ‚ΠΎ ΠΏΠΎΡ‡Π΅ΠΌΡƒ?

(a) const int buf;      (b) int cnt = 0;

(c) const int sz = cnt; (d) ++cnt; ++sz;

2.4.1. Бсылка Π½Π° константу

Подобно Π»ΡŽΠ±Ρ‹ΠΌ Π΄Ρ€ΡƒΠ³ΠΈΠΌ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌ, с константным ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ²ΡΠ·Π°Ρ‚ΡŒ ссылку. Для этого ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ссылка Π½Π° константу (reference to const), Ρ‚.Π΅. ссылка Π½Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Ρ‚ΠΈΠΏΠ° const. Π’ ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠΉ ссылки, ссылку Π½Π° константу нСльзя ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ для измСнСния ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°, с ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ ΠΎΠ½Π° связана.

const int ci = 1024;

const int &r1 = ci; // ok: ΠΈ ссылка, ΠΈ основной ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ - константы

r1 = 42;            // ошибка: r1 - ссылка Π½Π° константу

int &r2 = ci; // ошибка: нСконстантная ссылка Π½Π° константный ΠΎΠ±ΡŠΠ΅ΠΊΡ‚

ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ нСльзя ΠΏΡ€ΠΈΡΠ²ΠΎΠΈΡ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ самой ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ ci, ссылка Ρ‚Π°ΠΊΠΆΠ΅ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½Π° ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡ‚ΡŒ ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ Π΅Π΅. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ инициализация ссылки r2 β€” это ошибка. Если Π±Ρ‹ эта инициализация Π±Ρ‹Π»Π° допустима, Ρ‚ΠΎ ссылку r2 ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ Π±Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ для измСнСния значСния Π΅Π΅ основного ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°.

ВСрминология. ΠšΠΎΠ½ΡΡ‚Π°Π½Ρ‚Π½Π°Ρ ссылка β€” это ссылка Π½Π° константу

ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡΡ‚Ρ‹ Π‘++, ΠΊΠ°ΠΊ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ Ρ‚Π΅Ρ€ΠΌΠΈΠ½ константная ссылка (const reference), ΠΎΠ΄Π½Π°ΠΊΠΎ фактичСски Ρ€Π΅Ρ‡ΡŒ ΠΈΠ΄Π΅Ρ‚ ΠΎ ссылкС Π½Π° константу (reference to const).

Π‘ тСхничСской Ρ‚ΠΎΡ‡ΠΊΠΈ зрСния Π½Π΅Ρ‚ Π½ΠΈΠΊΠ°ΠΊΠΈΡ… константных ссылок. Бсылка β€” Π½Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, поэтому саму ссылку нСльзя ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ константой. На самом Π΄Π΅Π»Π΅, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π½Π΅Ρ‚ Π½ΠΈΠΊΠ°ΠΊΠΎΠ³ΠΎ способа Π·Π°ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ ссылку ΡΡΡ‹Π»Π°Ρ‚ΡŒΡΡ Π½Π° Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, Ρ‚ΠΎ Π² Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ смыслС всС ссылки β€” константы. Π’ΠΎ, Ρ‡Ρ‚ΠΎ ссылка ссылаСтся Π½Π° константный ΠΈΠ»ΠΈ нСконстантный Ρ‚ΠΈΠΏ, относится ΠΊ Ρ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ этой ссылки ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ, ΠΎΠ΄Π½Π°ΠΊΠΎ привязку самой ссылки ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ нСльзя Π² любом случаС.

Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡ ΠΈ ссылки Π½Π° константу

Π’ Ρ€Π°Π·Π΄Π΅Π»Π΅ 2.1.2 ΠΌΡ‹ ΠΎΠ±Ρ€Π°Ρ‰Π°Π»ΠΈ вашС Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° Π΄Π²Π° ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ ΠΈΠ· ΠΏΡ€Π°Π²ΠΈΠ»Π°, согласно ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ Ρ‚ΠΈΠΏ ссылки Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡΠΎΠ²ΠΏΠ°Π΄Π°Ρ‚ΡŒ с Ρ‚ΠΈΠΏΠΎΠΌ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΎΠ½Π° ссылаСтся. ΠŸΠ΅Ρ€Π²ΠΎΠ΅ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅: ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ссылку Π½Π° константу Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠΌ выраТСния, Ρ‚ΠΈΠΏ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ (см. Ρ€Π°Π·Π΄Π΅Π» 2.1.2) Π² Ρ‚ΠΈΠΏ ссылки. Π’ частности, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΡΠ²ΡΠ·Π°Ρ‚ΡŒ ссылку Π½Π° константу с нСконстантным ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ, Π»ΠΈΡ‚Π΅Ρ€Π°Π»ΠΎΠΌ ΠΈΠ»ΠΈ Π±ΠΎΠ»Π΅Π΅ ΠΎΠ±Ρ‰ΠΈΠΌ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ΠΌ:

int i = 42;

const int &r1 = i;      // ΠΌΠΎΠΆΠ½ΠΎ ΡΠ²ΡΠ·Π°Ρ‚ΡŒ ссылку const int& с ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΌ

                        // ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ int

const int &r2 =42;      // ok: r1 - ссылка Π½Π° константу

const int &r3 = r1 * 2; // ok: r3 - ссылка Π½Π° константу

int &r4 = r * 2;        // ошибка: r4 - простая, нСконстантная ссылка

ΠŸΡ€ΠΎΡΡ‚Π΅ΠΉΡˆΠΈΠΉ способ ΠΏΠΎΠ½ΡΡ‚ΡŒ это Ρ€Π°Π·Π»ΠΈΡ‡ΠΈΠ΅ Π² ΠΏΡ€Π°Π²ΠΈΠ»Π°Ρ… ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ β€” Ρ€Π°ΡΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ происходит ΠΏΡ€ΠΈ связывании ссылки с ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ°:

double dval = 3.14;

const int &ri = dval;

Π—Π΄Π΅ΡΡŒ ссылка ri ссылаСтся Π½Π° ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ Ρ‚ΠΈΠΏΠ° int. ΠžΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ со ссылкой ri Π±ΡƒΠ΄ΡƒΡ‚ цСлочислСнными, Π½ΠΎ пСрСмСнная dval содСрТит число с ΠΏΠ»Π°Π²Π°ΡŽΡ‰Π΅ΠΉ запятой, Π° Π½Π΅ Ρ†Π΅Π»ΠΎΠ΅ число. Π§Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ΄ΠΎΡΡ‚ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒΡΡ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, с ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ связана ссылка ri, ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‚ΠΈΠΏ int, компилятор ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ΅Ρ‚ этот ΠΊΠΎΠ΄ Π² Π½Π΅Ρ‡Ρ‚ΠΎ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅:

const int temp = dval; // ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ константу Ρ‚ΠΈΠΏΠ° int ΠΈΠ·

                       // ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ Ρ‚ΠΈΠΏΠ° double

const int &ri = temp;  // ΡΠ²ΡΠ·Π°Ρ‚ΡŒ ссылку ri с Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ константой

Π’ Π΄Π°Π½Π½ΠΎΠΌ случаС ссылка ri связана с Π²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ (temporary). Π’Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ β€” это бСзымянный ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, создаваСмый компилятором для хранСния ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΡ‡Π½ΠΎΠ³ΠΎ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π° вычислСния. ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡΡ‚Ρ‹ Π‘++ Π·Π°Ρ‡Π°ΡΡ‚ΡƒΡŽ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ слово "temporary" ΠΊΠ°ΠΊ сокращСниС Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π° "temporary object".

Π’Π΅ΠΏΠ΅Ρ€ΡŒ рассмотрим, Ρ‡Ρ‚ΠΎ ΠΌΠΎΠ³Π»ΠΎ Π±Ρ‹ ΠΏΡ€ΠΎΠΈΠ·ΠΎΠΉΡ‚ΠΈ, Π±ΡƒΠ΄ΡŒ инициализация ΠΏΠΎΠ·Π²ΠΎΠ»Π΅Π½Π°, Π½ΠΎ ссылка ri Π½Π΅ Π±Ρ‹Π»Π° Π±Ρ‹ константной. Π’ этом случаС ΠΌΡ‹ ΠΌΠΎΠ³Π»ΠΈ Π±Ρ‹ ΠΏΡ€ΠΈΡΠ²ΠΎΠΈΡ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠΎ ссылкС ri. Π­Ρ‚ΠΎ ΠΈΠ·ΠΌΠ΅Π½ΠΈΠ»ΠΎ Π±Ρ‹ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, с ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ связана ссылка ri. Π­Ρ‚ΠΎΡ‚ Π²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‚ΠΈΠΏ Π½Π΅ dval. ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡΡ‚, Π·Π°ΡΡ‚Π°Π²ΠΈΠ²ΡˆΠΈΠΉ ссылку ri ΡΡΡ‹Π»Π°Ρ‚ΡŒΡΡ Π½Π° ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ dval, вСроятно, ΠΎΠΆΠΈΠ΄Π°Π», Ρ‡Ρ‚ΠΎ присвоСниС ΠΏΠΎ ссылкС ri ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ dval. Π’ ΠΊΠΎΠ½Ρ†Π΅ ΠΊΠΎΠ½Ρ†ΠΎΠ², ΠΏΠΎΡ‡Π΅ΠΌΡƒ ΠΏΡ€ΠΎΠΈΠ·ΠΎΡˆΠ»ΠΎ присвоСниС ΠΏΠΎ ссылкС ri, Ссли Π½Π΅ Π±Ρ‹Π»ΠΎ намСрСния ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, с ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ ΠΎΠ½Π° связана? ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ связь ссылки с Π²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ осущСствляСт ΡƒΠΆ ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎ Π½Π΅ Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ΄Ρ€Π°Π·ΡƒΠΌΠ΅Π²Π°Π» программист, язык считаСт это Π½Π΅ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½Ρ‹ΠΌ.

Бсылка Π½Π° константу ΠΌΠΎΠΆΠ΅Ρ‚ ΡΡΡ‹Π»Π°Ρ‚ΡŒΡΡ Π½Π° нСконстантный ΠΎΠ±ΡŠΠ΅ΠΊΡ‚

Π’Π°ΠΆΠ½ΠΎ ΠΏΠΎΠ½ΠΈΠΌΠ°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ ссылка Π½Π° константу ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΠ²Π°Π΅Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ этой ссылки ΠΌΠΎΠΆΠ½ΠΎ Π΄Π΅Π»Π°Ρ‚ΡŒ. ΠŸΡ€ΠΈΠ²ΡΠ·ΠΊΠ° ссылки ΠΊ константному ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρƒ Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅ Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚ ΠΎ Ρ‚ΠΎΠΌ, являСтся Π»ΠΈ сам основной ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ константой. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ основной ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ нСконстантным, ΠΎΠ½ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ способами:

int i = 42;

int &r1 = i;       // r1 связана с i

const int &r2 = i; // r2 Ρ‚ΠΎΠΆΠ΅ связана с i;

                   // Π½ΠΎ ΠΎΠ½Π° Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ для измСнСния i

r1 = 0;            // r1 - нСконстантна; i Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ 0

r2 = 0;            // ошибка: r2 - ссылка Π½Π° константу

ΠŸΡ€ΠΈΠ²ΡΠ·ΠΊΠ° ссылки r2 ΠΊ нСконстантной ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ i Ρ‚ΠΈΠΏΠ° int Π²ΠΏΠΎΠ»Π½Π΅ допустима. Но ссылку r2 нСльзя ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ для измСнСния значСния ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ i. НСсмотря Π½Π° это, Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ i Π²ΠΏΠΎΠ»Π½Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Π΄Ρ€ΡƒΠ³ΠΈΠΌ способом, НапримСр, ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΈΡΠ²ΠΎΠΈΡ‚ΡŒ Π΅ΠΉ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ нСпосрСдствСнно ΠΈΠ»ΠΈ ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ Π΄Ρ€ΡƒΠ³ΠΎΠΉ связанной с Π½Π΅ΠΉ ссылки, Ρ‚Π°ΠΊΠΎΠΉ ΠΊΠ°ΠΊ r1.