426 Часть 1И. Современное программирование на C++
// присваивание членов, свойственных только В return *this;
}
Единственный явный вызов операции присваивания класса А, и дело сделано. Если же вы не хотите реализовывать копирование через присваивание, то вам придется в конструкторе копий создать также базовый класс. Операция присваивания при этом не изменится, но код конструктора копий станет таким:
// Список инициализации в первой строке используется для вызова
// конструктора копий для унаследованной из А части В, а оставшаяся
// часть конструктора занимается копированием данных-членов
В::В( const B&) : A (rhs)
f
// Здесь вместо вызова operator=
// Присваиваются значения всем членам В }
*
Единственное примечательное изменение состоит в том, что часть А класса в также должна дублироваться.
Далее...
Изученные в этой главе конструктор копий и операция присваивания исключительно важны. Чаще всего именно эти две функции становятся главными (хотя и не единственными) виновниками утечек памяти в классах C++ и краха программ как в DOS, так и в Windows. Вряд ли вам удастся далеко продвинуться без исчерпывающего понимания этих функций.
Полезный для изучения данной главы материал содержится в ряде других глав. В частности, чтобы глубже понять суть одной из наиболее назойливых проблем профаммирования на C++ — утечек памяти — прочтите следующие главы:
• В главе б "Базовые типы данных и операции" обсуждаются базовые типы данных, операции new и delete, операции потоков ввода-вывода и оператор-функции.
• Глава 14 "Базовые концепции классов" знакомит вас с необходимыми для написания объектно-ориентированных программ элементами классов.
• Глава 15 "Перегрузка функций" показывает, как использовать перегруженные функции.
• В главе 16 "Перегрузка операций" демонстрируется написание собственных оператор-функций.
• Глава 20 "Наследование и полиморфизм" посвящена ключевому в установлении взаимосвязей между классами и объектами понятию — иерархии.