Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
c++book1.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
2 Мб
Скачать
☆

8.9 Перегруженные Имена Функций

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

Поиск того, какую функцию вызвать, осуществляется в три отдельных шага:

Искать точно соответствующую и использовать, если найде­на.

Искать соответствующую с использованием стандартных пре­образований (#6.6-8) и использовать любую найденную.

Искать соответствующую с использованием определенных пользователем преобразований (#6.5.6). Если найдено единс­твенное множество преобразований, использовать ее.

Ноль, char или short считаются точно соответствующими формальному параметру типа int. Float считаются точно соот­ветствующими формальному параметру типа double.

Над параметром перегруженной функции выполняются только следующе преобразования: int в long, int в double и преобра­зования указателей и ссылок (#6.7-8).

Для того, чтобы перегрузить имя функции не члена и не функции operator, любому описанию функции должно предшество­вать описание overload, см. #8.1. Например:

overload abs;

double abs(double);

int abs(int);

abs(1); // вызывается abs(int);

abs(1.0); // вызывается abs(double);

Например:

class X (* ... X (int); *);

class Y (* ... Y (int); *);

class Z (* ... Z (char*); *);

overload int f (X), f (Y);

overload int g (X), g (Z);

f (1); // недопустимо: f(X(1)) или f(Y(1))

g (1); // g(X(1))

g ("asdf"); // g(Z("asdf"))

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

int operator=(matrix&, matrix&);

int operator=(vector&, vector&);

int (*pfm)(matrix&, matrix&) = &operator=;

int (*pfv)(vector&, vector&) = &operator=;

int (*pfx)(...) = &operator=;

8.10 Описания Перечислений

Перечисления являются типами int с именованными констан­тами.

enum_спецификатор:

enum идентификатор opt (* enum_список *)

enum_список:

перечислитель

enum_список , перечислитель

перечислитель:

идентификатор

идентификатор = константное_выражение

Идентификаторы в enum-списке описаны как константы и мо­гут появляться во всех местах, где требуются константы. Если не появляется ни одного перечислителя с =, то значения соот­ветствующих констант начинаются с 0 и возрастают на 1 по мере чтения описания слева нарпаво. Перечислитель с = дает ассоци­ированному с ним идентификатору указанное значение; последую­щие идентификаторы продолжают прогрессию от присвоенного зна­чения.

Имена перечислителей должны быть отличными от имен обычных переменных. Имена перечислителей с разными константа­ми тоже должны быть различны. Значения перечислителей не обя­зательно должны быть различными.

Роль идентификатора в спецификаторе перечисления

enum_спецификатор полностью аналогична роли имени класса; он

именует определенный нутератор. Например:

enum color (* red, yellow, green=20, blue *);

color col = red;

color *cp = &col;

if (*cp == blue) // ...

делает color именем типа, описывающего различные цвета, и затем описывает col как объект этого типа, а cp как указа­тель на объект этого типа. Возможные значения лежат во мно­жестве (* 0, 1, 20, 21 *).

8.11 Описание Asm

Описание Asm имеет вид

asm ( строка );

Смысл описания asm неопределен. Обычно оно используется для передачи информации ассемблеру через компилятор.

9. Операторы

Операторы выполняются последовательно во всех случаях кроме особо оговоренных.

9.1 Оператор Выражение

Большинство операторов является операторами выражение, которые имеют вид

выражение ;

Обычно операторы выражение являются присваиваниями и вы­зовами функций.

9.2 Составной Оператор, или Блок

Составной оператор (называемый также "блок", что эквива­лентно) дает возможность использовать несколько операторов в том месте, где предполагается использование одного:

составной_оператор:

(* список_операторов opt *)

список_операторов:

оператор

оператор список_операторов

Обратите внимание, что описание - это вариант оператора (#9.14).

9.3 Условный Оператор

Есть два вида условных операторов

if ( выражение ) оператор

if ( выражение ) оператор else оператор

Выражение должно быть арифметического или указательного типа или классового типа, для которого определено преобразо­вание в арифметический или указательный тип (см. #8.5.6). Вы­числяется выражение, и если оно не ноль, то выполняется пер­вый подоператор. Если используется "else", то второй подоператор выполняется, если выражение есть 0. Как обычно, неоднозначность "else" разрешается посредством того, что else связывается с последним встречнным if, не имеющим else.

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