Объектно-ориентированное программирование С++. Лекция 8 Карпов В.Э.

Презентация:



Advertisements
Похожие презентации
Лекция 22. Шаблоны (часть 2) Красс Александр СПбГУ ИТМО, 2008.
Advertisements

Объектно-ориентированное программирование С++. Лекция 6 Карпов В.Э.
Лекция 6 Функции. Объявления и определения Объявление функции – указание имени функции, а также входных и выходных параметров Определение функции – указание.
Лекция 6 Функции. Объявления и определения Объявление функции – указание имени функции, а также входных и выходных параметров Определение функции – указание.
ООП Классы Данные отдельно, методы отдельно struct Node { Node* next; void* data; }; struct List { Node* first; int size; }; void* allocate() { … } void.
Язык C++ Лекция 2. Недостатки enumов Засорение namespaceа, в котором находится enum Соответственно, члены enumа должны иметь уникальный префикс.
Лекция 14 Динамические данные. Виды памяти Существует три вида памяти: статическая, стековая и динамическая. Статическая память выделяется еще до начала.
Преобразования типов В языке C/C++ имеется несколько операций преобразования типов. Они используются в случае, если переменная одного типа должна рассматриваться.
Статические поля класса Статические поля хранят данные, общие для всех элементов класса. Статическое поле существует в единственном экземпляре для всех.
ООП Классы – 2.
Инструкции C++ Условная инструкция Формат: if (условие) оператор; else оператор; Пример: if (i!=0) { if (j) j++; if(k) k++; else if(p) k--; } else i--;
Лекция 11. Введение в ООП. Часть 4 Красс Александр СПбГУ ИТМО, 2008.
Лекция 10 Класс как абстрактный тип. Подбельский гл. 9, Страуструп гл. Конструкторы и деструктор Конструкторы - это специальные функции-члены класса, предназначенные.
Лекция 21. Шаблоны (часть 1) Красс Александр СПбГУ ИТМО, 2008.
Лекция 9. Введение в ООП. Часть 2 Красс Александр СПбГУ ИТМО, 2008.
Прикладное программирование кафедра прикладной и компьютерной оптики Полиморфизм.
Лекция 9 Функции. Массивы-параметры функции Передача массива в функцию Пример: void array_enter(int a[], int size) { int i; for (i = 0; i < size; i++)
1 Переопределение операций Макаревич Л. Г.. 2 Зачем нужна перегрузка операций? class Complex { double re; double im; public: Complex(double r=0, double.
Функции Функция – именованная последовательность описаний и операторов, выполняющая некоторое действие. Может иметь параметры и возвращать значение. Функция.
Синтаксис языка Java. Символы и синтаксис Перевод строчки эквивалентен пробелу Регистр в именах различается.
Транксрипт:

Объектно-ориентированное программирование С++. Лекция 8 Карпов В.Э.

ООП C++2 ШАБЛОНЫ Предположим, что перед нами стоит задача создания списка элементов некоторого типа. Например, списка целых чисел. Реализация может выглядеть примерно так: class List { int val; List *next; public: void add(List *e); void add(int n) { List *t = new List(n); add(t); } void print(void); List(int v0) { val = v0; next = NULL; }; }; void List::add(List *e) { List *t; for(t=this;t->next;t=t->next); t->next = e; } void List::print(void) { for(List *t=this;t;t=t->next) printf("%d ", t->val); } Пример работы со списком: List L=1; L.add(&List(2)); List *pl = new List(3); L.add(pl); L.add(4); L.print();

ООП C++3 Понятие шаблона Введено в работе Б.Строуструпа "Parameterized Types for C++", Определение шаблона: объявление Объявление описывает функцию или класс. Объявление может быть только глобальным. template class Vector { T* v; int sz; public: Vector(int n) { sz = n; v = new T[sz]; }; void sort(void); T& operator[](int i) { return v[i]; } }; Vector v1(20); Vector v2(10); typedef Vector CVector; Работа с именем шаблонного класса ведется так же, как и просто с именем класса. class SVector: public Vector {…}

ООП C++4 Шаблоны функций-членов template T&Vector ::operator[](int i) {...}; template void Vector ::sort(void) {...}; При использовании шаблонных функций на компилятор ложится работа по определению их реализации на основе анализа их типа. Vector cv(100); Vector ci(100); f(cv); //f(vector ) f(ci); //f(vector )

ООП C++5 Шаблоны функций template T max(T a, T b) {return a>b?a:b;}; int a, b; char c, d; int m1 = max(a,b); //max(int, int) char m2 = max(c,d); //max(char, char) int m3 = max(a,c); // - ошибка: нельзя сгенерировать max(int, char)

ООП C++6 Ограничения Каждый параметр шаблона, заданный в списке параметров, должен быть использован в типах параметров шаблона функции. template T* create(); // Ошибка template void f() { T a; … }; // Ошибка template class creator { static T* create(); } int *creator ::create();

ООП C++7 Пример struct S { int a, b; }; template T* create() { T *a; a = new T; return a; } template class Ccreator { public: static T* create(); }; int *Ccreator ::create() { int *n; n = new int; *n = 123; return n; } void main(void) { int *t; S *s; t = create (); s = create (); t = Ccreator ::create(); }

ООП C++8 Примеры template class TList {public: T val; TList *next; void add(TList *e); void add(T n) { TList *t = new TList(n); add(t); } void print(void); TList(T v0) { val = v0; next = NULL; }; }; template void TList ::add(TList *e) { TList *t; for(t=this;t->next;t=t->next); t->next = e; } template void TList ::print(void) { for(TList *t=this;t;t=t->next) printf("%d ", t->val); } template void print(T e) { printf("%d ", e.val); } // Вплоть до момента вызова этой функции компилятор ничего не знает о // типе аргумента template void print() { T x; printf("%d ", 1); } class C { int n, n2; public: C(int k=0) { n=k; n2=n-1;} };

ООП C++9 Продолжение void main(void) { TList tl=1; tl.add(&TList (2)); TList *tpl = new TList (3); tl.add(tpl); tl.add(4); tl.print(); typedef TList CList; CList cl=1; cl.add(&CList(2)); CList *cpl = new CList(3); cl.add(cpl); cl.add(4); cl.print(); TList ctpl = C(31); ctpl.add(32); ctpl.print(); print(ctpl); print(); //Ошибка: не найден образец для print () print (); //А вот так можно }

ООП C++10 Множество параметров Параметров шаблонов может быть несколько: template void print(A e, B x) { printf("%d %d", e.val, x); } template class L12 { T1 t1; T2 t2; };... print(ctpl, 1); L12 s;