Программирование и основы алгоритмизации. Тема 6. Объектно-ориентированное программирование. Перегрузка и шаблоны

Содержание

Слайд 2

Программирование и основы алгоритмизации

Тема 6. Объектно-ориентированное программирование. Перегрузка и шаблоны

2

Шевченко А. В.

Перегрузка

Программирование и основы алгоритмизации Тема 6. Объектно-ориентированное программирование. Перегрузка и шаблоны 2
функций

Перегрузка функций - одна из форм полиморфизма, которая заключается в возможности использования в одном пространстве имен нескольких функций с одинаковым именем, но с разными параметрами.

Язык С

Язык С++

int abs(int x)

double fabs(double x)

int abs(int x)

double abs(double x)

Слайд 3

Программирование и основы алгоритмизации

Тема 6. Объектно-ориентированное программирование. Перегрузка и шаблоны

3

Шевченко А. В.

Перегрузка

Программирование и основы алгоритмизации Тема 6. Объектно-ориентированное программирование. Перегрузка и шаблоны 3
функций в С++

char abs(char x);
short abs(short x);
long abs(long x);
float abs(float x);

char abs(char x)
{
return(x < 0 ? -x : x);
}
short abs(short x)
{
return(x < 0 ? -x : x);
}

long abs(long x)
{
return(x < 0 ? -x : x);
}
float abs(float x)
{
return(x < 0 ? -x : x);
}

Язык С++ разрешает определение нескольких функций с одним и тем же именем, если функции отличаются числом или типом параметров.

Слайд 4

Программирование и основы алгоритмизации

Тема 6. Объектно-ориентированное программирование. Перегрузка и шаблоны

4

Шевченко А. В.

Перегрузка

Программирование и основы алгоритмизации Тема 6. Объектно-ориентированное программирование. Перегрузка и шаблоны 4
методов в С++

class Circle
{
private:
double r;
...
public:
void Fit(Rectangle &R);
void Fit(Triangle &T);
void Fit(Square &S);
};
void Circle::Fit(Square &S)
{
r = S.Side()/2;
}

Слайд 5

Программирование и основы алгоритмизации

Тема 6. Объектно-ориентированное программирование. Перегрузка и шаблоны

5

Шевченко А. В.

Перегрузка,

Программирование и основы алгоритмизации Тема 6. Объектно-ориентированное программирование. Перегрузка и шаблоны 5
переопределение, сокрытие

Перегружаемые функции должны находиться в одной области определения.
Перегружаемые функции различаются компилятором по их параметрам.
Посредством перегрузки вызываемая версия функции соответствует конкретным типам параметров.
Переопределение функции осуществляется новым описанием функции в другой области определения в иерархиях классов.
Переопределяемые функции имеют идентичные имена и типы параметров.
Сокрытие или "затенение" функций осуществляется для функций, находящихся в различных областях определения, причем функция, описанная во внутренней области, скрывает описание, данное во внешней области.
Скрываемые и скрывающие функции имеют идентичные имена.
Доступ к скрытым функциям осуществляется через оператор расширения области видимости.

Слайд 6

Программирование и основы алгоритмизации

Тема 6. Объектно-ориентированное программирование. Перегрузка и шаблоны

6

Шевченко А. В.

Пример

Программирование и основы алгоритмизации Тема 6. Объектно-ориентированное программирование. Перегрузка и шаблоны 6
перегрузки, переопределения, сокрытия

class Figure
{
public:
double Area();
void Draw();
};
class Circle : public Figure
{
public:
double Area();
void Draw(int x, int y);
void Fit(Rectangle &R);
void Fit(Triangle &T);
void Fit(Square &S);
};

Circle c(100);
c.Draw(120, 50); // правильно
c.Draw(); // ошибка
c.Figure::Draw(); // правильно

Слайд 7

+ =

Circle a(2);
Circle b(2);
Circle c = a+b;
Circle c = a.operator+(b);

Программирование и

+ = Circle a(2); Circle b(2); Circle c = a+b; Circle c
основы алгоритмизации

Тема 6. Объектно-ориентированное программирование. Перегрузка и шаблоны

7

Шевченко А. В.

Перегрузка операторов в С++

2 + 2 = 4

int a = 2;
int b = 2;
int c = a+b;

Слайд 8

Программирование и основы алгоритмизации

Тема 6. Объектно-ориентированное программирование. Перегрузка и шаблоны

8

Шевченко А. В.

Правила

Программирование и основы алгоритмизации Тема 6. Объектно-ориентированное программирование. Перегрузка и шаблоны 8
перегрузки операторов

Нельзя определять новые операторы
Нельзя перегружать операторы :: , ?: , . , .* , # , ##
По крайней мере один из операндов перегруженного оператора должен быть объектом класса или ссылкой на объект класса
Нельзя изменять общий синтаксис оператора (число операндов, приоритет, задаваемые аргументы)

Перегрузка операторов

Вне области класса

В рамках определения класса

Слайд 9

class Circle
{
private:
double r;
public:
Circle(double R) { r = R; }
Circle &operator+(Circle

class Circle { private: double r; public: Circle(double R) { r =
&C);
};
Circle &Circle::operator+(Circle &C)
{
static Circle tmp(0);
tmp.r = sqrt(r*r+C.r*C.r);
return(tmp);
}

Программирование и основы алгоритмизации

Тема 6. Объектно-ориентированное программирование. Перегрузка и шаблоны

9

Шевченко А. В.

Пример перегрузки оператора «+» в области класса

Слайд 10

Circle &operator+(Circle &C1, Circle &C2)
{
static Circle C();
C.r = sqrt(C1.r*C1.r+C2.r*C2.r);
return(C);
}

Программирование

Circle &operator+(Circle &C1, Circle &C2) { static Circle C(); C.r = sqrt(C1.r*C1.r+C2.r*C2.r);
и основы алгоритмизации

Тема 6. Объектно-ориентированное программирование. Перегрузка и шаблоны

10

Шевченко А. В.

Пример перегрузки оператора «+» вне области класса

Слайд 11

class Circle
{
private:
double r;
public:
Circle(double R) { r = R; }
Circle &operator=(Circle

class Circle { private: double r; public: Circle(double R) { r =
&C);
};
Circle &Circle::operator=(Circle &C)
{
r = C.r;
return(*this);
}

Программирование и основы алгоритмизации

Тема 6. Объектно-ориентированное программирование. Перегрузка и шаблоны

11

Шевченко А. В.

Пример перегрузки оператора присваивания

Слайд 12

Circle a, b, c, d, e;

Программирование и основы алгоритмизации

Тема 6. Объектно-ориентированное программирование.

Circle a, b, c, d, e; Программирование и основы алгоритмизации Тема 6.
Перегрузка и шаблоны

12

Шевченко А. В.

Перегруженные операторы и цепочные вычисления

e = a+b+c+d;
e.operator=(a.operator+(b).operator+(c).operator+(d));

e = (a+b)+(c+d);
e.operator=(a.operator+(b).operator+(c.operator+(d)));

e = a+(b+c)+d;
e.operator=(a.operator+(b.operator+(c)).operator+(d));

Слайд 13

Программирование и основы алгоритмизации

Тема 6. Объектно-ориентированное программирование. Перегрузка и шаблоны

13

Шевченко А. В.

Многократная

Программирование и основы алгоритмизации Тема 6. Объектно-ориентированное программирование. Перегрузка и шаблоны 13
перегрузка операторов

class Circle
{
private:
double r;
public:
Circle(double R) { r = R; }
Circle &operator=(Circle &C);
Circle &operator=(Rectangle &R);
Circle &operator=(Triangle &T);
Circle &operator=(Square &S);
};
Circle &Circle::operator=(Square &S)
{
r = sqrt(S.Area()/M_PI);
return(*this);
}

Слайд 14

Программирование и основы алгоритмизации

Тема 6. Объектно-ориентированное программирование. Перегрузка и шаблоны

14

Шевченко А. В.

Пример

Программирование и основы алгоритмизации Тема 6. Объектно-ориентированное программирование. Перегрузка и шаблоны 14
перегрузки оператора >

class Circle
{
public:
double Area() { return(M_PI*r*r); }
bool operator>(Circle &C);
bool operator>(Rectangle &R);
bool operator>(Triangle &T);
bool operator>(Square &S);
};
bool Circle::operator>(Circle &C)
{
return(r > C.r);
}
bool Circle::operator>(Rectangle &R)
{
return(Area() > R.Area());
}

Слайд 15

Программирование и основы алгоритмизации

Тема 6. Объектно-ориентированное программирование. Перегрузка и шаблоны

15

Шевченко А. В.

Перегрузка

Программирование и основы алгоритмизации Тема 6. Объектно-ориентированное программирование. Перегрузка и шаблоны 15
операторов ++ и --

class Circle
{
private:
double r;
public:
Circle(double R) { r = R; }
Circle& operator++(); // префиксная форма
Circle& operator++(int); // постфиксная форма
Circle& operator--(); // префиксная форма
Circle& operator--(int); // постфиксная форма
};
Circle &operator++()
{
r *= 2;
return(*this);
}

Circle &operator++(int)
{
static Circle tmp(0);
tmp.r = r;
r *= 2;
return(tmp);
}

Circle a(10);
Circle b = a++;
Circle c = ++a;

Слайд 16

Программирование и основы алгоритмизации

Тема 6. Объектно-ориентированное программирование. Перегрузка и шаблоны

16

Шевченко А. В.

Шаблоны

Программирование и основы алгоритмизации Тема 6. Объектно-ориентированное программирование. Перегрузка и шаблоны 16
функций

char min(char x, char y);
short min(short x, short y);
long min(long x, long y);
float min(float x, float y);
double min(double x, double x);

template
T min(T x, T y)
{
return(x < y ? x : y);
}
long double min(long double x, long double y); // инсталляция

Слайд 17

Программирование и основы алгоритмизации

Тема 6. Объектно-ориентированное программирование. Перегрузка и шаблоны

13

Шевченко А. В.

Замещение

Программирование и основы алгоритмизации Тема 6. Объектно-ориентированное программирование. Перегрузка и шаблоны 13
шаблонов функций

template
T min(T x, T y)
{
return(x < y ? x : y);
}

char* min(char* x, char* y)
{
return(strcmp(x, y) < 0 ? x : y);
}

Слайд 18

Программирование и основы алгоритмизации

Тема 6. Объектно-ориентированное программирование. Перегрузка и шаблоны

18

Шевченко А. В.

Шаблоны

Программирование и основы алгоритмизации Тема 6. Объектно-ориентированное программирование. Перегрузка и шаблоны 18
классов

template
class Stack
{
private:
T *data;
int count;
public:
Stack(int Number);
~Stack();
void Input(T Value);
T Output();
};

Слайд 19

Программирование и основы алгоритмизации

Тема 6. Объектно-ориентированное программирование. Перегрузка и шаблоны

19

Шевченко А. В.

Реализация

Программирование и основы алгоритмизации Тема 6. Объектно-ориентированное программирование. Перегрузка и шаблоны 19
методов шаблонов классов

template
Stack::Stack(int Number)
{
data = new T[Number];
}
template
Stack::~Stack()
{
delete [] data;
}

template
void Stack::Input(T Value)
{
data[count++] = Value;
}
template
T Stack::Output()
{
return(data[--count]);
}

Слайд 20

Программирование и основы алгоритмизации

Тема 6. Объектно-ориентированное программирование. Перегрузка и шаблоны

20

Шевченко А. В.

Использование

Программирование и основы алгоритмизации Тема 6. Объектно-ориентированное программирование. Перегрузка и шаблоны 20
шаблонов в программе

void main()
{
Stack istack(20);
istack.Input(14);
istack.Input(11);
istack.Input(25);
int i = istack.Output();
Stack fstack(10);
fstack.Input(230.21);
fstack.Input(18.513);
fstack.Input(83.234);
float f = fstack.Output();
Stack cstack(24);
cstack.Input("First");
cstack.Input("Second");
char* c = cstack.Output();
}

Слайд 21

Программирование и основы алгоритмизации

Тема 6. Объектно-ориентированное программирование. Перегрузка и шаблоны

21

Шевченко А. В.

Полное

Программирование и основы алгоритмизации Тема 6. Объектно-ориентированное программирование. Перегрузка и шаблоны 21
и частичное замещение шаблонов классов

template
class Converter
{
T1 obj1;
T2 obj2;
...
};
void main()
{
class Converter {...};
template
class Converter {...};
}

Полное замещение

Частичное замещение