Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЛЕКЦИИ Программирование и основы алгоритмизации...doc
Скачиваний:
5
Добавлен:
01.07.2025
Размер:
2 Мб
Скачать
☆

Перегрузка бинарных операций

1) Функция-операция – как функция-элемент класса:

class time {

--------------

bool operator>(const time& t)

{ if(h>t.geth()) return true;

return false;

}

--------------

};

Примечание. Вызывающий функцию-операцию объект является первым операндом.

void main()

{ time t1,t2;

------------

if(t1>t2) -----

-------------

}

2) Функция-операция – просто функция. Должна иметь два параметра типа класса.

bool operator>(const time& t1, const time& t2)

{ if(t1.geth()>t2.geth()) return true;

return false;

}

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

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

Функция-операция присваивания может быть определена только как функция-элемент класса, так как она имеет единственный параметр – ссылку на присваиваемый объект этого класса и возвращает ссылку на объект, для которого она была вызвана и который является первым операндом операции присваивания.

//----------------------------------------------------------------------------------------------

class employee {

public:

employee (const char*); //

---------------------------

const employee& operator=(const employee& e);

---------------------------

private:

char* f;

------------

};

//-----------------------------------------------------------------

// Определение операции присваивания

const employee& employee:: operator=(const employee& e)

{

if(&e==this) return *this; //проверка на самоприсваивание

if(f) delete[]f;

if(e.f) { f=new char{strlen(e.f)+1];

strcpy(f, e.f); }

else f=0;

return *this;

}

//----------------------------------------------------------------------------------------------

Возврат из функции ссылки на объект делает возможной цепочку операций присваивания:

employee a(“Иванов”), b, c;

----------------------------

c=b=a;

Перегрузка операции приведения типа

Используется для преобразования объекта класса к другому типу.

Формат: operator имя_нового_типа();

Тип возвращаемого значения и параметры можно не указывать.

time::operator int() {return h;}

-------------------------

time t; cout<<int(t); //можно не использовать geth()

Перегрузка операции индексирования []

Операция [] перегружается тогда, когда тип класса представляет множество значений, для которого индексирование имеет смысл. Операция индексирования должна возвращать ссылку на объект, содержащийся во множестве.

//----------------------------------------------------------------------------------------------

#include <iostream.h>

#include <stdlib.h>

class vector {

public:

vector(const int a[], int n); //конструктор, инициализация массивом

~vector() { delete[]p;} //деструктор

int& operator[](int i); //перегруженная операция индексирования

void print() const;

----------------------

private:

int* p;

int size;

};

//-------------------------------------------------------------------

int& vector::operator[](int i)

{ if(i<0||i>=size) {

cout<<”Неверный индекс (i=”<<i<<”) “<<endl;

cout<<”Завершение программы”<<endl;

exit();

}

return p[i];

}

//--------------------------------------------------------------------

void main()

{ int mas[10]={1, 2, 3, 4, 5, 6, 7, 8, 9, 10};

vector a(mas,10);

a.print(); //1 2 3 …..

cout<<a[5]<<endl; //6

cout<<a[10]<<endl; // Неверный индекс (i=10)

// Завершение программы

}

//----------------------------------------------------------------------------------------------

Перегруженная операция индексирования получает целый аргумент и проверяет, лежит ли его значении в пределах диапазона массива. Если “да”, то возвращается элемент, что соответствует смыслу стандартной операции индексирования.