- •Курс лекций по объектно-ориентированному программированию
- •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()
7. Параметризованные типы и функции. (2 час.)
Шаблоны функций. Параметры шаблонов. Шаблоны классов. Наследование и шаблоны.
Шаблоны функций. Шаблоны, которые называют иногда родовыми или параметризоавнными типами, позволяют создавать (конструировать) семейства родственных функций и классов.
Цель введения шаблонов функций - автоматизация создания функций, которые могут обрабатывать разнотипные данные. В отличие от механизма перегрузки, когда для каждого набора формальных параметров определяется своя функция, шаблон семейства функций определяется один раз, но это определение параметризуется. Параметризовать в шаблоне функций можно тип возвращаемого функцией значения и типы любых параметров, количество и порядок размещения которых должны быть фиксированы. Для параметризации используется список параметров шаблона.
В определении шаблона семейства функций используется служебное слово template. Для параметризации используется список формальных параметров шаблона, который заключается в угловые скобки <>. Каждый формальный параметр шаблона обозначается служебным словом class, за которым следует имя параметра (идентификатор). Пример определения шаблона функций, вычисляющих абсолютные значения числовых величин разных типов:
template <class type>
type abs(type x) { return x > 0 ? x: -x; };
Шаблон семейства функций состоит из двух частей - заголовка шаблона:
template <список_параметров_шаблона>
и из обыкновенного определения функции, в котором тип возвращаемого значения и типы любых параметров обозначаются именами параметров шаблона, введенных в его заголовке. Те же имена параметров шаблона могут использоваться и в теле определения функции для обозначения типов локальных объектов.
В качестве еще одного примера рассмотрим шаблон семейства функций для обмена значений двух передаваемых им параметров.
template <class T>
Void swap (t* X, t* y)
{
T z = *x;
*x = *y;
*y = x;
};
Здесь параметр T шаблона функций используется не только в заголовке для спецификации формальных параметров, но и в теле определения функции, где он задает тип вспомогательной переменной z.
Шаблон семейства функций служит для автоматического формирования конкретных определений функций по тем вызовам, которые транслятор обнаруживает в теле программы. Например, если программист употребляет обращение abs(-10.3), то на основе приведенного ранее шаблона компилятор сформирует такое определение функции:
double abs(double x) {return x > 0 ? x: -x; };
Далее будет организовано выполнение именно этой функции и в точку вызова в качестве результата вернется числовое значение 10.3.
Если в программе присутствует приведенный ранее шаблон семейства функций swap() и появится последовательность операторов:
long k = 4, d = 8, swap (&k, &d);
то компилятор сформирует определение функции:
Void swap(long* X, long* y)
{
long x = *x;
*x = *y;
*y = x;
};
Затем будет выполнено обращение именно к этой функции и значения переменных k, d поменяются местами.
Если в той же программе присутствуют операторы:
double a = 2.44, b = 66.3; swap (&a, &b);
то сформируется и выполнится функция
