Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Otvety_ekzamen_CPP.doc
Скачиваний:
3
Добавлен:
21.09.2019
Размер:
311.81 Кб
Скачать
  1. Перегрузка бинарных операторов.

Бинарные операторы могут быть перегружены как нестатические члены класса с одним параметром:

Возращаемый_тип operator @ (параметр);

Или как операторы, не являющиеся членами класса, с двумя параметрами:

Возвращаемый_тип operator @ (параметр1, параметр2);

@ - один из следующих операторов: + - * / % == <= >= != && || << >>.

Если аргументами (параметрами) бинарного оператора являются объекты одного класса, то этот оператор лучше перегружать как friend-функцию с двумя параметрами. Если же объекты относятся к разному типу, то лучше перегружать как член класса. Например, если операция выполняется над двумя дробями, то лучше использовать friend-функцию, а если операция выполняется над дробью и целым числом, то лучше перегружать как функцию класса.

Пример: перегрузим логический оператор < для дробей:

rational.h:

friend bool operator < (const &r1, const &r2);

rlib.cpp:

bool operator < (const &r1, const &r2)

{

return (r1.n*r2.d<r1.d*r2.n)

}

  1. Составные операторы присваивания.

К составным операторам присваивания относятся +=, -=, *=, /=, %=, <<=, >>=. составные операторы присваивания могут быть перегружены только как нестатические члены класса. Перегруженные составные операторы присваивания имеют следующий прототип:

Имя_класса & operator @ (const имя_класса&);

Где @ - один из вышеперечисленных операторов. Как видно, этот прототип аналогичен прототипу простого оператора присваивания. Учитывая этот факт, можно отметить, что в реализации составных операторов присваивания не нужно выполнять проверку на присваивание объекта самому себе.

Перегрузим +=:

Пишем в rational.h:

ratio & operator *= (const ratio &r);

В lib:

ratio & ratio::operator *= (const ratio &r)

{

n*= r.n;

d* = r.d;

reduce ()

return *this;

}

Замечание: при вызове этого оператора через this передаётся ссылка на объект, который стоит слева в составном операторе присваивания.

  1. Оператор вызова функции.

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

Тип operator () (список параметров)

Количество параметров может быть неопределённым. Допускается также определение значения параметров по умолчанию. Вызывается оператор вызова функции путём применения списка аргументов к объекту класса, в котором он определён. Так как в этом случае объект может использоваться как функция, то он называется объектом-функцией или функциональным объектом.

# include <iostream>

using namespace std;

struct Inc

{

int & operator () (int & n) {return ++n;}

};

int main ()

{Inc inc;

int n = 1;

inc (n);

cout<<inc(n)<<endl;

}

  1. Перегрузка операторов для ввода/вывода (<<, >>).

Перегруженные операторы ввода/вывода << и >> должны всегда определяться как друзья класса и иметь следующий прототип:

friend istream & operator >> (istream & имя, имя_класса &);

friend ostream & operator << (ostream & имя, имя_класса &);

Перегрузим эти функции для дробей, имена в 1-м и во 2-м случае должны быть разные, поскольку разные параметры вносятся и выводятся:

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]