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

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

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

При реализации оператора присваивания должна проверяться возможность неосторожного присваивания объекта самому себе. Перегрузим оператор для нашей дроби:

Пишем в rational.h:

ratio & operator = (const ratio &r);

В lib:

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

{if (&r == this) //&r – адрес r, this – указатель на адрес этого объекта-члена класса

return *this;

n = r.n;

d = r.d;

return *this;

}

Объект, который вызывает оператор this находится слева от «=», a = b;

a – this (n, d); b - (const ratio &r): r.n, r.d.

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

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

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

  1. Оператор индексирования [].

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

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

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

  1. Операторы инкремента и декремента (++, --).

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

void main ()

{int n=1;

int k;

k = ++n;

cout<<k<<endl; //префиксный

k = n++;

cout<<k<<n<<endl; //постфиксный

}

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

Пример префиксной перегрузки:

ratio & operator ++ ()

{n = n+d;

Reduce ();

return *this;

}

Пример постфиксной перегрузки:

ratio & operator ++ (int)

{n = n+d;

Reduce ();

return ratio (n-d, d);

}

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