Что такое findslide.org?

FindSlide.org - это сайт презентаций, докладов, шаблонов в формате PowerPoint.


Для правообладателей

Обратная связь

Email: Нажмите что бы посмотреть 

Яндекс.Метрика

Презентация на тему Объектно-ориентированное программирование. Перегрузка операций

Содержание

НЕЛЬЗЯ перегружать* ?: :: # ## sizeofПРАВИЛА перегрузкипри перегрузке операций сохраняются количество аргументов, приоритеты операций и правила ассоциации (справа налево или слева направо), используемые в стандартных типах данных;для стандартных типов данных переопределять операции нельзя;функции-операции не могут
ОБЪЕКТНО-ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕПЕРЕГРУЗКА ОПЕРАЦИЙ НЕЛЬЗЯ перегружать* ?: :: # ## sizeofПРАВИЛА перегрузкипри перегрузке операций сохраняются количество Перегрузка унарных операцийclass monstr{	…	monstr & operator ++() {++health; return *this;}};monstr Vasia;cout « (++Vasia).get_health(); Перегрузка унарных операцийclass monstr{	…	friend monstr & operator ++( monstr &M);};monstr& operator ++(monstr Перегрузка унарных операцийvoid change_health(int he){health = he;}monstr& operator ++(monstr &М){	int h = M.get_health(); h++;	M.change_health(h);	return М;} Перегрузка унарных операцийclass monstrjmonstr operator ++(int){monstr MCnhis); health++;return M;}}:monstr Vasia:cout « (Vas1a++).get_health(); Перегрузка операций new и delete им не требуется передавать параметр типа класса; Перегрузка операций new и deleteclass Obj {...};class pObj{	…	private:		Obj *p;};new	 Obj *p = new pObj;sizeof(pObj) Перегрузка операций new и deleteclass pObj{	public:		static void * operator new(size_t size);	private:		union		{ Перегрузка операций new и deletevoid * pObj::operator new(size_t size){	// Перенаправить запросы неверного Перегрузка операций new и delete	// Если свободной памяти нет. выделяем очередной блок:	else Перегрузка операций new и deletepObj *pObj::headOfFree; // Устанавливается в 0 по умолчаниюconst int pObj::BLOCK_SIZE = 1024; Перегрузка операции приведения типаOperator имя нового типа ();Пример:monstr::operator int(){return health;}…monstr Vasia; cout « int(Vasia); Перегрузка операции вызова функцииclass if_greater{	public:	int operator () (int a, int b) const	 {		return a > b;	}}; Перегрузка операции вызова функцииПример:if_greater х;cout « х(1. 5) « endl; 			// Результат Перегрузка операции индексирования []#1nclucle #1nclude class Vect{	public:		explicit Vect(int n = 10);		Vect(const int Перегрузка операции индексирования []Vect::Vect(int n) : size(n){	p = new int[size];}Vect::Vect(const int a[]. Перегрузка операции индексирования []// Перегрузка операции индексирования:int& Vect::operator [] (int i){	if(i < Перегрузка операции индексирования []void Vect::Print(){	for (int i = 0; i < size; Перегрузка операции индексирования []Результат работы программы:1 2 3 4 5 6 7 Указатели на элементы классов.*  и  ->*Формат указателя на метод класса:возвр Указатели на элементы классовПример:// Присваивание значения указателю:pget « & monstr::get_health;monstr Vasia. *p;p Указатели на элементы классовПравила использования указателей на методы классов: Указателю на метод Указатели на элементы классовФормат указателя на поле класса:Тип данных (имя класса::*имя указателя);&имя_класса: Рекомендации по составу классаКласс должен содержать: скрытые поля (private) функции: конструкторы, определяющие,
Слайды презентации

Слайд 2 НЕЛЬЗЯ перегружать
* ?: :: # ## sizeof

ПРАВИЛА перегрузки
при

НЕЛЬЗЯ перегружать* ?: :: # ## sizeofПРАВИЛА перегрузкипри перегрузке операций сохраняются

перегрузке операций сохраняются количество аргументов, приоритеты операций и правила

ассоциации (справа налево или слева направо), используемые в стандартных типах данных;
для стандартных типов данных переопределять операции нельзя;
функции-операции не могут иметь аргументов по умолчанию;
функции-операции наследуются (за исключением =);
функции-операции не могут определяться как static.

тип operator операция (список параметров) {тело функции}

Слайд 3 Перегрузка унарных операций
class monstr
{

monstr & operator ++() {++health;

Перегрузка унарных операцийclass monstr{	…	monstr & operator ++() {++health; return *this;}};monstr Vasia;cout « (++Vasia).get_health();

return *this;}
};
monstr Vasia;
cout « (++Vasia).get_health();


Слайд 4 Перегрузка унарных операций
class monstr
{

friend monstr & operator ++(

Перегрузка унарных операцийclass monstr{	…	friend monstr & operator ++( monstr &M);};monstr& operator ++(monstr &M) {++M.health; return M;}

monstr &M);
};
monstr& operator ++(monstr &M) {++M.health; return M;}


Слайд 5 Перегрузка унарных операций
void change_health(int he){health = he;}

monstr& operator

Перегрузка унарных операцийvoid change_health(int he){health = he;}monstr& operator ++(monstr &М){	int h = M.get_health(); h++;	M.change_health(h);	return М;}

++(monstr &М)
{
int h = M.get_health(); h++;
M.change_health(h);
return М;
}


Слайд 6 Перегрузка унарных операций
class monstrj
monstr operator ++(int){
monstr MCnhis); health++;
return

Перегрузка унарных операцийclass monstrjmonstr operator ++(int){monstr MCnhis); health++;return M;}}:monstr Vasia:cout « (Vas1a++).get_health();

M;
}
}:
monstr Vasia:
cout « (Vas1a++).get_health();


Слайд 7 Перегрузка операций new и delete
им не требуется

Перегрузка операций new и delete им не требуется передавать параметр типа

передавать параметр типа класса;
первым параметром функциям new и

new[] должен передаваться размер объекта типа size_t;
они должны определяться с типом возвращаемого значения void*, даже если return возвращает указатель на другие типы;
Операция delete должна иметь тип возврата void и первый аргумент типа void*;
операции выделения и освобождения памяти являются статическими элементами класса.

Слайд 8 Перегрузка операций new и delete
class Obj {...};
class pObj
{

private:
Obj

Перегрузка операций new и deleteclass Obj {...};class pObj{	…	private:		Obj *p;};new	 Obj *p = new pObj;sizeof(pObj)

*p;
};
new
Obj *p = new pObj;
sizeof(pObj)


Слайд 9 Перегрузка операций new и delete
class pObj
{
public:
static void *

Перегрузка операций new и deleteclass pObj{	public:		static void * operator new(size_t size);	private:		union		{

operator new(size_t size);
private:
union
{
Obj *p;

// Указатель на объект
pObj *next; // Указатель на следующую свободную ячейку
};
static const int BLOCK_SIZE; // Размер блока
static pObj *headOfFree; // Заголовок списка свободных ячеек:
};


Слайд 10 Перегрузка операций new и delete
void * pObj::operator new(size_t

Перегрузка операций new и deletevoid * pObj::operator new(size_t size){	// Перенаправить запросы

size)
{
// Перенаправить запросы неверного количества памяти
// стандартной операции new:
if

(size != sizeof(pObj)) return ::operator new(size);
pObj *p = headOfFree; // Указатель на первую свободную ячейку
// Переместить указатель списка свободных ячеек:
if (р) headOfFree = р -> next;


Слайд 11 Перегрузка операций new и delete
// Если свободной памяти

Перегрузка операций new и delete	// Если свободной памяти нет. выделяем очередной

нет. выделяем очередной блок:
else
{
pObj *newblock =

static_cast
(::operator new(BLOCK_SIZE * sizeof(pObj)));
// Bee ячейки свободны, кроме первой (она будет занята), связываем их:
for (int i = 1: i< BLOCKJIZE - 1; ++i)
newblock[i].next = &newblock[i + 1 ] ;
newblock[BLOCK_SIZE - 1].next = 0:
// Устанавливаем начало списка свободных ячеек:
headOfFree = &newblock[1];
р = newblock;
}
return p; // Возвращаем указатель на выделенную память
}



Слайд 12 Перегрузка операций new и delete
pObj *pObj::headOfFree; // Устанавливается

Перегрузка операций new и deletepObj *pObj::headOfFree; // Устанавливается в 0 по умолчаниюconst int pObj::BLOCK_SIZE = 1024;

в 0 по умолчанию
const int pObj::BLOCK_SIZE = 1024;


Слайд 13 Перегрузка операции приведения типа
Operator имя нового типа ();

Пример:
monstr::operator

Перегрузка операции приведения типаOperator имя нового типа ();Пример:monstr::operator int(){return health;}…monstr Vasia; cout « int(Vasia);

int(){return health;}

monstr Vasia; cout « int(Vasia);


Слайд 14 Перегрузка операции вызова функции
class if_greater
{
public:
int operator () (int

Перегрузка операции вызова функцииclass if_greater{	public:	int operator () (int a, int b) const	 {		return a > b;	}};

a, int b) const
{
return a > b;
}
};


Слайд 15 Перегрузка операции вызова функции
Пример:
if_greater х;
cout « х(1. 5)

Перегрузка операции вызова функцииПример:if_greater х;cout « х(1. 5) « endl; 			//

« endl; // Результат - 0
cout « if_greater()(5. 1)

« endl; // Результат - 1

Слайд 16 Перегрузка операции индексирования []
#1nclucle
#1nclude
class Vect
{
public:
explicit Vect(int

Перегрузка операции индексирования []#1nclucle #1nclude class Vect{	public:		explicit Vect(int n = 10);		Vect(const

n = 10);
Vect(const int a[]. int n); //инициализация массивом
~Vect()

{ delete [] p; }
int& operator [] (int i);
void Print();

private:
int* p;
int size;
};

Слайд 17 Перегрузка операции индексирования []
Vect::Vect(int n) : size(n)
{
p =

Перегрузка операции индексирования []Vect::Vect(int n) : size(n){	p = new int[size];}Vect::Vect(const int

new int[size];
}
Vect::Vect(const int a[]. int n) : size(n)
{
p =

new int[size];
for (int i = 0; i < size; i++) p[i] = a[i];
}

Слайд 18 Перегрузка операции индексирования []
// Перегрузка операции индексирования:
int& Vect::operator

Перегрузка операции индексирования []// Перегрузка операции индексирования:int& Vect::operator [] (int i){	if(i

[] (int i)
{
if(i < 0 II i >= size)
{

cout « "Неверный индекс (i = " « i « ")" « endl;
cout « "Завершение программы" « endl;
exit(0);
}
return p[i];
}

Слайд 19 Перегрузка операции индексирования []
void Vect::Print()
{
for (int i =

Перегрузка операции индексирования []void Vect::Print(){	for (int i = 0; i <

0; i < size; i++) cout « p[i] «

" ";
cout « endl;
}
int main()
{
int агг[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
Vect а(агг, 10);
a.Print();
cout « a[5] « end!;
cout « a[12] « endl;
return 0;
}

Слайд 20 Перегрузка операции индексирования []
Результат работы программы:
1 2 3

Перегрузка операции индексирования []Результат работы программы:1 2 3 4 5 6

4 5 6 7 8 9 10
6
Неверный индекс (i

= 12)
Завершение программы


Слайд 21 Указатели на элементы классов
.* и ->*
Формат

Указатели на элементы классов.* и ->*Формат указателя на метод класса:возвр тип

указателя на метод класса:
возвр тип (имя класса::*имя указателя)(параметры);
Например:
int get_health()

{return health;}
int get_ammo() {return ammo;}
int (monstr:: *pget)();

void fun(int (monstr:: *pget)())
{
(*this.*pget)(); // Вызов функции через операцию .*
(this->*pget)(); // Вызов функции через операцию ->*
}

Слайд 22 Указатели на элементы классов
Пример:
// Присваивание значения указателю:
pget «

Указатели на элементы классовПример:// Присваивание значения указателю:pget « & monstr::get_health;monstr Vasia.

& monstr::get_health;
monstr Vasia. *p;
p = new monstr;
// Вызов функции

через операцию .* :
int Vasin_health = (Vasia.*pget)();
// Вызов функции через операцию ->* :
int p_health = (p->*pget)();

Слайд 23 Указатели на элементы классов
Правила использования указателей на методы

Указатели на элементы классовПравила использования указателей на методы классов: Указателю на

классов:
Указателю на метод можно присваивать только адрес методов,

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

Слайд 24 Указатели на элементы классов
Формат указателя на поле класса:
Тип

Указатели на элементы классовФормат указателя на поле класса:Тип данных (имя класса::*имя

данных (имя класса::*имя указателя);

&имя_класса: :имя_поля;// Поле должно быть public

int

(monstr::*phealth) » &monstr::health;
cout « Vasia.*phealth; // Обращение через операцию .*
cout « p->*phealth; // Обращение через операцию ->*

  • Имя файла: obektno-orientirovannoe-programmirovanie-peregruzka-operatsiy.pptx
  • Количество просмотров: 122
  • Количество скачиваний: 0