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

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«Π‘ΠΏΡ€Π°Π²ΠΎΡ‡Π½ΠΎΠ΅ руководство ΠΏΠΎ C++Β». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 17

Автор Π‘ΡŒΡΡ€Π½ Бтраустрап

float y[4][3] = {

 {1}, {2}, {3}, {4}

};

инициализируСтся ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ столбСц y (ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ рассматриваСтся ΠΊΠ°ΠΊ Π΄Π²ΡƒΠΌΠ΅Ρ€Π½Ρ‹ΠΉ массив), Π° ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Π΅ столбцы ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°ΡŽΡ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 0.

Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡ массива ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Ρ‚ΠΈΠΏΠ° класс с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ конструкторов описываСтся Π² Β§R.12.6.1.

Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ для объСдинСния Π±Π΅Π· конструктора Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ ΠΈΠ»ΠΈ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΌ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ΠΌ Ρ‚ΠΈΠΏΠ° объСдинСния, ΠΈΠ»ΠΈ Π·Π°ΠΊΠ»ΡŽΡ‡Π΅Π½Π½Ρ‹ΠΌ Π² Ρ„ΠΈΠ³ΡƒΡ€Π½Ρ‹Π΅ скобки, ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ΠΎΠΌ ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ Ρ‡Π»Π΅Π½Π° объСдинСния, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€,

union u {i nt a; char* b; };


u a = {1};

u b = a;

u c = 1; // ошибка

u d = {0, "asdf"}; // ошибка

u e = {"asdf"}; // ошибка

Число ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ΠΎΠ² Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΠΏΡ€Π΅Π²Ρ‹ΡˆΠ°Ρ‚ΡŒ числа Ρ‡Π»Π΅Π½ΠΎΠ² ΠΈΠ»ΠΈ элСмСнтов, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΡŽΡ‚ΡΡ. НапримСр, ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π°Ρ инициализация ΠΎΡˆΠΈΠ±ΠΎΡ‡Π½Π°:

char cv[4] = {'a', 's', 'd', 'f', 0}; // ошибка

R.8.4.2 Π‘ΠΈΠΌΠ²ΠΎΠ»ΡŒΠ½Ρ‹Π΅ массивы

Массив символов (Π½Π΅Π²Π°ΠΆΠ½ΠΎ, Π·Π½Π°ΠΊΠΎΠ²Ρ‹Ρ… ΠΈΠ»ΠΈ Π±Π΅Π·Π·Π½Π°ΠΊΠΎΠ²Ρ‹Ρ…) ΠΌΠΎΠΆΠ½ΠΎ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ строкой-Π»ΠΈΡ‚Π΅Ρ€Π°Π»ΠΎΠΌ: символы строки ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΡŽΡ‚ элСмСнты массива. Π‘Π»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π΄Π°Π΅Ρ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ символьного массива, элСмСнты ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΡŽΡ‚ΡΡ строкой:

char msg[] = "Syntax error on line %s\n";

Π—Π°ΠΌΠ΅Ρ‚ΠΈΠΌ, Ρ‡Ρ‚ΠΎ ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ '\n' Π·Π°Π΄Π°Π΅Ρ‚ ΠΎΠ΄ΠΈΠ½ символ, ΠΈ ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ добавляСтся Π·Π°Π²Π΅Ρ€ΡˆΠ°ΡŽΡ‰ΠΈΠΉ символ '\0', sizeof(msg) Ρ€Π°Π²Π½ΠΎ 25.

НСльзя Π·Π°Π΄Π°Π²Π°Ρ‚ΡŒ большС ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ΠΎΠ², Ρ‡Π΅ΠΌ Π΅ΡΡ‚ΡŒ элСмСнтов Π² массивС, поэтому ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΎΡˆΠΈΠ±ΠΎΡ‡Π΅Π½: здСсь Π½Π΅Ρ‚ мСста для ΠΏΠΎΠ΄Ρ€Π°Π·ΡƒΠΌΠ΅Π²Π°ΡŽΡ‰Π΅Π³ΠΎΡΡ символа ΠΊΠΎΠ½Ρ†Π° строки ('\0'):

char cv[4] = "asdf"; // ошибка

R.8.4.3 Бсылки

ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Π°Ρ, описанная ΠΊΠ°ΠΊ T&, Ρ‚.Π΅. "ссылка Π½Π° Ρ‚ΠΈΠΏ T" (Β§R.8.2.2), Π΄ΠΎΠ»ΠΆΠ½Π° ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ Ρ‚ΠΈΠΏΠ° T ΠΈΠ»ΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Ρ‚ΡŒ ΠΊ Ρ‚ΠΈΠΏΡƒ T, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€,

void f()

{

 int i;

 int& r = i; // `r' ссылаСтся Π½Π° `i'

 r = 1; // `i' ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 1

 int* p = &r; // `p' ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π½Π° `i'

 int& rr = r; // `rr' ссылаСтся Π½Π° Ρ‚ΠΎ, Π½Π° Ρ‡Ρ‚ΠΎ ΡΡΡ‹Π»Π°Π»ΠΎΡΡŒ `r',

  // Ρ‚.Π΅. Π½Π° `i'

};

Бсылку послС ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ нСльзя ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ½Π° ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π°Π»Π° Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚. ΠžΡ‚ΠΌΠ΅Ρ‚ΠΈΠΌ, Ρ‡Ρ‚ΠΎ инициализация ссылки трактуСтся совсСм Π½Π΅ Ρ‚Π°ΠΊ, ΠΊΠ°ΠΊ присваиваниС ссылкС. ΠŸΠ΅Ρ€Π΅Π΄Π°Ρ‡Π° ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° (Β§R.5.2.2) ΠΈ опСрация Π²ΠΎΠ·Π²Ρ€Π°Ρ‚Π° значСния Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ (Β§R.6.6.3) ΡΡ‡ΠΈΡ‚Π°ΡŽΡ‚ΡΡ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠ΅ΠΉ.

Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ для ссылки ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² описании ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° (Β§R.8.2.5), Π² описании Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ³ΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ Ρ‚ΠΈΠΏΠ°, Π² описании Ρ‡Π»Π΅Π½Π° класса ΠΏΡ€ΠΈ описании самого класса (Β§R.9.2) ΠΈ Ρ‚Π°ΠΌ, Π³Π΄Π΅ явно использована спСцификация extern, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€,

int& r1; // ошибка: Π½Π΅Ρ‚ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ

extern int& r2; // Π½ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎ

Если ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ для ссылки Π½Π° Ρ‚ΠΈΠΏ T являСтся адрСсом Ρ‚ΠΈΠΏΠ° T ΠΈΠ»ΠΈ Ρ‚ΠΈΠΏΠΎΠΌ, ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹ΠΌ ΠΎΡ‚ T (Β§R.10), для ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ T слуТит доступным Π±Π°Π·ΠΎΠ²Ρ‹ΠΌ Ρ‚ΠΈΠΏΠΎΠΌ (Β§R.4.6), ссылка Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π°Ρ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, Π·Π°Π΄Π°Π½Π½ΠΎΠ΅ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ΠΎΠΌ. Π˜Π½Π°Ρ‡Π΅, Π² Ρ‚ΠΎΠΌ ΠΈ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‚ΠΎΠΌ случаС, ΠΊΠΎΠ³Π΄Π° ссылка ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ со спСцификациСй const, Π±ΡƒΠ΄Π΅Ρ‚ создан ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Ρ‚ΠΈΠΏΠ° T ΠΈ ΠΏΡ€ΠΎΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ, Π·Π°Π΄Π°Π½Π½Ρ‹ΠΌ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ΠΎΠΌ.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ ссылка ΠΈΠ³Ρ€Π°Π΅Ρ‚ Ρ€ΠΎΠ»ΡŒ ΠΈΠΌΠ΅Π½ΠΈ этого ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€,

double d = 1.0;


double& rd = d; // rd ссылаСтся Π½Π° `d'

const double& rcd = d; // rcd ссылаСтся Π½Π° `d'


double& rd2 = 1; // ошибка: нСсоотвСтствиС Ρ‚ΠΈΠΏΠ°

const double& rcd2 = 1; // rcd2 ссылаСтся Π½Π° Π²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚

 // со Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ `1'

Бсылку Π½Π° volatile T ΠΌΠΎΠΆΠ½ΠΎ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ Ρ‚ΠΈΠΏΠ° volatile T ΠΈΠ»ΠΈ просто T, Π½ΠΎ Π½Π΅ const T. Бсылку Π½Π° const T ΠΌΠΎΠΆΠ½ΠΎ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ const T, просто T ΠΈΠ»ΠΈ Ρ‡Π΅ΠΌ-Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Ρ‚ΡŒ Π² Ρ‚ΠΈΠΏ T, Π½ΠΎ Π½Π΅ volatile T. Бсылку Π½Π° Ρ‚ΠΈΠΏ T (Π±Π΅Π· const ΠΈΠ»ΠΈ volatile) ΠΌΠΎΠΆΠ½ΠΎ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ Ρ‚ΠΈΠΏΠ° T.

ВрСмя ΠΆΠΈΠ·Π½ΠΈ Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°, созданного ΠΏΡ€ΠΈ описанной ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ, опрСдСляСтся Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ ΠΎΠ±Π»Π°ΡΡ‚ΡŒΡŽ видимости, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΎΠ½ Π±Ρ‹Π» создан (Β§R.3.5). ΠžΡ‚ΠΌΠ΅Ρ‚ΠΈΠΌ, Ρ‡Ρ‚ΠΎ ссылку Π½Π° класс B ΠΌΠΎΠΆΠ½ΠΎ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ класса D ΠΏΡ€ΠΈ условии, Ρ‡Ρ‚ΠΎ Π’ являСтся ΠΎΠ΄Π½ΠΎΠ·Π½Π°Ρ‡Π½ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΌ ΠΈ доступным Π±Π°Π·ΠΎΠ²Ρ‹ΠΌ классом для D (Ρ‚ΠΎΠ³Π΄Π° говорят, Ρ‡Ρ‚ΠΎ "D Π΅ΡΡ‚ΡŒ B"), см. Β§R.4.7.

R.9 классы

Класс Π΅ΡΡ‚ΡŒ Ρ‚ΠΈΠΏ. Π•Π³ΠΎ имя ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΊΠ°ΠΊ имя-класса (Β§R.9.1), Ρ‚.Π΅. становится Π·Π°Ρ€Π΅Π·Π΅Ρ€Π²ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΌ словом Π² Π΅Π³ΠΎ области видимости.

имя-класса:

 ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€

Для образования конструкции имя-класса ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ спСцификации-класса ΠΈ спСцификации-слоТного-Ρ‚ΠΈΠΏΠ° (Β§R.7.1.6). ΠžΠ±ΡŠΠ΅ΠΊΡ‚ класса состоит ΠΈΠ· ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ (Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ пустой) Ρ‡Π»Π΅Π½ΠΎΠ².

спСцификация-класса:

 Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ-класса {список-Ρ‡Π»Π΅Π½ΠΎΠ² opt}

заголовок-класса:

 ΡΠ»ΡƒΠΆΠ΅Π±Π½ΠΎΠ΅-слово-класса ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ opt спСц-Π±Π°Π·ΠΎΠ²Ρ‹Ρ… opt

 ΡΠ»ΡƒΠΆΠ΅Π±Π½ΠΎΠ΅-слово-класса имя-класса спСц-Π±Π°Π·ΠΎΠ²Ρ‹Ρ… opt

слуТСбноС-слово-класса:

 class

 struct

 union

Имя класса ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π² качСствС конструкции имя-класса Π΄Π°ΠΆΠ΅ Π² спискС-Ρ‡Π»Π΅Π½ΠΎΠ² самого этого класса. ΠžΠ±Ρ‹Ρ‡Π½ΠΎ ΡΠΏΠ΅Ρ†ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΡŽ-класса Π½Π°Π·Ρ‹Π²Π°ΡŽΡ‚ описаниСм класса. Класс считаСтся ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΌ, ΠΊΠ°ΠΊ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ появится спСцификация-класса, нСсмотря Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Π΅Π³ΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ-Ρ‡Π»Π΅Π½Ρ‹ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ Π΅Ρ‰Π΅ Π½Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Ρ‹.

ΠžΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ пустого класса ΠΈΠΌΠ΅ΡŽΡ‚ Π½Π΅Π½ΡƒΠ»Π΅Π²ΠΎΠΉ Ρ€Π°Π·ΠΌΠ΅Ρ€.

ΠžΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Ρ‚ΠΈΠΏΠ° класс ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΈΡΠ²Π°ΠΈΠ²Π°Ρ‚ΡŒ, ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Ρ‚ΡŒ Π² качСствС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ΡŒ Π² качСствС значСния, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ³ΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ (Π·Π° ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Ρ‚Π΅Ρ… классов, для ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΎ, см. Β§R.12.8). Π”Ρ€ΡƒΠ³ΠΈΠ΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ, Ρ‚Π°ΠΊΠΈΠ΅, ΠΊΠ°ΠΊ сравнСниС Π½Π° равСнство, ΠΌΠΎΠ³ΡƒΡ‚ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡ‚ΡŒΡΡ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ, см. Β§R.13.4.

Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€ΠΎΠΉ называСтся класс, описанный со слуТСбным-словом-класса struct; Π΅Π΅ Ρ‡Π»Π΅Π½Ρ‹ ΠΈ Π±Π°Π·ΠΎΠ²Ρ‹Π΅ классы (Β§R.10) ΡΡ‡ΠΈΡ‚Π°ΡŽΡ‚ΡΡ ΠΎΠ±Ρ‰ΠΈΠΌΠΈ ΠΏΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΡŽ (Β§R.11). ОбъСдинСниСм называСтся класс, описанный со слуТСбным-словом-класса union; Π΅Π³ΠΎ Ρ‡Π»Π΅Π½Ρ‹ ΡΡ‡ΠΈΡ‚Π°ΡŽΡ‚ΡΡ ΠΎΠ±Ρ‰ΠΈΠΌΠΈ ΠΏΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΡŽ, ΠΈ Π² любой ΠΌΠΎΠΌΠ΅Π½Ρ‚ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ объСдинСниС содСрТит Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ Ρ‡Π»Π΅Π½ (Β§R.9.5).

R.9.1 ИмСна класса

ОписаниС класса ΠΏΠΎΡ€ΠΎΠΆΠ΄Π°Π΅Ρ‚ Π½ΠΎΠ²Ρ‹ΠΉ Ρ‚ΠΈΠΏ. НапримСр, Π½ΠΈΠΆΠ΅ ΠΎΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‚ΡΡ Ρ‚Ρ€ΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ Ρ‚Ρ€Π΅Ρ… Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… Ρ‚ΠΈΠΏΠΎΠ²:

struct X { int a; };

struct Y { int a; };

X a1;

Y a2;

int a3;

ΠžΡ‚ΡΡŽΠ΄Π° слСдуСт, Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΈΠ΅ присваивания приводят ΠΊ Π½Π΅ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΠΈΡŽ Ρ‚ΠΈΠΏΠΎΠ²:

a1 = a2; // ошибка: Y присваиваСтся X

a1 = a3; // ошибка: int присваиваСтся X

НиТС описываСтся ΠΏΠ΅Ρ€Π΅Π³Ρ€ΡƒΠ·ΠΊΠ° (Β§R.13) Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ f(), Π° Π½Π΅ просто ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎΠ΅ описаниС Ρ‚ΠΎΠΉ ΠΆΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ:

int f(X);

int f(Y);

По Ρ‚ΠΎΠΉ ΠΆΠ΅ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π΅ нСльзя Π΄Π²Π°ΠΆΠ΄Ρ‹ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡ‚ΡŒ класс, это Π²ΠΈΠ΄Π½ΠΎ ΠΈΠ· ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° Π½ΠΈΠΆΠ΅, Π³Π΄Π΅ Π΄Π²Π°ΠΆΠ΄Ρ‹ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ S:

struct S { int a; };

struct S { int a; }; // ошибка, ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎΠ΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅

ОписаниС класса Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ имя класса Π² Ρ‚Ρƒ ΠΎΠ±Π»Π°ΡΡ‚ΡŒ видимости, Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΎΠ½ΠΎ ΠΏΡ€ΠΎΠΈΠ·ΠΎΡˆΠ»ΠΎ, ΠΈ Π·Π°ΠΊΡ€Ρ‹Π²Π°Π΅Ρ‚ любой класс, ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ΠΈΠ»ΠΈ Π΄Ρ€ΡƒΠ³ΠΎΠ΅ описаниС этого ΠΈΠΌΠ΅Π½ΠΈ Π² ΠΎΠ±ΡŠΠ΅ΠΌΠ»ΡŽΡ‰Π΅ΠΉ области видимости (Β§R.3.2). Если имя класса описано Π² Ρ‚Π°ΠΊΠΎΠΉ области видимости, Π³Π΄Π΅ ΡƒΠΆΠ΅ Π±Ρ‹Π» описан ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ с Ρ‚Π°ΠΊΠΈΠΌ ΠΆΠ΅ ΠΈΠΌΠ΅Π½Π΅ΠΌ, функция ΠΈΠ»ΠΈ элСмСнт пСрСчислСния, Ρ‚ΠΎ ΠΎΠ±Ρ€Π°Ρ‰Π°Ρ‚ΡŒΡΡ ΠΊ классу ΠΌΠΎΠΆΠ½ΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ конструкции спСцификация-слоТного-Ρ‚ΠΈΠΏΠ° (Β§R.7.1.6), Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€:

struct stat {

 //…

};


stat gstt; // просто `stat' ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для

 // опрСдСлСния ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ

int stat(struct stat*); // ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ `stat' ΠΊΠ°ΠΊ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ


void f()

{

 struct stat* ps; // Π½ΡƒΠΆΠ΅Π½ прСфикс struct

 // для задания структуры stat

 //…

 stat(ps); // Π²Ρ‹Π·ΠΎΠ² stat()

 //…

}

ΠšΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡ спСцификация-слоТного-Ρ‚ΠΈΠΏΠ° вмСстС со слуТСбным-словом-класса, Π½ΠΎ Π±Π΅Π· описания ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° ΠΈΠ»ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠ»ΡƒΠΆΠΈΡ‚ΡŒ для задания ΠΈΠΌΠ΅Π½ΠΈ класса, ΠΊΠ°ΠΊ ΠΈ описаниС класса, ΠΎΠ΄Π½Π°ΠΊΠΎ Π² этом случаС класс Π½Π΅ считаСтся ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΌ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€:

struct s { int a; };


void g()

{

 struct s; // скрываСт Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½ΡƒΡŽ структуру `s'

 s* p; // ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ локальная структура `s'

 struct s { char* p; }; // описаниС локальной структуры `s'

}

Π’Π°ΠΊΠΈΠ΅ ΠΏΡ€Π°Π²ΠΈΠ»Π° ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ классам ΡΡΡ‹Π»Π°Ρ‚ΡŒΡΡ Π΄Ρ€ΡƒΠ³ Π½Π° Π΄Ρ€ΡƒΠ³Π° ΠΏΡ€ΠΈ ΠΈΡ… описании, ΠΏΡ€ΠΈΠΌΠ΅Ρ€,

class vector;


class matrix {

 //…

 friend vector operator*(matrix&, vector&);

};


class vector {

 //…

 friend vector operator*(matrix&, vector&);

};

ОписаниС friend (друТСствСнныС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ) обсуТдаСтся Π² Β§R.11.4, Π° функция operator Π² Β§R.13.4. Если класс, ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹ΠΉ ΠΊΠ°ΠΊ Π΄Ρ€ΡƒΠ³, ΠΏΠΎΠΊΠ° Π΅Ρ‰Π΅ Π½Π΅ описан, Π΅Π³ΠΎ имя считаСтся ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠ°Ρ‰ΠΈΠΌ Ρ‚ΠΎΠΉ ΠΆΠ΅ области видимости, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ находится имя класса, содСрТащСго описаниС friend (Β§R.11.4).

Π’ описании ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² ΠΈΠ»ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΌΠΎΠΆΠ½ΠΎ Ρ‚Π°ΠΊΠΆΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡŽ спСцификация-слоТного-Ρ‚ΠΈΠΏΠ° (Β§R.7.1.6). Π•Π΅ использованиС отличаСтся ΠΎΡ‚ описания класса Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ Ссли класс, Ρ‡ΡŒΠ΅ имя ΡƒΠΊΠ°Π·Π°Π½ΠΎ Π² спСцификации, находится Π² Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ области видимости, Ρ‚ΠΎ имя ΠΈΠ· этой спСцификации Π±ΡƒΠ΄Π΅Ρ‚ ΡΡΡ‹Π»Π°Ρ‚ΡŒΡΡ Π½Π° Π½Π΅Π³ΠΎ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€: