Бьерн Страуструп.
Язык программирования С++
182
+ - * / % ^ & | ~ !
= < > += -= *= /= %= ^= &=
|= << >> >>= <<= == != <= >= &&
|| ++ -- ->* , -> [] () new delete
Последние пять операций означают: косвенное обращение ($$7.9), индексацию ($$7.7), вызов функции
($$7.8), размещение в свободной памяти и освобождение ($$3.2.6). Нельзя изменить приоритеты этих
операций, равно как и синтаксические правила для выражений. Так,
нельзя определить унарную
операцию % , также как и бинарную операцию !. Нельзя ввести новые лексемы для обозначения
операций, но если набор
операций вас не устраивает, можно воспользоваться привычным
обозначением вызова функции. Поэтому используйте pow(), а не ** . Эти
ограничения можно счесть
драконовскими, но более свободные правила легко приводят к неоднозначности. Допустим, мы
определим операцию ** как возведение в степень, что на первый взгляд кажется очевидной и простой
задачей. Но
если как следует подумать, то возникают вопросы: должны ли операции ** выполняться
слева направо (как в Фортране) или справа налево (как в Алголе)? Как интерпретировать выражение
a**p как a*(*p) или как (a)**(p)?
Именем операторной
функции является служебное слово operator, за
которым идет сама операция,
например, operator<<. Операторная функция описывается и вызывается как обычная функция.
Использование символа операции является просто краткой формой
записи вызова операторной
функции:
void f(complex a, complex b)
{
complex c = a + b;
//
краткая форма
complex d = operator+(a,b);
//
явный вызов
}
С учетом приведенного описания типа complex инициализаторы в
этом примере являются
эквивалентными.
Достарыңызбен бөлісу: