Характеристики объектно-ориентированных языков. Конструкторы и деструкторы. Дружественные функции, страница 3


Режим доступа private в классе queue заменен на protected. Тогда все функции члены класса queue1 не имеют доступа к приватной части класса queue.     

Конструкторы и деструкторы.

Для большинства объектов естественно требовать, чтобы они были инициализированы до начала их использования. Для этого мы использовали функцию init(). Можно реализовать автоматическую инициализацию использованием функции конструктор. Конструктор – это специальная функция, являющаяся членом класса и имеющая то же самое имя, что и класс. Функция конструктор не может иметь тип возвращаемого значения и ее нельзя вызвать явно. Пример конструктора:

class queue {  //объявляем класс

int q[10];

int sloc,rloc;

public:

queue(void); // конструктор

void qput(int i);

int qget(void);

};

 
 


Описание конструктора можно сделать так:

queue::queue(void) //конструктор класса queue

{

rloc=sloc=0;

cout<<” очередь инициализирована\n”;

}

 
 


Вызывается функция конструктор в тот момент, когда создается объект; для локального объекта это будет происходить при входе в блок, в котором есть объявление объекта, для глобальных объектов конструктор вызывается один раз при создании объекта  в начале работы программы.

Во многих случаях требуется, чтобы были произведены какие- либо действия при окончании работы объекта. Это может быть освобождение памяти, закрытие файлов и т.д. Такой функцией является деструктор. Деструктор имеет такое же имя, как и имя класса, но перед ним ставится знак тильды ( ~). Деструктор как и конструктор не может иметь тип возвращаемого значения, но может быть вызван явно.

class queue {  //объявляем класс

int q[10];

int sloc,rloc;

public:

queue(void); // конструктор

~queue(void); // деструктор

void qput(int i);

int qget(void);

};

 
 


Описание деструктора:

queue::~queue(void) //описание деструктора

{

cout<<” очередь разрушена\n”;

}

 
 


Можно использовать конструктор с параметрами, в этом случае можно инициализировать элементы  создаваемого объекта  определенными конкретными значениями. Пусть конструктор инициализации будет иметь один параметр, который будет передаваться переменной id. 

class queue {  //объявляем класс

int q[10];

int sloc,rloc;

int id;

public:

queue(void); // конструктор умолчания

queue(inti); // конструктор инициализации

~queue(void); // деструктор

void qput(int i);

int qget(void);

};

 
 


Тогда описание конструктора по умолчанию будет следующее:

queue::queue(void) //конструктор по умолчанию

{

rloc=sloc=0;

id=0;

}

 

queue::queue(inti) //конструктор инициализации

{

rloc=sloc=0;

id=i;

}

 
 


Конструктор  инициализации будет выглядеть следующим образом:

При объявлении объекта a и передачи ему значения  210 необходимо написать:

queue a=queue(210) ;

или более короткий способ

 queue a(210) ;

 
 


Дружественные функции

Причиной введения дружественных функций явилась ситуация, когда одна и та же функция должна использовать приватные элементы двух или более разных классов. Это можно сделать при объявлении класса, объявив такую функцию  используя ключевое слово friend.

Рассмотрим пример объявления двух классов, в каждом из которых объявлена дружественная функция, не являющаяся членом ни первого, ни второго класса. Дружественная функция 

int same_color (line l, box b) будет сравнивать значения переменной color в каждом из классов box  и line и возвращать  1, если  значения совпадают, и 0 в противном случае.

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