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

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

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

R.13.4.2 Π‘ΠΈΠ½Π°Ρ€Π½Ρ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ

Π‘ΠΈΠ½Π°Ρ€Π½ΡƒΡŽ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΡŽ ΠΌΠΎΠΆΠ½ΠΎ Π·Π°Π΄Π°Ρ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ нСстатичСской Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ-Ρ‡Π»Π΅Π½Π° (Β§R.9.3), ΠΈΠΌΠ΅ΡŽΡ‰Π΅ΠΉ ΠΎΠ΄ΠΈΠ½ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€, ΠΈΠ»ΠΈ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Π½Π΅ ΡΠ²Π»ΡΡŽΡ‰Π΅ΠΉΡΡ Ρ‡Π»Π΅Π½ΠΎΠΌ, с двумя ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°ΠΌΠΈ. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, для всякой Π±ΠΈΠ½Π°Ρ€Π½ΠΎΠΉ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ @ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ [email protected] ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΊΠ°ΠΊ [email protected](y) ΠΈΠ»ΠΈ ΠΊΠ°ΠΊ [email protected](x,y). Если описаны Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ-ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ ΠΎΠ±ΠΎΠΈΡ… Π²ΠΈΠ΄ΠΎΠ², Ρ‚ΠΎ какая ΠΈΠ· Π½ΠΈΡ… Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΏΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅, опрСдСляСтся ΠΏΡ€Π°Π²ΠΈΠ»Π°ΠΌΠΈ сопоставлСния ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² (Β§R.13.2).

R.13.4.3 ΠŸΡ€ΠΈΡΠ²Π°ΠΈΠ²Π°Π½ΠΈΡ

Ѐункция присваивания operator=() Π΄ΠΎΠ»ΠΆΠ½Π° Π±Ρ‹Ρ‚ΡŒ нСстатичСской Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ-Ρ‡Π»Π΅Π½ΠΎΠΌ. Она Π½Π΅ наслСдуСтся (Β§R.12.8). Π‘ΠΎΠ»Π΅Π΅ Ρ‚ΠΎΠ³ΠΎ, Ссли ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Π½Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠ» для класса X Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ operator=, Ρ‚ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ стандартная функция operator=, которая опрСдСляСтся ΠΊΠ°ΠΊ присваиваниС ΠΏΠΎ Ρ‡Π»Π΅Π½Π°ΠΌ для класса X.

X& X::operator=(const X& from)

{

 // ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΠΎ Ρ‡Π»Π΅Π½Π°ΠΌ X

}

R.13.4.4 Π’Ρ‹Π·ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ

Π’Ρ‹Π·ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π΅ΡΡ‚ΡŒ конструкция Π²ΠΈΠ΄Π°:

ΠΏΠ΅Ρ€Π²ΠΈΡ‡Π½ΠΎΠ΅-Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ ( список-Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ opt )

Она считаСтся Π±ΠΈΠ½Π°Ρ€Π½ΠΎΠΉ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠ΅ΠΉ, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΏΠ΅Ρ€Π²ΠΈΡ‡Π½ΠΎΠ΅-Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ прСдставляСт ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ ΠΎΠΏΠ΅Ρ€Π°Π½Π΄, Π° список-Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ (Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ пустой), - Π²Ρ‚ΠΎΡ€ΠΎΠΉ ΠΎΠΏΠ΅Ρ€Π°Π½Π΄. ИмСнСм, Π·Π°Π΄Π°ΡŽΡ‰ΠΈΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, слуТит operator(), ΠΈ Π²Ρ‹Π·ΠΎΠ² x(arg1,arg2,arg3) для ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° класса x интСрпрСтируСтся ΠΊΠ°ΠΊ x.operator()(arg1,arg2,arg3). Ѐункция operator() Π΄ΠΎΠ»ΠΆΠ½Π° Π±Ρ‹Ρ‚ΡŒ нСстатичСской Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ-Ρ‡Π»Π΅Π½ΠΎΠΌ класса x.

R.13.4.5 Π˜Π½Π΄Π΅ΠΊΡΠ°Ρ†ΠΈΡ

Π˜Π½Π΄Π΅ΠΊΡΠ°Ρ†ΠΈΡ, опрСдСляСмая ΠΊΠ°ΠΊ:

ΠΏΠ΅Ρ€Π²ΠΈΡ‡Π½ΠΎΠ΅-Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ [ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ ]

считаСтся Π±ΠΈΠ½Π°Ρ€Π½ΠΎΠΉ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠ΅ΠΉ. Π’Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ с индСксациСй x[y] для ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° класса x интСрпрСтируСтся ΠΊΠ°ΠΊ x.operator[](y). Ѐункция operator[] Π΄ΠΎΠ»ΠΆΠ½Π° Π±Ρ‹Ρ‚ΡŒ нСстатичСской Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ-Ρ‡Π»Π΅Π½ΠΎΠΌ класса x.

R.13.4.6 Доступ ΠΊ Ρ‡Π»Π΅Π½Ρƒ класса

Доступ ΠΊ Ρ‡Π»Π΅Π½Ρƒ класса опрСдСляСтся с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ -β€Ί:

ΠΏΠ΅Ρ€Π²ΠΈΡ‡Π½ΠΎΠ΅-Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ -β€Ί ΠΏΠ΅Ρ€Π²ΠΈΡ‡Π½ΠΎΠ΅-Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅

Он считаСтся ΡƒΠ½Π°Ρ€Π½ΠΎΠΉ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠ΅ΠΉ. Для ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° класса x Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ x-β€Ίm интСрпрСтируСтся ΠΊΠ°ΠΊ (x.operator-β€Ί())-β€Ίm. ΠžΡ‚ΡΡŽΠ΄Π° слСдуСт, Ρ‡Ρ‚ΠΎ функция operator-β€Ί() Π΄ΠΎΠ»ΠΆΠ½Π° Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Ρ‚ΡŒ ΠΈΠ»ΠΈ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° класс, ΠΈΠ»ΠΈ ссылку Π½Π° класс, ΠΈΠ»ΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ класса, для ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π° функция operator-β€Ί(). Она Π΄ΠΎΠ»ΠΆΠ½Π° Π±Ρ‹Ρ‚ΡŒ нСстатичСской Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ-Ρ‡Π»Π΅Π½ΠΎΠΌ класса.

R.13.4.7 Π˜Π½ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚ ΠΈ Π΄Π΅ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚

Ѐункция с ΠΈΠΌΠ΅Π½Π΅ΠΌ operator++ ΠΈ с ΠΎΠ΄Π½ΠΈΠΌ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠΌ Π·Π°Π΄Π°Π΅Ρ‚ для ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ класса ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΡŽ прСфиксного ΠΈΠ½ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚Π° ++. Ѐункция с ΠΈΠΌΠ΅Π½Π΅ΠΌ operator++ ΠΈ с двумя ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°ΠΌΠΈ Π·Π°Π΄Π°Π΅Ρ‚ для ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ класса ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΡŽ постфиксного ΠΈΠ½ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚Π° ++. Для постфиксной ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ ++ Π²Ρ‚ΠΎΡ€ΠΎΠΉ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ Ρ‚ΠΈΠΏΠ° int, ΠΈ, ΠΊΠΎΠ³Π΄Π° Π² Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΈ встрСчаСтся опСрация постфиксного ΠΈΠ½ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚Π°, функция operator++ вызываСтся со Π²Ρ‚ΠΎΡ€Ρ‹ΠΌ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠΌ, Ρ€Π°Π²Π½Ρ‹ΠΌ Π½ΡƒΠ»ΡŽ. ΠŸΡ€ΠΈΠ²Π΅Π΄Π΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€:

class X {

public:

 X operator++(); // прСфиксная ++a

 X operator++(int) // постфиксная a++

};


void f(X a)

{

 ++a; // a.operator++();

 a++; // a.operator++(0);


 a.operator++(); // явный Π²Ρ‹Π·ΠΎΠ²: дСйствуСт ΠΊΠ°ΠΊ ++a;

 a.operator++(0); // явный Π²Ρ‹Π·ΠΎΠ²: дСйствуСт ΠΊΠ°ΠΊ a++;

}

ΠŸΡ€Π΅Ρ„ΠΈΠΊΡΠ½Ρ‹Π΅ ΠΈ постфиксныС ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Π΄Π΅ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚Π° - ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ΡΡ Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½Ρ‹ΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ.

R.14 Π¨ΠΠ‘Π›ΠžΠΠ« ВИПА

R.14.1 Π¨Π°Π±Π»ΠΎΠ½Ρ‹ Ρ‚ΠΈΠΏΠ°

Π¨Π°Π±Π»ΠΎΠ½ Ρ‚ΠΈΠΏΠ° опрСдСляСт Ρ†Π΅Π»ΠΎΠ΅ сСмСйство Ρ‚ΠΈΠΏΠΎΠ² ΠΈΠ»ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ.

описаниС-шаблона-Ρ‚ΠΈΠΏΠ°:

 template β€Ή список-ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ²-шаблона-Ρ‚ΠΈΠΏΠ° β€Ί описаниС

список-ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ²-шаблона-Ρ‚ΠΈΠΏΠ°:

 ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€-шаблона-Ρ‚ΠΈΠΏΠ°

 ΡΠΏΠΈΡΠΎΠΊ-ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ²-шаблона-Ρ‚ΠΈΠΏΠ° , ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€-шаблона-Ρ‚ΠΈΠΏΠ°

ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€-шаблона-Ρ‚ΠΈΠΏΠ°:

 ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€-Ρ‚ΠΈΠΏΠ°

 ΠΎΠΏΠΈΡΠ°Π½ΠΈΠ΅-ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°

ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€-Ρ‚ΠΈΠΏΠ°:

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

ΠšΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡ описаниС Π² описании-шаблона-Ρ‚ΠΈΠΏΠ° Π΄ΠΎΠ»ΠΆΠ½Π° ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ описаниС ΠΈΠ»ΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈΠ»ΠΈ класса.

Π’ конструкции ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€-Ρ‚ΠΈΠΏΠ° ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ опрСдСляСтся ΠΊΠ°ΠΊ имя-Ρ‚ΠΈΠΏΠ° Π² области видимости описания шаблона Ρ‚ΠΈΠΏΠ°.

ИмСна шаблонов Ρ‚ΠΈΠΏΠ° ΠΏΠΎΠ΄Ρ‡ΠΈΠ½ΡΡŽΡ‚ΡΡ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΌ ΠΏΡ€Π°Π²ΠΈΠ»Π°ΠΌ для областСй видимости ΠΈ контроля доступа. ΠšΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡ описаниС-шаблона-Ρ‚ΠΈΠΏΠ° считаСтся описаниСм. Она ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΈΡΡƒΡ‚ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΊΠ°ΠΊ глобальноС описаниС.

R.14.2 Π¨Π°Π±Π»ΠΎΠ½Ρ‹ Ρ‚ΠΈΠΏΠΎΠ² для классов

Π¨Π°Π±Π»ΠΎΠ½ Ρ‚ΠΈΠΏΠ° для класса опрСдСляСт ΠΊΠ°ΠΊ Π±ΡƒΠ΄ΡƒΡ‚ ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒΡΡ классы, ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎ Ρ‚ΠΎΠΌΡƒ, ΠΊΠ°ΠΊ описаниС класса опрСдСляСт ΠΊΠ°ΠΊ Π±ΡƒΠ΄ΡƒΡ‚ ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒΡΡ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ этого класса. Π¨Π°Π±Π»ΠΎΠ½ Ρ‚ΠΈΠΏΠ° для класса vector ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠΏΠΈΡΠ°Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

templateβ€Ήclass Tβ€Ί class vector {

 T* v;

 int sz;

public:

 vector(int);

 T& operator[](int);

 T& elem(int i) { return v[i]; }

 //…

};

ΠŸΡ€Π΅Ρ„ΠΈΠΊΡ templateβ€Ήclass Tβ€Ί ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ описываСтся шаблон Ρ‚ΠΈΠΏΠ°, ΠΈ Ρ‡Ρ‚ΠΎ Π² этом описании ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ имя-Ρ‚ΠΈΠΏΠ° T, ΠΈΠ½Ρ‹ΠΌΠΈ словами, vector - это ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΈΠ·ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ Ρ‚ΠΈΠΏ с ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠΌ T.

Класс ΠΌΠΎΠΆΠ½ΠΎ Π·Π°Π΄Π°Ρ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ конструкции имя-шаблонного-класса:

имя-шаблонного-класса:

 ΠΈΠΌΡ-шаблона-Ρ‚ΠΈΠΏΠ° β€Ή список-ΠΏΠ°Ρ€Π°ΠΌ-шаблона-Ρ‚ΠΈΠΏΠ° β€Ί

список-ΠΏΠ°Ρ€Π°ΠΌ-шаблона-Ρ‚ΠΈΠΏΠ°:

 ΠΏΠ°Ρ€Π°ΠΌ-шаблона-Ρ‚ΠΈΠΏΠ°

 ΡΠΏΠΈΡΠΎΠΊ-ΠΏΠ°Ρ€Π°ΠΌ-шаблона-Ρ‚ΠΈΠΏΠ° , ΠΏΠ°Ρ€Π°ΠΌ-шаблона-Ρ‚ΠΈΠΏΠ°

ΠΏΠ°Ρ€Π°ΠΌ-шаблона:

 Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅

 ΠΈΠΌΡ-Ρ‚ΠΈΠΏΠ°

ΠšΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡ имя-шаблонного-класса являСтся ΠΈΠΌΠ΅Π½Π΅ΠΌ-класса (Β§R.9).

Класс, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ пороТдаСтся шаблоном Ρ‚ΠΈΠΏΠ° для класса, называСтся ΡˆΠ°Π±Π»ΠΎΠ½Π½Ρ‹ΠΌ классом ΠΈ эквивалСнтСн ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠΌΡƒ классу, ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠΌΡƒ со ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΌ ΠΈΠΌΠ΅Π½Π΅ΠΌ - ΠΈΠΌΠ΅Π½Π΅ΠΌ-шаблонного-класса, см. Β§R.14.5.

Если Π² конструкции имя-шаблонного-класса имя-шаблона-Ρ‚ΠΈΠΏΠ° Π½Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΎ,Ρ‚ΠΎ ΠΎΠ½Π° ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ Π½Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΉ класс.

Имя шаблонного класса Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΌ Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ ΠΈ Π² своСй области видимости ΠΎΠ½ΠΎ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π°Ρ‚ΡŒ Π΄Ρ€ΡƒΠ³ΠΎΠΉ шаблон Ρ‚ΠΈΠΏΠ°, класс, Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΈΠ»ΠΈ Ρ‚ΠΈΠΏ.

Π’ΠΈΠΏΡ‹, ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹Π΅ Π² спискС-ΠΏΠ°Ρ€Π°ΠΌ-шаблона-Ρ‚ΠΈΠΏΠ° ΠΈΠ· ΠΈΠΌΠ΅Π½ΠΈ-шаблонного-класса, Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚ΠΈΠΏΠ°ΠΌ, Π·Π°Π΄Π°Π½Π½Ρ‹ΠΌ Π² спискС-ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ²-шаблона-Ρ‚ΠΈΠΏΠ° ΠΈΠ· шаблона-Ρ‚ΠΈΠΏΠ°. (МоТно ΡΠΊΠ°Π·Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΏΠ΅Ρ€Π²Ρ‹Π΅ ΡΠ²Π»ΡΡŽΡ‚ΡΡ фактичСскими ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°ΠΌΠΈ шаблона Ρ‚ΠΈΠΏΠ°, Π° Π²Ρ‚ΠΎΡ€Ρ‹Π΅ - Ρ„ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΌΠΈ.)

ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΈΠΏΠΎΠ² Π² спискС-ΠΏΠ°Ρ€Π°ΠΌ-шаблона-Ρ‚ΠΈΠΏΠ° ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ: выраТСния-константы, адрСса ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² ΠΈΠ»ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, ΠΏΠΎΠ΄Π»Π΅ΠΆΠ°Ρ‰ΠΈΡ… Π²Π½Π΅ΡˆΠ½Π΅ΠΌΡƒ ΡΠ²ΡΠ·Ρ‹Π²Π°Π½ΠΈΡŽ, статичСскиС Ρ‡Π»Π΅Π½Ρ‹ классов. Для ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ², Π½Π΅ ΡΠ²Π»ΡΡŽΡ‰ΠΈΡ…ΡΡ Ρ‚ΠΈΠΏΠ°ΠΌΠΈ, трСбуСтся Ρ‚ΠΎΡ‡Π½ΠΎΠ΅ соотвСтствиС (Β§R.13.2).

ΠŸΡ€ΠΈΠ²Π΅Π΄Π΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ использования классов шаблона Ρ‚ΠΈΠΏΠ° vector:

vectorβ€Ήintβ€Ί v1(20);

vectorβ€Ήcomplexβ€Ί v2(30);


typedef vectorβ€Ήcomplexβ€Ί cvec; // cvec становится синонимом

 // vectorβ€Ήcomplexβ€Ί

cvec v3(40); // v2 ΠΈ v3 ΠΎΠ΄Π½ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ°


v1[3] = 7;

v2[3] = v3.elem(4) = complex(7,8);

Π—Π΄Π΅ΡΡŒ vectorβ€Ήintβ€Ί ΠΈ vectorβ€Ήcomplexβ€Ί ΡΠ²Π»ΡΡŽΡ‚ΡΡ ΡˆΠ°Π±Π»ΠΎΠ½Π½Ρ‹ΠΌΠΈ классами, ΠΈ ΠΈΡ… опрСдСлСния бСрутся ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΠΈΠ· шаблона Ρ‚ΠΈΠΏΠ° vector.

ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ шаблонноС-имя-класса являСтся ΠΈΠΌΠ΅Π½Π΅ΠΌ-класса, Ρ‚ΠΎ ΠΎΠ½ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Ρ‚Π°ΠΌ, Π³Π΄Π΅ допустимо имя-класса, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€:

class vectorβ€ΉShape*β€Ί;


vectorβ€ΉWindowβ€Ί* current_window;


class svector: public vectorβ€ΉShape*β€Ί {/*… */};

ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ-Ρ‡Π»Π΅Π½Π° шаблонного класса Π΄Π°Π½ΠΎ Π² Β§R.14.6.

R.14.3 Π­ΠΊΠ²ΠΈΠ²Π°Π»Π΅Π½Ρ‚Π½ΠΎΡΡ‚ΡŒ Ρ‚ΠΈΠΏΠΎΠ²

Π”Π²Π΅ конструкции шаблонноС-имя-класса ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π°ΡŽΡ‚ ΠΎΠ΄ΠΈΠ½ ΠΈ Ρ‚ΠΎΡ‚ ΠΆΠ΅ класс, Ссли Π² Π½ΠΈΡ… ΡΠΎΠ²ΠΏΠ°Π΄Π°ΡŽΡ‚ ΠΈΠΌΠ΅Π½Π° шаблонов Ρ‚ΠΈΠΏΠ° ΠΈ значСния ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹Ρ… ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ². НапримСр, Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… описаниях x ΠΈ y ΠΎΠ΄Π½ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΎΡ‚Π»ΠΈΡ‡Π΅Π½ ΠΎΡ‚ Ρ‚ΠΈΠΏΠ° z:

templateβ€Ήclass E, int sizeβ€Ί class buffer;


bufferβ€Ήchar, 2*512β€Ί x;

bufferβ€Ήchar,1024β€Ί y;

bufferβ€Ήchar,512β€Ί z;

НиТС ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Ρ‹ описания, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹ΠΉ Ρ‚ΠΈΠΏ ΠΈΠΌΠ΅ΡŽΡ‚ x2 ΠΈ x3. Он отличаСтся ΠΎΡ‚ Ρ‚ΠΈΠΏΠΎΠ² x1 ΠΈ x4:

templateβ€Ήclass T, void(*err_fct)()β€Ί

class list {/*… */};


listβ€Ήint,&error_handler1β€Ί x1;

listβ€Ήint,&error_handler2β€Ί x2;

listβ€Ήint,&error_handler2β€Ί x3;

listβ€Ήchar,&error_handler2β€Ί x4;

R.14.4 Π¨Π°Π±Π»ΠΎΠ½Ρ‹ Ρ‚ΠΈΠΏΠ° для Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ

Π¨Π°Π±Π»ΠΎΠ½ Ρ‚ΠΈΠΏΠ° для Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ опрСдСляСт ΠΊΠ°ΠΊ Π±ΡƒΠ΄Π΅Ρ‚ ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒΡΡ функция. НапримСр, сСмСйство Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ sort ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠΏΠΈΡΠ°Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

templateβ€Ήclass Tβ€Ί void sort(vectorβ€ΉTβ€Ί);

Π¨Π°Π±Π»ΠΎΠ½ Ρ‚ΠΈΠΏΠ° для Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΏΠΎΡ€ΠΎΠΆΠ΄Π°Π΅Ρ‚ Π½Π΅ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Π½ΠΎΠ΅ мноТСство ΠΏΠ΅Ρ€Π΅Π³Ρ€ΡƒΠΆΠ΅Π½Π½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ. Ѐункция, пороТдаСмая шаблоном Ρ‚ΠΈΠΏΠ° для Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, называСтся шаблонной Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ. Она эквивалСнтна Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Π² описании ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΡƒΠΊΠ°Π·Π°Π½ Ρ‚ΠΈΠΏ, ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ ΡˆΠ°Π±Π»ΠΎΠ½Ρƒ, см. Β§R.14.5.

ΠŸΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ шаблонной Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ шаблона Ρ‚ΠΈΠΏΠ° Π½Π΅ Π·Π°Π΄Π°ΡŽΡ‚ΡΡ явно, вмСсто этого примСняСтся ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ нСопрСдСлСнности ΠΏΠ΅Ρ€Π΅Π³Ρ€ΡƒΠΆΠ΅Π½Π½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ. Рассмотрим ΠΏΡ€ΠΈΠΌΠ΅Ρ€:

vectorβ€Ήcomplexβ€Ί cv(100);

vectorβ€Ήintβ€Ί ci(200);


void f(vectorβ€Ήcomplexβ€Ί& cv, vectorβ€Ήintβ€Ί& ci)

{

 sort(cv); // вызываСтся sort(vectorβ€Ήcomplexβ€Ί)

 sort(ci); // вызываСтся sort(vectorβ€Ήintβ€Ί)

}

Шаблонная функция ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΠ΅Ρ€Π΅Π³Ρ€ΡƒΠΆΠ΅Π½Π° ΠΊΠ°ΠΊ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΌΠΈ, Ρ‚Π°ΠΊ ΠΈ ΡˆΠ°Π±Π»ΠΎΠ½Π½Ρ‹ΠΌΠΈ функциями с Ρ‚Π΅ΠΌ ΠΆΠ΅ ΠΈΠΌΠ΅Π½Π΅ΠΌ. Для Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ нСопрСдСлСнности ΡˆΠ°Π±Π»ΠΎΠ½Π½Ρ‹Ρ… ΠΈ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ с ΠΎΠ΄Π½ΠΈΠΌ ΠΈ Ρ‚Π΅ΠΌ ΠΆΠ΅ ΠΈΠΌΠ΅Π½Π΅ΠΌ Π½Π°Π΄ΠΎ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ ΠΏΡ€ΠΎΠΉΡ‚ΠΈ Ρ‚Ρ€ΠΈ шага: