Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
###Cpp_лкц1_1.09_11_#дляБАК#29_01_12.doc
Скачиваний:
40
Добавлен:
29.04.2019
Размер:
6.42 Mб
Скачать

Часть II. Объектно-ориентированное программирование

  • функции-операции не могут иметь аргументов по умолчанию;

  • функции-операции наследуются (за исключением -);

  • функции-операции не могут определяться как static.

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

Функция-операция содержит ключевое слово operator, за которым следует знак переопределяемой операции:

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

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

Унарная функция-операция, определяемая внутри класса, должна быть представлена с помощью нестатического метода без параметров, при этом операндом является вызвавший ее объект, например:

с]ass monstrf

monstr & operator ++() {++health; return *this;}

}:

monstr Vasia;

cout « (++Vasia).get_health();

Если функция определяется вне класса, она должна иметь один параметр типа класса:

class monstr{

friend monstr & operator ++( monstr &M);

}:

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

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

void change_health(int he){ health - he;}

Тогда можно перегрузить операцию инкремента с помощью обычной функции, описанной вне класса:

monstr& operator ++(monstr &M){ int h - M.getJiealthO; h++; M.changejiealth(h);

Особый случай: функция-операция, первый параметр которой имеет стандартный тип, не может определяться как метод класса.

Глава 4. Классы

191

return M;

}

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

class monstrj

monstr operator ++(int){ monstr M(*this); hea"lth++; return M; } }:

monstr Vasia; cout « (Vasia++).get_hea1th();

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

Бинарная функция-операция, определяемая внутри класса, должна быть представлена с помощью нестатического метода с параметрами, при этом вызвавший ее объект считается первым операндом:

class monstr{

boo! operator >(const monstr &M){ if( health > M.health) return true; return false: } }: Если функция определяется вне класса, она должна иметь два параметра типа класса:

bool operator >(const monstr &M1, const monstr &M2){

if( Ml.getJiealthO > M2.get_healthO) return true:

return false; }

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

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

const monstr& operator = (const monstr &M){ // Проверка на самоприсваивание:

192