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




Почленная инициализация *


Инициализация одного объекта класса другим объектом того же класса, как, например:

Account oldAcct( "Anna Livia Plurabelle" );

Account newAcct( oldAcct );

называется почленной инициализацией по умолчанию. По умолчанию – потому, что она производится автоматически, независимо от того, есть явный конструктор или нет. Почленной – потому, что единицей инициализации является отдельный нестатический член, а не побитовая копия всего объекта класса.

Такую инициализацию проще всего представить, если считать, что компилятор создает специальный внутренний копирующий конструктор, где поочередно, в порядке объявления, инициализируются все нестатические члены. Если рассмотреть первое определение нашего класса Account:

class Account {

public:

   // ...

private:

   char         *_name;

   unsigned int _acct_nmbr;

   double       _balance;

};

то можно представить, что копирующий конструктор по умолчанию определен так:

inline Account::

Account( const Account &rhs )

{

   _name = rhs._name;

   _acct_nmbr = rhs._acct_nmbr;

   _balance = rhs._balance;

}

Почленная инициализация одного объекта класса другим встречается в следующих ситуациях:

  • явная инициализация одного объекта другим:
  • Account newAcct( oldAcct );

    • передача объекта класса в качестве аргумента функции:
    • extern bool cash_on_hand( Account acct );

      if ( cash_on_hand( oldAcct ))

         // ...

      • передача объекта класса в качестве возвращаемого функцией значения:
      • extern Account

               consolidate_accts( const vector< Account >& )

        {

           Account final_acct;

           // выполнить финансовую операцию

           return final_acct;

        }

        • определение непустого последовательного контейнера:
        • // вызывается пять копирующих конструкторов класса string

          vector< string > svec( 5 );

          (В этом примере с помощью конструктора string по умолчанию создается один временный объект, который затем копируется в пять элементов вектора посредством копирующего конструктора string.)

          • вставка объекта класса в контейнер:



          • Содержание  Назад  Вперед