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

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

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

struct s { int a; }


void g()

{

 struct* s p = new s; // ΠΎΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅ ΠΊ глобальной `s'

 p-β€Ίa = 1;

}

Имя считаСтся описанным сразу ΠΆΠ΅ послС появлСния Π΅Π³ΠΎ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π° Π² описании. ΠžΡ‚ΡΡŽΠ΄Π° слСдуСт, Ρ‡Ρ‚ΠΎ Π² описании

class A * A;

A Π² Π½Π°Ρ‡Π°Π»Π΅ задаСтся, ΠΊΠ°ΠΊ имя класса, Π° Π·Π°Ρ‚Π΅ΠΌ ΠΎΠ½ΠΎ пСрСопрСдСляСтся ΠΊΠ°ΠΊ имя указатСля Π½Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ этого класса, поэтому для обозначСния этого класса слСдуСт ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΡΠΏΠ΅Ρ†ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΡŽ-слоТного Ρ‚ΠΈΠΏΠ° class A. Π’Π°ΠΊΠΎΠ΅ "Ρ‚Ρ€ΡŽΠΊΠ°Ρ‡Π΅ΡΡ‚Π²ΠΎ" с ΠΈΠΌΠ΅Π½Π°ΠΌΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ Π½Π΅Π΄ΠΎΡƒΠΌΠ΅Π½ΠΈΠ΅, ΠΈ Π»ΡƒΡ‡ΡˆΠ΅ Π΅Π³ΠΎ ΠΈΠ·Π±Π΅Π³Π°Ρ‚ΡŒ.

ΠšΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡ имя-typedef (Β§R.7.1.3) ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ класс ΠΈ считаСтся ΠΈΠΌΠ΅Π½Π΅ΠΌ-класса, см. Ρ‚Π°ΠΊΠΆΠ΅ Β§R.7.1.3.

R.9.2 Π§Π»Π΅Π½Ρ‹ класса

список-Ρ‡Π»Π΅Π½ΠΎΠ²:

 ΠΎΠΏΠΈΡΠ°Π½ΠΈΠ΅-Ρ‡Π»Π΅Π½Π° список-Ρ‡Π»Π΅Π½ΠΎΠ² opt

 ΡΠΏΠ΅Ρ†ΠΈΡ„икация-доступа : список-Ρ‡Π»Π΅Π½ΠΎΠ² opt

описаниС-Ρ‡Π»Π΅Π½Π°:

 ΡΠΏΠ΅Ρ†ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ-описания opt список-описатСлСй-Ρ‡Π»Π΅Π½ΠΎΠ² opt ;

 ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ; opt

 ΡƒΡ‚ΠΎΡ‡Π½Π΅Π½Π½ΠΎΠ΅-имя ;

список-описатСлСй-Ρ‡Π»Π΅Π½ΠΎΠ²:

 ΠΎΠΏΠΈΡΠ°Ρ‚Π΅Π»ΡŒ-Ρ‡Π»Π΅Π½Π°

 ΡΠΏΠΈΡΠΎΠΊ-описатСлСй-Ρ‡Π»Π΅Π½ΠΎΠ² , ΠΎΠΏΠΈΡΠ°Ρ‚Π΅Π»ΡŒ-Ρ‡Π»Π΅Π½Π°

ΠΎΠΏΠΈΡΠ°Ρ‚Π΅Π»ΡŒ-Ρ‡Π»Π΅Π½Π°:

 ΠΎΠΏΠΈΡΠ°Ρ‚Π΅Π»ΡŒ спСцификация-чистой opt

 ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ opt : Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅-константа

спСцификация-чистой:

 = 0

Π‘ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ конструкции список-Ρ‡Π»Π΅Π½ΠΎΠ² ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠΏΠΈΡΠ°Ρ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅, Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, классы, элСмСнты пСрСчислСния (Β§R.7.2), Π±ΠΈΡ‚ΠΎΠ²Ρ‹Π΅ поля, Π΄Ρ€ΡƒΠ·Π΅ΠΉ (Β§R.11.4) ΠΈ ΠΈΠΌΠ΅Π½Π° Ρ‚ΠΈΠΏΠΎΠ² (Β§R.7.1.3, Β§R.9.1). ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, список-Ρ‡Π»Π΅Π½ΠΎΠ² ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ описания, ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°ΡŽΡ‰ΠΈΠ΅ доступ ΠΊ ΠΈΠΌΠ΅Π½Π°ΠΌ Ρ‡Π»Π΅Π½ΠΎΠ², см. Β§R.11.3. Никакой Ρ‡Π»Π΅Π½ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π΄Π²Π°ΠΆΠ΄Ρ‹ описан Π² спискС-Ρ‡Π»Π΅Π½ΠΎΠ². Бписок-Ρ‡Π»Π΅Π½ΠΎΠ² опрСдСляСт всС мноТСство Ρ‡Π»Π΅Π½ΠΎΠ² Π΄Π°Π½Π½ΠΎΠ³ΠΎ класса, Ρ‚.Π΅. нСльзя Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π΅Ρ‰Π΅ ΠΎΠ΄ΠΈΠ½ Ρ‡Π»Π΅Π½ Π² ΠΊΠ°ΠΊΠΎΠΌ-Π»ΠΈΠ±ΠΎ Π΄Ρ€ΡƒΠ³ΠΎΠΌ описании.

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

Π§Π»Π΅Π½ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ ΡΠΏΠ΅Ρ†ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΡŽ auto, extern ΠΈΠ»ΠΈ register.

ΠšΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡ спСцификации-описания ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΡ‚ΡΡƒΡ‚ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² описании Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. ΠšΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡ список-описатСлСй-Ρ‡Π»Π΅Π½ΠΎΠ² ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠΏΡƒΡΠΊΠ°Ρ‚ΡŒΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ послС конструкций спСцификация-класса, спСцификация-пСрСчислСния ΠΈΠ»ΠΈ спСцификация-описания, Ссли послСдняя ΠΈΠΌΠ΅Π΅Ρ‚ Π²ΠΈΠ΄ friend спСцификация-слоТного-Ρ‚ΠΈΠΏΠ°. ΠšΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡ спСцификация-чистой ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΡ€ΠΈ описании Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ (Β§R.10.2).

Если Ρ‡Π»Π΅Π½Ρ‹ ΡΠ²Π»ΡΡŽΡ‚ΡΡ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌΠΈ классов, Ρ‚ΠΎ эти классы Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ Ρ€Π°Π½Π΅Π΅ описаны. Π’ частности, класс C1 Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ класса C1, Π½ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ ΠΈΠ»ΠΈ ссылку Π½Π° класс C1. Если Π² Ρ‚ΠΈΠΏΠ΅ нСстатичСского Ρ‡Π»Π΅Π½Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ массив, Ρ‚ΠΎ всС Ρ€Π°Π·ΠΌΠ΅Ρ€Ρ‹ всСх индСксов массива Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ ΡƒΠΊΠ°Π·Π°Π½Ρ‹.

ΠŸΡ€ΠΈΠ²Π΅Π΄Π΅ΠΌ простой ΠΏΡ€ΠΈΠΌΠ΅Ρ€ описания класса:

struct tnode {

 char tword[20];

 int count;

 tnode *left;

 tnode *right;

};

Π—Π΄Π΅ΡΡŒ класс содСрТит массив ΠΈΠ· Π΄Π²Π°Π΄Ρ†Π°Ρ‚ΠΈ символов, Ρ†Π΅Π»ΠΎΠ΅ ΠΈ Π΄Π²Π° указатСля Π½Π° Ρ‚Ρƒ ΠΆΠ΅ структуру. ПослС появлСния Ρ‚Π°ΠΊΠΎΠ³ΠΎ описания ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅:

tnode s, *sp;

Π·Π°Π΄Π°Π΅Ρ‚ s ΠΊΠ°ΠΊ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Ρ‚ΠΈΠΏΠ° tnode ΠΈ sp ΠΊΠ°ΠΊ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° tnode. Π‘ ΡƒΡ‡Π΅Ρ‚ΠΎΠΌ этих описаний s-β€Ίcount ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ Ρ‡Π»Π΅Π½ count структуры, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ sp; s.left ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ left Π½Π° ΠΏΠΎΠ΄Π΄Π΅Ρ€Π΅Π²ΠΎ структуры s; s.right-β€Ίtword[0] ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ символ Ρ‡Π»Π΅Π½Π° tword ΠΏΠΎΠ΄Π΄Π΅Ρ€Π΅Π²Π° структуры s, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ right.

НСстатичСскиС Ρ‡Π»Π΅Π½Ρ‹ класса, ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Π΅ ΠΈ описанныС подряд ΠΈ Π±Π΅Π· использования спСцификации-доступа, Ρ€Π°Π·ΠΌΠ΅Ρ‰Π°ΡŽΡ‚ΡΡ Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Ρ‚ΠΈΠΏΠ° класс Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ·ΠΆΠ΅ описанныС Ρ‡Π»Π΅Π½Ρ‹ ΠΈΠΌΠ΅ΡŽΡ‚ большиС адрСса. ΠŸΠΎΡ€ΡΠ΄ΠΎΠΊ размСщСния Ρ‚Π°ΠΊΠΈΡ… Ρ‡Π»Π΅Π½ΠΎΠ², Ссли ΠΈΡ… описаниС пСрСмСТаСтся описаниями со спСцификациСй-доступа, зависит ΠΎΡ‚ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ (Β§R.11.1). ΠŸΡ€ΠΈΠ½ΡΡ‚Ρ‹Π΅ Π² Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΏΡ€Π°Π²ΠΈΠ»Π° выравнивания ΠΌΠΎΠ³ΡƒΡ‚ привСсти ΠΊ Ρ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ Π΄Π²Π° сосСдних Ρ‡Π»Π΅Π½Π° Π½Π΅ Π±ΡƒΠ΄ΡƒΡ‚ Ρ€Π°ΡΠΏΠΎΠ»Π°Π³Π°Ρ‚ΡŒΡΡ сразу Π΄Ρ€ΡƒΠ³ Π·Π° Π΄Ρ€ΡƒΠ³ΠΎΠΌ. К этому ΠΆΠ΅ ΠΌΠΎΠ³ΡƒΡ‚ привСсти ΠΏΡ€Π°Π²ΠΈΠ»Π° выдСлСния памяти для Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ (Β§R.10.2) ΠΈ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… Π±Π°Π·ΠΎΠ²Ρ‹Ρ… классов (Β§R.10.1); см. Ρ‚Π°ΠΊΠΆΠ΅ Β§R.5.4.

Ѐункция-Ρ‡Π»Π΅Π½ (Β§R.9.3), имя ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ совпадаСт с ΠΈΠΌΠ΅Π½Π΅ΠΌ класса, являСтся конструктором (Β§R.12.1). Имя статичСского Ρ‡Π»Π΅Π½Π° Π΄Π°Π½Π½Ρ‹Ρ…, элСмСнта пСрСчислСния, Ρ‡Π»Π΅Π½Π° бСзымянного объСдинСния ΠΈΠ»ΠΈ Π²Π»ΠΎΠΆΠ΅Π½Π½ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ° Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΠ²ΠΏΠ°Π΄Π°Ρ‚ΡŒ с ΠΈΠΌΠ΅Π½Π΅ΠΌ класса.

R.9.3 Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ-Ρ‡Π»Π΅Π½Ρ‹

Ѐункция, описанная ΠΊΠ°ΠΊ Ρ‡Π»Π΅Π½ (Π±Π΅Π· спСцификации friend Β§R.11.4), называСтся функция-Ρ‡Π»Π΅Π½ ΠΈ вызываСтся Π² соотвСтствии с синтаксисом Ρ‡Π»Π΅Π½Π° класса (Β§R.5.2.4), Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€:

struct tnode {

 char tword[20];

 int count;

 tnode *left;

 tnode *right;

 void set(char*, tnode* l, tnode *r);

};

Π—Π΄Π΅ΡΡŒ set являСтся Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ-Ρ‡Π»Π΅Π½ΠΎΠΌ ΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒΡΡ Ρ‚Π°ΠΊ:

void f(tnode n1, tnode n2)

{

 n1.set("abc",&n2,0);

 n2.set("def",0,0);

}

БчитаСтся, Ρ‡Ρ‚ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ-Ρ‡Π»Π΅Π½Π° ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠΈΡ‚ области видимости Π΅Π΅ класса. Π­Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ-Ρ‡Π»Π΅Π½Π΅ (Ссли ΠΎΠ½Π° нСстатичСская, Β§R.9.4) ΠΌΠΎΠΆΠ½ΠΎ нСпосрСдствСнно ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΠΌΠ΅Π½Π° Ρ‡Π»Π΅Π½ΠΎΠ² Π΅Π΅ класса. Π’ статичСской Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ-Ρ‡Π»Π΅Π½Π΅ ΠΌΠΎΠΆΠ½ΠΎ нСпосрСдствСнно ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΠΌΠ΅Π½Π° Ρ‚ΠΎΠ»ΡŒΠΊΠΎ статичСских Ρ‡Π»Π΅Π½ΠΎΠ², элСмСнтов пСрСчислСния ΠΈ Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Ρ… Ρ‚ΠΈΠΏΠΎΠ². Если ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ-Ρ‡Π»Π΅Π½Π° находится Π²Π½Π΅ описания класса, Π΅Π΅ имя слСдуСт ΡƒΡ‚ΠΎΡ‡Π½ΠΈΡ‚ΡŒ ΠΈΠΌΠ΅Π½Π΅ΠΌ класса с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ ::, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€:

void tnode::set(char* w, tnode* l, tnode* r)

{

 count = strlen(w)+1;

 if (sizeof(tword)β€Ή=count)

  error("tnode string too long");

 strcpy(tword,w);

 left = 1;

 right = r;

}

ΠžΠ±ΠΎΠ·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ tnode::set ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ функция set являСтся Ρ‡Π»Π΅Π½ΠΎΠΌ ΠΈ находится Π² области видимости класса tnode. ИмСна Ρ‡Π»Π΅Π½ΠΎΠ² tword, count, left ΠΈ right относятся ΠΊ Ρ‡Π»Π΅Π½Π°ΠΌ Ρ‚ΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°, с ΠΈΠΌΠ΅Π½Π΅ΠΌ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Π²Ρ‹Π·Ρ‹Π²Π°Π»Π°ΡΡŒ ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ Π² Π²Ρ‹Π·ΠΎΠ²Π΅ n1.set("abc",&n2,0) tword ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ n1.tword, Π° Π² Π²Ρ‹Π·ΠΎΠ²Π΅ n2.set("def",0,0) tword ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ n2.tword. Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ strlen, error ΠΈ strcpy Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ описаны Π³Π΄Π΅-Ρ‚ΠΎ Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅.

Π§Π»Π΅Π½Ρ‹ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡ‚ΡŒ (Β§R.3.1) Π²Π½Π΅ описания класса; Ссли Π² описании класса ΠΎΠ½ΠΈ Π±Ρ‹Π»ΠΈ описаны, Π½ΠΎ Π½Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Ρ‹, ΠΈΡ… Π½Π΅ слСдуСт ΠΎΠΏΠΈΡΡ‹Π²Π°Ρ‚ΡŒ Π·Π°Π½ΠΎΠ²ΠΎ, см. Β§R.3.3. ПослС опрСдСлСния класса Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ-Ρ‡Π»Π΅Π½Ρ‹ этого класса ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΈ описании Π΄Ρ€ΡƒΠ·Π΅ΠΉ. Всякая вызываСмая Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ функция-Ρ‡Π»Π΅Π½ Π΄ΠΎΠ»ΠΆΠ½Π° ΠΈΠΌΠ΅Ρ‚ΡŒ Π² точности ΠΎΠ΄Π½ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅.

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Π²Ρ‹Π·ΠΎΠ²Π° нСстатичСской Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ-Ρ‡Π»Π΅Π½Π° (Β§R.9.4) класса X, ΠΊΠΎΠ³Π΄Π° ΠΎΠ½Π° вызываСтся Π½Π΅ с ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ класса X, Π½Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½.

R.9.3.1 Π£ΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ this

Π’ нСстатичСской (Β§R.9.3) Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ-Ρ‡Π»Π΅Π½Π΅ слуТСбноС слово this ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, с ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ эта функция Π²Ρ‹Π·Ρ‹Π²Π°Π»Π°ΡΡŒ. Π’ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ-Ρ‡Π»Π΅Π½Π΅ класса X Ρ‚ΠΈΠΏ this Π΅ΡΡ‚ΡŒ X *const, Ссли Ρ‚ΠΎΠ»ΡŒΠΊΠΎ функция-Ρ‡Π»Π΅Π½ Π½Π΅ описана со спСцификациСй const ΠΈΠ»ΠΈ volatile; для этих случаСв this ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‚ΠΈΠΏ const X *const ΠΈΠ»ΠΈ volatile X *const соотвСтствСнно. Если функция описана с ΡƒΠΊΠ°Π·Π°Π½ΠΈΠ΅ΠΌ const ΠΈ volatile, Ρ‚ΠΎ Ρ‚ΠΈΠΏ this Π±ΡƒΠ΄Π΅Ρ‚ const volatile X *const, см. Ρ‚Π°ΠΊΠΆΠ΅ Β§R.18.3.3. ΠŸΡ€ΠΈΠ²Π΅Π΄Π΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€:

struct s {

 int a;

 int f() const;

 int g() { return a++; }

 int h() const { return a++; } // ошибка

};


int s::f() const { return a; }

ΠžΠΏΠ΅Ρ€Π°Ρ†ΠΈΡ a++ Π² Ρ‚Π΅Π»Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ s::h ΠΎΡˆΠΈΠ±ΠΎΡ‡Π½Π°, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ с Π΅Π΅ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ дСлаСтся ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠ° ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ (Ρ‡Π°ΡΡ‚ΡŒ Π΅Π³ΠΎ), с ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ Π²Ρ‹Π·Ρ‹Π²Π°Π»Π°ΡΡŒ функция s::h(). Π­Ρ‚ΠΎ нСдопустимо для Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ-Ρ‡Π»Π΅Π½Π°, описанной со спСцификациСй const, Ρ‚.ΠΊ. this являСтся ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΌ Π½Π° const, ΠΈΠ½Ρ‹ΠΌΠΈ словами, *this ΠΈΠΌΠ΅Π΅Ρ‚ ΡΠΏΠ΅Ρ†ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΡŽ const.

Ѐункция-Ρ‡Π»Π΅Π½ const (Ρ‚.Π΅. функция-Ρ‡Π»Π΅Π½, описанная со спСцификациСй const) ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒΡΡ ΠΊΠ°ΠΊ для ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² const, Ρ‚Π°ΠΊ ΠΈ для ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Π±Π΅Π· спСцификации const, Ρ‚ΠΎΠ³Π΄Π° ΠΊΠ°ΠΊ функция-Ρ‡Π»Π΅Π½ Π±Π΅Π· спСцификации const ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Π±Π΅Π· спСцификации const, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€:

void k(s& x, const s& y)

{

 x.f();

 x.g();

 y.f();

 y.g(); // ошибка

}

Π—Π΄Π΅ΡΡŒ Π²Ρ‹Π·ΠΎΠ² y.g() являСтся ошибкой, Ρ‚.ΠΊ. y Π΅ΡΡ‚ΡŒ const, Π° s::g() - функция-Ρ‡Π»Π΅Π½ Π±Π΅Π· спСцификации const, которая ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ (ΠΈ измСняСт) ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹, для ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΎΠ½Π° Π²Ρ‹Π·Ρ‹Π²Π°Π»Π°ΡΡŒ.

Аналогично, Ρ‚ΠΎΠ»ΡŒΠΊΠΎ функция-Ρ‡Π»Π΅Π½ volatile (Ρ‚.Π΅. функция-Ρ‡Π»Π΅Π½, описанная со спСцификациСй volatile) ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒΡΡ для ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² со спСцификациСй volatile. Ѐункция-Ρ‡Π»Π΅Π½ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ const ΠΈ volatile.

Для ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² const ΠΈΠ»ΠΈ volatile ΠΌΠΎΠ³ΡƒΡ‚ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒΡΡ конструкторы (Β§R.12.1) ΠΈ дСструкторы (Β§R.12.4). ΠšΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ‚ΠΎΡ€Ρ‹ (Β§R.12.1) ΠΈ дСструкторы (Β§R.12.4) нСльзя ΠΎΠΏΠΈΡΡ‹Π²Π°Ρ‚ΡŒ со спСцификациями const ΠΈΠ»ΠΈ volatile.

R.9.3.2 Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ-Ρ‡Π»Π΅Π½Ρ‹ со спСцификациСй inline

Π€ΡƒΠ½ΠΊΡ†ΠΈΡŽ-Ρ‡Π»Π΅Π½ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ (Β§R.8.3) Π² описании класса, Π² Ρ‚Π°ΠΊΠΎΠΌ случаС ΠΎΠ½Π° считаСтся подстановкой (inline, Β§R.7.1.2). ΠžΠΏΡ€Π΅Π΄Π΅Π»ΡΡ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ Π² описании класса - это эквивалСнтно Ρ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠΏΠΈΡΡ‹Π²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡ‚ΡŒ Π΅Π΅ со спСцификациСй inline сразу ΠΆΠ΅ послС описания класса. БчитаСтся, Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠΉ пСрСнос опрСдСлСния Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ происходит послС прСпроцСссорной ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Π΄ΠΎ стадии синтаксичСского Π°Π½Π°Π»ΠΈΠ·Π° ΠΈ контроля Ρ‚ΠΈΠΏΠΎΠ². ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹ΠΉ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚