Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
37
Добавлен:
27.02.2014
Размер:
122.37 Кб
Скачать

Виды конструкторов

class Complex

{

double re,im;

public:

Complex(double i_re=0,double i_im=0):re(i_re),im(i_im){} //Конструктор по умолчанию

// (в данном случае является также и конструктором преобразования)

Complex(Complex& obj){re=obj.re;im=obj.im;} //Конструктор копирования

}

Конструктор по умолчанию

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

Конструктор копирования

Конструктор, аргументом которого является ссылка на объект того же класса. Эта особенность (необходимость передачи параметра именно по ссылке, а не по значению) вытекает из коллизии: при передаче объекта по значению (в частности для вызова конструктора) требутеся скопировать объект. Но для того чтобы скопировать объект необходимо вызвать конструктор копирования.

Наличие конструктора копирования становится необходимым, например, если для хранения данных объекта требуется дополнительно выделяемая память.

Если его не будет, то конструктором копирования (сгенерированным компилятором) будут скопированы указатели, адресующие данные прежнего объекта (без выделения новой памяти). Соответственно попытка изменения "копии" повредит оригинал, а вызов деструктора для одного из этих объектов при последующем использовании другого приведёт к обращению в область памяти, уже не принадлежащей программе.

Конструктор преобразования

Конструктор, имеющий произвольные аргументы (термин может быть применён в первом случае). Так, например, при вызове Complex a(1); конструктор из первого примера преобразовывает действительное число 1 в комплексное (1;0).

Виртуальный конструктор

Конструктор не бывает виртуальным в смысле виртуального метода — для того, чтобы механизм виртуальных методов работал, нужно запустить конструктор, который автоматически настроит таблицу виртуальных методов данного объекта.

«Виртуальными конструкторами» называют похожий, но другой механизм, присутствующий в некоторых языках — например, он есть в Delphi, но нет в Java. Этот механизм позволяет создать объект любого заранее неизвестного класса при двух условиях:

  • Этот класс является потомком некоего наперёд заданного класса (в данном примере это класс TVehicle)

  • На всём пути наследования от базового класса к создаваемому цепочка переопределения не обрывалась.

type

TVehicle = class

constructor Create; virtual;

end;

TAutomobile = class (TVehicle)

constructor Create; override;

end;

TMotorcycle = class (TVehicle)

constructor Create; override;

end;

TMoped = class (TMotorcycle) // обрываем цепочку переопределения - заводим новый Create

constructor Create(x : integer); reintroduce;

end;

В языке вводится так называемый классовый тип. Этот тип в качестве значения может принимать название любого класса, производного от TVehicle.

type

CVehicle = class of TVehicle;

Такой механизм позволяет создавать объекты любого заранее неизвестного класса, производного от TVehicle.

var

cv : CVehicle;

v : TVehicle;

cv := TAutomobile;

v := cv.Create;

Заметьте, что код

cv := TMoped;

v := cv.Create;

является некорректным — директива reintroduce разорвала цепочку переопределения виртуального метода, и в действительности для мопеда будет вызван конструктор TMotorcycle.Create.

Соседние файлы в папке Ответы на билеты