- •Создание простого конструктора
- •Представление о деструкторе
- •Что вам необходимо знать
- •Конструктор (программирование)
- •[Править]Назначение конструктора
- •[Править]Виды конструкторов
- •[Править]Конструктор по умолчанию
- •[Править]Конструктор копирования
- •[Править]Конструктор преобразования
- •[Править]Виртуальный конструктор
- •[Править]Синтаксис
- •[Править]Пример
- •[Править]ColdFusion [править]Пример
- •[Править]php [править]Пример
- •[Править]Упрощенные конструкторы (с псевдокодом)
[Править]Назначение конструктора
Одна из ключевых особенностей ООП — инкапсуляция: внутренние поля объекта напрямую недоступны, и пользователь может работать с объектом только как с единым целым, через открытые (public) методы. Каждый метод, в идеале, должен быть устроен так, чтобы объект, находящийся в «допустимом» состоянии (то есть когда выполняется инвариант класса), после вызова метода также оказался в допустимом состоянии. И первая задача конструктора — перевести поля объекта в такое состояние.
Вторая задача — упростить пользование объектом. Объект — не «вещь в себе», ему часто приходится требовать какую-то информацию от других объектов: например, объект File, создаваясь, должен получить имя файла. Это можно сделать и через метод:
File file;
file.open("in.txt", File::omRead);
Но удобнее открытие файла сделать в конструкторе:[1]
File file("in.txt", File::omRead);
[Править]Виды конструкторов
Некоторые языки программирования различают несколько особых типов конструкторов:
-
конструктор по умолчанию — конструктор, не принимающий аргументов;
-
конструктор копирования — конструктор, принимающий в качестве аргумента объект того же класса (или ссылку из него);
-
конструктор преобразования — конструктор, принимающий один аргумент (эти конструкторы могут вызываться автоматически для преобразования значений других типов в объекты данного класса).
class Complex
{
public:
// Конструктор по умолчанию
// (в данном случае является также и конструктором преобразования)
Complex(double i_re = 0, double i_im = 0)
: re(i_re), im(i_im)
{}
// Конструктор копирования
Complex(const Complex &obj)
{
re = obj.re;
im = obj.im;
}
private:
double re, im;
};
[Править]Конструктор по умолчанию
Основная статья: Конструктор по умолчанию
Конструктор не имеющий обязательных аргументов. Используется при создании массивов объектов, вызываясь для создания каждого экземпляра. В отсутствие явно заданного конструктора по умолчанию его код генерируется компилятором (что на исходном тексте, естественно, не отражается).
[Править]Конструктор копирования
Основная статья: Конструктор копирования
Конструктор, аргументом которого является ссылка на объект того же класса. Применяется в C++ для передачи объектов в функции по значению.
Конструктор копирования в основном необходим, когда объект имеет указатели на объекты выделенные в куче. Если программист не создаёт конструктор копирования, то компилятор создаст неявный конструктор копирования, который копирует указатели как есть, то есть фактическое копирование данных не происходит и два объекта ссылаются на одни и те же данные в куче. Соответственно попытка изменения «копии» повредит оригинал, а вызов деструктора для одного из этих объектов при последующем использовании другого приведёт к обращению в область памяти, уже не принадлежащую программе.
Аргумент должен передаваться именно по ссылке, а не по значению. Это вытекает из коллизии: при передаче объекта по значению (в частности, для вызова конструктора) требуется скопировать объект. Но для того, чтобы скопировать объект, необходимо вызвать конструктор копирования.