Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Абстрактные классы.rtf
Скачиваний:
6
Добавлен:
10.07.2019
Размер:
2.25 Mб
Скачать

2.1.2. Конструктор

Функция, называемая конструктором (constructor) класса, имеет то же имя, что и класс. Подобно другим функциям C++, конструктору могут передаваться параметры, используемые для инициализации одного или более данных-членов класса. В классе Rectangle конструктору дается имя Rectangle, и он принимает параметры l и w, используемые для инициализации длины и ширины объекта, соответственно. Заметьте, что эти параметры имеют значения по умолчанию, которые указывают, что используется значение 0, когда параметр l или w не передается явно.

Пример 1 иллюстрирует объявление класса (class definition), так как методы описываются только объявлениями функций. Код C++ для определения отдельных функций создает реализацию класса (class implementation).

2.1.3. Объявление объекта

Объявление класса описывает новый тип данных. Объявление объекта типа класс создает экземпляр (instance) класса. Это делает реальным объект типа класс и автоматически вызывает конструктор для инициализации некоторых или всех данных-членов класса. Параметры для объекта передаются конструктору заключением их в скобки после имени объекта. Заметьте, что конструктор не имеет возвращаемого типа, поскольку вызывается только во время создания объекта:

ClassName object(<parameters>);//список параметров может быть

// пустым

Например, следующие объявления создают два объекта типа Rectangle:

Rectangle room(12, 10);

Rectangle t; //использование параметров по умолчанию (0, 0).

Каждый объект имеет полный диапазон данных-членов и методов, объявляемых в классе. Открытые члены доступны с использованием имени объекта и имени члена, разделяемых «.» (точкой). Например:

х = room.Area(); //присваивает х площадь 12*10=120

t.PutLength(20); //присваивает 20 как длину объекта Rectangle

// Текущая длина равна 0 так как используются параметры

// по умолчанию,

cout<<t.GetWidth(); // выводит текущую ширину, которая = 0

// по умолчанию

В объявлении объекта Room конструктор первоначально устанавливает значение длины, равным 12, а ширины — 10. Клиент может изменять размеры, используя методы доступа PutLength и PutWidth:

room.PutLength(15); //изменение длины и ширины на 15 и 12

room.PutWidth(12);

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

Класс Rectangle содержит члены класса типа float. В общем, класс может содержать элементы любого допустимого типа C++, даже других классов. Однако, класс не может содержать объект его собственного типа в качестве члена.

2.1.4. Реализация класса

Каждый метод в объявлении класса должен быть определен. Определения функций могут быть заданы в теле класса (встроенный код) или вне его. При помещений функций вне тела имя класса, за которым следует два двоеточия, должно предшествовать имени этой функции. Символ "::" называется операцией разрешения области действия (scope resolution operator) и указывает на то, что функция принадлежит области действия класса. Это позволяет всем операторам в определении функции иметь доступ к закрытым членам класса. В случае с классом Rectangle идентификатор "Rectangle::" предшествует именам методов.

Далее следует определение GetLength(), когда она записана вне тела класса Rectangle:

float Regtangle::GetLength(void) const

{

return length; //доступ к закрытому члену length

}

Заметьте, что при определении константного метода может быть также использован квалификатор const.

Функция-член класса может быть записана внутри тела класса. В этом случае код является расширенным встраиваемым (expanded inline), а операция разрешения области действия не используется, так как код находится в области действия тела класса. Встраиваемое определение операции GetLength имеет вид:

class Rectangle

{

private:

float length;

float width;

public:

float GetLength(void) const //код задается как inline

{

return(length);

}

};

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