Язык программирования C++. Вводный курс



              

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


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

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;

}

·                  определение непустого последовательного контейнера:




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