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

       

Конструкторы копий должны использовать списки инициализации членов


У наследования тоже есть свои проблемы с копированием. Конструктор копии все же остается конструктором, поэтому здесь также применимы результаты обсуждения предыдущего правила. Если у конструктора копии нет списка инициализации членов, то для базовых классов и вложенных объектов используется конструктор по умолчанию. Так как список инициализации членов отсутствует в следующем определении конструктора копии, то компонент базового класса в объекте производного класса инициализируется с использованием base(void), а поле s инициализируется с использованием string::string(void):

class base

{

public:

   base( void );                  // конструктор по умолчанию

   base( const base r );         //

конструктор копии

   const base operator=( const base r );

};

class derived

{

   string s;              // класс имеет конструктор копии

public:

   derived( const derived r )

};

derived::derived( const derived r )

{}

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

derived::derived( const derived r ) : base(r), s(r.s) {}



Содержание раздела