Создание простого конструктора
УРОК 23. КОНСТРУКТОР И ДЕСТРУКТОР
При создании объектов одной из наиболее широко используемых операций которую вы будете выполнять в ваших программах, является инициализация элементов данных объекта. Как вы узнали из урока 22, единственным способом, с помощью которого вы можете обратиться к частным элементам данных, является использование функций класса. Чтобы упростить процесс инициализации элементов данных класса, C++ использует специальную функцию, называемую конструктором, которая запускается для каждого создаваемого вами объекта. Подобным образом C++ обеспечивает функцию, называемую деструктором, которая запускается при уничтожении объекта. В данном уроке конструктор и деструктор рассматриваются более подробно. К концу этого урока вы освоите следующие основные концепции:
- Конструктор представляет собой метод класса, который облегчает вашим программам инициализацию элементов данных класса.
- Конструктор имеет такое же имя, как и класс.
- Конструктор не имеет возвращаемого значения.
- Каждый раз, когда ваша программа создает переменную класса, C++ вызывает конструктор класса, если конструктор существует.
- Многие объекты могут распределять память для хранения информации; когда вы уничтожаете такой объект, C++ будет вызывать специальный деструктор, который может освобождать эту память, очищая ее после объекта.
- Деструктор имеет такое же имя, как и класс, за исключением того, что вы должны предварять его имя символом тильды (~).
- Деструктор не имеет возвращаемого значения.
Термины конструктор и деструктор не должны вас пугать. Вместо этого представьте конструктор как функцию, которая помогает вам строить (конструировать) объект. Подобно этому, деструктор представляет собой функцию, которая помогает вам уничтожать объект. Деструктор обычно используется, если при уничтожении объекта нужно освободить память, которую занимал объект.
СОЗДАНИЕ ПРОСТОГО КОНСТРУКТОРА
Конструктор представляет собой метод класса, который имеет такое же имя, как и класс. Например, если вы используете класс с именем employee, конструктор также будет иметь имя employee. Подобно этому, для класса с именем dogs конструктор будет иметь имя dogs. Если ваша программа определяет конструктор, C++ будет автоматически вызывать его каждый раз, когда вы создаете объект. Следующая программа CONSTRUC.CPP создает класс с именем employee. Программа также определяет конструктор с именем employee который присваивает начальные значения объекту. Однако конструктор не возвращает никакого значения, несмотря на то, что он не объявляется как void. Вместо этого вы просто не указываете тип возвращаемого значения:
class employee
{
public:
employee(char *, long, float); //Конструктор
void show_employee(void);
int change_salary(float);
long get_id(void);
private:
char name [64];
long employee_id;
float salary;
};
В вашей программе вы просто определяете конструктор так же, как любой другой метод класса:
employee::employee(char *name, long employee_id, float salary)
{
strcpy(employee::name, name) ;
employee::employee_id = employee_id;
if (salary < 50000.0)
employee::salary = salary;
else // Недопустимый оклад
employee::salary = 0.0;
}
Как видите, конструктор не возвращает значение вызвавшей функции. Для него также не используется тип void. В данном случае конструктор использует оператор глобального разрешения и имя класса перед именем каждого элемента, как уже обсуждалось в уроке 23. Ниже приведена реализация программы CONSTRUC.CPP:
#include <iostream.h>
#include <string.h>
class employee
{
public:
employee(char *, long, float);
void show_employee(void);
int change_salary(float) ;
long get_id(void);
private:
char name [64] ;
long employee_id;
float salary;
};
employee::employee(char *name, long employee_id, float salary)
{
strcpy(employee::name, name) ;
employee::employee_id = employee_id;
if (salary < 50000.0)
employee::salary = salary;
else // Недопустимый оклад
employee::salary = 0.0;
}
void employee::show_employee(void)
{
cout << "Служащий: " << name << endl;
cout << "Номер служащего: " << employee_id << endl;
cout << "Оклад: " << salary << endl;
}
void main(void)
{
employee worker("Happy Jamsa", 101, 10101.0);
worker.show_employee();
}
Обратите внимание, что за объявлением объекта worker следуют круглые скобки и начальные значения, как и при вызове функции. Когда вы используете конструктор, передавайте ему параметры при объявлении объекта:
employee worker("Happy Jamsa", 101, 10101.0);
Если вашей программе потребуется создать несколько объектов employee, вы можете инициализировать элементы каждого из них с помощью конструктора, как показано ниже:
employee worker("Happy Jamsa", 101, 10101.0);
employee secretary("John Doe", 57, 20000.0);
employee manager("Jane Doe", 1022, 30000.0);