Professional Documents
Culture Documents
Intro in C Language
Intro in C Language
1. Цел на упражнението
Усвояване начина на предефиниране на стандартните операции за
класове и използването на специалния указател this.
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