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



              

Почленное присваивание A


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

newAcct = oldAcct;

по умолчанию присваивает каждому нестатическому члену newAcct значение соответственного члена oldAcct. Компилятор генерирует следующий копирующий оператор присваивания:

inline Account&

Account::

operator=( const Account &rhs )

{

   _name = rhs._name;

   _balance = rhs._balance;

   _acct_nmbr = rhs._acct_nmbr;

}

Как правило, если для класса не подходит почленная инициализация по умолчанию, то не подходит и почленное присваивание по умолчанию. Например, для первоначального определения класса Account, где член _name был объявлен как char*, такое присваивание не годится ни для _name, ни для _acct_nmbr.

Мы можем подавить его, если предоставим явный копирующий оператор присваивания, где будет реализована подходящая для класса семантика:

// общий вид копирующего оператора присваивания

className&

className::

operator=( const className &rhs )

{

   // не надо присваивать самому себе

   if ( this != &rhs )

   {

        // здесь реализуется семантика копирования класса

   }

   // вернуть объект, которому присвоено значение

   return *this;

}

Здесь условная инструкция

if ( this != &rhs )

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

Account&

Account::

operator=( const Account &rhs )

{

   // не надо присваивать самому себе

   if ( this != &rhs )

   {

      delete [] _name;

      _name = new char[strlen(rhs._name)+1];

      strcpy( _name,rhs._name );

      _balance = rhs._balance;

      _acct_nmbr = rhs._acct_nmbr;

   }

   return *this;

<


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