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

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

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

Π’Π΅Π»ΠΎ дСструктора выполняСтся ΠΏΡ€Π΅ΠΆΠ΄Π΅ дСструкторов для ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ², ΡΠ²Π»ΡΡŽΡ‰ΠΈΡ…ΡΡ Ρ‡Π»Π΅Π½Π°ΠΌΠΈ. ДСструкторы для нСстатичСских ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ², ΡΠ²Π»ΡΡŽΡ‰ΠΈΡ…ΡΡ Ρ‡Π»Π΅Π½Π°ΠΌΠΈ, Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ΡΡ ΠΏΡ€Π΅ΠΆΠ΄Π΅, Ρ‡Π΅ΠΌ дСструкторы для Π±Π°Π·ΠΎΠ²Ρ‹Ρ… классов. ДСструкторы для Π½Π΅Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… Π±Π°Π·ΠΎΠ²Ρ‹Ρ… классов Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ΡΡ ΠΏΡ€Π΅ΠΆΠ΄Π΅, Ρ‡Π΅ΠΌ дСструкторы для Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… Π±Π°Π·ΠΎΠ²Ρ‹Ρ… классов. ДСструкторы для Π½Π΅Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… Π±Π°Π·ΠΎΠ²Ρ‹Ρ… классов Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ΡΡ Π² порядкС, ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠΌ ΠΈΡ… описанию Π² ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½ΠΎΠΌ классС. ДСструкторы Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… Π±Π°Π·ΠΎΠ²Ρ‹Ρ… классов Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ΡΡ Π² порядкС, ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠΌ появлСнию ΠΈΡ… ΠΏΡ€ΠΈ ΠΎΠ±Ρ…ΠΎΠ΄Π΅ снизу ΠΈ слСва-Π½Π°ΠΏΡ€Π°Π²ΠΎ Π°Ρ†ΠΈΠΊΠ»ΠΈΡ‡Π½ΠΎΠ³ΠΎ Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½Π½ΠΎΠ³ΠΎ Π³Ρ€Π°Ρ„Π° Π±Π°Π·ΠΎΠ²Ρ‹Ρ… классов. Π—Π΄Π΅ΡΡŒ "слСва-Π½Π°ΠΏΡ€Π°Π²ΠΎ" ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ порядок появлСния ΠΈΠΌΠ΅Π½ Π±Π°Π·ΠΎΠ²Ρ‹Ρ… классов, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±Ρ‹Π» ΠΏΡ€ΠΈ описании ΠΈΡ… Π² ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½ΠΎΠΌ классС. ДСструкторы для элСмСнтов массива Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ Π² порядкС, ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠΌ Π²Ρ‹Π·ΠΎΠ²Π°ΠΌ ΠΏΡ€ΠΈ ΠΈΡ… построСнии.

ДСструктор ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹ΠΌ.

Π’ дСструкторС ΠΌΠΎΠΆΠ½ΠΎ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ-Ρ‡Π»Π΅Π½, см. Β§R.12.7.

ΠžΠ±ΡŠΠ΅ΠΊΡ‚ класса с дСструктором Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Ρ‡Π»Π΅Π½ΠΎΠΌ объСдинСния.

ДСструкторы Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ нСявно Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… случаях:

(1) ΠΊΠΎΠ³Π΄Π° ΠΈΡΡ‡Π΅Π·Π°ΡŽΡ‚ ΠΈΠ· области видимости ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ auto (Β§R.3.5) ΠΈΠ»ΠΈ Π²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ (Β§R.12.2, Β§R.8.4.3);

(2) ΠΏΡ€ΠΈ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ (Β§R.3.4) для построСнных статичСских ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² (Β§R.3.5);

(3) благодаря ΠΎΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΡŽ ΠΊ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ delete (Β§R.5.3.4) для ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ², созданных с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ new (Β§R.5.3.3);

(4) ΠΏΡ€ΠΈ явном Π²Ρ‹Π·ΠΎΠ²Π΅.

Когда дСструктор вызываСтся ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠ΅ΠΉ delete, Ρ‚ΠΎ ΠΎΠ½ освобоТдаСт ΠΏΠ°ΠΌΡΡ‚ΡŒ для самого большСго ΠΈΠ· ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹Ρ… классов (Β§R.12.6.2) Ρ‚ΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ использовал ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΡŽ delete() (Β§R.5.3.4), Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€:

class X {

 //…

 public:

 X(int);

 ~X();

};


void g(X*);


void f() // ΠΎΠ±Ρ‰ΠΈΠΉ случай

{

 X* p = new X(111); // Ρ€Π°Π·ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠ΅ ΠΈ инициализация

 g(p);

 delete p; // освобоТдСниС ΠΈ ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠ΅

}

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

void* operator new(size_t, void* p) { return p; }


void f(X* p);


static char buf[sizeof(X)];


void g() // Ρ€Π΅Π΄ΠΊΠΈΠΉ, ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΉ случай

{

 X* p = new(buf) X(222); // Ρ€Π°Π·ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠ΅ Π² buf[] ΠΈ инициализация

 f(p);

 p-β€ΊX::~X(); // ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠ΅

}

ΠžΠ±ΠΎΠ·Π½Π°Ρ‡Π΅Π½ΠΈΡ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Π½Π½Ρ‹Π΅ для явного Π²Ρ‹Π·ΠΎΠ²Π° дСструктора, ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ для ΠΈΠΌΠ΅Π½ΠΈ любого простого Ρ‚ΠΈΠΏΠ°, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€,

int* p;

//…

p-β€Ίint::~int();

ИспользованиС Ρ‚Π°ΠΊΠΎΠΉ записи для Ρ‚ΠΈΠΏΠ°, Ρƒ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Π½Π΅Ρ‚ дСструктора, ΠΏΡ€ΠΎΡ…ΠΎΠ΄ΠΈΡ‚ бСсслСдно. Допуская Ρ‚Π°ΠΊΡƒΡŽ запись, ΠΌΡ‹ Ρ€Π°Π·Ρ€Π΅ΡˆΠ°Π΅ΠΌ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡΠΌ ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ, Π½Π΅ Π·Π°Π΄ΡƒΠΌΡ‹Π²Π°ΡΡΡŒ Π½Π°Π΄ Ρ‚Π΅ΠΌ, Π΅ΡΡ‚ΡŒ Π»ΠΈ Π΄Π°Π½Π½ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ° дСструктор.

R.12.5 Бвободная ΠΏΠ°ΠΌΡΡ‚ΡŒ

Когда создаСтся ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ new, для получСния свободной памяти вызываСтся (нСявно) функция operator new() (Β§R.5.3.3).

Если функция operator new() Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ запрос, ΠΎΠ½Π° Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ 0.

Π’ классС X функция X::operator new() являСтся статичСским Ρ‡Π»Π΅Π½ΠΎΠΌ, Π΄Π°ΠΆΠ΅ Ссли ΠΎΠ½Π° Π½Π΅ описана явно ΠΊΠ°ΠΊ static. ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ Π΅Π΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΈΠΌΠ΅Ρ‚ΡŒ Ρ‚ΠΈΠΏ size_t, - зависящий ΠΎΡ‚ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ цСлочислСнный Ρ‚ΠΈΠΏ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ Π² стандартном Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½ΠΎΠΌ Ρ„Π°ΠΉΠ»Π΅ β€Ήstddef.hβ€Ί, ΠΈ ΠΎΠ½Π° Π΄ΠΎΠ»ΠΆΠ½Π° Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Ρ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠ° void*, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€:

class X {

 //…

 void* operator new(size_t);

 void* operator new(size_t, Arena*);

};

ΠŸΡ€Π°Π²ΠΈΠ»Π° Π²Ρ‹Π±ΠΎΡ€Π° подходящСй Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ operator new() ΠΎΠ±ΡΡƒΠΆΠ΄Π°ΡŽΡ‚ΡΡ Π² Β§R.5.3.3.

Π’ классС X функция X::operator delete() являСтся статичСским Ρ‡Π»Π΅Π½ΠΎΠΌ, Π΄Π°ΠΆΠ΅ Ссли ΠΎΠ½Π° Π½Π΅ описана явно ΠΊΠ°ΠΊ static. ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ Π΅Π΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ Ρ‚ΠΈΠΏΠ° void* ΠΈ ΠΌΠΎΠΆΠ½ΠΎ Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ Π²Ρ‚ΠΎΡ€ΠΎΠΉ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ Ρ‚ΠΈΠΏΠ° size_t. Она Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Ρ‚ΡŒ ΠΊΠ°ΠΊΠΎΠ΅-Π»ΠΈΠ±ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΈ Ρ‚ΠΈΠΏ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ³ΠΎ значСния Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ void, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€:

class X {

 //…

 void operator delete(void*);

};


class Y {

 //…

 void operator delete(void*, size_t);

};

Π’ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ классС ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠΏΠΈΡΠ°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄Π½Ρƒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ operator delete(), Π·Π½Π°Ρ‡ΠΈΡ‚ эта функция Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΠ΅Ρ€Π΅Π³Ρ€ΡƒΠΆΠ΅Π½Π½ΠΎΠΉ. Π“Π»ΠΎΠ±Π°Π»ΡŒΠ½Π°Ρ функция operator delete() ΠΈΠΌΠ΅Π΅Ρ‚ СдинствСнный ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ Ρ‚ΠΈΠΏΠ° void*.

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

Для массивов ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Ρ‚ΠΈΠΏΠ° класс ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ operator new() ΠΈ operator delete() (Β§R.5.3.3, Β§R.5.3.4).

ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ X::operator new() ΠΈ X::operator delete() статичСскиС, ΠΎΠ½ΠΈ Π½Π΅ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹ΠΌΠΈ. Ѐункция operator delete(), которая вызываСтся ΠΈΠ· дСструктора для освобоТдСния памяти, выбираСтся ΠΏΠΎ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΌ ΠΏΡ€Π°Π²ΠΈΠ»Π°ΠΌ областСй видимости, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€:

struct B {

 virtual ~B();

 void* operator new(size_t);

 void operator delete(void*);

};


struct D: B {

 ~D();

 void* operator new(size_t);

 void operator delete(void*);

};


void f()

{

 B* p = new D;

 delete p;

}

Π’ этом ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΏΠ°ΠΌΡΡ‚ΡŒ для ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° класса D выдСляСтся с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ D::operator new(), Π° благодаря Π½Π°Π»ΠΈΡ‡ΠΈΡŽ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ дСструктора, освобоТдаСтся с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ D::operator delete().

R.12.6 Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡ

ΠžΠ±ΡŠΠ΅ΠΊΡ‚ класса Π±Π΅Π· конструкторов, Π±Π΅Π· частных ΠΈΠ»ΠΈ Π·Π°Ρ‰ΠΈΡ‰Π΅Π½Π½Ρ‹Ρ… Ρ‡Π»Π΅Π½ΠΎΠ², Π±Π΅Π· Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΈ Π±Π΅Π· Π±Π°Π·ΠΎΠ²Ρ‹Ρ… классов ΠΌΠΎΠΆΠ½ΠΎ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ списка ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ΠΎΠ² (Β§R.8.4.1). ΠžΠ±ΡŠΠ΅ΠΊΡ‚ класса с конструктором Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΈΠ»ΠΈ ΠΈΠΌΠ΅Ρ‚ΡŒ стандартный конструктор (Β§R.12.1). Π‘Ρ‚Π°Π½Π΄Π°Ρ€Ρ‚Π½Ρ‹ΠΉ конструктор ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ проходят явной ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ.

R.12.6.1 Явная инициализация

ΠžΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ классов с конструкторами (Β§R.12.1) ΠΌΠΎΠΆΠ½ΠΎ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ списком Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ, Π·Π°ΠΊΠ»ΡŽΡ‡Π΅Π½Π½Ρ‹ΠΌ Π² скобки. Π­Ρ‚ΠΎΡ‚ список считаСтся списком фактичСских ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² для Π²Ρ‹Π·ΠΎΠ²Π° конструктора, производящСго ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ. Π˜Π½Π°Ρ‡Π΅, Π² качСствС ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π° задаСтся с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ = ΠΎΠ΄Π½ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅. Оно ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΊΠ°ΠΊ фактичСский ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ для конструктора копирования. ΠžΠ±Ρ‹Ρ‡Π½ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠ±ΠΎΠΉΡ‚ΠΈΡΡŒ Π±Π΅Π· Π²Ρ‹Π·ΠΎΠ²Π° конструктора копирования, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€:

class complex {

 //…

public:

 complex();

 complex(double);

 complex(double,double);

 //…

};


complex sqrt(complex,complex);


complex a(1); // инициализация Π²Ρ‹Π·ΠΎΠ²ΠΎΠΌ

  // complex(double)

complex b = a; // инициализация ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ `a'

complex c = complex(1,2); // конструктор complex(1,2)

  // вызываСтся complex(double,double)

  // ΠΈ копируСтся Π² `c'

complex d = sqrt(b,c); // вызываСтся sqrt(complex,complex),

  // Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ копируСтся Π² `d'

complex e; // инициализация Π²Ρ‹Π·ΠΎΠ²ΠΎΠΌ конструктора

complex f = 3; // complex(3), вызываСтся

  // complex(double) ΠΈ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚

  // копируСтся Π² `f'

ΠŸΠ΅Ρ€Π΅Π³Ρ€ΡƒΠ·ΠΊΠ° ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ присваивания = Π½Π΅ ΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ влияниС Π½Π° ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ.

Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡ, происходящая ΠΏΡ€ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π΅ фактичСских ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² ΠΈ ΠΏΡ€ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‚Π΅ ΠΈΠ· Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, эквивалСнтна ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Π²ΠΈΠ΄Π°

T x = a;

Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡ, происходящая Π² Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ new (Β§R.5.3.3) ΠΈ ΠΏΡ€ΠΈ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Π±Π°Π·ΠΎΠ²Ρ‹Ρ… классов ΠΈ Ρ‡Π»Π΅Π½ΠΎΠ², эквивалСнтна ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Π²ΠΈΠ΄Π°

T x(a);

Для массивов ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² класса с конструкторами ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ ΠΏΡ€ΠΈ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ (Β§R.12.1) конструкторы ΠΊΠ°ΠΊ ΠΈ для ΠΎΠ΄ΠΈΠ½ΠΎΡ‡Π½Ρ‹Ρ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ². Если оказалось, Ρ‡Ρ‚ΠΎ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ΠΎΠ² Π² спискС мСньшС, Ρ‡Π΅ΠΌ элСмСнтов массива, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ стандартный конструктор (Β§R.12.1). Если Π΅Π³ΠΎ Π½Π΅Ρ‚, список ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ΠΎΠ² Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ ΠΏΠΎΠ»Π½Ρ‹ΠΌ. ΠŸΡ€ΠΈΠ²Π΅Π΄Π΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€:

complex cc = { 1, 2 }; // ошибка: Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ

  // ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ конструктор

complex v[6] = { 1,complex(1,2),complex(),2 };

Π—Π΄Π΅ΡΡŒ v[0] ΠΈ v[3] ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΡŽΡ‚ΡΡ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ complex::complex(double), v[1] инициализируСтся complex::complex(double,double), Π° v[2], v[4] ΠΈ v[5] ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Ρ‹ complex::complex().

ΠžΠ±ΡŠΠ΅ΠΊΡ‚ класса M ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Ρ‡Π»Π΅Π½ΠΎΠΌ класса X Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΈΠ· ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… случаСв:

(1) M Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ конструктора;

(2) M ΠΈΠΌΠ΅Π΅Ρ‚ стандартный конструктор;

(3) X ΠΈΠΌΠ΅Π΅Ρ‚ конструктор ΠΈ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΈΠ· Π½ΠΈΡ… Π·Π°Π΄Π°Π΅Ρ‚ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€-ctor (Β§R.12.6.2) для Ρ‡Π»Π΅Π½Π° M.

Π’ случаС 2 ΠΏΡ€ΠΈ создании составного ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° вызываСтся стандартный конструктор. Если Ρ‡Π»Π΅Π½ составного ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° ΠΈΠΌΠ΅Π΅Ρ‚ дСструктор, Ρ‚ΠΎ ΠΎΠ½ вызываСтся ΠΏΡ€ΠΈ ΡƒΠ½ΠΈΡ‡Ρ‚ΠΎΠΆΠ΅Π½ΠΈΠΈ составного ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°.