Operación de asignación en C++

La versión actual de la página aún no ha sido revisada por colaboradores experimentados y puede diferir significativamente de la versión revisada el 4 de junio de 2017; las comprobaciones requieren 5 ediciones .

El operador de asignación en el lenguaje de programación C++ se indica con el signo '='. Al igual que otros operadores en C++, puede sobrecargarse con .

La operación de asignación de copia es un tipo especial de operación de asignación que se utiliza para asignar objetos de la misma clase entre sí. Es uno de los miembros de funciones especiales y el compilador lo genera automáticamente si no hay una declaración explícita por parte del programador. El código generado por el compilador hace una copia bit a bit.

El operador de asignación de copia se diferencia del constructor de copia en que debe limpiar los miembros de datos del destino de la asignación (y manejar correctamente la autoasignación), mientras que el constructor de copia asigna valores a los miembros de datos no inicializados. [1] Por ejemplo:

Mi_Array primero ; // inicialización con el constructor predeterminado My_Array segundo = primero ; // inicialización con constructor de copia segundo = primero ; // asignación por operación de asignación de copia

Como caso especial, se debe tener en cuenta la siguiente variante de inicialización por parte del constructor de copias:

Mi_Array segundo = Mi_Array ();

En este caso, el compilador (por ejemplo, VC2013) inmediatamente, sin ninguna opción de optimización, realiza la optimización del valor de retorno (RVO, optimización del valor de retorno) y no se llama al constructor de copia.

Sobrecarga de tareas de copia

Cuando se trata de hacer copias profundas de objetos, también se debe tener en cuenta el manejo de excepciones . Una forma de evitar el error de movimiento de recursos es la siguiente:

  1. Obtener nuevos recursos
  2. Liberar recursos antiguos
  3. Asignando al objeto los valores del nuevo recurso
clase Mi_Array { int * matriz ; conteo int ; público : Mi_Array & operador = ( const My_Array & otro ) { if ( this != & other ) // protección contra la autoasignación incorrecta { // 1: asignar memoria "nueva" y copiar elementos int * new_array = new int [ other . contar ]; std :: copiar ( otra . matriz , otra . matriz + otra . cuenta , nueva_matriz ); // 2: liberar memoria "antigua" borrar [] array ; // 3: asignar valores en memoria "nueva" al objeto array = new_array ; contar = otro . contar ; } // por convención siempre devuelve *esto devuelve * esto ; } ... };

Sin embargo, si un método de intercambio exitoso está disponible para todos los miembros y la clase implementa un constructor de copia y un destructor (de acuerdo con la Regla de tres ), la forma más corta de implementar una asignación de copia sería [2] :

público : void swap ( My_Array & other ) // función de miembro de intercambio (¡no debería fallar!) { // intercambiar todos los miembros (y los subobjetos subyacentes si es posible) con otros std :: swap ( arreglo , otro . arreglo ); std :: swap ( cuenta , otro . cuenta ); } My_Array & operator = ( My_Array other ) // Nota: ¡el argumento se pasa por valor! { // intercambiar esto con otro intercambio ( otro ); // por convención siempre devuelve *esto devuelve * esto ; // otro se destruye, liberando memoria }

La razón por la cual la operación =regresa My_Array&en lugar de voides simple. Se permite combinar tareas, tales como:

matriz_1 = matriz_2 = matriz_3 ; // el valor de matriz_3 se asigna a matriz_2 // luego el valor de matriz_2 se asigna a matriz_1

Véase también

Enlaces

  1. Bjarne Stroustrup . El lenguaje de programación C++  (neopr.) . - 3. - Addison-Wesley , 2000. - S. 244. - ISBN 978-0201700732 .
  2. Sutter, H. & Alexandrescu, A. (octubre de 2004), Estándares de codificación de C++ , Addison-Wesley , ISBN 0-321-11358-6