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

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«Π‘Ρ‚Π°Π½Π΄Π°Ρ€Ρ‚Ρ‹ программирования Π½Π° Π‘++. 101 ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ ΠΈ рСкомСндация». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 26

Автор Π“Π΅Ρ€Π± Π‘Π°Ρ‚Ρ‚Π΅Ρ€

Если класс опрСдСляСт Π»ΡŽΠ±ΡƒΡŽ ΠΏΠ΅Ρ€Π΅Π³Ρ€ΡƒΠ·ΠΊΡƒ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° new, ΠΎΠ½ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΏΠ΅Ρ€Π΅Π³Ρ€ΡƒΠ·ΠΈΡ‚ΡŒ всС Ρ‚Ρ€ΠΈ стандартных Ρ‚ΠΈΠΏΠ° этого ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° β€” ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΉ new, Ρ€Π°Π·ΠΌΠ΅Ρ‰Π°ΡŽΡ‰ΠΈΠΉ ΠΈ Π½Π΅ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ. Если этого Π½Π΅ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ, Ρ‚ΠΎ эти ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ окаТутся скрытыми ΠΈ нСдоступными ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡΠΌ вашСго класса.

ΠžΠ±ΡΡƒΠΆΠ΄Π΅Π½ΠΈΠ΅

ΠžΠ±Ρ‹Ρ‡Π½ΠΎ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠ΅ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ new ΠΈ delete Π½ΡƒΠΆΠ½Ρ‹ ΠΎΡ‡Π΅Π½ΡŒ Ρ€Π΅Π΄ΠΊΠΎ, Π½ΠΎ Ссли ΠΎΠ½ΠΈ всС ΠΆΠ΅ ΠΎΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹, Ρ‚ΠΎ вряд Π»ΠΈ Π²Ρ‹ Π·Π°Ρ…ΠΎΡ‚ΠΈΡ‚Π΅, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ½ΠΈ скрывали встроСнныС сигнатуры.

Π’ Π‘++, послС Ρ‚ΠΎΠ³ΠΎ ΠΊΠ°ΠΊ Π²Ρ‹ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚Π΅ имя Π² области видимости (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π² области видимости класса), всС Ρ‚Π°ΠΊΠΈΠ΅ ΠΆΠ΅ ΠΈΠΌΠ΅Π½Π° Π² ΠΎΡ…Π²Π°Ρ‚Ρ‹Π²Π°ΡŽΡ‰ΠΈΡ… областях видимости окаТутся скрыты (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π² Π±Π°Π·ΠΎΠ²Ρ‹Ρ… классах ΠΈΠ»ΠΈ ΠΎΡ…Π²Π°Ρ‚Ρ‹Π²Π°ΡŽΡ‰ΠΈΡ… пространствах ΠΈΠΌΠ΅Π½), Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ ΠΏΠ΅Ρ€Π΅Π³Ρ€ΡƒΠ·ΠΊΠ° Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Ρ‡Π΅Ρ€Π΅Π· Π³Ρ€Π°Π½ΠΈΡ†Ρ‹ областСй видимости. Когда Ρ€Π΅Ρ‡ΡŒ ΠΈΠ΄Π΅Ρ‚ ΠΎΠ± ΠΈΠΌΠ΅Π½ΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° new, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π±Ρ‹Ρ‚ΡŒ особСнно остороТным ΠΈ Π²Π½ΠΈΠΌΠ°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π΅ ΡƒΡΠ»ΠΎΠΆΠ½ΡΡ‚ΡŒ Тизнь сСбС ΠΈ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡΠΌ вашСго класса.

ΠŸΡƒΡΡ‚ΡŒ Π²Ρ‹ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠ»ΠΈ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ new, спСцифичный для класса:

class Π‘ {

 // ...


 // Π‘ΠΊΡ€Ρ‹Π²Π°Π΅Ρ‚ Ρ‚Ρ€ΠΈ стандартных Π²ΠΈΠ΄Π° ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° new

 static void* operator new(size_t, MemoryPool&);

};

Π’Π΅ΠΏΠ΅Ρ€ΡŒ, Ссли ΠΊΡ‚ΠΎ-Ρ‚ΠΎ попытаСтся Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ с ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΌ стандартным new Π‘, компилятор сообщит ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ Π½Π΅ Π² состоянии Π½Π°ΠΉΡ‚ΠΈ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΉ старый ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ new. ОбъявлСниС ΠΏΠ΅Ρ€Π΅Π³Ρ€ΡƒΠ·ΠΊΠΈ C::operator new с ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠΌ Ρ‚ΠΈΠΏΠ° MemoryPool скрываСт всС ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Π΅ ΠΏΠ΅Ρ€Π΅Π³Ρ€ΡƒΠ·ΠΊΠΈ, Π²ΠΊΠ»ΡŽΡ‡Π°Ρ Π·Π½Π°ΠΊΠΎΠΌΡ‹Π΅ встроСнныС Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹Π΅ вСрсии, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ всС ΠΌΡ‹ Π·Π½Π°Π΅ΠΌ ΠΈ любим:

void* operator new(std::size_t); // ΠžΠ±Ρ‹Ρ‡Π½Ρ‹ΠΉ

void* operator new(std::size_t,

 std::nothrow_t) throw();        // He Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ

void* operator new(std::size_t,

 void*);                         // Π Π°Π·ΠΌΠ΅Ρ‰Π°ΡŽΡ‰ΠΈΠΉ

Π’ качСствС Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π° событий ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Ρ‡Ρ‚ΠΎ ваш класс прСдоставляСт Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΡΠΏΠ΅Ρ†ΠΈΡ„ΠΈΡ‡Π½ΡƒΡŽ для Π΄Π°Π½Π½ΠΎΠ³ΠΎ класса Π²Π΅Ρ€ΡΠΈΡŽ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° new β€” ΠΎΠ΄Π½Ρƒ ΠΈΠ· Ρ‚Ρ€Π΅Ρ…. Π’ Ρ‚Π°ΠΊΠΎΠΌ случаС это объявлСниС Ρ‚Π°ΠΊΠΆΠ΅ скроСт ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Π΅ Π΄Π²Π΅ вСрсии:

class Π‘ {

 // ...

 // Π‘ΠΊΡ€Ρ‹Π²Π°Π΅Ρ‚ Π΄Π²Π΅ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ стандартныС вСрсии ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° new

 static void* operator new(size_t, void*);

};

ΠŸΡ€Π΅Π΄ΠΏΠΎΡ‡Ρ‚ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Ρƒ класса Π‘ Π² Π΅Π³ΠΎ ΠΎΠ±Π»Π°ΡΡ‚ΡŒ видимости Π±Ρ‹Π»ΠΈ явно внСсСны всС Ρ‚Ρ€ΠΈ стандартныС вСрсии ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° new. ΠžΠ±Ρ‹Ρ‡Π½ΠΎ всС ΠΎΠ½ΠΈ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΈΠΌΠ΅Ρ‚ΡŒ ΠΎΠ΄Π½Ρƒ ΠΈ Ρ‚Ρƒ ΠΆΠ΅ Π²ΠΈΠ΄ΠΈΠΌΠΎΡΡ‚ΡŒ. (Π’ΠΈΠ΄ΠΈΠΌΠΎΡΡ‚ΡŒ для ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Ρ… вСрсий ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ сдСлана Π·Π°ΠΊΡ€Ρ‹Ρ‚ΠΎΠΉ, Ссли Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ явно Π·Π°ΠΏΡ€Π΅Ρ‚ΠΈΡ‚ΡŒ ΠΎΠ΄ΠΈΠ½ ΠΈΠ· Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ΠΎΠ² ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° new, ΠΎΠ΄Π½Π°ΠΊΠΎ Ρ†Π΅Π»ΡŒ Π΄Π°Π½Π½ΠΎΠΉ Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄Π°Ρ†ΠΈΠΈ β€” Π½Π°ΠΏΠΎΠΌΠ½ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²Ρ‹ Π½Π΅ скрыли эти вСрсии Π½Π΅ΠΏΡ€Π΅Π΄Π½Π°ΠΌΠ΅Ρ€Π΅Π½Π½ΠΎ.)

Π—Π°ΠΌΠ΅Ρ‚ΠΈΠΌ, Ρ‡Ρ‚ΠΎ Π²Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ всСгда ΠΈΠ·Π±Π΅Π³Π°Ρ‚ΡŒ сокрытия Ρ€Π°Π·ΠΌΠ΅Ρ‰Π°ΡŽΡ‰Π΅Π³ΠΎ new, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΎΠ½ интСнсивно ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π°ΠΌΠΈ стандартной Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ.

ВсС, Ρ‡Ρ‚ΠΎ ΠΎΡΡ‚Π°Π»ΠΎΡΡŒ ΡƒΠΏΠΎΠΌΡΠ½ΡƒΡ‚ΡŒ, β€” это Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ внСсСниС ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° new Π² ΠΎΠ±Π»Π°ΡΡ‚ΡŒ видимости ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ сдСлано двумя Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹ΠΌΠΈ способами Π² Π΄Π²ΡƒΡ… Ρ€Π°Π·Π½Ρ‹Ρ… ситуациях. Если Π±Π°Π·ΠΎΠ²Ρ‹ΠΉ класс вашСго класса Ρ‚Π°ΠΊΠΆΠ΅ опрСдСляСт ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ new, всС, Ρ‡Ρ‚ΠΎ Π²Π°ΠΌ Π½Π°Π΄ΠΎ, β€” "Ρ€Π°ΡΠΊΡ€Ρ‹Ρ‚ΡŒ" ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ new:

class Π‘ : public B { // ...

public:

 using B::operator new;

};

Π’ ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС, Ссли Π½Π΅ имССтся Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ класса ΠΈΠ»ΠΈ Π² Π½Π΅ΠΌ Π½Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ new, Π²Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΊΠΎΡ€ΠΎΡ‚ΠΊΡƒΡŽ ΠΏΠ΅Ρ€Π΅ΡΡ‹Π»Π°ΡŽΡ‰ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ (ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ нСльзя ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ using для внСсСния ΠΈΠΌΠ΅Π½ ΠΈΠ· глобальной области видимости):

class C { // ...

public:

 static void* operator new(std::size_t s) {

  return ::operator new(s);

 }


 static void* operator new(std::size_t s,

  std::nothrow_t nt) throw() {

  return ::operator new(s, nt);

 }


 static void* operator new(std::size_t s, void* p) {

  return ::operator new(s, p);

 }

};

РассмотрСнная рСкомСндация ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΠΌΠ° Ρ‚Π°ΠΊΠΆΠ΅ ΠΊ вСрсиям ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ² для массивов β€” operator new[].

Π˜Π·Π±Π΅Π³Π°ΠΉΡ‚Π΅ Π²Ρ‹Π·ΠΎΠ²Π° вСрсии new(nothrow) Π² вашСм ΠΊΠΎΠ΄Π΅, Π½ΠΎ Ρ‚Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅ ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΡŒΡ‚Π΅ ΠΈ Π΅Π΅, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΠΈ вашСго класса Π½Π΅ оказались Π² ΠΊΠ°ΠΊΠΎΠΉ-Ρ‚ΠΎ ΠΌΠΎΠΌΠ΅Π½Ρ‚ нСприятно ΡƒΠ΄ΠΈΠ²Π»Π΅Π½Ρ‹.

Бсылки

[Dewhurst03] Β§60 β€’ [Sutter04] Β§22-23

ΠšΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ‚ΠΎΡ€Ρ‹, дСструкторы ΠΈ ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅

Если стандарт ΠΏΡ€ΠΈΠ²Π΅Π» вас ΠΊ ΠΎΠ±Ρ€Ρ‹Π²Ρƒ, это Π΅Ρ‰Π΅ Π½Π΅ Π·Π½Π°Ρ‡ΠΈΡ‚, Ρ‡Ρ‚ΠΎ Π²Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΏΡ€Ρ‹Π³Π½ΡƒΡ‚ΡŒ с Π½Π΅Π³ΠΎ.

β€” Норман Π”Π°ΠΉΠΌΠΎΠ½Π΄ (Norman Diamond)

О Π‘ΠΎΠ»ΡŒΡˆΠΎΠΉ Π§Π΅Ρ‚Π²Π΅Ρ€ΠΊΠ΅ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Π±Ρ‹Π»ΠΎ сказано достаточно, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²Ρ‹ Π½Π΅ ΡƒΠ΄ΠΈΠ²Π»ΡΠ»ΠΈΡΡŒ Ρ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ ΠΈΠΌ посвящСн ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΉ Ρ€Π°Π·Π΄Π΅Π». Π—Π΄Π΅ΡΡŒ собраны знания ΠΈ ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ°, связанныС с конструкторами ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ, ΠΊΠΎΠΏΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΌΠΈ конструкторами, ΠΊΠΎΠΏΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΌ присваиваниСм ΠΈ дСструкторами.

Одна ΠΈΠ· ΠΏΡ€ΠΈΡ‡ΠΈΠ½, ΠΏΠΎ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ ΠΏΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ с этими функциями слСдуСт Π±Ρ‹Ρ‚ΡŒ особСнно Π²Π½ΠΈΠΌΠ°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌΠΈ, Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Ссли Π²Ρ‹ Π΄Π°Π΄ΠΈΡ‚Π΅ компилятору хотя Π±Ρ‹ полшанса β€” ΠΎΠ½ Ρ‚ΡƒΡ‚ ΠΆΠ΅ Π½Π°ΠΏΠΈΡˆΠ΅Ρ‚ эти Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π·Π° вас. Π•Ρ‰Π΅ ΠΎΠ΄Π½Π° ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π° состоит Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π‘++ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ рассматриваСт классы ΠΊΠ°ΠΊ Ρ‚ΠΈΠΏΡ‹-значСния, Π½ΠΎ Π΄Π°Π»Π΅ΠΊΠΎ Π½Π΅ всС Ρ‚ΠΈΠΏΡ‹ ΠΈΠΌΠ΅Π½Π½ΠΎ Ρ‚Π°ΠΊΠΎΠ²Ρ‹ (см. Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄Π°Ρ†ΠΈΡŽ 32). Надо ΠΎΡ‚Ρ‡Π΅Ρ‚Π»ΠΈΠ²ΠΎ ΠΏΠΎΠ½ΠΈΠΌΠ°Ρ‚ΡŒ, ΠΊΠΎΠ³Π΄Π° слСдуСт ΠΏΠΈΡΠ°Ρ‚ΡŒ (ΠΈΠ»ΠΈ Π·Π°ΠΏΡ€Π΅Ρ‰Π°Ρ‚ΡŒ) эти ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ явно, ΠΈ ΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€Π°Π²ΠΈΠ»Π°ΠΌ ΠΈ рСкомСндациям ΠΈΠ· этого Ρ€Π°Π·Π΄Π΅Π»Π° β€” это ΠΏΠΎΠΌΠΎΠΆΠ΅Ρ‚ Π²Π°ΠΌ Π² написании ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎΠ³ΠΎ, Ρ€Π°ΡΡˆΠΈΡ€ΡΠ΅ΠΌΠΎΠ³ΠΎ ΠΈ бСзопасного ΠΊΠΎΠ΄Π°.

Π’ этом Ρ€Π°Π·Π΄Π΅Π»Π΅ ΠΌΡ‹ считаСм Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ Π·Π½Π°Ρ‡ΠΈΠΌΠΎΠΉ Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄Π°Ρ†ΠΈΡŽ 51 β€” "ДСструкторы, Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ освобоТдСния рСсурсов ΠΈ ΠΎΠ±ΠΌΠ΅Π½Π° Π½Π΅ ΠΎΡˆΠΈΠ±Π°ΡŽΡ‚ΡΡ".

47. ΠžΠΏΡ€Π΅Π΄Π΅Π»ΡΠΉΡ‚Π΅ ΠΈ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΠΉΡ‚Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅-Ρ‡Π»Π΅Π½Ρ‹ Π² ΠΎΠ΄Π½ΠΎΠΌ порядкС

РСзюмС

ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅-Ρ‡Π»Π΅Π½Ρ‹ всСгда ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΡŽΡ‚ΡΡ Π² Ρ‚ΠΎΠΌ порядкС, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΎΠ½ΠΈ ΠΎΠ±ΡŠΡΠ²Π»Π΅Π½Ρ‹ ΠΏΡ€ΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠΈ класса; порядок ΠΈΡ… упоминания Π² спискС ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ конструктора игнорируСтся. Π£Π±Π΅Π΄ΠΈΡ‚Π΅ΡΡŒ, Ρ‡Ρ‚ΠΎ Π² ΠΊΠΎΠ΄Π΅ конструктора ΡƒΠΊΠ°Π·Π°Π½ Ρ‚ΠΎΡ‚ ΠΆΠ΅ порядок, Ρ‡Ρ‚ΠΎ ΠΈ Π² ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠΈ класса.

ΠžΠ±ΡΡƒΠΆΠ΄Π΅Π½ΠΈΠ΅

Рассмотрим ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΊΠΎΠ΄:

class Employee {

 string email_, firstName_, lastName_;

public:

 Employee( const char* firstName, const char* lastName ) :

  firstName_(firstName), lastName_(lastName),

  email_(firstName_+"."+lastName_+"@acme.com") {}

};

Π­Ρ‚ΠΎΡ‚ ΠΊΠΎΠ΄ содСрТит ΠΎΡˆΠΈΠ±ΠΊΡƒ, ΡΡ‚ΠΎΠ»ΡŒ ΠΆΠ΅ Π½Π΅ΠΏΡ€ΠΈΡΡ‚Π½ΡƒΡŽ, сколь ΠΈ Ρ‚Ρ€ΡƒΠ΄Π½ΠΎ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΠ²Π°Π΅ΠΌΡƒΡŽ. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Ρ‡Π»Π΅Π½ email_ объявлСн Π² ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠΈ класса Π΄ΠΎ first_ ΠΈ last_, ΠΎΠ½ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½ ΠΏΠ΅Ρ€Π²Ρ‹ΠΌ ΠΈ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ‹Ρ‚Π°Ρ‚ΡŒΡΡ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π΅Ρ‰Π΅ Π½Π΅ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ поля. Π‘ΠΎΠ»Π΅Π΅ Ρ‚ΠΎΠ³ΠΎ, Ссли ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ конструктора находится Π² ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠΌ Ρ„Π°ΠΉΠ»Π΅, Ρ‚ΠΎ Π²Ρ‹ΡΠ²ΠΈΡ‚ΡŒ Ρ‚Π°ΠΊΠΎΠ΅ ΡƒΠ΄Π°Π»Π΅Π½Π½ΠΎΠ΅ влияниС порядка объявлСния ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…-Ρ‡Π»Π΅Π½ΠΎΠ² класса Π½Π° ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎΡΡ‚ΡŒ конструктора окаТСтся Π΅Ρ‰Π΅ Ρ‚Ρ€ΡƒΠ΄Π½Π΅Π΅.

Π­Ρ‚Π° ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎΡΡ‚ΡŒ языка обусловлСна Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΡΡ‚ΡŒΡŽ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π΅Π΄ΠΈΠ½Ρ‹ΠΉ порядок уничтоТСния Ρ‡Π»Π΅Π½ΠΎΠ²; Π² ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС дСструктор Π±Ρ‹Π» Π±Ρ‹ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡƒΠ½ΠΈΡ‡Ρ‚ΠΎΠΆΠ°Ρ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Π² Ρ€Π°Π·Π½ΠΎΠΌ порядкС, Π² зависимости ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ, Π² ΠΊΠ°ΠΊΠΎΠΌ ΠΈΠΌΠ΅Π½Π½ΠΎ порядкС конструктор создавал ΠΈΡ…. НакладныС расходы, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Π΅ для Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ этой ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹, ΠΏΡ€ΠΈΠ·Π½Π°Π½Ρ‹ Π½Π΅ΠΏΡ€ΠΈΠ΅ΠΌΠ»Π΅ΠΌΡ‹ΠΌΠΈ.

РСшСниС Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ всСгда ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Ρ‹ Ρ‡Π»Π΅Π½ΠΎΠ² Π² Ρ‚ΠΎΠΌ ΠΆΠ΅ порядкС, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ эти Ρ‡Π»Π΅Π½Ρ‹ ΠΎΠ±ΡŠΡΠ²Π»Π΅Π½Ρ‹ Π² классС. Π’ этом случаС сразу становятся ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½Ρ‹ΠΌΠΈ всС Π½Π΅ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½Ρ‹Π΅ зависимости ΠΌΠ΅ΠΆΠ΄Ρƒ Ρ‡Π»Π΅Π½Π°ΠΌΠΈ. Π•Ρ‰Π΅ Π»ΡƒΡ‡ΡˆΠ΅ ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ ΠΈΠ·Π±Π΅Π³Π°Ρ‚ΡŒ зависимости ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΎΠ΄Π½ΠΎΠ³ΠΎ Ρ‡Π»Π΅Π½Π° ΠΎΡ‚ Π΄Ρ€ΡƒΠ³ΠΈΡ….

МногиС компиляторы (Π½ΠΎ Π½Π΅ всС) Π²Ρ‹Π΄Π°ΡŽΡ‚ ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΈ Π½Π°Ρ€ΡƒΡˆΠ΅Π½ΠΈΠΈ этого ΠΏΡ€Π°Π²ΠΈΠ»Π°.

Бсылки

[Cline99] Β§22.03-1] β€’ [Dewhurst03] Β§52-53 β€’ [Koenig97] Β§4 β€’ [Lakos96] Β§10.3.5 β€’ [Meyers97] Β§13 β€’ [Murray93] Β§2.1.3 β€’ [Sutter00] Β§47

48. Π’ конструкторах ΠΏΡ€Π΅Π΄ΠΏΠΎΡ‡ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ ΠΏΡ€ΠΈΡΠ²Π°ΠΈΠ²Π°Π½ΠΈΡŽ

РСзюмС

Π’ конструкторах использованиС ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ вмСсто присваивания для установки Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…-Ρ‡Π»Π΅Π½ΠΎΠ² прСдохраняСт ΠΎΡ‚ Π½Π΅Π½ΡƒΠΆΠ½ΠΎΠΉ Ρ€Π°Π±ΠΎΡ‚Ρ‹ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ выполнСния ΠΏΡ€ΠΈ Ρ‚ΠΎΠΌ ΠΆΠ΅ объСмС Π²Π²ΠΎΠ΄ΠΈΠΌΠΎΠ³ΠΎ исходного тСкста.

ΠžΠ±ΡΡƒΠΆΠ΄Π΅Π½ΠΈΠ΅

ΠšΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ‚ΠΎΡ€Ρ‹ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΡŽΡ‚ скрытый ΠΊΠΎΠ΄ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ. Рассмотрим ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΊΠΎΠ΄:

class A {

 string s1_, s2_;

public:

 A() { s1_ = "Hello, "; s2_ = "world"; }

};

Π’ Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ сгСнСрированный ΠΊΠΎΠ΄ конструктора выглядит Ρ‚Π°ΠΊ, ΠΊΠ°ΠΊ Ссли Π±Ρ‹ Π²Ρ‹ написали:

А() : s1_(), s2_() { s1_ = "Hello, "; s2_ = "world"; }

To Π΅ΡΡ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹, Π½Π΅ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ Π²Π°ΠΌΠΈ явно, автоматичСски ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΡŽΡ‚ΡΡ с использованиСм ΠΈΡ… конструкторов ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ, послС Ρ‡Π΅Π³ΠΎ выполняСтся присваиваниС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ с использованиСм ΠΈΡ… ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ² присваивания. Π§Π°Ρ‰Π΅ всСго ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ присваивания Π½Π΅Ρ‚Ρ€ΠΈΠ²ΠΈΠ°Π»ΡŒΠ½Ρ‹Ρ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ большС Ρ€Π°Π±ΠΎΡ‚Ρ‹, Ρ‡Π΅ΠΌ конструкторы, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ с ΡƒΠΆΠ΅ созданными ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌΠΈ.

Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, инициализация ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…-Ρ‡Π»Π΅Π½ΠΎΠ² Π² спискС ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Π΄Π°Π΅Ρ‚ ΠΊΠΎΠ΄, Π»ΡƒΡ‡ΡˆΠ΅ Π²Ρ‹Ρ€Π°ΠΆΠ°ΡŽΡ‰ΠΈΠΉ ваши намСрСния ΠΈ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ Π±ΠΎΠ»Π΅Π΅ быстрый ΠΈ мСньшСго Ρ€Π°Π·ΠΌΠ΅Ρ€Π°:

А() : s1_("Hello, "), s2_("world ") { }

Π­Ρ‚Π° ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΈΠΊΠ° Π½Π΅ являСтся ΠΏΡ€Π΅ΠΆΠ΄Π΅Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠ΅ΠΉ; это β€” ΠΈΠ·Π±Π΅ΠΆΠ°Π½ΠΈΠ΅ ΠΏΡ€Π΅ΠΆΠ΄Π΅Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ пСссимизации (см. Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄Π°Ρ†ΠΈΡŽ 9).

Π˜ΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ

ВсСгда выполняйтС Π·Π°Ρ…Π²Π°Ρ‚ нСуправляСмого рСсурса (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠ΅ памяти ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠΌ new, Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Π½Π΅ пСрСдаСтся Π½Π΅ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ конструктору ΠΈΠ½Ρ‚Π΅Π»Π»Π΅ΠΊΡ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ указатСля) Π² Ρ‚Π΅Π»Π΅ конструктора, Π° Π½Π΅ Π² спискС ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ (см. [Sutter02]). ΠšΠΎΠ½Π΅Ρ‡Π½ΠΎ, Π»ΡƒΡ‡ΡˆΠ΅ всСго Π²ΠΎΠΎΠ±Ρ‰Π΅ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚Π°ΠΊΠΈΡ… нСбСзопасных ΠΈ Π½Π΅ ΠΈΠΌΠ΅ΡŽΡ‰ΠΈΡ… Π²Π»Π°Π΄Π΅Π»ΡŒΡ†Π° рСсурсов (см. Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄Π°Ρ†ΠΈΡŽ 13).