Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекция_03_КОНСТРУКТОРЫ И ДЕСТРУКТОРЫ.doc
Скачиваний:
8
Добавлен:
11.11.2019
Размер:
91.65 Кб
Скачать

Файл Dot.H

#include<iostream.h> // содержит функции ввода-вывода

#include<windows.h> // содержит функцию CharToOem

#include<math.h> // содержит математические функции

class Dot // класс точки

{

char name; // имя точки

double x, y; // координаты точки

public:

// конструктор с параметрами

Dot(char Name, double X, double Y){name=Name; x=X; y=Y;}

void Print(); // выводит на экран имя и координаты текущей точки

};

Файл Dot.Cpp

#include "Dot.h" // подключение файла класса Dot

void Dot :: Print()

{

char S[]="Координаты точки"; // объявляет и инициализирует строку заголовка

CharToOem(S, S); // преобразует символы строки в кириллицу

cout<<S<<name<<":"; // выводит на экран заголовок и имя точки

cout<<"\tx="<<x<<"\ty="<<y<<'\n';

}

Файл Main.Cpp

#include "Dot.h" // подключение файла класса Dot

int main()

{

Dot A('A', 3, 4); // создание объекта

A.Print(); // вызов функции-члена класса

}

Здесь значение, переданное в конструктор при объявлении объекта A, используется для инициализации закрытых членов name, x и y этого объекта.

Фактически синтаксис передачи аргумента конструктору с параметрами является сокращенной формой записи следующего выражения:

Dot A=Dot('A', 3, 4);

Однако практически всегда используется сокращенная форма синтаксиса, приведенная в примере.

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

Правила для конструкторов

Правила для конструкторов:

  • конструктор класса вызывается всякий раз, когда создается объект его класса;

  • конструктор обычно инициализирует данные-члены класса и резервирует память для динамических членов;

  • конструктор имеет то же имя, что и класс, членом которого он является;

  • для конструктора не указывается тип возвращаемого значения;

  • конструктор не может возвращать значение;

  • конструктор не наследуется;

  • класс может иметь несколько перегруженных конструкторов;

  • конструктор не может быть объявлен с модификатором const, volatile, static или virtual;

  • если в классе не определен конструктор, компилятор генерирует конструктор по умолчанию, не имеющий параметров.

Правила для деструкторов

  • деструктор вызывается при удалении объекта;

  • деструктор обычно выполняет работу по освобождению памяти, занятой объектом;

  • деструктор имеет то же имя, что и класс, которому он принадлежит, с предшествующим символом ~;

  • деструктор не может иметь параметров;

  • деструктор не может возвращать значение;

  • деструктор не наследуется;

  • класс не может иметь более одного деструктора;

  • деструктор не может быть объявлен с модификатором const, volatile или static;

  • если в классе не определен деструктор, компилятор генерирует деструктор по умолчанию.

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

Список инициализации элементов

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

ConstrName(par1, par2): mem1(par1) ,mem2(par2), …{…}

В следующем примере для инициализации класса используется список инициализации элементов.

Пример 6.

class AnyClass

{

int a, b;

public:

AnyClass(int x, int y): a(x), b(y) {};

};

Пример 7.

class Dot

{

char name; // имя точки

double x, y; // координаты точки

public:

// конструктор со списком инициализации

Dot(char Name):name(Name), x(0), y(0) {}

};

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

C++ определяет два специальных вида конструкторов: конструктор по умолчанию, о котором мы упоминали выше, и конструктор копирования.