- •Введение в понятие класса
- •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)
Void main(void)
{
int i=10;
float f=1.1;
long l=2345;
long double id=123.1e+123;
cout<<”int”<<sqr_it(i)<<endl;
cout<<”float”<<sqr_it(f)<<endl;
cout<<”long”<<sqr_it(l)<<endl;
cout<<”long double”<<sqr_it(id)<<endl;
}
В шаблоне функции может использоваться необязательно один тип как параметр шаблона. Например, функции max (a,b) с различными типами аргументов могут быть определены следующим образом:
template <class T1, class T2>
T max(T1 x,T2 y)
{ return (x>y)?x:y; };
Возвращаемый тип T1. Для того, чтобы функции возвращали результат без потери значения, при вызове функции желательно переменную или константу “старшего” типа использовать в качестве первого аргумента.
Пример:
include <iostream.h>
template <class T1,class T2>
T maximum(T1 x,T2 y)
{
if(x>=y) return x;
return y;
};
Void main(void)
{
int i=10;
double d=1.2345;
long l=123456;
long double ld=1.1e+123;
cout<<”максимум из “<<d<<” и “<<i<<” равен “<<maximum(d,i)<<endl;
cout<<”максимум из “<<i<<” и “<<d<<” равен “<<maximum(i,d)<<endl;
cout<<”максимум из “<<ld<<” и “<<l<<” равен “<<maximum(ld,l)<<endl;
}
Шаблоны классов
Шаблоны классов позволяют построить отдельные классы аналогично шаблонам функций. Шаблон класса задает параметризованный тип. Имя шаблона класса должно быть уникальным и не может относиться к какому-либо шаблону, классу, функции, объекту и т.д.
В качестве параметра при задании шаблона класса может использоваться не только тип, но и другие параметры, например целочисленные значения (но эти параметры должны быть константными выражениями).
Преобразуем класс queue, задав этот класс шаблоном. Параметрами шаблона будет тип массива, входящего в класс queue, и размер size этого массива.
#include <iostream.h>
template <class T, int size>
class queue
{
T *q;
Int sloc, rloc;
public:
queue(void); // конструктор
~queue(void); // деструктор
Void qput(t I);
T qget(void);
};
template <class T, int size> // следует обратить внимание на синтаксис
queue<T, size>::queue(void) // описание функции-конструктора
{
if (!(q=new T[size]))
{
cout<<”Недостаточно памяти \n”;
return;
}
sloc=rloc=0;
cout<<”Очередь размера ”<<size<<” инициализирована \n”;
}
template <class T, int size>
queue<T, size>::~queue(void) // описание функции-деструктора
{
delete q; cout<<” Очередь разрушена \n”;
}
template <class T, int size>
void queue<T, size>::qput(T i)
{
if(sloc= =size)
{
cout<<” Очередь полна \n”;
return;
}
q[sloc++]=i;
}
template <class T, int size>
T queue<T, size>::qget(void)
{
if(rloc= =sloc)
{
cout<<” Очередь пуста \n”; return 0;
}
return q[rloc++];
}
Void main(void)
{
queue<int,5> a;
queue<double, 200> b;
// объявление двух объектов класса queue с массивами разных типов и разных размеров
a.qput(10);
b.qput(1.234);
a.qput(1);
b.qput(2.3456);
cout<<a.qget()<<” “;
cout<<a.qget()<<” “;
cout<<b.qget()<<” “;
cout<<b.qget()<<” \n“;
const int s=10;
queue<long double,s> *pq;
pq = new queue<long double, s>;
// Динамическое создание объекта, именно сейчас вызывается конструктор queue
if((!pq)
{
cout<<”\n Недостаточно памяти \n”;
return 0;
}
else
cout<<”\n Объект класса queue создан \n”;
for (int i=0;i<s;i++)
pq->qput((i/2.0+i); // заполнение очереди
for ( i=0;i<s;i++)
cout<<pq->qget()<<” “;
cout<<endl;
delete pq;
}