You are on page 1of 4

ПРАКТИЧЕСКО УПРАЖНЕНИЕ No 3

КОНСТРУКТОРИ И ДЕСТРУКТОРИ

1. Цел на упражнението
Усвояване на умения за работа с управляващи методи на
класовете - конструктори и деструктори.

2. Предназначение, синтаксис и използване на конструктори и


деструктори
С++ поддържа механизъм за автоматично инициализиране и
"освобождаване" на обекти. Инициализирането на обекти се състои в
задаване на начални стойности за данните на обекта. Ако всички
членове-данни на класа са общодостъпни, то обектът може да се
инициализира чрез списък от стойности, отделени със запетаи, в
съответствие със следния синтаксис:
<дефиниция на обект> = { <списък стойности>}
Методи, които инициализират обектите, се наричат
конструктори. Конструкторите се извикват автоматично от
компилатора при всяко дефиниране на обект или заделяне на памет за
обект чрез операция new. Конструкторът носи името на класа.
Конструкторът не може явно да връща резултат и следователно не може
да се указва тип на резултат в прототипа му. При деклариране на
конструктора в тялото на класа могат да се зададат стойности по
подразбиране за аргументите му. За един клас могат да се дефинират
няколко конструктора.
Всяка дефиниция на обект поражда неявно обръщение към
конструктор на класа, при което се прави пълен контрол на типовете.
Съществува явен и съкратен начин за предаване на аргументи на
конструктора.
Синтаксис на явно извикване:
<дефиниция на обект>=<име на конструктор> (<списък стойности за аргументи>)
При неявно извикване се пропуска името на конструктора, а
списъкът от стойности на аргументите се задава по един от следните
два начина:
<дефиниция на обект> (<списък от стойности за аргументи>)
<дефиниция на обект> = <стойност>
Възможно е дефиниране на обект без параметри в следните два
случая:
1. Ако са дадени стойности по подразбиране на аргументите на
дефинирания конструктор;
2. Ако е дефиниран конструктор по подразбиране, т.е.
конструктор без аргументи.
Деструкторът е специална функция - член на класа, която се
извиква автоматично от компилатора при изход от областта, в която е

1
дефиниран даден обект или при използване на операция delete с
указател към такъв обект. Деструкторът носи името на класа,
предшествано от символа "~" (tilt). Както и при конструкторите
деструкторът не може да връща резултат и не се посочва тип на
резултата в заглавието му. По дефиниция деструкторът е функция без
аргументи и следователно за един клас не може да се дефинира повече
от един деструктор.
В тялото на деструктора се включват операции за освобождаване
на паметта, заета за данните на обекта, както и всички действия, които
трябва да се извършат преди напускане областта на действие на даден
обект. Деструкторите могат да извършват различни допълнителни
действия, като например отпечатване на съобщения в определени
контролни точки.

3. Задачи за изпълнение

Задача 1:
Да се добави метод към класа ОneData от фиг. 3.1, който ще
връща квадрата dataStore. Да се добавят в главната програма
оператори за извеждане на изчислената стойност.

Задача 2:
Към класа ОneData да се добави конструктор за инициализиране
със стойност по подразбиране. В главната програма да се добавят
оператори за извеждане на инициализираната стойност.

Задача 3:
Да се замени функцията initialize на класа Rectangle (фиг. 3.2) с
конструктор и да се добави деструктор на същия клас. Да се добавят
оператори за извеждане на съобщения в конструктора и в деструктора
на класа Rectangle, които да сигнализират входа и изхода в/от областта
на действие на класа.

Задача 4:
Към класа IntArray (фиг. 3.3.) да се дефинира конструктор с
аргумент размера на масива, който да заделя памет за масива и да
инициализира неговите елементи с определена стойност. Да се
дефинира конструктор с аргумент обект от клас IntArray, който да
копира елементите на аргумента в елементите на текущия обект. Да се
дефинира деструктор, който да освобождава заетата от масива памет.

Задача 5:
Към класа IntArray да се дефинират следните методи: за задаване
стойности на елементите на масива; за извеждане стойностите на

2
елементите на масива; за търсене на минимален елемент и за
сортиране елементите на масива по метода на мехурчето.

Задача 6:
Да се декларира клас, който съхранява лично, бащино и фамилно
име и връща пълното име на лицето в един от следните формати:
Иван Павлов Димитров
И.П.Димитров
Димитров, Иван П.
или какъв да е друг формат по избор.

#include <iostream.h

class ОneData
{
public:
void set(int inValue);
int getValue(void);

private:
int dataStore;
}; // end OneData

void main( void )


{
ОneData man1, man2, man3;
int kid;
man1.set(12);
man2.set(17);
man3.set(-13);
kid = 123;
cout << "Стойността на man1 е " << man1.getValue() << "\n";
cout << "Стойността на man2 е " << man2.getValue() << "\n";
cout << "Стойността на man3 е " << man3.getValue() << "\n";
cout << "Стойността на kid е " << kid << "\n";
} // end main

void ОneData :: set( int inValue )


{
dataStore = inValue;
}

int ОneData :: getValue( void )


{
return dataStore;
}
Фиг. 3.1.

3
class Rectangle
{
public:
int area( void );
void initialize( int, int );

private:
int height;
int width;
};

int Rectangle :: area( void ) // площ на правоъгълника


{
return height * width;
}

void Rectangle :: initialize( int initHeight, int initWidth )


{
height = initHeight;
width = initWidth;
}

Фиг. 3.2.

const int ARRAY_SIZE =24; // стойност по подразбиране

class IntArray
{
public:
IntArray(int sz = ARRAY_SIZE); //конструктор с аргумент размера на масива
IntArray( const IntArray& ); // конструктор с аргумент обект от клас IntArray
~IntArray(); // деструктор
void loadArray( void ); // задаване стойности за елементите на масива
void showArray( void ); // извеждане стойностите на елементите
int findMin( void ); // търсене на минимален елемент
void sortArray( void ); // сортиране по метода на мехурчето
int getSize( void ) { return size; } // връща размера на масива
int *getPtr( void ) { return ia; }

private:
int size;
int *ia;
};
Фиг. 3.3

You might also like