Глава 17. Конструкторы: копирование и присваивание__________________409

¦ Вам следует понимать, что же действительно вызывается, когда и почему. Это одна из тех особенностей, благодаря которым C++ труднее и интереснее, чем С.

Четыре важнейшие функции-члена

Речь идет о четырех функциях-членах, с которыми следует считаться при создании любых классов. Заметьте: не "которые должны быть объявлены", а "с которыми следует считаться". Это значит, что при создании любых классов на эти четыре функции — конструктор по умолчанию, деструктор, конструктор копий и операцию присваивания — следует обратить особое внимание.

Относительно этих функций существуют четкие правила, которых желательно придерживаться для получения устойчивых результатов. В данном разделе мы определим рекомендации только для конструктора копий и операции присваивания. Правила, касающиеся конструктора по умолчанию и деструктора, рассмотрены в главе 14 "Базовые концепции классов".

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

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

Конструктор копий дублирует объект из уже существующего. Если вы не определили конструктор копий, то компилятор сделает это за вас. Конструктор, который он создает, производит побитное копирование объекта. Побитная копия означает, что точно воспроизводится состояние битов всех элементов объекта-источника (объекта, который копируется). Предположим, что класс содержит указатели. Тогда адреса, содержащиеся в указателях объекта-оригинала и объекта-копии, будут идентичны. Это означает, что два объекта будут указывать на одну и ту же область памяти, что, как правило, опасно (в следующем разделе мы выясним, почему).

Обычно, конструктор копий, созданный компилятором, удовлетворителен при следующих обстоятельствах:

• Среди членов класса нет указателей (*).

• Среди членов класса нет ссылок (&).

В этом контексте вполне разумно использовать конструктор, построенный компилятором. В текст определения класса полезно поместить соответствующий комментарий.

Замечание

¦ Если к вашей работе привлечено много программистов различного уровня [¦ подготовки, то полезно поместить в класс комментарий о том, что вы наме-