Правила программирования на С и С++. Главы 7-8 Страница 43. Конструкторы копий должны использовать списки инициализации членов
|
Страница 43 из 74
130. Конструкторы копий должны использовать списки инициализации членов.
У наследования тоже есть свои проблемы с копированием. Конструктор копии все же остается конструктором, поэтому здесь также применимы результаты обсуждения предыдущего правила. Если у конструктора копии нет списка инициализации членов, то для базовых классов и вложенных объектов используется конструктор по умолчанию. Так как список инициализации членов отсутствует в следующем определении конструктора копии, то компонент базового класса в объекте производного класса инициализируется с использованием 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) {} |