Перед использованием объекта может потребоваться инициализировать некоторые его данные. Для примера рассмотрим класс queue, определенный выше в этой главе. Перед тем как использо¬вать queue, необходимо присвоить переменным rloc и sloc значения 0, используя функцию init(). Поскольку требование инициализации является чрезвычайно распространенным, то С++ позво¬ляет производить инициализацию объектов во время их создания. Такая автоматическая иници¬ализация выполняется с помощью функции, которая называется конструктором.
Функция-конструктор, являющаяся членом класса и имеющая имя, совпадающее с именем класса, представляет собой специальный тип функции. В качестве примера ниже показано, как выглядит класс queue, преобразованный таким образом, чтобы использовать для инициализации конструктор:
тема 2 вопрос 34.docx
конструкторы и деструкторы в с++ примеры использования конструкторов и деструкторов в с+
тема 2 вопрос 34
Перед использованием объекта может потребоваться инициализировать некоторые его данные. Для
примера рассмотрим класс queue, определенный выше в этой главе. Перед тем как использовать queue,
необходимо присвоить переменным rloc и sloc значения 0, используя функцию init(). Поскольку
требование инициализации является чрезвычайно распространенным, то С++ позволяет производить
инициализацию объектов во время их создания. Такая автоматическая инициализация выполняется с
помощью функции, которая называется конструктором.
Функцияконструктор, являющаяся членом класса и имеющая имя, совпадающее с именем класса,
представляет собой специальный тип функции. В качестве примера ниже показано, как выглядит класс
queue, преобразованный таким образом, чтобы использовать для инициализации конструктор:
/ / создание класса очередь
class queue {
int q[100];
int sloc, rloc;
public:
queue (); // конструктор
void qput(int i);
int qget ();};
Обратим внимание, что конструктор queue() не имеет типа возвращаемого значения. В С++ функции
конструкторы не могут возвращать значений.
Код, реализующий функцию queue(), выглядит следующим образом:
// конструктор
queue ::queue ()
{sloc = rloc = 0;
cout << "Queue initialized. \n";
}
Обратим внимание, что выводимое сообщение «queue initialized» служит для иллюстрации работы
конструктора. В обычной практике большинство конструкторов не занимаются выводом или вводом
данных. Они служат для инициализации.
Конструктор объекта вызывается автоматически при создании объекта. Это означает, что он вызывается
тогда, когда происходит объявление объекта. В этом заключается важнейшее различие между
объявлениями в языке С и в С++. В С объявления переменных, попросту говоря, являются пассивными и
в большинстве случаев выполняются во время компиляции. Иными словами, в языке С объявления
переменных не являются исполнимыми инструкциями. В отличие от этого в С++ объявления переменных
служат активными инструкциями, исполняемыми по существу во время работы программы. Одна из
причин этого заключается в том, что объявление объекта может требовать вызова конструктора, то есть
вызывать выполнение функции. Хотя это различие может показаться едва уловимым и носить больше
академический характер, как будет видно далее, оно может оказывать существенное влияние на
инициализацию переменных.
При инициализации глобальных или статических объектов конструктор вызывается только один раз. Для
локальных объектов конструктор вызывается всякий раз, когда встречается объявление объекта.
Дополнением конструктора является деструктор. Во многих случаях перед уничтожением объекта
необходимо выполнить определенные действия. Локальные объекты создаются при входе в соот
ветствующий блок программы и разрушаются при выходе из него. Глобальные объекты уничтожаются
при завершении работы программы. Имеется много причин тому, чтобы существовал деструктор.
Например, может потребоваться освободить память, которая была ранее зарезервирована. В С++ за
дезактивацию отвечает деструктор. Он имеет то же самое имя, что и конструктор, только к нему
добавлен значок ~. Ниже представлен вариант класса queue, использующий конструктор и деструктор.
(Следует иметь в виду, что класс queue не нуждается в деструкторе, поэтому ниже он приведен только
для иллюстрации.)
// создание класса очередь
class queue { int q[100];int sloc, rloc;
public:queue(); // конструктор
~queue(); // деструктор
void gput(int i);
int qget();
};// конструктор
queue::queue()
{sloc = rloc = 0;
cout << "Queue initialized.\n";
}
// деструктор
queue ::~queue (){
cout << "Queue destroyed.\n";}
Для того чтобы продемонстрировать работу конструктора и деструктора, ниже представлена новая
версия программы:
#include
// создание класса очередь
class queue {
int q[100];
int sloc, rloc;
public :
queue (); // конструктор
~queue(); // деструктор
void gput(int i);
int qget();
};/ / конструктор
queue::queue ()
{sloc = rloc = 0;
cout << "Queue initialized.\n";
}// деструктор
queue::~queue ()
{cout << "Queue destroyed.\n";
}void queue::qput(int i)
{
if (sloc == 99) {
cout << "Queue is full.\n";
return;
}sloc++;
q[sloc] = i;
}int queue::qget()
{
if (rloc == sloc) {
cout << "Queue underflow.\n";
return 0;
}rloc++;
return q[rloc];
}int main()
{
queue a, b; // создание двух объектов типа queue
a.qput(10);
b.qput(19) ;
a.qput(20);
b.qput(1);
cout << a.qget ()<< " "; cout << a.qget ()<< " ";
cout << b.qget()<<" ";
cout << b.qget()<< "\n";
return 0;}
Эта программа выводит на экран следующий текст:
Queue initialized.
Queue initialized.
10 20 19 1
Queue destroyed.
Queue destroyed.
ачнем с того, что когда мы создаем элементы (переменные) класса, мы не можем присвоить
им значения в самом определении класса. Компилятор выдаст ошибку. Поэтому нам
необходимо создавать отдельный метод (так называемую setфункцию) класса, с помощью
которого и будет происходить инициализация элементов. При этом, если необходимо создать,
к примеру, 20 объектов класса, то чтобы инициализировать элементы потребуется 20 раз
вызвать setфункции.
Тут нам как раз сможет помочь конструктор класса. Кстати, конструктор (от слова construct
— создавать) – это специальный метод класса, который предназначен для инициализации
элементов класса некоторыми начальными значениями.
В отличии от конструктора, деструктор (от слова destruct — разрушать) — специальный
метод класса, который служит для уничтожения элементов класса. Чаще всего его
используют тогда, когда в конструкторе,при создании объекта класса, динамически был
выделен участок памяти и необходимо эту память очистить, если эти значения уже не нужны
для дальнейшей работы программы.
Важно запомнить:
конструктор и деструктор, мы всегда объявляем в разделе public;
при объявлении конструктора, тип данных возвращаемого значения не указывается, в
том числе — void!!!;
у деструктора так же нет типа данных для возвращаемого значения, к тому же
деструктору нельзя передавать никаких параметров;
имя класса и конструктора должно быть идентично;
имя деструктора идентично имени конструктора, но с приставкой ~ ;
В классе допустимо создавать несколько конструкторов, если это необходимо. Имена,
согласно пункту 2 нашего списка, будут одинаковыми. Компилятор будет их различать по передаваемым
параметрам (как при перегрузке функций). Если мы не передаем в конструктор параметры, он считается
конструктором по умолчанию;
Обратите внимание на то, что в классе может быть объявлен только один деструктор;
Сразу хочу привести пример, который доступно покажет, как работает конструктор:
# include
using namespace std;
class AB //класс
{
private:
int a;
int b;
public:
AB() //это конструктор: 1) у конструктора нет типа возвращаемого значения! в том числе
void!!!
// 2) имя должно быть таким как и у класса (в нашем случае AB)
{
a = 0;//присвоим начальные значения переменным
1.
2.
3.
4.
5.
6.
7. b = 0;
cout << "Работа конструктора при создании нового объекта: " << endl;//и здесь же их
отобразим на экран
cout << "a = " << a << endl;
cout << "b = " << b << endl << endl;
}
void setAB() // с помощью этого метода изменим начальные значения заданные
конструктором
{
cout << "Введите целое число а: ";
cin >> a;
cout << "Введите целое число b: ";
cin >> b;
}
void getAB() //выведем на экран измененные значения
{
cout << "a = " << a << endl;
cout << "b = " << b << endl << endl;
int main()
setlocale(LC_ALL, "rus");
AB obj1; //конструктор сработает на данном этапе (во время создания объекта класса)
obj1.setAB(); //присвоим новые значения переменным
obj1.getAB(); //и выведем их на экран
AB obj2; //конструктор сработает на данном этапе (во время создания 2го объекта
класса)
Результат работы программы:
CppStudio.com
Работа конструктора при создании нового объекта:
a = 0b = 0
Введите целое число а: 34
Введите целое число b: 67
a = 34b = 67
Работа конструктора при создании нового объекта:
a = 0
b = 0
Как видно из результата работы программы, конструктор срабатывает сразу, при создании объектов
класса, поэтому, явно вызывать конструктор не нужно, он сам «приходит» :)
Хочется еще добавить, что, как и обычным функциям, мы можем передавать конструктору параметры.
Через параметры, конструктору можно передавать любые данные, которые будут необходимы при
инициализации объектов класса.
Рассмотрим еще один пример, это все та же программа, только в код внесены некоторые изменения. Тут
же покажем принцип работы деструктора: Смотрим результат работы программы:
CppStudio.com
Тут сработал конструктор, который принимает параметры:
a = 100
b = 100
Введите целое число а: 333
Введите целое число b: 333
a = 333
b = 333
Тут сработал конструктор, который принимает параметры:
a = 200
b = 200
Тут сработал деструктор
Тут сработал деструктор
Деструктор срабатывает в тот момент, когда завершается работа программы и уничтожаются все данные.
Мы его не вызывали – он сработал сам. Как видно, он сработал 2 раза, так как и конструктор. Уже от
себя добавлю, что, в первую очередь, он удалил второй созданный объект (где a = 200, b = 200), а затем
первый (где a = 100, b = 100). «Последним пришёл — первым вышел».
Конструкторы и деструкторы в С++
В больших программах в некоторых частях программы обычно требуется инициализация. Необходимость
в инициализации еще чаще требуется при работе с объектами. Действительно, фактически, для каждого
создаваемого вами объекта требуется какогото вида инициализация. Для решения этой проблемы в C++
имеется функцияконструктор (constructor function), включаемая в описание класса. Конструктор класса
вызывается всякий раз при создании объекта этого класса. Таким образом, любая необходимая объекту
инициализация при наличии конструктора выполняется автоматически.
Конструктор имеет то же имя, что и класс, частью которого он является, и не имеет возвращаемого
значения. Ниже представлен небольшой класс с конструктором:
#include
using namespace std;
class myclass {
int a;
public:
myclass (); // конструктор
void show() ;
myclass :: myclass ( )
{
cout ≪ "В конструкторе\n";
a=10;
)
void myclass :: show ()
{
cout ≪ a;
}
int main ( )
{
myclass ob;
ob. show();
return 0;
}
В этом простом примере значение а инициализируется конструктором myclass(). Конструктор
вызывается тогда, когда создается объект ob. Объект, в свою очередь, создается при выполнении
инструкции объявления объекта.
Функцией, обратной конструктору, является деструктор (destructor). Эта функция вызывается при
удалении объекта. Обычно при работе с объектом в момент его удаления должны выполняться
некоторые действия. Например, при создании объекта для него выделяется память, которую необходимо
освободить при его удалении. Имя деструктора совпадает с именем класса, но с символом ~ (тильда) в
начале.
В следующем примере показана необходимость не только конструктора, но и деструктора.
Замечание. В программе используется стандартная библиотечная функция clock(), которая возвращает
число временных циклов с момента запуска программы. Если разделить это число на
CLOCKS_PER_SEC, можно получить значение в секундах.
Конструктору можно передавать аргументы. Для этого просто добавьте необходимые параметры в
объявление и определение конструктора. Затем при объявлении объекта задайте параметры в качестве
аргументов.
Пример. Здесь 4 передается в х, а 7 передается в у.
#include
using namespace std;
class myclass {
myclass(int x, int y); //
конструктор
void show();
myclass::myclass(int x, int y)
cout << "В конструкторе\n";
void myclass::show()
cout << a << ' ' << b << "\n";
int main()
myclass ob(4, 7);
ob.show();
return 0;
Пример. Здесь представлена следующая версия класса stack, в котором конструктор с параметром
используется для присвоения стеку "имени". Это односимвольное имя необходимо для идентификации
стека в случае возникновения ошибки.
#include
using namespace std;
#define SIZE 10
// Объявление класса stack для символов
class stack {
char stck[SIZE]; // содержит стек
int tos; // индекс вершины стека
char who; // идентифицирует стек
stack(char c); // конструктор
void push(char ch); // помещает в стек символ
char pop(); // выталкивает из стека символ
// Инициализация стека
stack::stack(char c)
who = c;
cout << "Работа конструктора стека " << who << "\n";
// Помещение символа в стек
void stack::push(char ch)
if (tos==SIZE) {
cout << "Стек " << who << " полон \n";
stck[tos]=ch;
// Выталкивание символа из стека
char stack::pop()
if (tos==0) {
cout << "Стек " << who << " пуст ";
return 0; // возврат нуля при пустом стеке
return stck[tos];
int main()
// образование двух, автоматически инициализируемых,
// стеков stack s1('A'), s2('B'); s1.push('a');
s2.push('x');
s1.push('b');
s2.push('y');
s1.push('c');
s2.push('z');
// Это вызовет сообщения об ошибках
for(i=0; i<5; i++) cout << "символ из стека s1: " << s1.pop() << "\n";
for(i=0; i<5; i++) cout << "символ из стека s2: " << s2.pop() << "\n";
return 0;
Пример. Вариант класса strtype, в котором используется конструктор с параметром:
Пример. Объекты могут создаваться по мере необходимости, точно в соответствии с возникающей в
момент их создания ситуацией. Конструктору объекта можно передать не только константы, но и любые
допустимые выражения с переменными. Например, в следующей программе для создания объекта
используется пользовательский ввод:
#include
using namespace std;
class myclass {
int i, j;
public:
myclass(int a, int b);
void show();
};
myclass::myclass(int a, int b)
{
i = a;
j = b;
} void myclass::show()
{ cout << i << ' ' << j << "\n";
} int main()
{ int x, y;
cout << "Введите два целых: ";
cin >> x >> y;
// использование переменных для создания ob
myclass ob(x, y);
ob.show();
return 0;
}
Лекция "Конструкторы и деструкторы в с++ "
Лекция "Конструкторы и деструкторы в с++ "
Лекция "Конструкторы и деструкторы в с++ "
Лекция "Конструкторы и деструкторы в с++ "
Лекция "Конструкторы и деструкторы в с++ "
Лекция "Конструкторы и деструкторы в с++ "
Лекция "Конструкторы и деструкторы в с++ "
Лекция "Конструкторы и деструкторы в с++ "
Лекция "Конструкторы и деструкторы в с++ "
Материалы на данной страницы взяты из открытых истончиков либо размещены пользователем в соответствии с договором-офертой сайта. Вы можете сообщить о нарушении.