Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
0495976_C19D7_shpory_s.doc
Скачиваний:
1
Добавлен:
01.03.2025
Размер:
1.82 Mб
Скачать

71. Приведите пример использования дружественных функции.

Дружественной функцией класса называется функция, которая, не являясь его компонентом, имеет доступ к его защищенным и собственным компонентам. Функция не может стать другом класса "без его согласия". Для получения прав друга функция должна быть описана в теле класса со спецификатором friend. Именно при наличии такого описания класс предоставляет функции права доступа к защищенным и собственным компонентам. Пример класса с дружественной функцией:

//OOР13_01.СРР - класс с дружественной функцией.

#include <conio.h> // Для консольных функций в текстовом режиме.

// Класс - "символ в заданной позиции экрана":

class charlocus {

int x, y; // Координаты знакоместа на экране дисплея.

// Значение символа, связанного со знакоместом:

char cc;

// Прототип дружественной функции для замены символа:

friend void friend_put(charlocus *, char);

public:

charlocus(int xi, int yi, char ci) // Конструктор.

{ x = xi; y = yi; cc = ci; }

void display (void) // Вывести символ на экран.

{ gotoxy(x,y); putch(cc); }

};

// Дружественная функция замены символа в конкретном

// объекте:

void friend_put(charlocus *p, char c)

{ p->cc = c; }

void main (void)

{ charlocus D(20,4,'d'); // Создать объект.

charlocus S(10,10,'s'); // Создать объект.

D.display (); getch();

S.display (); getch();

friend_put(&D,'*'); D.display(); getch();

friend_put(&S,'#'); S.display(); getch();

}

72. Приведите пример использования конструкторов и деструктора.

Конструкторы и деструкторы - это специальные методы класса. Это надо понять в первую очередь. Разумеется, эти методы обладают целым рядом особенностей (именно по этому они и выделены в специальную группу). Сейчас мы об этих особенностях и поговорим.

Первое. В отличие от других методов они должны называться особым образом. Если обычные методы могут называться как угодно, то имя констуктора должно совпадать с именем класса, а имя деструктора - с именем класса с приписанной в начале тильдой. Например, если класс называется CRect, то конструктор этого класса обязан называться тоже CRect, а деструктор - ~CRect.

Второе. В отличии от других методов конструктор и деструктор вызываются сами (а другие методы мы вызываем явным образом). Конструктор вызывается в момент создания экземпляра класса, а деструктор - в момент уничтожения. Т. е. их не надо вызывать явным образом - они вызываются сами. Именно поэтому конструкторы обычно используются для задания некоторых начальных значений для переменных класса, а деструкторы - для освобождения памяти (в случае если у вас есть внутри класса переменные-указатели).

Третье. Ни конструктор, ни деструктор не возвращают никакого значения (даже типа void). Это означает, в частности, что при обяъвлении конструтора и деструктора в классе мы перед ними не пишем ни какой тип.

struct T

{

int x, y;

};

/* Эта процедура является отображением конструктора T::T(int,int) */

void

T_constr (struct T *this, int _x, int _y)

{

this->x = _x;

this->y = _y;

}

/* Эта процедура является отображением деструктора T::~T() */

void

T_destr (struct T *this)

{

this->x = 0;

this->y = 0;

}

...

void

func (void)

{

struct T a; /* выделяем память для объекта "a" */

struct T b; /* выделяем память для объекта "b" */

T_constr (&a, 10, 11); /* вызываем конструктор для "a" */

T_constr (&b, 20, 21); /* вызываем конструктор для "b" */

/* тело процедуры */

T_destr (&a); /* вызываем деструктор для "a" */

T_destr (&b); /* вызываем деструктор для "b" */

/* по достижении выхода из процедуры происходит удаление памяти для объектов "a" и "b" */

}

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]