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



         

Почленное присваивание A - часть 2


/p>

}

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

newAcct = oldAcct;

выполняются следующие шаги:

1.      Выясняется, есть ли в классе явный копирующий оператор присваивания.

2.      Если есть, проверяются права доступа к нему, чтобы понять, можно ли его вызывать в данном месте программы.

3.      Оператор вызывается для выполнения присваивания; если же он недоступен, компилятор выдает сообщение об ошибке.

4.      Если явного оператора нет, выполняется почленное присваивание по умолчанию.

5.      При почленном присваивании каждому члену встроенного или составного члена объекта в левой части присваивается значение соответственного члена объекта в правой части.

6.      Для каждого члена, являющегося объектом класса, рекурсивно применяются шаги 1-6, пока не останутся только члены встроенных и составных типов.

Если мы снова модифицируем определение класса Account так, что _name

будет иметь тип string, то почленное присваивание по умолчанию

newAcct = oldAcct;

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

inline Account&

Account::

operator=( const Account &rhs )

{

   _balance = rhs._balance;

   _acct_nmbr = rhs._acct_nmbr;

   // этот вызов правилен и с точки зрения программиста

   name.string::operator=( rhs._name );

}

Однако почленное присваивание по умолчанию для объектов класса Account не подходит из-за _acct_nmbr. Нужно реализовать явный копирующий оператор присваивания с учетом того, что _name – это объект класса string:

Account&

Account::

operator=( const Account &rhs )

{

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

   if ( this != &rhs )

   {

      // вызывается string::operator=( const string& )

      _name = rhs._name;

      _balance = rhs._balance;

   }

   return *this;

}

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

Копирующий конструктор и копирующий оператор присваивания обычно рассматривают вместе. Если необходим один, то, как правило, необходим и другой. Если запрещается один, то, вероятно, следует запретить и другой.

Упражнение 14.17

Реализуйте копирующий оператор присваивания для каждого из классов, определенных в упражнении 14.14 из раздела 14.6.

Упражнение 14.18

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




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