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

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

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

const int *cp = &i; // ok: Π½ΠΎ cp Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ i (Ρ€Π°Π·Π΄Π΅Π» 2.4.2)

const int &r = i;   // ok: Π½ΠΎ r Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ i (Ρ€Π°Π·Π΄Π΅Π» 2.4.1)

const int &r2 = 42; // ok: (Ρ€Π°Π·Π΄Π΅Π» 2.4.1)

int *p = cp;  // ошибка: Ρ‚ΠΈΠΏΡ‹ p ΠΈ cp Π½Π΅ ΡΠΎΠ²ΠΏΠ°Π΄Π°ΡŽΡ‚ (Ρ€Π°Π·Π΄Π΅Π» 2.4.2)

int &r3 = r;  // ошибка: Ρ‚ΠΈΠΏΡ‹ r3 ΠΈ r Π½Π΅ ΡΠΎΠ²ΠΏΠ°Π΄Π°ΡŽΡ‚ (Ρ€Π°Π·Π΄Π΅Π» 2.4.1)

int &r4 = 42; // ошибка: нСльзя ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΡΡ‚ΡƒΡŽ ссылку ΠΈΠ·

              //         Π»ΠΈΡ‚Π΅Ρ€Π°Π»Π° (Ρ€Π°Π·Π΄Π΅Π» 2.3.1)

Π’Π΅ ΠΆΠ΅ ΠΏΡ€Π°Π²ΠΈΠ»Π° ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ относятся ΠΈ ΠΊ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ²:

int i = 0;

const int ci = i;

string::size_type ctr = 0;

reset(&i);  // Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ Π²Π΅Ρ€ΡΠΈΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ reset с ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠΌ Ρ‚ΠΈΠΏΠ° int*

reset(&ci); // ошибка: нСльзя ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ int* ΠΈΠ· указатСля Π½Π°

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

reset(i);   // Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ Π²Π΅Ρ€ΡΠΈΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ reset с ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠΌ Ρ‚ΠΈΠΏΠ° int&

reset(ci);  // ошибка: нСльзя ΠΏΡ€ΠΈΠ²ΡΠ·Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΡΡ‚ΡƒΡŽ ссылку ΠΊ константному

            //         ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρƒ ci

reset(42);  // ошибка: нСльзя ΠΏΡ€ΠΈΠ²ΡΠ·Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΡΡ‚ΡƒΡŽ ссылку ΠΊ Π»ΠΈΡ‚Π΅Ρ€Π°Π»Ρƒ

reset(ctr); // ошибка: Ρ‚ΠΈΠΏΡ‹ Π½Π΅ ΡΠΎΠ²ΠΏΠ°Π΄Π°ΡŽΡ‚; ctr ΠΈΠΌΠ΅Π΅Ρ‚ Π±Π΅Π·Π·Π½Π°ΠΊΠΎΠ²Ρ‹ΠΉ Ρ‚ΠΈΠΏ

// ok: ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ find_char являСтся ссылкой Π½Π° константу

find_char("Hello World!", 'o', ctr);

Π‘ΡΡ‹Π»ΠΎΡ‡Π½ΡƒΡŽ Π²Π΅Ρ€ΡΠΈΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ reset() (см. Ρ€Π°Π·Π΄Π΅Π» 6.2.2) ΠΌΠΎΠΆΠ½ΠΎ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Ρ‚ΠΈΠΏΠ° int. НСльзя ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ Π»ΠΈΡ‚Π΅Ρ€Π°Π», Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅, Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ Ρ‚ΠΈΠΏ int, ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ прСобразования, ΠΈΠ»ΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Ρ‚ΠΈΠΏΠ° const int. Π’ΠΎΡ‡Π½ΠΎ Ρ‚Π°ΠΊ ΠΆΠ΅ вСрсии Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ reset() с ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΌ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Ρ‚ΠΈΠΏΠ° int* (см. Ρ€Π°Π·Π΄Π΅Π» 6.2.1). Π‘ Π΄Ρ€ΡƒΠ³ΠΎΠΉ стороны, ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ строковый Π»ΠΈΡ‚Π΅Ρ€Π°Π» ΠΊΠ°ΠΊ ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ find_char() (см. Ρ€Π°Π·Π΄Π΅Π» 6.2.2). Бсылочный ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ этой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ β€” ссылка Π½Π° константу, ΠΈ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ссылки Π½Π° константу ΠΈΠ· Π»ΠΈΡ‚Π΅Ρ€Π°Π»ΠΎΠ².

По возмоТности ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ ссылки Π½Π° константы

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

Π’ качСствС ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° рассмотрим Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ find_char() ΠΈΠ· Ρ€Π°Π·Π΄Π΅Π»Π° 6.2.2. Π‘Ρ‚Ρ€ΠΎΠΊΠΎΠ²Ρ‹ΠΉ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ этой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ сдСлан ссылкой Π½Π° константу. Если Π±Ρ‹ этот ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ Π±Ρ‹Π» ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ ΠΊΠ°ΠΊ string&:

// ошибка: ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ const string&

string::size_type find_char(string &s, char c,

                            string::size_type &occurs);

Ρ‚ΠΎ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ Π΅Π΅ ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ Π±Ρ‹ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° класса string, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ

find_char("Hello World", 'o', ctr);

ΠΏΡ€ΠΈΠ²Π΅Π»ΠΎ Π±Ρ‹ ΠΊ Π½Π΅ΡƒΠ΄Π°Ρ‡Π΅ Π²ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ компиляции.

Π‘ΠΎΠ»Π΅Π΅ Ρ‚ΠΎΠ³ΠΎ, эту Π²Π΅Ρ€ΡΠΈΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ find_char() нСльзя ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΠ· Π΄Ρ€ΡƒΠ³ΠΈΡ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ свои ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ ΠΊΠ°ΠΊ ссылки Π½Π° константу. НапримСр, ΠΌΡ‹ ΠΌΠΎΠ³Π»ΠΈ Π±Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ find_char() Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, которая опрСдСляСт, являСтся Π»ΠΈ строка ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΠΌ:

bool is_sentence(const string &s) {

 // Ссли Π² ΠΊΠΎΠ½Ρ†Π΅ s Π΅ΡΡ‚ΡŒ Ρ‚ΠΎΡ‡ΠΊΠ°, Ρ‚ΠΎ строка s - ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΠ΅

 string::size_type ctr = 0;

 return find_char(s, ctr) == s.size() - 1 && ctr == 1;

}

Если Π±Ρ‹ функция find_char() ΠΏΠΎΠ»ΡƒΡ‡Π°Π»Π° ΠΏΡ€ΠΎΡΡ‚ΡƒΡŽ ссылку string?, Ρ‚ΠΎ этот Π΅Π΅ Π²Ρ‹Π·ΠΎΠ² ΠΏΡ€ΠΈΠ²Π΅Π» Π±Ρ‹ ΠΊ ошибкС ΠΏΡ€ΠΈ компиляции. ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΠ° Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ s β€” ссылка Π½Π° const string, Π½ΠΎ функция find_char() Π±Ρ‹Π»Π° Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π° ΠΊΠ°ΠΊ ΠΏΠΎΠ»ΡƒΡ‡Π°ΡŽΡ‰Π°Ρ ΠΏΡ€ΠΎΡΡ‚ΡƒΡŽ ссылку.

Π‘Ρ‹Π»ΠΎ Π±Ρ‹ Π·Π°ΠΌΠ°Π½Ρ‡ΠΈΠ²ΠΎ ΠΏΠΎΠΏΡ‹Ρ‚Π°Ρ‚ΡŒΡΡ ΠΈΡΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ эту ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ, ΠΈΠ·ΠΌΠ΅Π½ΠΈΠ² Ρ‚ΠΈΠΏ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ is_sentence(). Но это Ρ‚ΠΎΠ»ΡŒΠΊΠΎ распространит ΠΎΡˆΠΈΠ±ΠΊΡƒ, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‰Π°Ρ сторона Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ is_sentence() смоТСт ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ нСконстантныС строки.

ΠŸΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹ΠΉ способ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ этой ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ β€” ΠΈΡΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ find_char(). Если Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ find_char(), ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚Π΅ Π»ΠΎΠΊΠ°Π»ΡŒΠ½ΡƒΡŽ копию строки s Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ is_sentence() ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°ΠΉΡ‚Π΅ эту строку Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ find_char().

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

Π£ΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ 6.16. НСсмотря Π½Π° Ρ‚ΠΎ Ρ‡Ρ‚ΠΎ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π°Ρ функция допустима, ΠΎΠ½Π° ΠΌΠ΅Π½Π΅Π΅ ΠΏΠΎΠ»Π΅Π·Π½Π°, Ρ‡Π΅ΠΌ ΠΌΠΎΠ³Π»Π° Π±Ρ‹ Π±Ρ‹Ρ‚ΡŒ. ВыявитС ΠΈ ΠΈΡΠΏΡ€Π°Π²ΡŒΡ‚Π΅ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅ этой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ:

bool is_empty(string& s) { return s.empty(); }

Π£ΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ 6.17. ΠΠ°ΠΏΠΈΡˆΠΈΡ‚Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‰ΡƒΡŽ, содСрТит Π»ΠΈ строка ΠΊΠ°ΠΊΠΈΠ΅-Π½ΠΈΠ±ΡƒΠ΄ΡŒ Π·Π°Π³Π»Π°Π²Π½Ρ‹Π΅ Π±ΡƒΠΊΠ²Ρ‹. ΠΠ°ΠΏΠΈΡˆΠΈΡ‚Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄ΡΡ‰ΡƒΡŽ всю строку Π² Π½ΠΈΠΆΠ½ΠΈΠΉ рСгистр. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Π½Π½Ρ‹Π΅ Π² этих функциях ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ ΠΈΠΌΠ΅ΡŽΡ‚ Ρ‚ΠΎΡ‚ ΠΆΠ΅ Ρ‚ΠΈΠΏ? Если Π΄Π°, Ρ‚ΠΎ ΠΏΠΎΡ‡Π΅ΠΌΡƒ? Если Π½Π΅Ρ‚, Ρ‚ΠΎ Ρ‚ΠΎΠΆΠ΅ ΠΏΠΎΡ‡Π΅ΠΌΡƒ?

Π£ΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ 6.18. ΠΠ°ΠΏΠΈΡˆΠΈΡ‚Π΅ объявлСния для ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΈΠ· ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ. Написав объявлСния, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ имя Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ для обозначСния Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ ΠΎΠ½Π° Π΄Π΅Π»Π°Π΅Ρ‚.

(a) Π€ΡƒΠ½ΠΊΡ†ΠΈΡ compare() Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠ° bool ΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ Π΄Π²Π° ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°, ΡΠ²Π»ΡΡŽΡ‰ΠΈΠ΅ΡΡ ссылками Π½Π° класс matrix.

(b) Π€ΡƒΠ½ΠΊΡ†ΠΈΡ change_val() Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€ vector<int> ΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ Π΄Π²Π° ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°: ΠΎΠ΄ΠΈΠ½ Ρ‚ΠΈΠΏΠ° int, Π° Π²Ρ‚ΠΎΡ€ΠΎΠΉ ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€ для Π²Π΅ΠΊΡ‚ΠΎΡ€Π° vector<int>.

Π£ΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ 6.19. Π‘ ΡƒΡ‡Π΅Ρ‚ΠΎΠΌ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π³ΠΎ объявлСния ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚Π΅, ΠΊΠ°ΠΊΠΈΠ΅ Π²Ρ‹Π·ΠΎΠ²Ρ‹ допустимы, Π° ΠΊΠ°ΠΊΠΈΠ΅ Π½Π΅Ρ‚. ΠžΠ±ΡŠΡΡΠ½ΠΈΡ‚Π΅, ΠΏΠΎΡ‡Π΅ΠΌΡƒ ΠΎΠ½ΠΈ нСдопустимы.

double calc(double);

int count(const string &, char);

int sum(vector<int>::iterator, vector<int>::iterator, int);

vector<int> vec(10);

(a) calc(23.4, 55.1); (b) count("abcda", 'a');

(c) calc(66);         (d) sum(vec.begin(), vec.end(), 3.8);

Π£ΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ 6.20. Когда ссылочныС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ ссылками Π½Π° константу? Π§Ρ‚ΠΎ Π±ΡƒΠ΄Π΅Ρ‚, Ссли ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ простой ссылкой, ΠΊΠΎΠ³Π΄Π° это ΠΌΠΎΠ³Π»Π° Π±Ρ‹Ρ‚ΡŒ ссылка Π½Π° константу?

6.2.4. ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ Π² Π²ΠΈΠ΄Π΅ массива

ΠœΠ°ΡΡΠΈΠ²Ρ‹ ΠΎΠ±Π»Π°Π΄Π°ΡŽΡ‚ двумя особСнностями, Π²Π»ΠΈΡΡŽΡ‰ΠΈΠΌΠΈ Π½Π° ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΈ использованиС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‰ΠΈΡ… с массивами: массив нСльзя ΡΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ (см. Ρ€Π°Π·Π΄Π΅Π» 3.5.1), имя массива ΠΏΡ€ΠΈ использовании автоматичСски прСобразуСтся Π² ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° Π΅Π³ΠΎ ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ элСмСнт (см. Ρ€Π°Π·Π΄Π΅Π» 3.5.3). ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ массив нСльзя, Π΅Π³ΠΎ нСльзя ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΏΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΡŽ. Π’Π°ΠΊ ΠΊΠ°ΠΊ имя массива автоматичСски прСобразуСтся Π² ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ, ΠΏΡ€ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π΅ массива Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ фактичСски пСрСдаСтся ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° Π΅Π³ΠΎ ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ элСмСнт.

Π₯отя ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ массив ΠΏΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΡŽ нСльзя, Π²ΠΏΠΎΠ»Π½Π΅ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ выглядит ΠΊΠ°ΠΊ массив:

// нСсмотря Π½Π° внСшний Π²ΠΈΠ΄,

// ΡΡ‚ΠΈ Ρ‚Ρ€ΠΈ объявлСния Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ print эквивалСнтны

// Ρƒ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π΅ΡΡ‚ΡŒ ΠΎΠ΄ΠΈΠ½ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ Ρ‚ΠΈΠΏΠ° const int*

void print(const int*);

void print(const int[]);   // дСмонстрация намСрСния ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ массив

void print(const int[10]); // Ρ€Π°Π·ΠΌΠ΅Ρ€Π½ΠΎΡΡ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для докумСнтирования

НСзависимо ΠΎΡ‚ внСшнСго Π²ΠΈΠ΄Π°, эти объявлСния эквивалСнтны: Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΌ объявлСна функция с ΠΎΠ΄Π½ΠΈΠΌ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠΌ Ρ‚ΠΈΠΏΠ° const int*. Когда компилятор провСряСт Π²Ρ‹Π·ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ print(), ΠΎΠ½ выясняСт Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Ρ‚ΠΈΠΏΠΎΠΌ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° являСтся const int*:

int i = 0, j[2] = {0, 1};

print(&i); // ok: &i - int*

print(j);  // ok: j прСобразуСтся Π² int*, ΡƒΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‰ΠΈΠΉ Π½Π° j[0]

Если ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ массив Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ print(), Ρ‚ΠΎ этот Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ автоматичСски прСобразуСтся Π² ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ элСмСнт Π² массивС; Ρ€Π°Π·ΠΌΠ΅Ρ€ массива Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ значСния.

Подобно Π»ΡŽΠ±ΠΎΠΌΡƒ ΠΊΠΎΠ΄Ρƒ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ массивы, Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΏΠΎΠ»ΡƒΡ‡Π°ΡŽΡ‰ΠΈΠ΅ Π² качСствС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² массив, Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π½Π΅Π²Ρ‹Ρ…ΠΎΠ΄ Π·Π° ΠΏΡ€Π΅Π΄Π΅Π»Ρ‹ Π΅Π³ΠΎ Π³Ρ€Π°Π½ΠΈΡ†.

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

ИспользованиС ΠΌΠ°Ρ€ΠΊΠ΅Ρ€Π° для опрСдСлСния продолТСния массива

ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ ΠΊ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΡŽ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°ΠΌΠΈ Π² Π²ΠΈΠ΄Π΅ массива Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚, Ρ‡Ρ‚ΠΎΠ±Ρ‹ массив сам содСрТал ΠΌΠ°Ρ€ΠΊΠ΅Ρ€ ΠΊΠΎΠ½Ρ†Π°. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠΌ этого ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Π° ΡΠ²Π»ΡΡŽΡ‚ΡΡ ΡΠΈΠΌΠ²ΠΎΠ»ΡŒΠ½Ρ‹Π΅ строки Π² стилС Π‘ (см. Ρ€Π°Π·Π΄Π΅Π» 3.5.4). Π‘Ρ‚Ρ€ΠΎΠΊΠΈ Π² стилС Π‘ хранятся Π² ΡΠΈΠΌΠ²ΠΎΠ»ΡŒΠ½Ρ‹Ρ… массивах, послСдний символ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… являСтся Π½ΡƒΠ»Π΅Π²Ρ‹ΠΌ. Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‰ΠΈΠ΅ со строками Π² стилС Π‘, ΠΏΡ€Π΅ΠΊΡ€Π°Ρ‰Π°ΡŽΡ‚ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ массива, ΠΊΠΎΠ³Π΄Π° Π²ΡΡ‚Ρ€Π΅Ρ‡Π°ΡŽΡ‚ Π½ΡƒΠ»Π΅Π²ΠΎΠΉ символ:

void print(const char *cp) {

 if (cp)      // Ссли cp Π½Π΅ Π½ΡƒΠ»Π΅Π²ΠΎΠΉ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ

  while (*cp) // ΠΏΠΎΠΊΠ° ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅ΠΌΡ‹ΠΉ символ Π½Π΅ являСтся Π½ΡƒΠ»Π΅Π²Ρ‹ΠΌ

   cout << *cp++; // вывСсти символ ΠΈ пСрСвСсти ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ

}