Operadores de asignación

Sintaxis

expression assignment-operator expression

assignment-operator: uno de
=*=/=%=+=-=<<=>>=&=^=|=

Comentarios

Los operadores de asignación almacenan un valor en el objeto especificado por el operando izquierdo. Hay dos tipos de operaciones de asignación:

  • asignación simple, en la que el valor del segundo operando se almacena en el objeto especificado por el primer operando.

  • asignación compuesta, en la que se realiza una operación aritmética, de desplazamiento o bit a bit antes de almacenar el resultado.

Todos los operadores de asignación de la tabla siguiente, salvo el operador =, son operadores de asignación compuesta.

Tabla de operadores de asignación

Operador Significado
= Almacena el valor del segundo operando en el objeto especificado por el primer operando (asignación simple).
*= Multiplica el valor del primer operando por el valor del segundo operando; almacena el resultado en el objeto especificado por el primer operando.
/= Divide el valor del primer operando por el valor del segundo operando; almacena el resultado en el objeto especificado por el primer operando.
%= Toma el módulo del primer operando especificado por el valor del segundo operando; almacena el resultado en el objeto especificado por el primer operando.
+= Suma el valor del segundo operando al valor del primer operando; almacena el resultado en el objeto especificado por el primer operando.
-= Resta el valor del segundo operando del valor del primer operando; almacena el resultado en el objeto especificado por el primer operando.
<<= Desplaza a la izquierda el valor del primer operando el número de bits especificado por el valor del segundo operando; almacena el resultado en el objeto especificado por el primer operando.
>>= Desplaza a la derecha el valor del primer operando el número de bits especificado por el valor del segundo operando; almacena el resultado en el objeto especificado por el primer operando.
&= Obtiene el AND bit a bit del primer y el segundo operandos; almacena el resultado en el objeto especificado por el primer operando.
^= Obtiene el OR exclusivo bit a bit del primer y el segundo operandos; almacena el resultado en el objeto especificado por el primer operando.
|= Obtiene el OR inclusivo bit a bit del primer y el segundo operandos; almacena el resultado en el objeto especificado por el primer operando.

Palabras clave de operador

Tres de los operadores de asignación compuesta tienen equivalentes de palabras clave. Son:

Operador Tipo de datos de XPath
&= and_eq
|= or_eq
^= xor_eq

C++ especifica estas palabras clave de operador como ortografía alternativa para los operadores de asignación compuesta. En C, las ortografías alternativas se proporcionan como macros en el encabezado de <iso646.h>. En C++, las ortografías alternativas son palabras clave; el uso de <iso646.h> o el equivalente C++ <ciso646> está en desuso. En Microsoft C++, se requiere la opción del compilador /permissive- o /Za para poder habilitar la ortografía alternativa.

Ejemplo

// expre_Assignment_Operators.cpp
// compile with: /EHsc
// Demonstrate assignment operators
#include <iostream>
using namespace std;
int main() {
   int a = 3, b = 6, c = 10, d = 0xAAAA, e = 0x5555;

   a += b;      // a is 9
   b %= a;      // b is 6
   c >>= 1;      // c is 5
   d |= e;      // Bitwise--d is 0xFFFF

   cout  << "a = 3, b = 6, c = 10, d = 0xAAAA, e = 0x5555" << endl
         << "a += b yields " << a << endl
         << "b %= a yields " << b << endl
         << "c >>= 1 yields " << c << endl
         << "d |= e yields " << hex << d << endl;
}

Asignación simple

El operador de asignación simple (=) hace que el valor del segundo operando se almacene en el objeto especificado por el primer operando. Si ambos objetos son de tipos aritméticos, el operando derecho se convierte al tipo de la izquierda antes de almacenar el valor.

Los objetos de const y volatile se pueden asignar a valores L de tipos que solo son volatile, o que no son const o volatile.

La asignación a objetos de tipo de clase (struct, uniony class ) se realiza mediante una función denominada operator=. El comportamiento predeterminado de esta función de operador es realizar una asignación de copia basada en miembros de los miembros de datos no estáticos del objeto y clases base directas; sin embargo, este comportamiento se puede modificar mediante operadores sobrecargados. Para obtener más información, vea Sobrecarga de operadores. Los tipos de clase también pueden tener operadores de asignación de copia y asignación de movimiento. Para obtener más información, consulte Copiar constructores y copiar operadores de asignación y Mover constructores y mover operadores de asignación.

Un objeto de cualquier clase derivada sin ambigüedad de una clase base se puede asignar a un objeto de la clase base. Lo contrario no es cierto porque hay una conversión implícita de la clase derivada a la clase base, pero no de la clase base a la clase derivada. Por ejemplo:

// expre_SimpleAssignment.cpp
// compile with: /EHsc
#include <iostream>
using namespace std;
class ABase
{
public:
    ABase() { cout << "constructing ABase\n"; }
};

class ADerived : public ABase
{
public:
    ADerived() { cout << "constructing ADerived\n"; }
};

int main()
{
    ABase aBase;
    ADerived aDerived;

    aBase = aDerived; // OK
    aDerived = aBase; // C2679
}

Las asignaciones a los tipos de referencia se comportan como si la asignación se creara en el objeto al que señala la referencia.

Para los objetos de tipo de clase, la asignación es diferente de la inicialización. Para ver lo diferentes que pueden ser la asignación y la inicialización, considere el código

UserType1 A;
UserType2 B = A;

El código anterior muestra un inicializador; llama al constructor para UserType2 que toma un argumento de tipo UserType1. Dado el código

UserType1 A;
UserType2 B;

B = A;

la instrucción de asignación

B = A;

puede tener uno de los efectos siguientes:

  • Llame a la función operator= para UserType2, siempre que operator= tenga un argumento UserType1.

  • Llamar a la función de conversión explícita UserType1::operator UserType2, si existe tal función.

  • Llamar a un constructor UserType2::UserType2, siempre que exista un constructor de ese tipo, que tome un argumento UserType1 y copie el resultado.

Asignación compuesta

Los operadores de asignación compuesta se muestran en la tabla Operadores de asignación. Estos operadores tienen el formato e1op= e2, donde e1 es un valor L modificable que noconst es y e2 es:

  • un tipo aritmético

  • un puntero, si op es + o -

  • un tipo para el que existe una sobrecarga coincidente operator *op*= para el tipo de e1

El formulario integrado e1op= e2 se comporta como e1=e1ope2, pero e1 solo se evalúa una vez.

La asignación compuesta a un tipo enumerado genera un mensaje de error. Si el operando izquierdo tiene el tipo de puntero, el operando derecho debe tener el tipo de puntero o debe ser una expresión de constante que se evalúa como 0. Cuando el operando izquierdo es de tipo integral, el operando derecho no debe ser de tipo apuntador.

Resultado de operadores de asignación integrados

Los operadores de asignación integrados devuelven el valor del objeto especificado por el operando izquierdo después de la asignación (y la operación aritmética/lógica en el caso de operadores de asignación compuestos). El tipo resultante es el tipo del operando izquierdo. El resultado de una expresión de asignación es siempre un valor L. Estos operadores tienen asociatividad de derecha a izquierda. El operando izquierdo debe ser un valor L modificable.

En ANSI C, el resultado de una expresión de asignación no es un valor L. Esto significa que la expresión de C++ (a += b) += c no se permite en C.

Consulte también

Expresiones con operadores binarios
Operadores integrados de C++, precedencia y asociatividad
Operadores de asignación de C