Правила программирования на Си и Си++


         

производного класса действуют так, как


operator=()
производного класса действуют так, как будто бы их эквиваленты в базовом классе (и вложенном объекте) просто не существуют. Другими словами, конструктор по умолчанию — без аргументов —
вызывается для копирования компонента базового класса, а почленное копирование — которое может выполняться просто функцией memcpy()
— используется для поля. Мое понимание пересмотренного проекта стандарта Си++ ISO/ANSI позволяет сделать вывод, что такое поведение некорректно, но в течение некоторого времени вам придется рассчитывать на худшее, чтобы обеспечивать переносимость. Следовательно, это, вероятно, хорошая мысль — всегда помещать в производный класс конструктор копии и функцию operator=(), которые явно вызывают своих двойников из базового класса. Вот реализация предыдущего производного класса для самого худшего случая:
class derived : public base
{
   string s;
public:
   derived( const derived &r );
   const derived &operator=( const derived &r );
};
//-----------------------------------------------------------
derived::derived( const derived &r ) : base(r), s(r.s)
{}
//-----------------------------------------------------------
const derived &derived::operator=( const derived &r )
{
   (* (base*)this) = r;
   s = r.s;
}
Список инициализации членов в конструкторе копии описан ранее. Следующий отрывок из функции operator=()
нуждается в некотором пояснении:
(* (base*)this) = r;
Указатель this указывает на весь текущий объект; добавление оператора приведения преобразует его в указатель на компонент базового класса в текущем объекте — (base*)this. (* (base*)this)
является самим объектом, а выражение (* (base*)this) = r передает этому объекту сообщение, вызывая функцию operator=()
базового класса для перезаписи информации из правого операнда в текущий объект. Вы могли бы заменить этот код таким образом:
base::operator=( r );
но я видел компиляторы, которые бракуют этот оператор, если в базовом классе не объявлена явно функция operator=(). Первая форма работает независимо от того, объявлена явно operator=(), или нет. (Если не объявлена, то у вас будет по умолчанию реализовано почленное копирование).

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





Forekc.ru
Рефераты, дипломы, курсовые, выпускные и квалификационные работы, диссертации, учебники, учебные пособия, лекции, методические пособия и рекомендации, программы и курсы обучения, публикации из профильных изданий