You are on page 1of 5

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

ПРЕДЕФИНИРАНЕ НА ОПЕРАЦИИ. УКАЗАТЕЛ this

1. Цел на упражнението
Усвояване начина на предефиниране на стандартните операции за
класове и използването на специалния указател this.

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


на операции.
Предефинирането на операции има за цел осигуряването на
стандартните операции за работа с обектите от даден потребителски
клас. Операциите се дефинират като "обикновени" функции с тази
разлика, че името им се състои от ключовата дума operator, следвана
от знак за стандартна операция. Функциите, които резлизират тези
операции могат и да не са членове на класа, но в такъв случай трябва
да имат поне един аргумент от този клас.
Предефинираните операции се извикват в стандартния
префиксен, инфиксен или постфиксен формат вместо в обичайния за
метод на клас формат на изпращане на съобщения. Например, ако е
предефинирана операция "+", може да се използва запис от вида:
object1 + object2
вместо:
object1.operator+(object2).
За един и същ клас могат да се дефинират няколко операции с
общо име, но с различна сигнатура.
Операциите, които се дефинират за класове, трябва да се
представят от знак на съществуваща в С++ операция. Съществуващите
дефиниции на стандартни операции не могат да се отменят. Не може да
се дефинират и допълнителни операции за стандартните типове данни.
Разрешава се само предефиниране на стандартните операции за
класове. Поради това съществува изискване всяка функция,
реализираща предефинирана операция, да има за аргумент обект от
някакъв клас.
Съществуващият приоритет на операциите не може да се отменя.
Задължително е също така да се запази броя на операндите.
Операциите за инкремент "++" и декремент "--" могат да имат
само една дефиниция. Между префиксната и постфиксната форма не се
прави разлика.
Методите, реализиращи предефинирани операции могат да се
дефинират като приятелски функции вместо да бъдат членове на класа.
Операция, декларирана като член на класа, има един аргумент по-малко
от съответната "приятелска" декларация, тъй като обектът, за който, се
извиква се подразбира като първи аргумент на операцията - член.

1
3. Предназначение, синтаксис и използване на указателя this.
Ключовата дума this е дефинирана за всеки обект като указател
към обекта, в който се съдържа. Неявно се декларира по следния начин:
<име на клас> *this;
и се инициализира да сочи обекта, за който се извиква функцията-
член. Този указател е особено полезен за работа с указатели към обекти
и най-вече при организиране на свързани списъци.

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

Задача 1:
Да се разгледа и изпълни програмата от фиг.4.1

Задача 2:
За класа Box от програмата на фиг.4.1 да се предефинират
оператори за свиване размерите на правоъгълника с определена
константа и определен брой пъти.

Задача 3:
Да се разгледа и изпълни програмата от фиг.4.2

Задача 4:
Да се преобразува структурата на класа Box от фиг. 4.2 в
двусвързан списък. Да се преобразуват по съответен начин методите на
класа. Да се дефинират методи за добавяне и изтривне на елемент. Да
се използва указател this.

Задача 5:
Декларацията на клас IntArray е представена на фиг. 3.3. За класа
IntArray да се дефинират функции-членове за предефиниране на
следните операции: [] - индексиране; ++ - инкрементиране и + -
събиране на два масива. Направените дефиниции да се тестват за
различни обекти.

Задача 6:
Декларацията на клас IntList е представена на фиг. 4.3. За класа
IntList да се дефинират декларираните конструктори и следните
функции-членове: display - за извеждане елементите на списъка; insert
- за добавяне на нов елемент в началото на списъка; append - за
добавяне на нов елемент в края на списъка; remove - за изтриване на
целия списък. Направените дефиниции да се тестват за различни
обекти.

2
#include <iostream.h>
class Box
{
private:
int length;
int width;
public:
void set( int l, int w ){ length = l; width = w; }
int getArea(void) { return length * width; }
friend Box operator+( Box a, Box b ); // Слива два правоъгълника
friend Box operator+( int a, Box b ); // Добавя константа
friend Box operator*( int a, Box b ); // Умножава с константа
};
Box operator+( Box a, Box b) // Слива два правоъгълника по ширина
{
Box temp;
temp.length = a.length;
temp.width = a.width + b.width;
return temp;
}
Box operator+( int a, Box b ) // Добавя константа към ширината
{
Box temp;
temp.length = b.length;
temp.width = a + b.width;
return temp;
}
Box operator*( int a, Box b ) // Разширява с множител
{
Box temp;
temp.length = a * b.length;
temp.width = a * b.width;
return temp;
}
void main( void )
{
Box small, medium, large;
Box temp;
small.set(2, 4);
medium.set(5, 6);
large.set(8, 10);
cout << " Площта е " << small.getArea() << "\n";
cout << " Площта е " << medium.getArea() << "\n";
cout << " Площта е " << large.getArea() << "\n";
temp = small + medium;
cout << " Новата площ е " << temp.getArea() << "\n";
temp = 10 + small;
cout << " Новата площ е " << temp.getArea() << "\n";
temp = 4 * large;
cout << " Новата площ е " << temp.getArea() << "\n";
}
Фиг. 4.1

3
#include <iostream.h>
class Box
{
int length;
int width;
Box *anotherBox;
public:
Box( void ); //Конструктор
void set( int, int );
int getArea( void );
void pointAtNext( Box *);
Box *getNext( void );
};
Box :: Box( void )
{ //Дефиниране на конструктора
length = 8;
width = 8;
anotherBox = NULL;
}
void Box :: set( int newLength, int newWidth)
{
length = newLength;
width = newWidth;
}
int Box :: getArea( void )
{
return (length * width);
}
void Box :: pointAtNext( Box *whereToPoint)
//Пренасочва указателя да сочи входния параметър
{
anotherBox = whereToPoint;
}
Box *Box :: getNext( void )
{
return anotherBox; // Връща указател към следващия елемент в списъка
}
void main( void )
{
Box *start = NULL; // Винаги сочи началото на списъка
Box *temp; // Работен указател
Box *boxPointer; // Използва се за създаване на нов елемент
for (int index = 0 ; index < 10 ; index++ ) // Генериране на списъка
{
boxPointer = new Box;
boxPointer->set(index + 1, index + 3);
if (start == NULL)
start = boxPointer; // Първи елемент на списъка
else
temp->pointAtNext(boxPointer); // Допълнителен елемент
temp = boxPointer;
} // Край на генериране на списъка

4
// Разпечатване елементите на списъка
temp = start;
do
{
cout << "Площта е: " << temp->getArea() << "\n";
temp = temp->getNext();
} while ( temp != NULL );

// Изтриване на списъка
temp = start;
do {
temp = temp->getNext();
delete start;
start = temp;
} while (temp != NULL);
}
Фиг. 4.2

class IntItem
{
friend class IntList;
private:
IntItem( int = 0 );
IntItem *next; // указател към следващия елемент
int val; // ключ
};

class IntList
{
public:
IntList( int );
IntList( void );
int display( void );
int insert( int = 0 );
int append( int = 0 );
int remove( void );
private:
IntItem *list;
IntItem *atEnd( void );
};

Фиг. 4.3

You might also like