09 static polymorphism

36
Бублик Володимир Васильович Програмування - 2 Лекція 9. Процедурне програмування. Статичний поліморфізм Лекції для студентів 2 курсу

Upload: olegapster

Post on 23-Jun-2015

569 views

Category:

Entertainment & Humor


2 download

TRANSCRIPT

Page 1: 09 Static Polymorphism

Бублик Володимир Васильович

Програмування - 2

Лекція 9. Процедурне програмування.

Статичний поліморфізм

Лекції для студентів 2 курсу

Page 2: 09 Static Polymorphism

1. Функціональна полісемія

Page 3: 09 Static Polymorphism

© Бублик В.В. Програмування-2. 9. Процедурне програмування. Статичний поліморфізм

3

Непряме звернення до функцій

Оголошення указника функції• double (*f) (double);

Визначення з ініціалізацією• double (*f ) (double) = 0;• double (*trigon) (double) = sin;

Присвоєння• trigon = cos;

Page 4: 09 Static Polymorphism

© Бублик В.В. Програмування-2. 9. Процедурне програмування. Статичний поліморфізм

4

Виклик за указником

• #include <cmath>

• int main()• {• double (*trigon) (double) = sin;• cout<<trigon(0)<<endl;• trigon = cos;• cout<<trigon(0)<<endl;

• return 0;• }

Page 5: 09 Static Polymorphism

© Бублик В.В. Програмування-2. 9. Процедурне програмування. Статичний поліморфізм

5

Масиви указників функцій

• const int n = 10;• double (*g[n]) (double);

• typedef double (*F) (double);

• F * pf = new F[n];

• g[1] = sin;• pf[2] = exp;

Page 6: 09 Static Polymorphism

© Бублик В.В. Програмування-2. 9. Процедурне програмування. Статичний поліморфізм

6

Функціонали

Розв'язування рівнянь методом ділення навпілR x R x R x [R -> R] -> R

• double Newton (double a, double b, double eps,• double (*f) (double));

• double Simpson (double a, double b, double eps,• double (*f) (double));

В яких випадках бажано або необхідно мати одне спільне позначення для різних дій?

Page 7: 09 Static Polymorphism

2. Розширення області визначення (overloading) функцій

Що бракує С?

Page 8: 09 Static Polymorphism

© Бублик В.В. Програмування-2. 9. Процедурне програмування. Статичний поліморфізм

8

Мінімізація понять

На всі випадки один символ для додавання

• Натуральні 1+2 // 1 +n 2 • Цілі -1+2 // -1 +i 2

• Раціональні ⅓ + ⅝ // ⅓ +z ⅝• Дійсні φ + 2πk // φ +r 2πk

• Комплексні (a + bi) + (c + di) // (a ☺ bi) ☻ (c ☺ di)• Вектори u+v• Матриці A+B

Page 9: 09 Static Polymorphism

© Бублик В.В. Програмування-2. 9. Процедурне програмування. Статичний поліморфізм

9

Однойменні функції

Обмін цілих значень• void pswap ( int *x, int *y); // стиль С• void rswap ( int &x, int &y); // стиль С++

Як назвати цю ж функцію для дійсних (символьних, …) значень?

• void pswap_char (char *x, char *y); //?• void pswap_1 (char *x, char *y); //?

Краще всього так само pswap або відповідно rswap

Page 10: 09 Static Polymorphism

© Бублик В.В. Програмування-2. 9. Процедурне програмування. Статичний поліморфізм

10

Overloading

Якщо функція визначається сигнатурою, а не тільки іменем, то кожній сигнатурі приписуємо свою реалізацію

• void pswap ( int *x, int *y);• void pswap ( char *x, char *y);• void pswap (double *x, double *y);

Page 11: 09 Static Polymorphism

© Бублик В.В. Програмування-2. 9. Процедурне програмування. Статичний поліморфізм

11

Виклики

Якщо функція визначається сигнатурою, а не тільки іменем, то за типами фактичних параметрів можна встановити, функція якої саме сигнатури викликається

• char a, b;• int m, n;• float x, y;

• pswap (&a, &b);• pswap (&m, &n);• pswap (&x, &y);

Page 12: 09 Static Polymorphism

© Бублик В.В. Програмування-2. 9. Процедурне програмування. Статичний поліморфізм

12

Перший висновок

Якщо функція визначається сигнатурою, а не тільки іменем, то немає більше необхідності в різних іменах pswap і rswap для функцій swap, що різнитимуться типами параметрів: указниками та відсилками

• void swap ( int &x, int &y);• void swap ( int *x, int *y);

Але для сигнатури• void swap ( int x, int y);вже немає місця (чому?)

Page 13: 09 Static Polymorphism

© Бублик В.В. Програмування-2. 9. Процедурне програмування. Статичний поліморфізм

13

Функції swap: різні способи передачі параметрів

• void swap ( int *x, int *y)• {• int z=*x; *x=*y; *y=z;• return;• }

• void swap ( int &x, int &y)• {• int z=x; x=y; y=z;• }

Page 14: 09 Static Polymorphism

© Бублик В.В. Програмування-2. 9. Процедурне програмування. Статичний поліморфізм

14

Функції swap: різні типи даних

• void swap (double *x, double *y)• {• double z=*x; *x=*y; *y=z;• return;• }

• void swap (double &x, double &y)• {• double z=x; x=y; y=z;• }

Page 15: 09 Static Polymorphism

© Бублик В.В. Програмування-2. 9. Процедурне програмування. Статичний поліморфізм

15

Функції swap: різні реалізації

• void swap ( int *x, int *y)• {• *x=*x+*y; *y=*x-*y;*x=*x-*y;• return;• }

• void swap ( int &x, int &y)• {• x=x+y; y=x-y; x=x-y;• }

Page 16: 09 Static Polymorphism

3. Розширення області визначення (overloading) операцій

Що ще бракує С?

Page 17: 09 Static Polymorphism

© Бублик В.В. Програмування-2. 9. Процедурне програмування. Статичний поліморфізм

17

Довизначені операції

• struct Point• { • double _x;• double _y;• };• const Point plus(Point u, Point v) //дуже незграбно• { • Point res;• res._x = u._x+v._x;• res._y = u._y+v._y;• return res;• }

Page 18: 09 Static Polymorphism

© Бублик В.В. Програмування-2. 9. Процедурне програмування. Статичний поліморфізм

18

Так краще

• int main()• {•• const Point one_zero = {1, 0};• Point u = {2, 3};• Point v = u + one_zero;

• cout<<v._x<<v._y<<endl;•• return 0;• }

Page 19: 09 Static Polymorphism

© Бублик В.В. Програмування-2. 9. Процедурне програмування. Статичний поліморфізм

19

Так ще краще

• int main()• {•• const Point one = {1, 0};• Point u = {2, 3};• Point v = u + one;

• cout<<v<<endl;•• return 0;• }

Page 20: 09 Static Polymorphism

© Бублик В.В. Програмування-2. 9. Процедурне програмування. Статичний поліморфізм

20

Або навіть

• int main()• {•• const Point one_zero = {1, 0};• Point u = {2, 3};•• cout<< u + one_zero <<endl;•• return 0;• }

Page 21: 09 Static Polymorphism

© Бублик В.В. Програмування-2. 9. Процедурне програмування. Статичний поліморфізм

21

Point.h

// Arithmetic• const Point operator+ (const Point &, const Point &);// Варіація// Point operator+ (Point , Point);

// Boolean• bool operator== (const Point &, const Point &);

// Input-output• ostream& operator<<(ostream &os, const Point &);• istream& operator>>(istream &is, Point &);

Page 22: 09 Static Polymorphism

© Бублик В.В. Програмування-2. 9. Процедурне програмування. Статичний поліморфізм

22

Погодження

Замість• plus (u, v); або operator+(u, v);Пишемо• u+v;

Відповідно замість суперпозиції• operator+(u, operator+(v, w));звичайний запис• u+v+w;

Page 23: 09 Static Polymorphism

© Бублик В.В. Програмування-2. 9. Процедурне програмування. Статичний поліморфізм

23

Point.cpp

• const Point operator+(const Point & u, const Point & v)

• { • Point res = {u._x+v._x, u._y+v._y};• return res;• }

• bool operator==(const Point& u, const Point & v)• {• return (u._x == v._x) && (u._y == v._y);• }

Page 24: 09 Static Polymorphism

© Бублик В.В. Програмування-2. 9. Процедурне програмування. Статичний поліморфізм

24

Point.cpp

• ostream& operator<<(ostream &os, const Point& u)• {• os<<'('<<u._x<<','<<u._y<<')';• return os;• }

• istream& operator>>(istream &is, Point& u)• {• is>>u._x>>u._y;• return is;• }

Page 25: 09 Static Polymorphism

© Бублик В.В. Програмування-2. 9. Процедурне програмування. Статичний поліморфізм

25

Змішані типи

• struct Complex• { • double _re; • double _im;• };•• // Arithmetic• Complex operator+ (const Complex &, const

Complex &);• Complex operator+ (double, const Complex &);• Complex operator+ (const Complex &, double);

Page 26: 09 Static Polymorphism

© Бублик В.В. Програмування-2. 9. Процедурне програмування. Статичний поліморфізм

26

Змішані типи

• const Complex i = {0, 1};• Complex z = {1, 1};• double x = 2, y=3;• cout << (x +5) + (z+i) + y<<endl;

• Complex operator+ (const Complex &, const Complex &);

• Complex operator+ (double, const Complex &);• Complex operator+ (const Complex &, double);• ostream& operator<<(ostream &os, const Complex &);

Як визначити одне додавання для всіх? (далі буде)

Page 27: 09 Static Polymorphism

© Бублик В.В. Програмування-2. 9. Процедурне програмування. Статичний поліморфізм

27

Множення

• struct WrappedVector• {• static const int n;• double * x;• };

• double operator*(const WrappedVector&, const WrappedVector&);

Або (але не одночасно, чому?)• const WrappedVector operator*

(const WrappedVector&, const WrappedVector&);

Page 28: 09 Static Polymorphism

4. Узагальнені функції(function template)

Page 29: 09 Static Polymorphism

© Бублик В.В. Програмування-2. 9. Процедурне програмування. Статичний поліморфізм

29

Мінімізація текстів

• void swap ( int &x, int &y);• void swap ( char &x, char &y);• void swap ( float &x, float &y);

Записати три і більше реалізацій одним текстом

Page 30: 09 Static Polymorphism

© Бублик В.В. Програмування-2. 9. Процедурне програмування. Статичний поліморфізм

30

Myswap.h

Куди помістити?

• template <typename T>• void myswap (T &x, T &y)• {• T z = x; x = y; y = z;• return;• }

Чому не Myswap.сpp?

Page 31: 09 Static Polymorphism

© Бублик В.В. Програмування-2. 9. Процедурне програмування. Статичний поліморфізм

31

Myswap.cpp

• int m=10, n=20;• myswap (m, n);

• double a=1.25, b = 2.50;• myswap (a, b);

• Point u ={1,2}, v={3,4};• myswap(u,v);

• Complex z1 = {1,1}, z2 = {2,2};• myswap (z1, z2);

Page 32: 09 Static Polymorphism

© Бублик В.В. Програмування-2. 9. Процедурне програмування. Статичний поліморфізм

32

Конкретизація

• int m=10, n=20;• short k=50, i=40;•• myswap<int> (m, n);• myswap (m, n);• myswap (i, k);// Звичайна функція• void myswap ( int &x, int &y)• {• cout<<"Non template"<<endl;• x=x+y; y=x-y; x=x-y;• }

Page 33: 09 Static Polymorphism

© Бублик В.В. Програмування-2. 9. Процедурне програмування. Статичний поліморфізм

33

Союз довизначень і узагальнень

Для типу Т повинні бути визначені всі функції і операції, вжиті в узагальненій функції

• template <typename T>• T max(T x, Ty)• {• return (x>y)?x:y;• }

Page 34: 09 Static Polymorphism

© Бублик В.В. Програмування-2. 9. Процедурне програмування. Статичний поліморфізм

34

Союз довизначень і узагальнень

• int m=10, n=20;• cout<<max (m, n)<<endl;

• double a=1.25, b = 2.50;• cout<<max (a, b) <<endl;

• Point u ={1,2}, v={3,4};• // max (u,v); ERROR

• Complex z1 = {1,1}, z2 = {2,2};• // max (z1, z2); ERROR

Page 35: 09 Static Polymorphism

© Бублик В.В. Програмування-2. 9. Процедурне програмування. Статичний поліморфізм

35

Складність компіляції

• Вибір функції за типами фактичних параметрів з урахуванням можливих перетворень типів, використання замовчуваних значень параметрів, можливостей конкретизації шаблонів. В деяких випадках компілятор не справляється з однозначним визначенням потрібної функції

Page 36: 09 Static Polymorphism

© Бублик В.В. Програмування-2. 9. Процедурне програмування. Статичний поліморфізм

36

Висновок

Поліморфізм полягає у використанні об'єктів, що можуть набувати багатьох різних типів.

При динамічному поліморфізмі тип об'єкта визначиться лише на етапі виконання (далі буде).

Статичний поліморфізм ― це визначення типів, використаних узагальненою функцією, на етапі компіляції з одночасною конкретизацією шаблону або вибором підходящої звичайної функції. Конкретизація можлива, якщо всі вирази шаблону визначені для конкретизуючого типу