426 Часть 1И. Современное программирование на C++

// присваивание членов, свойственных только В return *this;

}

Единственный явный вызов операции присваивания класса А, и дело сделано. Если же вы не хотите реализовывать копирование через присваивание, то вам придется в конструкторе копий создать также базовый класс. Операция присваивания при этом не изменится, но код конструктора копий станет таким:

// Список инициализации в первой строке используется для вызова

// конструктора копий для унаследованной из А части В, а оставшаяся

// часть конструктора занимается копированием данных-членов

В::В( const B&) : A (rhs)

f

// Здесь вместо вызова operator=

// Присваиваются значения всем членам В }

*

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

Далее...

Изученные в этой главе конструктор копий и операция присваивания исключительно важны. Чаще всего именно эти две функции становятся главными (хотя и не единственными) виновниками утечек памяти в классах C++ и краха программ как в DOS, так и в Windows. Вряд ли вам удастся далеко продвинуться без исчерпывающего понимания этих функций.

Полезный для изучения данной главы материал содержится в ряде других глав. В частности, чтобы глубже понять суть одной из наиболее назойливых проблем профаммирования на C++ — утечек памяти — прочтите следующие главы:

• В главе б "Базовые типы данных и операции" обсуждаются базовые типы данных, операции new и delete, операции потоков ввода-вывода и оператор-функции.

• Глава 14 "Базовые концепции классов" знакомит вас с необходимыми для написания объектно-ориентированных программ элементами классов.

• Глава 15 "Перегрузка функций" показывает, как использовать перегруженные функции.

• В главе 16 "Перегрузка операций" демонстрируется написание собственных оператор-функций.

• Глава 20 "Наследование и полиморфизм" посвящена ключевому в установлении взаимосвязей между классами и объектами понятию — иерархии.