- •Введение в понятие класса
- •Void queue::init(void)
- •Перегруженные функции
- •Int sqr_it(int I); // Прототипы
- •Перегрузка операций.
- •Наследование
- •Конструкторы и деструкторы
- •Int sloc,rloc;
- •Void qput(int); // Прототип
- •Int qget(void); // Прототип
- •Конструктор с параметрами
- •Конструктор копирования
- •Void input();
- •Void output();
- •Void ThreeAngle::input()
- •Void ThreeAngle::output()
- •Void main(void)
- •Дружественные функции
- •Замечание
- •Дружественные классы
- •Аргументы функций, задаваемые по умолчанию
- •Void main(void)
- •Void stringxy(char *str, int X, int y)
- •Структуры и классы
- •Объединения и классы
- •Void main()
- •Наследование классов
- •Конструкторы с параметрами при наследовании
- •Множественное наследование
- •Перегрузка функций и операций
- •Ключевое слово this
- •Перегрузка операций ввода/вывода. Инсерторы и экстракторы
- •Void main(void)
- •Vector a(1,2,3),b(4,5,6);
- •Void main(void)
- •Vector a(1,2,3),b(4,5,6);
- •Void main(void)
- •Vector a(1,2,3);
- •Дружественные функции-операции
- •Void main(void)
- •Void swap1(int *I, int *j)
- •Void swap(int a, int b)
- •Void swap1(int *I, int *j)
- •Void swap2(int &a, int &b)
- •Использование ссылочных переменных для перегрузки унарных операций
- •Перегрузка операции индексации [ ]
- •Использование виртуальных функций
- •Указатели на производные типы
- •Виртуальные функции
- •Замечания к использованию виртуальных функций
- •Пример использования виртуальных функций
- •Чистые виртуальные функции и абстрактные типы
- •Производные классы и их конструкторы и деструкторы
- •Void main()
- •Конструкторы и деструкторы при множественном наследовании
- •Void main()
- •Виртуальные базовые классы.
- •Операции динамического выделения памяти new и delete
- •Void main(void)
- •Void main(void)
- •Виртуальные деструкторы
- •Void main(void)
- •Void main(void)
- •Шаблоны классов и функций
- •Шаблоны функций
- •Void main(void)
- •Void main(void)
- •Шаблоны классов
- •Int sloc, rloc;
- •Void qput(t I);
- •Void main(void)
- •Статические члены класса
- •Локальные классы
- •Void f(void);
- •Void main(void)
- •Void f(void)
- •Вложенные классы
- •Void main(void)
Перегрузка операций.
Второй способ реализации полиморфизма в С++ - это перегрузка операций. Например, << и >> в 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
Очередь разрушена
Очередь разрушена