Оператор | Значение | Использование |
:: | Глобальная область видимости | ::name |
:: | Область видимости класса | class::name |
:: | Область видимости пространства имен | namespace::name |
. | Доступ к члену | object.member |
- | Доступ к члену по указателю | pointer-member |
[] | Взятие индекса | variable[expr] |
() | Вызов функции | name(expr_list) |
() | Построение значения | type(expr_list) |
++ | постфиксный инкремент | lvalue++ |
| постфиксный декремент | lvalue-- |
typeid | идентификатор типа | typeid(type) |
typeid | идентификатор типа выражения | typeid(expr) |
| преобразование типа | const_casttype(expr) |
| преобразование типа | dynamic_casttype(expr) |
reinterpret_cast | приведение типа | reinterpret_casttype (expr) |
static_cast | приведение типа | static_casttype(expr) |
sizeof | размер объекта | sizeof expr |
sizeof | размер типа | sizeof( type) |
++ | префиксный инкремент | ++lvalue |
-- | префиксный декремент | --lvalue |
~ | побитовое НЕ | ~expr |
! | логическое НЕ | !expr |
- | унарный минус | -expr |
+ | унарный плюс | +expr |
* | разыменование | *expr |
адрес | expr | |
() | приведение типа | (type)expr |
new | выделение памяти | new type |
new | выделение памяти и инициализация | new type(exprlist) |
new | Выделение памяти под массив | все формы |
delete | освобождение памяти | все формы |
delete | освобождение памяти из-под массива | все формы |
-* | доступ к члену классу по указателю | pointer- *pointer_to_member |
.* | доступ к члену класса по указателю | object.*pointer_to_member |
* | Умножение | expr * expr |
/ | Деление | expr / expr |
% | деление по модулю | expr % expr |
+ | сложение | expr + expr |
- | вычитание | expr - expr |
сдвиг влево | expr expr | |
сдвиг вправо | expr expr | |
меньше | expr expr | |
= | меньше или равно | expr = expr |
больше | expr expr | |
= | больше или равно | expr = expr |
== | равно | expr == expr |
!= | не равно | expr != expr |
побитовое И | expr expr | |
^ | побитовое ИСКЛЮЧАЮЩЕЕ ИЛИ | expr ^ expr |
| | побитовое ИЛИ | expr | expr |
логическое И | expr expr | |
|| | логическое ИЛИ | expr || expr |
?: | условный оператор | expr ? expr * expr |
= | присваивание | l-значение = expr |
=, *=, /=, %=, +=, -=, =, =, =, |=, ^= | составное присваивание | l-значение += expr и т.д. |
throw | возбуждение исключения | throw expr |
, | запятая | expr, expr |
4.14. Преобразования типов
Представим себе следующий оператор присваивания:
int ival = 0;
// обычно компилируется с предупреждением
ival = 3.541 + 3;
В результате ival получит значение 6. Вот что происходит: мы складываем литералы разных типов – 3.541 типа double и 3 типа int. C++ не может непосредственно сложить подобные операнды, сначала ему нужно привести их к одному типу. Для этого существуют правила преобразования арифметических типов. Общий принцип таков: перейти от операнда меньшего типа к большему, чтобы не потерять точность вычислений.
В нашем случае целое значение 3 трансформируется в тип double, и только после этого производится сложение. Такое преобразование выполняется независимо от желания программиста, поэтому оно получило название неявного преобразования типов.