- •1. Объектно-ориентированное программирование как методология проектирования программных средств.
- •1.2. Объект
- •Iarray a(10), b(25), c(45);
- •Int main(void)
- •2.1. Перегрузка имен функций
- •Int print(int);
- •Void print(int);
- •Void incr(int &aa)
- •Int (*matrix)[10];
- •Void main(void)
- •3.2 Объявление класса.
- •Имя_класса имя объекта;
- •Имя объекта. Имя элемента
- •Имя_объекта. Имя_метода( );
- •Имя класса *this;
- •Имя_класса (список формальных параметров)
- •Листинг 3.4
- •V_3d( double &X, double &y,double &z)
- •Void main(void)
- •Х:: х(const х&)
- •V_3d::v_3d(const v_3d& v1)
- •Void v_3d::print()
- •Сlass X
- •Void main (void)
- •4. Перегрузка операций
- •V_3d(double x1,double y1,double z1)
- •Void print();
- •Void main(void)
- •Void v_3d::print()
- •4.3.1. Использование дружественных функций при перегрузке операций
- •Void print();
- •Void main(void)
- •Void v_3d::print()
- •4.3.2.Особенности использования дружественных функций
- •Имя объекта. Имя_функции
- •Void f1( X& );
- •Void f2 ( X* );
- •Void main(void)
- •5. Производные классы
- •Int Bfunc( );
- •Int Xfunc( );
- •Int Efunc( X & x1 );
- •Istream
- •Iostream
- •Ifstream
- •С помощью манипуляторов – специальных операций, вставляемых непосредственно в поток вывода.
- •Int width( int w);
- •Int precision( int p);
- •Void main(void)
- •Void open(char* filename, int mode, int access);
- •If(!fout) {
- •7. Виртуальные функции
- •Circle a;
- •A.Build();
- •Virtual double a(double X)
- •Void main (void)
- •Void Graphics Object :: Build() { };
- •8.Шаблоны функций и классов
- •Void main(void)
- •Void Swap ( SwapType &X, SwapType &y)
- •Void main(void)
- •Int a, double b;
- •Int sloc,rloc;//начало и конец очереди
- •Void qput(t I); // помещение элемента в очередь
- •Int main(void)
- •1.Какой принцип ооп реализуется с помощью шаблонных функций и классов?
- •2.Когда целесообразно использовать шаблоны функций? Каков общий вид объявления шаблона функции?
Void main(void)
{
int i=15; float f=3.12;
double x=3.1e2
cout << “целое” << cub(i) <<”\n”;
cout <<”вещественное” << cub(f) <<”\n”;
cout <<”двойной точности” << cub(x) <<”\n”;
return 0;
}
В листинге 8.2 приведен фрагмент программы, в котором показано использование ссылки в качестве параметра шаблона функции.
Листинг 8.2
//Шаблон функции, осуществляющей перестановку двух переданных параметров.
Void Swap ( SwapType &X, SwapType &y)
{
SwapType temp;
Temp=x;
x=y;
y=temp;
}
В листинге 8.3 приведен фрагмент программы, в котором показано использование в шаблоне функции в качестве параметров двух типов.
Листинг 8.3.
// Шаблон функции для нахождения максимального из двух величин
template < class T1, class T2 >
T1 max( T1 x, T2 y)
{
if( x>y)
return x;
else
return y;
}
Рассмотрим, вопрос о типе возвращаемого значения функции, приведенной в листинге 8.3.
В C++ нет механизма изменения типа возвращаемого значения, поэтому нужно сделать какой-то выбор. Для того, чтобы эти функции возвращали результат без потери значения, при вызове функции, желательно, переменную или константу “старшего типа” использовать в качестве первого аргумента, например:
Void main(void)
{
Int a, double b;
// операторы
max( b, a);
// операторы
}
В этом случае в качестве типа возвращаемого значения - T1 будет использовано имя переменной старшего типа, и потери не произойдет.
8.2.Шаблоны классов
Шаблон класса представляет собой скелет обобщенного класса.
Синтаксис объявления шаблонного класса:
template < список_аргументов_шаблона >
class имя_класса
{
//тело класса
};
Каждый аргумент является:
либо именем типа, за которым следует идентификатор, например:
float a;
либо ключевым словом class, за которым следует идентификатор, обозначающий параметризированный тип, например:
class T.
Общий вид определения функции - метода шаблонного класса
template <список_аргументов_шаблона>
тип_результата имя_класса <список_аргументов_шаблона>
:: имя_функции(список_аргументов_функции)
{
// операторы
}
Объявление объекта шаблонного класса:
имя_класса_шаблона <список_аргументов_шаблона> имя объекта;
Пример использования шаблонного класса для организации очереди объектов параметризированного типа приведен в листинге 8.4.
Листинг 8.4.
// Использование шаблона класса для организации очереди объектов
//параметризированного типа
#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++];
}
/*************************************************/
