С++ для начинающих


Опасность увеличения размера программы


Встроенный деструктор может стать причиной непредвиденного увеличения размера программы, поскольку он вставляется в каждой точке выхода внутри функции для каждого активного локального объекта. Например, в следующем фрагменте

Account acct( "Tina Lee" );

int swt;

// ...

switch( swt ) {

case 0:

   return;

case 1:

   // что-то сделать

   return;

case 2:

   // сделать что-то другое

   return;



// и так далее

}

компилятор подставит деструктор перед каждой инструкцией return. Деструктор класса Account невелик, и затраты времени и памяти на его подстановку тоже малы. В противном случае придется либо объявить деструктор невстроенным, либо реорганизовать программу. В примере выше инструкцию return в каждой метке case можно заменить инструкцией break с тем, чтобы у функции была единственная точка выхода:

// переписано для обеспечения единственной точки выхода

switch( swt ) {

case 0:

   break;

case 1:

   // что-то сделать

   break;

case 2:

   // сделать что-то другое

   break;

// и так далее

}

// единственная точка выхода

return;

Упражнение 14.6

Напишите подходящий деструктор для приведенного набора членов класса, среди которых pstring адресует динамически выделенный массив символов:

class NoName {

public:

   ~NoName();

   // ...

private:

   char    *pstring;

   int     ival;

   double  dval;

};

Упражнение 14.7

Необходим ли деструктор для класса, который вы выбрали в упражнении 14.3? Если нет, объясните почему. В противном случае предложите реализацию.

Упражнение 14.8

Сколько раз вызываются деструкторы в следующем фрагменте:

void mumble( const char *name, fouble balance, char acct_type )

{

   Account acct;

   if ( ! name )

      return;

   if ( balance <= 99 )

      return;

   switch( acct_type ) {

      case 'z': return;

      case 'a':

      case 'b': return;

   }

   // ...

}



Содержание раздела