Например:
overload abs;
int abs (int);
double abs (double);
Когда вызывается перегруженное имя, по порядку производится
сканирование списка функций для нахождения той, которая может быть
вызвана. Например, abs(12) вызывает abs(int), а abs(12.0) будет
вызывать abs(double). Если бы был зарезервирован порядок вызова, то
оба обращения вызвали бы 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 (Y);
f (1); /* неверно: неоднозначность f(X(1)) или f(Y(1)) */
g (1); /* g(X(1)) */
g ("asdf"); /* g(Z("asdf")) */
- стр 297 -
Все имена функций операций являются автомаатически
перегруженными.
8.10 Описание перечисления
Перечисления являются int с именованными константами.
enum_спецификатор:
enum идентификатор opt { enum_список }
enum_список:
перечислитель
enum_список, перечислитель
перечислитель:
идентификатор
идентификатор = константное_выражение
Идентификаторы в enum-списке описаны как константы и могут
появляться во всех местах, где требуются константы. Если не
появляется ни одного перечислителя с =, то значения всех
соответствующих констант начинаются с 0 и возрастают на 1 по мере
чтения описания слева нарпаво. Перечислитель с = дает
ассоциированному с ним идентификатору указанное значение;
последующие идентификаторы продолжают прогрессию от присвоеннного
зеначения.
Имена перечислителей должны быть отличными от имен обычных
переменных. Значения перечислителей не обязательно должны быть
различными.
Роль идентификатора в спецификаторе перечисления
enum_спецификатор полностью аналогична роли имени класса; он
именует определенный нутератор. Например:
enum color { chartreuse, burgundy, claret=20, winedark };
...
color *cp, col;
...
col = claret;
cp = &col;
...
if (*cp == burgundy) ...
делает color именем типа,описывающего различные цвета, и затем
описывает cp как указатель на объект этого типа. Возможные значения
извлекаются из множества { 0, 1, 20, 21 }.
8.11 Описание Asm
Описание Asm имеет вид
asm (строка);
Смысл описания asm неопределен. Обычно оно используется для
передачи информации ассемблеру через компилятор.
- стр 298 -
9. ОПЕРАТОРЫ
Операторы выполняются последовательно во всех случаях кроме особо
оговоренных.
9.1 Оператор выражение
Большинство операторов является операторами выражение, которые
имеют вид
выражение ;
Обычно операторы выражение являются присваиваниями и вызовами
функций.
9.2 Составной оператор, или блок
Составной оператор (называемый также "блок", что эквивалентно)
дает возможность использовать несколько операторов в том месте, где
предполагается использование одного:
составной_оператор:
{ список_описаний opt список_операторов opt }
список_описаний:
описание
описание список_описаний
список_операторов:
оператор
оператор список_операторов
Если какой-либо из идентификаторов в списке_описаний был ранее
описан, то внешенее описание выталкивается на время выполнения
блока, и снова входит в силу по его окончании.
Каждая инициализиция auto или register переменных производится
всякий раз при входе в голову блока. В блок делать передачу; в этом
случае инициализации не выполняются. Инициализации переменных,
имеющих класс памяти static (#4.2) осуществляются только один раз в
начале выполнения программы.
9.3 Условный оператор
Есть два вида условных операторов
if ( выражение ) оператор
if ( выражение ) оператор else оператор
В обоих случаях вычисляется выражение, и если оно не ноль, то
выполняется первый подоператор. Во втором случае второй подоператор
выполняется, если выражение есть 0. Как обычно, неоднозначность
"else" разрешается посредством того, что else связывается с
последним встречнным if, не имеющим else.
9.4 Оператор while
Оператор while имеет вид
while ( выражение ) оператор
- стр 299 -
Выполнение подоператора повторяется, пока значение выражения
остается ненулевым. Проверка выполняется передкаждым выполнением
оператора.
9.5 Оператор do
Оператор do имеет вид
do оператор while (выражение);
Выполнение подоператора повторяется до тех пор, пока значение
выражения не станет нулем. Проверка выполняется после каждого
выполнения оператора.
9.6 Оператор for
Оператор for имеет вид
for ( выражение_1 opt ; выражение_2 opt ; выражение_3 opt )
оператор
Этот оператор эквивалентен следующему:
- стр 300 -
выражение_1;
while (выражение_2)
{
оператор
выражение_3;
}
Первое выражение задает инициализацию цикла; второе выражение
задает осуществляемую перед каждой итерацией проверку, по которой
производится выход из цикла, если выражение становится нулем;
третье выражение часто задает приращение, выполняемое после каждой
итерации.
Каждое или все выражения могут быть опущены. Отсутствие
выражения_2 делает подразумеваемое while-предложение эквивалентым
while(1); остальные опущенные выражения просто пропускаются в
описанном выше расширении.
9.7 Оператор switch
Оператор switch вызывает передачу управления на один из
нескольких операторов в зависимости от значения выражения. Он имеет
вид
switch ( выражение ) оператор
Выражение должно быть целого типа или типа указателя. Любой
оператор внутри оператора может быть помечен одним или более
префиксом case следующим образом:
case константное_выражение :
где константное выражение должно иметь тот же тип что и выоажение-
переключатель; производятся обычные арифметические преобразования.
В одном операторе switch никакие две константы, помеченные case, не
могут иметь одинаковое значение. Константные выражения точно
определяются в #15.
Может также быть не более чем один префикс оператора вида
default :
Когда выполнен оператор switch, проведено вычисление его
выражения и сравнение его с каждой case константой. Если одна из
констант равна значению выражения, то управление передается на
выражение, следующее за подошедшим префиксом case. Если никакая
case константа не соответствует выражению, и есть префикс default,
то управление передается на выражение, которому он предшествует.
Если нет соответсвующих вариантов case и default отсутствует, то
никакой из операторов в операторе switch не выполняется.
Префиксы case и default сами по себе не изменяют поток
управления, который после задерки идет дальше, перескакивая через
эти префиксы. Для выхода из switch см. break, #9.8.
Обычно зависящий от switch оператор является составным. В голове
этого оператора могут стоять описания, но инициализации
автоматических и регистровых переменных являются безрезультатными.
9.8 Оператор break
Оператор
break ;
- стр 301 -
прекращает выполнение ближайшего охватывающего while, do, for или
switch оператора; управление передается на оператор, следующий за
законченным.
9.9 Оператор continue
Оператор
continue ;
вызывает передачу управления на управляющую продолжением цикла
часть наименьшего охватывающего оператора while, do или for; то
есть на конец петли цикла. Точнее, в каждом из операторов
while (...) do for (...)
{ { {
... ... ...
contin:; contin:; contin:;
} } }
while (...);
continue эквивалентно goto contin. (За contin: следует пустой
оператор, #9.13.)
9.10 Оператор return
Возврат из функции в вызывающеую программу осуществляется с
помощью оператора return, имеющего один из двух видов:
return ;
return выражение ;
Первый может использоваться только в функциях, не возвращающих
значения, т.е. в функциях с типом возвращаемого значения void.
Вторая форма может использоваться только в функциях, не
возвращающих значение; вызывающей функцию программе возвращается
значение выражения. Если необходимо, то выражение преобразуется,
как это делается при присваивании, к типу функции, в которой оно
возникло. Обход конца функции эквивалентен возврату return без
возвращаемого значения.
9.11 Оператор goto
Можно осуществлять безусловную передачу упраления с помощью
оператора
goto идентификатор ;
Идентификатор должен быть меткой (#9.12), расположенной в
текущей функции.
9.12 Помеченные операторы
Перед любым оперотором может стоять префикс метка, имеющий вид
идентификатор :
который служит для описания идентификатора как метки. Метка
используется только как объект для goto. Областью видимости метки
- стр 302 -
является текущая функция, исключая любой подблок, в котором был
переописан такой же идентияикатор. См. #4.1.
9.13 Пустой оператор
Пустой оператор имеет вид
;
Пустой оператор используется для помещения метки непосредственно
перед } составного оператора или того, чтобы снабдить такие
операторы, как while, пустым телом.
9.14 Оператор delete
Оператор delete имеет вид
delete выражение ;
Результатом выражения должен быть указатель. Объект, на который
он указывает, уничтожается. Это значит, что после оператора
уничтожения delete нельзя гарантировать, что объект имеет
определенное значение; см. #17. Эффект от применеия delete к
указателю, не полученному из операции new (#7.1), неопределен.
Однако, уничтожение указателя с нулевым значением безопасно.
9.15 Оператор asm
Оператор asm имеет вид
asm ( строка) ;
Смысл оператора asm неопределен. Обычно он используется для
передачи информации черз компилятор ассемблеру.
10. ВНЕШНИЕ ОПРЕДЕЛЕНИЯ
Программа на C++ состоит из последовательности внешних
определений. Внешенее определение описывает идентификатор как
имеющий класс памяти static и определяет его тип. Спецификатор типа
(#8.2) может также быть пустым, и в этом случае принимается тип
int. Область видимости внешних определений простирается до конца
файла, в котором они описаны, так же, как действие описаний
сохраняется до конца блока. Синтаксис внешних определений тот же,
что и у описаний, за исключением того, что только на этом уровне и
внутри описаний классов может быть задан код (текст программы)
функции.
10.1 Определения функций