Конструкторы


Конструкторы и деструкторы

Преимущества инкапсуляции

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

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

private:int Left;int Top;int Right;int Bottom;

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

В этом параграфе анализируются функции-члены двух специальных типов, которые можно определить для класса: конструкторы и деструкторы.

Предыдущий вариант класса CRectangle позволяет инициализировать переменные-члены путем вызова функции-члена SetCoord. В качестве альтернативного способа инициализации переменных можно определить специальную функцию класса, называемую конструктором. Конструктор автоматически вызывается при создании экземпляра класса. Он может инициализировать переменные класса и выполнять любые другие задачи инициализации, необходимые для подготовки объекта к использованию.

Конструктор имеет такое же имя, как и класс. При определении конструктора нельзя указывать тип возвращаемого значения, даже void (конструктор никогда не возвращает значение). Однако он может принять любое число аргументов (включая нулевое). Например, следующий вариант класса CRectangle содержит конструктор, принимающий четыре параметра для инициализации переменных-членов. (Вспомните: функция-член SetCoord проверяет корректность значений аргументов и присваивает значения параметров закрытым переменным-членам, хранящим координаты прямоугольника.)

class CRectangle ,

{

private:int Left;int Top;int Right;int Bottom; public:

// конструктор:

CRectangle {int L, int T, int R, int B)

{

SetCoord (L, T, R, B);

}

// определения других функций-членов ...

};

Примечание

Для создания экземпляра класса необходимо, чтобы конструктор был функцией-членом типа public. (При использовании класса только для порождения других классов можно сделать конструктор защищенным членом, поместив его в раздел protected, как описано в гл. 4.)

При определении объекта значения параметров передаются конструктору с использованием синтаксиса, подобного обычному вызову функции.

CRectangle Rect (25,25,100,100);

Такое определение создает экземпляр класса CRectangle, вызывая конструктор класса и передавая ему заданные значения параметров.

При создании экземпляра класса значения параметров можно передать конструктору, используя оператор new.

CRectangle *PRect = new CRectangle (25,25,100,100);

Оператор new автоматически вызывает конструктор для созданного им объекта, что является важным преимуществом использования оператора new по сравнению с другими методами выделения памяти, например, функцией malloc.

Имея конструктор, можно создать объект CRectangle и нарисовать прямоугольник с помощью двух операторов (а не трех, как в разделе «Инкапсуляция»).

void main() { CRectangle Rect (25,25,100,100); // создание объекта и описание // размеров прямоугольникаRect.Draw (); // рисование прямоугольника}