Similar presentations:
Объектно-ориентированное программирование. Перегрузка и шаблоны. Тема 06
1. Тема 6. Объектно-ориентированное программирование. Перегрузка и шаблоны
Программирование и основы алгоритмизацииТема 6. Объектно-ориентированное
программирование. Перегрузка и
шаблоны
Шевченко А. В.
Тема 6. Объектно-ориентированное программирование. Перегрузка и шаблоны
1
2. Перегрузка функций
Программирование и основы алгоритмизацииПерегрузка функций
Перегрузка функций - одна из форм полиморфизма, которая заключается
в возможности использования в одном пространстве имен нескольких
функций с одинаковым именем, но с разными параметрами.
Язык С
int abs(int x)
double fabs(double x)
Язык С++
int abs(int x)
double abs(double x)
Шевченко А. В.
Тема 6. Объектно-ориентированное программирование. Перегрузка и шаблоны
2
3. Перегрузка функций в С++
Программирование и основы алгоритмизацииПерегрузка функций в С++
char
short
long
float
abs(char x);
abs(short x);
abs(long x);
abs(float x);
Язык С++ разрешает определение
нескольких функций с одним и тем же
именем, если функции отличаются
числом или типом параметров.
char abs(char x)
{
return(x < 0 ? -x : x);
}
long abs(long x)
{
return(x < 0 ? -x : x);
}
short abs(short x)
{
return(x < 0 ? -x : x);
}
float abs(float x)
{
return(x < 0 ? -x : x);
}
Шевченко А. В.
Тема 6. Объектно-ориентированное программирование. Перегрузка и шаблоны
3
4. Перегрузка методов в С++
Программирование и основы алгоритмизацииПерегрузка методов в С++
class Circle
{
private:
double
...
public:
void
void
void
};
r;
Fit(Rectangle &R);
Fit(Triangle &T);
Fit(Square &S);
void Circle::Fit(Square &S)
{
r = S.Side()/2;
}
Шевченко А. В.
Тема 6. Объектно-ориентированное программирование. Перегрузка и шаблоны
4
5. Перегрузка, переопределение, сокрытие
Программирование и основы алгоритмизацииПерегрузка, переопределение, сокрытие
Перегружаемые функции должны находиться в одной области определения.
Перегружаемые функции различаются компилятором по их параметрам.
Посредством перегрузки вызываемая версия функции соответствует
конкретным типам параметров.
Переопределение функции осуществляется новым описанием функции в
другой области определения в иерархиях классов.
Переопределяемые функции имеют идентичные имена и типы параметров.
Сокрытие или "затенение" функций осуществляется для функций,
находящихся в различных областях определения, причем функция, описанная
во внутренней области, скрывает описание, данное во внешней области.
Скрываемые и скрывающие функции имеют идентичные имена.
Доступ к скрытым функциям осуществляется через оператор расширения
области видимости.
Шевченко А. В.
Тема 6. Объектно-ориентированное программирование. Перегрузка и шаблоны
5
6. Пример перегрузки, переопределения, сокрытия
Программирование и основы алгоритмизацииПример перегрузки, переопределения, сокрытия
class Figure
{
public:
double
Area();
void
Draw();
};
class Circle
{
public:
double
void
void
void
void
};
Шевченко А. В.
Circle c(100);
c.Draw(120, 50);
c.Draw();
c.Figure::Draw();
: public Figure
// правильно
// ошибка
// правильно
Переопределение
Area();
Draw(int x, int y);
Fit(Rectangle &R);
Fit(Triangle &T);
Fit(Square &S);
Тема 6. Объектно-ориентированное программирование. Перегрузка и шаблоны
Сокрытие
Перегрузка
6
7. Перегрузка операторов в С++
Программирование и основы алгоритмизацииПерегрузка операторов в С++
2 + 2 = 4
+
=
int a = 2;
int b = 2;
int c = a+b;
Circle a(2);
Circle b(2);
Circle c = a+b;
Circle c = a.operator+(b);
Шевченко А. В.
Тема 6. Объектно-ориентированное программирование. Перегрузка и шаблоны
7
8. Правила перегрузки операторов
Программирование и основы алгоритмизацииПравила перегрузки операторов
• Нельзя определять новые операторы
• Нельзя перегружать операторы :: , ?: , . , .* , # , ##
• По крайней мере один из операндов перегруженного оператора должен быть
объектом класса или ссылкой на объект класса
• Нельзя изменять общий синтаксис оператора (число операндов, приоритет,
задаваемые аргументы)
Перегрузка операторов
Вне области класса
Шевченко А. В.
В рамках определения класса
Тема 6. Объектно-ориентированное программирование. Перегрузка и шаблоны
8
9. Пример перегрузки оператора «+» в области класса
Программирование и основы алгоритмизацииПример перегрузки оператора «+» в области класса
class Circle
{
private:
double
r;
public:
Circle(double R) { r = R; }
Circle &operator+(Circle &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);
}
Шевченко А. В.
Тема 6. Объектно-ориентированное программирование. Перегрузка и шаблоны
10
11. Пример перегрузки оператора присваивания
Программирование и основы алгоритмизацииПример перегрузки оператора присваивания
class Circle
{
private:
double
r;
public:
Circle(double R) { r = R; }
Circle &operator=(Circle &C);
};
Circle &Circle::operator=(Circle &C)
{
r = C.r;
return(*this);
}
Шевченко А. В.
Тема 6. Объектно-ориентированное программирование. Перегрузка и шаблоны
11
12. Перегруженные операторы и цепочные вычисления
Программирование и основы алгоритмизацииПерегруженные операторы и цепочные вычисления
Circle a, b, c, d, e;
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));
Шевченко А. В.
Тема 6. Объектно-ориентированное программирование. Перегрузка и шаблоны
12
13. Многократная перегрузка операторов
Программирование и основы алгоритмизацииМногократная перегрузка операторов
class Circle
{
private:
double
r;
public:
Circle(double R) { r = R; }
Circle
Circle
Circle
Circle
&operator=(Circle &C);
&operator=(Rectangle &R);
&operator=(Triangle &T);
&operator=(Square &S);
};
Circle &Circle::operator=(Square &S)
{
r = sqrt(S.Area()/M_PI);
return(*this);
}
Шевченко А. В.
Тема 6. Объектно-ориентированное программирование. Перегрузка и шаблоны
13
14. Пример перегрузки оператора >
Программирование и основы алгоритмизацииПример перегрузки оператора >
class Circle
{
public:
double
bool
bool
bool
bool
};
Area() { return(M_PI*r*r); }
operator>(Circle &C);
operator>(Rectangle &R);
operator>(Triangle &T);
operator>(Square &S);
bool Circle::operator>(Circle &C)
{
return(r > C.r);
}
bool Circle::operator>(Rectangle &R)
{
return(Area() > R.Area());
}
Шевченко А. В.
Тема 6. Объектно-ориентированное программирование. Перегрузка и шаблоны
14
15. Перегрузка операторов ++ и --
Программирование и основы алгоритмизацииПерегрузка операторов ++ и -class Circle
{
private:
double
r;
public:
Circle(double R) { r = R; }
Circle& operator++();
// префиксная форма
Circle& operator++(int);
// постфиксная форма
Circle& operator--();
// префиксная форма
Circle& operator--(int);
// постфиксная форма
};
Circle &operator++(int)
Circle &operator++() {
static Circle tmp(0);
{
tmp.r = r;
r *= 2;
r *= 2;
Circle a(10);
return(*this);
return(tmp);
Circle b = a++;
}
}
Circle c = ++a;
Шевченко А. В.
Тема 6. Объектно-ориентированное программирование. Перегрузка и шаблоны
15
16. Шаблоны функций
Программирование и основы алгоритмизацииШаблоны функций
char
short
long
float
double
min(char x, char y);
min(short x, short y);
min(long x, long y);
min(float x, float y);
min(double x, double x);
template<class T>
T min(T x, T y)
{
return(x < y ? x : y);
}
long double min(long double x, long double y); // инсталляция
Шевченко А. В.
Тема 6. Объектно-ориентированное программирование. Перегрузка и шаблоны
16
17. Замещение шаблонов функций
Программирование и основы алгоритмизацииЗамещение шаблонов функций
template<class T>
T min(T x, T y)
{
return(x < y ? x : y);
}
char* min(char* x, char* y)
{
return(strcmp(x, y) < 0 ? x : y);
}
Шевченко А. В.
Тема 6. Объектно-ориентированное программирование. Перегрузка и шаблоны
13
18. Шаблоны классов
Программирование и основы алгоритмизацииШаблоны классов
template<class T>
class Stack
{
private:
T
*data;
int
count;
public:
Stack(int Number);
~Stack();
void
T
Input(T Value);
Output();
};
Шевченко А. В.
Тема 6. Объектно-ориентированное программирование. Перегрузка и шаблоны
18
19. Реализация методов шаблонов классов
Программирование и основы алгоритмизацииРеализация методов шаблонов классов
template<class T>
Stack<T>::Stack(int Number)
{
data = new T[Number];
}
template<class T>
void Stack<T>::Input(T Value)
{
data[count++] = Value;
}
template<class T>
Stack<T>::~Stack()
{
delete [] data;
}
template<class T>
T Stack<T>::Output()
{
return(data[--count]);
}
Шевченко А. В.
Тема 6. Объектно-ориентированное программирование. Перегрузка и шаблоны
19
20. Использование шаблонов в программе
Программирование и основы алгоритмизацииИспользование шаблонов в программе
void main()
{
Stack<int> istack(20);
istack.Input(14);
istack.Input(11);
istack.Input(25);
int i = istack.Output();
Stack<float> fstack(10);
fstack.Input(230.21);
fstack.Input(18.513);
fstack.Input(83.234);
float f = fstack.Output();
Stack<char*> cstack(24);
cstack.Input("First");
cstack.Input("Second");
char* c = cstack.Output();
}
Шевченко А. В.
Тема 6. Объектно-ориентированное программирование. Перегрузка и шаблоны
20
21. Полное и частичное замещение шаблонов классов
Программирование и основы алгоритмизацииПолное и частичное замещение шаблонов классов
template<class T1, class T2>
class Converter
{
T1 obj1;
T2 obj2;
...
};
Полное замещение
void main()
{
class Converter<Rectangle, Circle> {...};
template<class T>
class Converter<T, Circle> {...};
}
Частичное замещение
Шевченко А. В.
Тема 6. Объектно-ориентированное программирование. Перегрузка и шаблоны
21
22. Создание новых типов на основе шаблонов классов
Программирование и основы алгоритмизацииСоздание новых типов на основе шаблонов классов
template<class T>
class Stack
{
private:
T
*data;
int
count;
public:
Stack(int Number);
~Stack();
...
};
typedef Stack<Circle> StackOfCircles;
typedef Stack<Square> StackOfSquares;
StackOfCircles circles(100);
StackOfSquares squares(120);
Шевченко А. В.
Тема 6. Объектно-ориентированное программирование. Перегрузка и шаблоны
22