2.4. конструкторы
Для заполнения полей объекта при его инициализации мы вынуждены определять функцию init(). Составные функции не позволяют устанавливать значения констант и переменных ссылочного типа, и необходимость вызова этих функций усложняет программирование и делает программу громоздкой. Для заполнения полей объекта при его создании и для освобождения полей при его удалении в Си++ предусмотрено специальное средство, которое состоит из составных функций, называемых конструктором и деструктором. Составная функция класса, вызываемая при создании объекта, называется конструктором. Поскольку объект создается при его появлении в области видимости и с помощью оператора new, то в этих случаях будет вызываться конструктор.
Основные свойства конструктора Класс может иметь несколько конструкторов. Имя каждого конструктора совпадает с именем класса, для которого этот конструктор определен. Конструкторы могут быть перегружены и иметь параметры по умолчанию. Конструктор не имеет возвращаемого значения. Конструктор может быть объявлен и в закрытой, и в защищенной, и в открытой части класса. Если конструктор объявлен в закрытой части, то объекты этого класса могут создаваться только дружественными функциями, а если в защищенной – дружественными функциями производного класса. Конструктор может быть определен вне тела класса.
Пример. Определим класс двумерного вектора. Будем инициализировать его с помощью полярных координат:
#include <iostream.h> #include <math.h> #include <conio.h>
class Vector { double x, y; public: Vector( double rho, double phi);
void show() { cout << "Вектор = ("<< x << ", " << y << ") "; } };
Vector::Vector(double rho, double phi = 0) { x = rho*cos(phi); y = rho*sin(phi); }
void main() { clrscr();
Vector v(1), w(-1, 0.5); v.show(); w.show();
getch(); }
Результаты работы программы
Вектор = (1, 0) Вектор = (-0.877583, -0.479426)
Обращение к конструктору осуществляется одним из трех способов: имя объект(параметры); имя объект = имя(параметры); имя объект = параметр; где имя обозначает имя класса. Второй способ называется явным, третий – сокращенным. Пример. Определим класс, объектом которого является стек заданного размера. Продемонстрируем способы вызова конструктора:
class IntStack { int *v, size, top; public: IntStack(int size); };
IntStack::IntStack(int size) { v = new int[IntStack::size = size]; top = size; }
void main() { IntStack s1(1000); IntStack s2 = IntStack(1000); // явный IntStack s3 = 1000; // сокращенный }
В данном примере будут определены 3 стека, по 1000 элементов в каждом.
|