Саммерфилд Марк
Шрифт:
• Типы ссылок. Это такие классы, как Integer (в Java), String и MyVeryOwnClass. Их экземпляры создаются при помощи оператора new. Оператор присваивания копирует только ссылку на объект, а для действительного копирования объекта мы должны вызывать функцию clone (в Java) или Clone (в C#). Например:
В С++ все типы могут использоваться как «типы ссылок», а в дополнение к этому те из них, которые допускают копирование, могут использоваться как «типы значений». Например, в С++ нет необходимости иметь класс, подобный Integer, потому что можно использовать указатели и оператор new:
В отличие от Java и C#, в С++ определяемые пользователем типы используются так же, как встроенные типы:
Если требуется сделать класс С++ копируемым, необходимо предусмотреть в этом классе конструктор копирования и оператор присваивания. Конструктор копирования вызывается при инициализации объекта другим объектом того же типа. Синтаксически в С++ это обеспечивается двумя способами:
Оператор присваивания вызывается при присваивании одной переменной другой переменной:
При определении класса компилятор С++ автоматически обеспечивает конструктор копирования и оператор присваивания, выполняющие копирование члена в член. Для класса Point2D это равносильно тому, как если бы мы написали следующий программный код в определении класса:
Для некоторых классов создаваемые по умолчанию конструктор копирования и оператор присваивания оказываются неподходящими. Обычно это происходит в тех случаях, когда класс использует динамическую память. Чтобы сделать класс копируемым, мы должны сами реализовать конструктор копирования и оператор присваивания.
Для классов, которые не должны быть копируемыми, можно отключить конструктор копирования и оператор присваивания, если сделать их закрытыми. Если мы случайно попытаемся копировать экземпляры такого класса, компилятор выдаст сообщение об ошибке. Например:
В Qt многие классы проектировались как используемые по значению. Они имеют конструктор копирования и оператор присваивания и обычно инстанцируются в стеке без использования оператора new. Это относится к классам QDateTime, QImage, QString и к классам—контейнерам, например QList<T>, QVector<T> и QMap<K, T>.
Другие классы попадают в категорию «типа ссылок», в частности QObject и его подклассы (QWidget, QTimer, QTcpSocket и т.д.). Они имеют виртуальные функции и не могут копироваться. Например, QWidget представляет конкретное окно или элемент управления на экране дисплея. Если в памяти находится 75 экземпляров QWidget, на экране также будет находиться 75 окон или элементов управления. Обычно эти классы инстанцируются при помощи оператора new.