Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
С++ - ООП.doc
Скачиваний:
11
Добавлен:
21.09.2019
Размер:
399.87 Кб
Скачать

Перегрузка операций.

Второй способ реализации полиморфизма в С++ - это перегрузка операций. Например, << и >> в C++ имеют двоякий смысл: поразрядный сдвиг и оператор ввода/вывода на консоль. Причина этого в том, что в файле iostream.h эти знаки операций перегружены. Когда перегружается знак операции, компилятор анализирует тип операндов и в зависимости от типа делает выбор.

Наследование

Наследование – одна из важных черт ООП. В С++ наследованием реализуется возможность объединять один класс с другим во время объявления второго класса.

Основная форма наследования:

class имя-наследующего класса: режим-доступа наследуемый класс {…..};

где

наследуемый класс – базовый класс (base class);

наследующий класс – производный класс (derive class);

режим доступа – {private, protected, public}.

Пример иллюстрирующий понятие наследования

#include <iostream.h> // Пример двух классов – модель очередь

#include <conio.h>

class queue {

protected:

int q[10];

int sloc,rloc;

public:

void init(void);

void qput(int);

int qget(void);

};

class queue1:public queue

{

int sum;

public:

int get_sum(void); // Прототип

void show_sum(void); // Прототип

};

void queue::init(void)

{

rloc=sloc=0;

}

int queue::qget(void)

{

if (sloc==rloc)

{

out<<"\n Очередь пустая";

return 0;

}

return q[rloc++];

}

void queue::qput(int i)

{

if (sloc==10)

{

cout<<"\n Очередь полная";

return;

}

q[sloc++]=i;

}

int queue1::get_sum(void)

{

sum=0;

for(int i=rloc;i<sloc;i++)

sum+=q[i];

return sum;

}

void queue1::show_sum(void)

{

cout<<"\n Сумма элементов очереди = "<<sum<<"\n";

}

void main(void)

{

queue1 obj; // Создание объекта

obj.init(); // Инициализация объекта

for(int i=0;i<5;i++)

obj.qput(100+i);

obj.get_sum();

obj.show_sum();

for(i=0;i<6;i++)

{

obj.get_sum();

obj.show_sum();

obj.qget();

}

getch();

}

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

В С++ существует общее требование инициализации объектов. С++ предоставляет возможность делать это автоматически при создании объекта, т. е. при объявлении объекта.

Эта автоматическая инициализация реализуется использованием функции называемой конструктором (constructor). Конструктор – это специальная функция, являющаяся членом класса и имеющая то же самое имя, что и класс.

Пример

class queue {

protected:

int q[10];

Int sloc,rloc;

public:

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

Void qput(int); // Прототип

Int qget(void); // Прототип

};

Функция конструктор не может иметь тип возвращаемого значения. Описание конструктора queue() можно сделать так:

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

{

sloc=rloc=0;

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

}

Замечание Функция конструктор вызывается в тот момент, когда создается объект, т. е. ему выделяется память. Для локального объекта – это будет происходить при входе в блок, в котором есть объявление объекта. Для глобальных объектов конструктор вызывается один раз при создании объекта в начале работы программы. Нельзя вызывать конструктор в явном виде. Конструктор может иметь параметры, он может быть перегруженной функцией, в объекте может быть несколько конструкторов. Если в классе не объявлен ни один конструктор, то компилятор автоматически создает конструктор-функцию.

Специальная функция класса - деструктор (destructor)

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

Пример

class queue {

protected:

int q[10];

int sloc,rloc;

public:

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

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

void qput(int); // Прототип

int qget(void); // Прототип

};

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

#include <iostream.h>

#include <conio.h>

class queue {

int q[100];

int sloc,rloc;

public:

queue(void);

~queue(void);

void qput(int);

int qget(void);

};

queue::queue(void)

{

rloc=sloc=0;

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

}

~queue::queue(void)

{

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

}

int queue::qget(void)

{

if (sloc==rloc)

{

cout<<"\n Очередь пустая";

return 0;

}

return q[rloc++];

}

void queue::qput(int i)

{

if (sloc==100)

{

cout<<"Очередь полная\n ";

return;

}

q[sloc++]=i;

}

void main(void)

{

queue a,b;

a.qput(10);

b.qput(19);

a.qput(20);

b.qput(1);

cout<<a.qget()<<" ";

cout<<a.qget()<<" ";

cout<<b.qget()<<" ";

cout<<b.qget()<<"\n";

}

В результате работы программы получим:

Очередь инициализирована

Очередь инициализирована

10 20 19 1

Очередь разрушена

Очередь разрушена