Файл 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++ определяет два специальных вида конструкторов: конструктор по умолчанию, о котором мы упоминали выше, и конструктор копирования.
