В С++ определен ряд операций присваивания.
Обозначение | Операция | Типы операндов и результата | Пример |
---|---|---|---|
= | присваивание | любые | X = Y |
+= | присваивание со сложением | арифметические, указатели, структуры, объединения | X += Y |
-= | присваивание с вычитанием | арифметические, указатели, структуры, объединения | X -= Y |
*= | присваивание с умножением | арифметические | X *= Y |
/= | присваивание с делением | арифметические | X /= Y |
% = | присваивание остатка целочисленного деления | целые | X %= Y |
<<= | присваивание со сдвигом влево | целые | X <<= Y |
>>= | присваивание со сдвигом вправо | целые | X >>= Y |
&= | присваивание с поразрядной операцией И | целые | X &= Y |
^= | присваивание с поразрядной операцией исключающее ИЛИ | целые | X ^= Y |
|= | присваивание с поразрядной операцией ИЛИ | целые | X |= Y |
Помимо простой операции присваивания (=) все прочие являются составными операциями. Они присваивают первому операнду результат применения соответствующей простой операции, указанной перед символом "=", к первому и второму операндам.
Например, выражение X += Y эквивалентно выражению X = X + Y, но записывается компактнее и может выполняться быстрее. Аналогично определяются и другие операции присваивания: X %= Y эквивалентно X = X % Y и т.д.
При записи составных операций присваивания между символом операции и знаком равенства пробел не допускается.
В операциях присваивания первый операнд не может быть нулевым указателям.
Операции присваивания возвращают как результат присвоенное значение. Благодаря этому они допускают сцепление. Например, вы можете написать:
А = (В = С = 1) + 1;
Выполняются операции присваивания справа налево. Поэтому приведенное выражение задаст переменным В и С значения 1, а переменной А - 2. Вычисляться это будет следующим образом. Сначала выполняются операции, заключенные в скобки, а из них первой - самая правая (т.е. С = 1). Эта операция вернет 1, так что далее будет выполнена операция В = 1. Она вернет значение 1, после чего выполнится операция сложения 1 + 1. Полученное в результате значение 2 присвоится переменной А.
Применительно к указателям на объекты надо четко представлять различие между оператором присваивания и методом копирования Assign, свойственным многим классам объектов. Метод Assign используется следующим образом:
объект_приемник->Assign(объект_источник);
Например:
A->Assign(В);
Этот оператор копирует содержание объекта В (все его свойства) в объект А. Для тех же самых объектов А и В можно записать оператор присваивания:
А = В;
Различие между двумя приведенными операторами следующее. Метод Assign копирует содержимое одного объекта в другой. Таким образом в памяти будет иметься два объекта А и В одинакового содержания. А оператор присваивания, примененный к указателям (имя объекта - это указатель на объект), присваивает указателю А значение указателя В. Таким образом, и А, и В будут указывать на один и тот же объект в памяти. А тот объект, на который до выполнения этого оператора указывал А, может быть вообще потерян, если в программе где-то не хранится другой указатель на него.