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

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

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

public:

 X(int);

 X(const X&, int = 1);

};


X a(1); // Π²Ρ‹Π·ΠΎΠ² X(int)

X b(a,0); // Π²Ρ‹Π·ΠΎΠ² X(const X&,int)

X c = b; // Π²Ρ‹Π·ΠΎΠ² X(const X&,int)

ΠŸΡ€ΠΈΡΠ²Π°ΠΈΠ²Π°Π½ΠΈΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² класса X опрСдСляСтся Ρ‡Π΅Ρ€Π΅Π· Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ X::operator=(const X&). Π­Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ (Β§R.12.3), Ρ‡Ρ‚ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½ΠΎΠ³ΠΎ класса ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΈΡΠ²Π°ΠΈΠ²Π°Ρ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌ ΠΎΠ±Ρ‰Π΅Π³ΠΎ Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ класса, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€:

class X {

public:

 int b;

};


class Y: public X {

public:

 int c;

};


void f()

{

 X x1;

 Y y1;

 x1 = y1; // Π½ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎ

 y1 = x1; // ошибка

}

Π’ этом ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ y1.b присваиваСтся x1.b, Π° x1.c Π½Π΅ копируСтся.

ΠšΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Π² Π΄Ρ€ΡƒΠ³ΠΎΠΉ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ стандартной ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ копирования ΠΈΠ»ΠΈ стандартного конструктора копирования Π½Π΅ измСняСт структуру ΠΎΠ±ΠΎΠΈΡ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ². ΠŸΡ€ΠΈΠ²Π΅Π΄Π΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€:

struct s {

 virtual f();

 //…

};


struct ss: public s {

 f();

 //…

};


void f()

{

 s a;

 ss b;

 a = b; // Π½Π° самом Π΄Π΅Π»Π΅ выполняСтся a.s::operator=(b)

 b = a; // ошибка

 a.f(); // Π²Ρ‹Π·ΠΎΠ² s::f

 b.f(); // Π²Ρ‹Π·ΠΎΠ² ss::f

 (s&)b = a; // присваиваниС a b

  // Π½Π° самом Π΄Π΅Π»Π΅ выполняСтся ((s&)b).s::operator=(a)

 b.f(); // всС Π΅Ρ‰Π΅ Π²Ρ‹Π·ΠΎΠ² ss::f

}

Π’Ρ‹Π·ΠΎΠ² a.f() ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Ρ‚ ΠΊ Π²Ρ‹Π·ΠΎΠ²Ρƒ s::f() (ΠΊΠ°ΠΊ ΠΈ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ для ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° класса s (Β§R.10.2)), Π° Π²Ρ‹Π·ΠΎΠ² b.f() ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Ρ‚ ΠΊ Π²Ρ‹Π·ΠΎΠ²Ρƒ ss::f() (ΠΊΠ°ΠΊ ΠΈ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ для ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° класса ss).

R.13 ΠŸΠ΅Ρ€Π΅Π³Ρ€ΡƒΠ·ΠΊΠ°

Говорят, Ρ‡Ρ‚ΠΎ имя ΠΏΠ΅Ρ€Π΅Π³Ρ€ΡƒΠΆΠ΅Π½ΠΎ, Ссли для Π½Π΅Π³ΠΎ Π·Π°Π΄Π°Π½ΠΎ нСсколько Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… описаний Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Π² ΠΎΠ΄Π½ΠΎΠΉ области видимости. ΠŸΡ€ΠΈ использовании ΠΈΠΌΠ΅Π½ΠΈ Π²Ρ‹Π±ΠΎΡ€ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ производится ΠΏΡƒΡ‚Π΅ΠΌ сопоставлСния Ρ‚ΠΈΠΏΠΎΠ² Ρ„ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½Ρ‹Ρ… ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² с Ρ‚ΠΈΠΏΠ°ΠΌΠΈ фактичСских ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ², Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€:

double abs(double);

int abs(int);


abs(1); // Π²Ρ‹Π·ΠΎΠ² abs(int)

abs(1.0); // Π²Ρ‹Π·ΠΎΠ² abs(double)

ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΏΡ€ΠΈ любом Ρ‚ΠΈΠΏΠ΅ T ΠΈ для самого T, для ΠΈ T& допустимо ΠΎΠ΄Π½ΠΎ ΠΈ Ρ‚ΠΎ ΠΆΠ΅ мноТСство ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΡŽΡ‰ΠΈΡ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ, Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Ρ‚ΠΈΠΏΡ‹ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Ρ€Π°Π·Π»ΠΈΡ‡Π°ΡŽΡ‚ΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ использованиСм, ΠΈΠ»ΠΈ Π½Π΅ использованиСм ссылки, Π½Π΅ ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹Π΅ ΠΈΠΌΠ΅Π½Π°, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€:

int f(int i)

{

 //…

}


int f(int& r) // ошибка: Ρ‚ΠΈΠΏΡ‹ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ

{ // нСдостаточно Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹

 //…

}

Аналогично, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ для любом Ρ‚ΠΈΠΏΠ΅ T для самого T, const T ΠΈ volatile T допустимо ΠΎΠ΄Π½ΠΎ ΠΈ Ρ‚ΠΎ ΠΆΠ΅ мноТСство ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΡŽΡ‰ΠΈΡ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ, Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Ρ‚ΠΈΠΏΡ‹ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΎΡ‚Π»ΠΈΡ‡Π°ΡŽΡ‚ΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠΉ спСцификациСй, Π½Π΅ ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹Π΅ ΠΈΠΌΠ΅Π½Π°. Однако, Ρ€Π°Π·Π»ΠΈΡ‡ΠΈΡ‚ΡŒ const T&, volatile T& ΠΈ просто T& ΠΌΠΎΠΆΠ½ΠΎ, поэтому допустимы опрСдСлСния Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ с ΠΎΠ΄Π½ΠΈΠΌ ΠΈΠΌΠ΅Π½Π΅ΠΌ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ€Π°Π·Π»ΠΈΡ‡Π°ΡŽΡ‚ΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠΌ ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠΈ. Аналогично, допустимы опрСдСлСния Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ с ΠΎΠ΄Π½ΠΈΠΌ ΠΈΠΌΠ΅Π½Π΅ΠΌ, Ρ‚ΠΈΠΏΡ‹ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Ρ€Π°Π·Π»ΠΈΡ‡Π°ΡŽΡ‚ΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΊΠ°ΠΊ Ρ‚ΠΈΠΏΡ‹ Π²ΠΈΠ΄Π° const T*, volatile T* ΠΈ просто T*.

НС ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹Π΅ ΠΈΠΌΠ΅Π½Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΡ‚Π»ΠΈΡ‡Π°ΡŽΡ‚ΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‚ΠΈΠΏΠΎΠΌ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ³ΠΎ значСния.

НС ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹Π΅ ΠΈΠΌΠ΅Π½Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ-Ρ‡Π»Π΅Π½Ρ‹, ΠΎΠ΄Π½Π° ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… статичСская, Π° другая Π½Π΅Ρ‚ (Β§R.9.4).

Π‘ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ конструкции typedef Π½Π΅ ΡΠΎΠ·Π΄Π°ΡŽΡ‚ΡΡ Π½ΠΎΠ²Ρ‹Π΅ Ρ‚ΠΈΠΏΡ‹, Π° Ρ‚ΠΎΠ»ΡŒΠΊΠΎ опрСдСляСтся синоним Ρ‚ΠΈΠΏΠ° (Β§R.7.1.3), поэтому Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΡ‚Π»ΠΈΡ‡Π°ΡŽΡ‚ΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π·Π° счСт использования Ρ‚ΠΈΠΏΠΎΠ², ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Ρ… с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ typedef, Π½Π΅ ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹Π΅ ΠΈΠΌΠ΅Π½Π°. ΠŸΡ€ΠΈΠ²Π΅Π΄Π΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€:

typedef int Int;


void f(int i) {/*… */}

void f(Int i) {/*… */} // ошибка: ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ f

Π‘ Π΄Ρ€ΡƒΠ³ΠΎΠΉ стороны всС пСрСчислСния ΡΡ‡ΠΈΡ‚Π°ΡŽΡ‚ΡΡ Ρ€Π°Π·Π½Ρ‹ΠΌΠΈ Ρ‚ΠΈΠΏΠ°ΠΌΠΈ, ΠΈ с ΠΈΡ… ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π°Π·Π»ΠΈΡ‡ΠΈΡ‚ΡŒ ΠΏΠ΅Ρ€Π΅Π³Ρ€ΡƒΠΆΠ΅Π½Π½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€:

enum E { a };


void f(int i) {/*… */}

void f(E i) {/*… */}

Π’ΠΈΠΏΡ‹ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ€Π°Π·Π»ΠΈΡ‡Π°ΡŽΡ‚ΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ *, Π° Π² Π΄Ρ€ΡƒΠ³ΠΎΠΌ массив [], ΡΡ‡ΠΈΡ‚Π°ΡŽΡ‚ΡΡ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ‡Π½Ρ‹ΠΌΠΈ. Напомним, Ρ‡Ρ‚ΠΎ для Ρ‚ΠΈΠΏΠ° ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° Π²Π°ΠΆΠ½Ρ‹ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π²Ρ‚ΠΎΡ€ΠΎΠΉ ΠΈ ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ индСксы ΠΌΠ½ΠΎΠ³ΠΎΠΌΠ΅Ρ€Π½ΠΎΠ³ΠΎ массива (Β§R.8.2.4). ΠŸΠΎΠ΄Ρ‚Π²Π΅Ρ€Π΄ΠΈΠΌ сказанноС ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠΌ:

f(char*);

f(char[]); // ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ‡Π½ΠΎ f(char*);

f(char[7]); // ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ‡Π½ΠΎ f(char*);

f(char[9]); // ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ‡Π½ΠΎ f(char*);

g(char(*)[10]);

g(char[5][10]); // ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ‡Π½ΠΎ g(char(*)[10]);

g(char[7][10]); // ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ‡Π½ΠΎ g(char(*)[10]);

g(char(*)[20]); // ΠΎΡ‚Π»ΠΈΡ‡Π½ΠΎ ΠΎΡ‚ g(char(*)[10]);

R.13.1 БопоставлСниС описаний

Π”Π²Π° описания Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ с ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹ΠΌΠΈ ΠΈΠΌΠ΅Π½Π°ΠΌΠΈ относятся ΠΊ ΠΎΠ΄Π½ΠΎΠΉ ΠΈ Ρ‚ΠΎΠΉ ΠΆΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Ссли ΠΎΠ½ΠΈ находятся Π² ΠΎΠ΄Π½ΠΎΠΉ области видимости ΠΈ ΠΈΠΌΠ΅ΡŽΡ‚ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ‡Π½Ρ‹Π΅ Ρ‚ΠΈΠΏΡ‹ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² (Β§R.13). Ѐункция-Ρ‡Π»Π΅Π½ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½ΠΎΠ³ΠΎ класса относится ΠΊ ΠΈΠ½ΠΎΠΉ области видимости, Ρ‡Π΅ΠΌ функция-Ρ‡Π»Π΅Π½ Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ класса с Ρ‚Π΅ΠΌ ΠΆΠ΅ ΠΈΠΌΠ΅Π½Π΅ΠΌ. Рассмотрим ΠΏΡ€ΠΈΠΌΠ΅Ρ€:

class B {

public:

 int f(int);

};


class D: public B {

public:

 int f(char*);

};

Π—Π΄Π΅ΡΡŒ D::f(char*) скорСС скрываСт B::f(int), Ρ‡Π΅ΠΌ ΠΏΠ΅Ρ€Π΅Π³Ρ€ΡƒΠΆΠ°Π΅Ρ‚ эту Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ.

void h(D* pd)

{

 pd-β€Ίf(1); // ошибка: D::f(char*) скрываСт B::f(int)

 pd-β€ΊB::f(1); // Π½ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎ

 pd-β€Ίf("Ben"); // Π½ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎ, Π²Ρ‹Π·ΠΎΠ² D::f

}

Ѐункция, описанная локально, находится Π² ΠΈΠ½ΠΎΠΉ области видимости, Ρ‡Π΅ΠΌ функция с Ρ„Π°ΠΉΠ»ΠΎΠ²ΠΎΠΉ ΠΎΠ±Π»Π°ΡΡ‚ΡŒΡŽ видимости.

int f(char*);

void g()

{

 extern f(int);

 f("asdf"); // ошибка: f(int) скрываСт f(char*) поэтому

  // Π² Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ области видимости Π½Π΅Ρ‚ f(char*)

}

Для Ρ€Π°Π·Π½Ρ‹Ρ… Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ΠΎΠ² ΠΏΠ΅Ρ€Π΅Π³Ρ€ΡƒΠΆΠ΅Π½Π½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ-Ρ‡Π»Π΅Π½Π° ΠΌΠΎΠΆΠ½ΠΎ Π·Π°Π΄Π°Ρ‚ΡŒ Ρ€Π°Π·Π½Ρ‹Π΅ ΠΏΡ€Π°Π²ΠΈΠ»Π° доступа, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€:

class buffer {

private:

 char* p;

 int size;


protected:

 buffer(int s, char* store) { size = s; p = store; }

 //…


public:

 buffer(int s) { p = new char[size = s]; }

};

R.13.2 БопоставлСниС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ²

ΠŸΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ с Π΄Π°Π½Π½Ρ‹ΠΌ ΠΈΠΌΠ΅Π½Π΅ΠΌ происходит Π²Ρ‹Π±ΠΎΡ€ ΠΈΠ· всСх Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ с этим ΠΈΠΌΠ΅Π½Π΅ΠΌ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ находятся Π² Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ области видимости, ΠΈ для ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚ прСобразования Ρ‚ΠΈΠΏΠ°, Π΄Π΅Π»Π°ΡŽΡ‰ΠΈΠ΅ Π²Ρ‹Π·ΠΎΠ² Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹ΠΌ. ВыбираСтся Ρ‚Π° функция, которая Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ соотвСтствуСт фактичСским ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°ΠΌ. Она находится Π² области пСрСсСчСния мноТСств Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, ΠΊΠ°ΠΆΠ΄ΠΎΠ΅ ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‚ Π²Ρ‹Π·ΠΎΠ²Ρƒ ΠΏΠΎ Π΄Π°Π½Π½ΠΎΠΌΡƒ фактичСскому ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρƒ. ΠžΠΏΠ΅Ρ€Π°Ρ†ΠΈΡ Π²Ρ‹Π·ΠΎΠ²Π° считаСтся допустимой, Ссли Π² этом пСрСсСчСнии находится Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ Ρ‡Π»Π΅Π½. Ѐункция, выбранная Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Π΄ΠΎΠ»ΠΆΠ½Π° Π±ΠΎΠ»Π΅Π΅ любой Π΄Ρ€ΡƒΠ³ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ с Ρ‚Π΅ΠΌ ΠΆΠ΅ ΠΈΠΌΠ΅Π½Π΅ΠΌ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ Π²Ρ‹Π·ΠΎΠ²Ρƒ, хотя Π±Ρ‹ ΠΏΠΎ ΠΎΠ΄Π½ΠΎΠΌΡƒ ΠΈΠ· ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² (Π½Π΅ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ это Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠ΄ΠΈΠ½ ΠΈ Ρ‚ΠΎΡ‚ ΠΆΠ΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ для Ρ€Π°Π·Π½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ). Π’ ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС, Π²Ρ‹Π·ΠΎΠ² считаСтся нСдопустимым.

ΠŸΡ€ΠΈ сопоставлСнии ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°ΡŽΡ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ с числом стандартных Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² (Β§R.8.2.6), Ρ€Π°Π²Π½Ρ‹ΠΌ n, ΠΊΠ°ΠΊ n+1 Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ с Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹ΠΌ числом ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ².

ΠŸΡ€ΠΈ сопоставлСнии ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² Π½Π΅ΡΡ‚Π°Ρ‚ΠΈΡ‡Π΅ΡΠΊΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ-Ρ‡Π»Π΅Π½ Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°ΡŽΡ‚ ΠΊΠ°ΠΊ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, ΠΈΠΌΠ΅ΡŽΡ‰ΡƒΡŽ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€, ΡƒΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‰ΠΈΠΉ Π½Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, для ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ вызываСтся функция. Π­Ρ‚ΠΎΡ‚ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ Ρ„ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡΠΎΠΏΠΎΡΡ‚Π°Π²Π»ΡΡ‚ΡŒΡΡ ΠΈΠ»ΠΈ с ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ, ΠΈΠ»ΠΈ с ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΌ Π½Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, Π·Π°Π΄Π°Π½Π½Ρ‹ΠΌΠΈ Π² явной ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Π²Ρ‹Π·ΠΎΠ²Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ-Ρ‡Π»Π΅Π½Π° (Β§R.5.2.4), ΠΈΠ»ΠΈ ΠΆΠ΅ с ΠΏΠ΅Ρ€Π²Ρ‹ΠΌ ΠΎΠΏΠ΅Ρ€Π°Π½Π΄ΠΎΠΌ ΠΏΠ΅Ρ€Π΅Π³Ρ€ΡƒΠΆΠ΅Π½Π½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ operator (Β§R.13.4). Для этого Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π½ΠΈΠΊΠ°ΠΊΠΈΡ… Π²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ², Π° для достиТСния сопоставлСния Π½Π΅ производится Π½ΠΈΠΊΠ°ΠΊΠΈΡ… ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΡ… ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠΉ Ρ‚ΠΈΠΏΠ°.

Если явно вызываСтся Ρ‡Π»Π΅Π½ класса X, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ ΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΡŽ -β€Ί, Ρ‚ΠΎ считаСтся, Ρ‡Ρ‚ΠΎ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‚ΠΈΠΏ const* X для Ρ‡Π»Π΅Π½ΠΎΠ² Ρ‚ΠΈΠΏΠ° const, volatile* X для Ρ‡Π»Π΅Π½ΠΎΠ² Ρ‚ΠΈΠΏΠ° volatile ΠΈ X* для всСх ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Ρ… Ρ‡Π»Π΅Π½ΠΎΠ². Если явно вызываСтся функция-Ρ‡Π»Π΅Π½, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΡŽ., Π° Ρ‚Π°ΠΊΠΆΠ΅, Ссли вызываСтся функция для ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ ΠΎΠΏΠ΅Ρ€Π°Π½Π΄Π° ΠΏΠ΅Ρ€Π΅Π³Ρ€ΡƒΠΆΠ΅Π½Π½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ operator (Β§R.9.4), Ρ‚ΠΎ считаСтся, Ρ‡Ρ‚ΠΎ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‚ΠΈΠΏ: const X& для Ρ‡Π»Π΅Π½ΠΎΠ² Ρ‚ΠΈΠΏΠ° const, volatile X& для Ρ‡Π»Π΅Π½ΠΎΠ² Ρ‚ΠΈΠΏΠ° volatile ΠΈ X& для всСх ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Ρ… Ρ‡Π»Π΅Π½ΠΎΠ². ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ ΠΎΠΏΠ΅Ρ€Π°Π½Π΄ для -β€Ί* ΠΈ .* рассматриваСтся Ρ‚Π°ΠΊ ΠΆΠ΅, ΠΊΠ°ΠΊ ΠΈ ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ ΠΎΠΏΠ΅Ρ€Π°Π½Π΄ для -β€Ί ΠΈ . соотвСтствСнно.

Эллипсис Π² спискС Ρ„ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½Ρ‹Ρ… ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² (Β§R.8.2.5) ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΠΏΠΎΡΡ‚Π°Π²Π»ΡΡ‚ΡŒΡΡ с фактичСским ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠΌ любого Ρ‚ΠΈΠΏΠ°.

Для Π΄Π°Π½Π½ΠΎΠ³ΠΎ фактичСского ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° допускаСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ такая ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠΉ Ρ‚ΠΈΠΏΠ°, которая содСрТит Π½Π΅ Π±ΠΎΠ»Π΅Π΅ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ прСобразования. Π•Π΅ нСльзя ΡΠΎΠΊΡ€Π°Ρ‚ΠΈΡ‚ΡŒ, ΠΈΡΠΊΠ»ΡŽΡ‡ΠΈΠ² ΠΎΠ΄Π½ΠΎ ΠΈΠ»ΠΈ нСсколько ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠΉ, Π΄ΠΎ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ, которая Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ Ρ‚ΠΈΠΏΡƒ, сопоставимому с Ρ‚ΠΈΠΏΠΎΠΌ рассматриваСмого Ρ„ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°. Вакая ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠΉ называСтся Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΉ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒΡŽ.

НапримСр, ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ int-β€Ίfloat-β€Ίdouble Π·Π°Π΄Π°Π΅Ρ‚ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ int Π² double, Π½ΠΎ Π΅Π΅ нСльзя Π½Π°Π·Π²Π°Ρ‚ΡŒ Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΉ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒΡŽ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π² Π½Π΅ΠΉ содСрТится Π±ΠΎΠ»Π΅Π΅ короткая ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ int-β€Ίdouble.