- •Курс лекций по объектно-ориентированному программированию
- •1. Введение. Объектно-ориентированное программирование как технология программирования. (4 час.)
- •Объектная модель
- •2. Расширение языка с. ( 3 час.)
- •Тип_функции имя_функции (спецификация_формальных_параметров);
- •Int infunc(float, int); // Прототип функции
- •3. Классы. (3 час.)
- •Int day; // день
- •Int month;
- •Int month;
- •Int year;
- •Int month;
- •Int month;
- •Int year;
- •Int *month;
- •Int *year;
- •Int size;
- •Int readm() { return m; };
- •Void f()
- •X *this;
- •Int day,month,year;
- •Void main()
- •Void shedule(int);
- •Void wait(event);
- •Void main()
- •Void strange(int I)
- •Void f()
- •Int check(char t, char* s)
- •Void f()
- •Void dat::put() const
- •X *Object_x;
- •Int X; // Личная часть класса
- •Void fun2(a&);
- •Void fun(a&);
- •Void f(complex a, complex b)
- •X* operator&(); // унарное & (взятие адреса)
- •X operator&(X); // бинарное & (операция и)
- •X operator&(X,X); // ошибка: тернарное
- •Int month;
- •Int year;
- •Void next(); // Элемент-функция вычисления следующего дня
- •Void dat::next()
- •Void main()
- •Void main()
- •Int size;
- •Int size; // Длина строки
- •Int operator[](char*); // Операция поиска подстроки
- •Int n; // целое
- •Void display () //вывод значения
- •Void main()
- •Void* operator new(size_t size);
- •Void operator delete (void *);
- •Int month;
- •Int year;
- •Void main()
- •Int month;
- •Int year;
- •Int r; // Текущий результат
- •Int I; // Счетчик месяцев
- •Void main()
- •Void g()
- •1.M(); // ошибка
- •Void g();
- •Void f(),
- •Void funс (int I)
- •Void funс (int I)
- •Void main(void) {
- •Virtual void vfunc (int I)
- •Void vfunc (int I)
- •Void vfunc (int I)
- •Void main(void)
- •Void main(void)
- •Virtual int f(int j) { return j * j; };
- •Int f(int I) { return base::f (I * 2); };
- •Void s(int);
- •Void f (int);
- •Void s (int);
- •Int line;
- •Int y_or_n(ostream& to, istream& from)
- •If (!cin.Get(ch)) return 0;
- •Void error(char* s, char* s2)
- •Istream from(&f1);
- •If (!from.Eof() && to.Bad())
- •7. Параметризованные типы и функции. (2 час.)
- •Void swap (t* X, t* y)
- •Void swap(long* X, long* y)
- •Void swap(double* X, double* y)
- •Void main()
- •Void main()
- •Void main()
- •Int size; // Количество элементов в иассиве
- •Vector (int); // Конструктор класса vector
- •Void main()
- •Int length;
- •Void main()
Int size; // Количество элементов в иассиве
public:
Vector (int); // Конструктор класса vector
~Vector () { delete [] data; }; // Деструктор
// Расширение действия (перегрузка) операции «[]»:
T& operator[] (int i) { return data [i]; };
};
// Внешнее определение конструктора класса:
template <class T>
Vector <T>::Vector(int n)
{
data = new T[n];
size = n;
};
Когда шаблон введен, у программиста появляется возможность определять конкретные объекты конкретных классов, каждый из которых параметрически порожден из шаблона. Формат определения объекта одного из классов, порождаемых шаблоном классов:
имя_параметризованного_класса <фактические_параметры_шаблона>
имя_объекта(параметры_конструктора);
В нашем случае определить вектор, имеющий восемь вещественных координат типа double, можно следующим образом: Vector <double> z (8);
Проиллюстрируем сказанное следующей программой:
// формирование классов с помощью шаблона
# include «template.vec» // Шаблон класса «вектор»
# include <iostream.h>
Void main()
{
Vector<int> X(5); //Создаем объект класса «целочисленный вектор»
Vector<char> C(5); // Создаем объект класса «символьный вектор»
for (int i = 0; i < 5; i++)// Определяем компоненты векторов
{ X [i] = i; C [i] = ‘A’ + i; };
for (i = 0; i < 5; i++)
cout << << X[i] << << C[i]; // 0 A 1 B 2 C 3 D 4 E
};
В программе шаблон семейства классов с общим именем Vector используется для формирования двух классов с массивами целого и символьного типов. В соответствии с требованием синтаксиса имя параметризованного класса, определенное в шаблоне (в примере vector), используется в программе только с последующим конкретным фактическим параметром (аргументом), заключенным в угловые скобки. Параметром может быть имя стандартного или определенного пользователем типа. В данном примере использованы стандартные типы int и char. Использовать имя Vector без указания фактического параметра шаблона нельзя, никакое умалчиваемое значение при этом не предусматривается.
В списке параметров шаблона могут присутствовать формальные параметры, не определяющие тип, точнее - это параметры, для которых тип фиксирован:
#include <iostream.h>
template <class T, int size = 64>
class row
{
T *data;
Int length;
public:
row()
{
length = size;
data = new T[size];
};
~row() { delete [] data; };
T& operator[] (int i) { return data [i]; };
};
Void main()
{
row<float,8> rf;
row<int,8> ri;
for (int i = 0; i < 8; i++)
{ rf [i] = i; ri [i] = i * i; };
for (i = 0; i < 8, i++)
cout << << rf[i] << << ri[i];
//0 0 1 1 2 4 3 9 4 16 5 25 6 36 7 49
};
В качестве аргумента, заменяющего при обращении к шаблону параметр size, взята константа. В общем случае может быть использовано константное выражение, однако выражения, содержащие переменные, использовать в качестве фактических параметров шаблонов нельзя.
