Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции по С++ глава 3.doc
Скачиваний:
6
Добавлен:
05.11.2018
Размер:
187.9 Кб
Скачать

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 (); // рисование прямоугольника

}

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

Конструктор без параметров называют конструктором по умолчанию. Такой конструктор обычно инициализирует переменные-члены, присваивая им стандартные, установленные по умолчанию значения. Например, следующий вариант класса CRectangle имеет конструктор по умолчанию, инициализирующий все данные значениями 0.

class CRectangle

{

private:

Int Left;

int Top;

Int Right;

Int Bottom;

public:

CRectangle ()

{

Left = Top = Right = Bottom = 0;

}

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

};

Примечание

Конструктор с одним или более параметрами, имеющими стандартные значения, также считается конструктором по умолчанию, потому что его можно вызвать без передачи параметров (смотрите параграф "Стандартные параметры функции" в гл. 2).

Если конструктор для какого-либо класса не определен, то компилятор генерирует конструктор по умолчанию. Такие конструкторы, сгенерированные компилятором, не присваивают начальные значения переменным-членам класса. Поэтому, если необходимо однозначно инициализировать переменные-члены или выполнить любые другие задачи инициализации, нужно определить собственный конструктор.

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

CRectangle Rect;

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

CRectangle Rect (); // определение функции, которая не принимает

// параметры и возвращает объект CRectangle

Если допустить такую ошибку, компилятор не сгенерирует сообщение об ошибке до тех пор, пока вы не попытаетесь использовать Rect как экземпляр класса.

В гл. 5 приведено описание особенностей конструкторов, использующих единственный параметр (в параграфе «Применение конструкторов копирования и преобразования»).

Перегруженные конструкторы

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

class Rectangle

{

private: