R Справочное руководство по С++

R.5.17 Операции присваивания.

   


Назад  |  Вперёд

Существует несколько операций присваивания, все они выполняются справа налево. Для всех них требуется, чтобы левым операндом был изменяемый адрес. Тип выражения присваивания совпадает с типом левого операнда. Результат операции присваивание - значение, хранящееся в левом операнде после того как произошло присваивание. Результат является адресом.

           выражение-присваивания:
              выражение-условия
              унарное-выражение операция-присваивания выражение-присваивания
              операция-присваивания: один из
                   =  *=  /=  %=  +=  -=  >>=  <<=  &=  ^=  |=

При простом присваивании (=) значение выражения заменяет собой значение объекта, с которым сопоставляется левый операнд. Если оба операнда арифметического типа, правый операнд, прежде чем произойдет присваивание, преобразуется к типу левого операнда. Неявные преобразования к типу перечисления ($$R.7.2) не производятся, поэтому если левый операнд имеет тип перечисления, правый операнд должен быть таким же. Если левый операнд имеет тип указателя, правый операнд должен быть типа указателя или выражением-константой, дающим результат 0. Правый операнд преобразуется к типу левого операнда, прежде выполнения присваивания.

Указатель типа T* const можно присваивать указателю типа T*, но обратное присваивание считается незаконным ($$R.7.1.6). Объекты типа const T или volatile T можно присваивать по адресу типа T или volatile T (см. так же $$R.8.4).

Если левый операнд имеет тип указателя на член, правый операнд должен быть типа указатель на член или выражением-константой, дающим результат 0; перед присваиванием правый операнд преобразуется к типу левого операнда.

Присваивание объектам класса X ($$R.9) задается функцией X::operator=() ($$R.13.4.3). Если пользователь не определил свою функцию X::operator=(), для присваивания используется стандартный вариант ($$R.12.8). Отсюда следует, что объект класса, который является прямым или непрямым производным от X, и однозначно описан как производный в части public ($$R.4.6), можно присвоить объекту X.

Указатель на член класса B можно присваивать указателю на член того же типа класса D при условии, что D является прямым или непрямым производным класса B, и однозначно описан как производный в части public ($$R.10.1.1).

Присваивание объекту типа "ссылка на T" сводится к присваиванию объекту типа T, который обозначается ссылкой.

Выполнение выражение вида E1 op= E2 эквивалентно выполнению E1 = E1 op (E2), однако E1 вычисляется лишь один раз. В операциях += и -= левый операнд может быть указателем, в этом случае правый (целочисленный) операнд преобразуется так, как объяснялось в $$R.5.7. Все правые операнды и все левые операнды, не являющиеся ссылками, должны быть арифметического типа.

Для объектов класса присваивание в общем случае не совпадает с инициализацией ($$R.8.4, $$R.12.1, $$R.12.6, $$R.12.8).


Назад  |  Вперёд


OtDiatlovaOU
К началу книги

Оформление и дизайн книги OtDiatlovaOU.
Вся книга, архив.