- •3.1. Определение класса
- •Int Left;
- •Int Right;
- •Int Bottom;
- •3.2. Создание экземпляра класса
- •Int Left;
- •Int Right;
- •Int Bottom;
- •3.3. Доступ к членам класса
- •Int Left;
- •Int Right;
- •Int Bottom;
- •3.4. Инкапсуляция
- •Int Left;
- •Int Right;
- •Int Bottom;
- •Int Left;
- •Int Right;
- •Int Bottom;
- •Int Left;
- •Int Right;
- •Int Bottom;
- •3.5. Конструкторы и деструкторы
- •3.5.1. Конструкторы
- •Int Left;
- •Int Right;
- •Int Bottom;
- •Int Left;
- •Int Right;
- •Int Bottom;
- •Int Left;
- •Int Right;
- •Int Bottom;
- •3.5.2. Деструкторы
- •3.5.3. Когда вызываются конструкторы и деструкторы
- •3.6. Встроенные функции-члены
- •Int Left;
- •Int Right;
- •Int Bottom;
- •3.7. Организация исходных файлов
- •Int Left;
- •Int Right;
- •Int Bottom;
- •3.8. Указатель this
- •3.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: