10 перегрузка
.pdf10–1
5.ПЕРЕГРУЗКА ОПЕРАЦИЙ
5.1.Основы перегрузки операций
Перегруженная операция = Перегруженный оператор = Функция-операция (ФО)
ФО ≡ имя_ФО (список_параметров) { тело_ФО } имя_ФО ≡ operator ЗнакОперации
10–2
5.2.Ограничения на перегрузку операций
1)Нельзя перегружать операции:
|
|
|
Опреде- |
Дирек- |
Точка |
РОД |
Условный |
ление |
тивы |
|
|
оператор |
размера |
препро- |
|
|
|
данных |
цессора |
. |
:: |
?: |
sizeof |
все |
|
|
|
|
|
10–3
2)Старшинство операций
3)Ассоциативность операций
4)Значения параметров по умолчанию
5)Неизменность числа операндов
6)Можно перегружать только существующие операции
7)Нельзя перегружать операции для операндов стандартных типов
10–4
5.3. Функции-операции как элементы класса и как функции-друзья класса
•Перегрузка операций (), [], –>, = допустима только в виде ФЭ класса
•Если ФО есть ФЭ класса, то ее левый (или
единственный) операнд должен быть
объектом или ссылкой на объект этого же
класса
10–5
Пример:
•ПО << должен иметь левый операнд типа ostream &
•ПО >> должен иметь левый операнд типа istream &
Поэтому данные ПО не могут быть ФЭ класса и объявляются как функциидрузья класса.
10–6
5.4. Перегрузка операций обмена с потоком
Пример:
ПО >> для класса Phone:
istream & operator>>(istream &input, Phone &num)
{
... |
// основная часть ФО |
return input; |
|
}
10–7
Когда компилятор встречает выражение cin >> p;
где p – объект класса Phone, он генерирует вызов ФО
operator>>(cin, p);
Параметр input становится псевдонимом объекта cin класса istream, а параметр num
– псевдонимом объекта p класса Phone.
10–8
ФО выполняет ввод из потока в объект p, а также возвращает ссылку input типа istream , что позволяет сцеплять операции ввода из потока для объектов класса:
cin >> p1>> p2;
Сначала выполняется выражение cin >> p1;
посредством вызова ФО operator>>(cin, p1);
10–9
ФО возвращает ссылку на cin как значение выражения
cin >> p1;
Оставшаяся часть исходного выражения рассматривается как выражение
cin >> p2;
и выполняется посредством вызова ФО operator>>(cin, p2);
10–10
ПО << для класса Phone:
ostream & operator<<(ostream &output, Phone &num)
{
...
return output;
}
Рассмотреть самостоятельно !