Constructores de movimiento y asignación de movimiento
Implemente correctamente constructores de movimiento y operadores de asignación de movimiento.
Constructores de movimiento y asignación de movimiento es una lección gratuita de C++ Academy en CoddyKit. Esta es la lección 4 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de C++ Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de C++ Academy incluye 4 lecciones en total.
Dos miembros especiales
El constructor de movimiento y el operador de asignación por movimiento permiten que su clase se apropie de los recursos de otra instancia sin copiarlos.
Firma
Ambos reciben una referencia rvalue al mismo tipo.
class String {
public:
String(String&& other) noexcept; // move ctor
String& operator=(String&& other) noexcept; // move assign
};Implementar un constructor de movimiento
Apropiese de los recursos del origen y déjelo en un estado vacío válido.
String(String&& other) noexcept
: data_(other.data_), size_(other.size_) {
other.data_ = nullptr;
other.size_ = 0;
}Implementar la asignación por movimiento
Tres pasos: libere los recursos actuales, apropiese de los recursos del origen y deje el origen vacío.
String& operator=(String&& other) noexcept {
if (this != &other) {
delete[] data_;
data_ = other.data_;
size_ = other.size_;
other.data_ = nullptr;
other.size_ = 0;
}
return *this;
}Por qué importa noexcept
Marque las operaciones de movimiento como noexcept siempre que sea posible. Los contenedores estándar como std::vector solo usan movimientos al cambiar de tamaño si estos son noexcept; de lo contrario, recurren a copias para garantizar la seguridad frente a excepciones.
La regla de cinco
Si escribe cualquiera de estos cinco elementos, piense en los cinco:
- Destructor
- Constructor de copia
- Asignación por copia
- Constructor de movimiento
- Asignación por movimiento
La regla de cero
Aún mejor: no escriba ninguno. Almacene los miembros como tipos RAII (vectores, cadenas y punteros inteligentes). Los valores predeterminados generados por el compilador funcionarán de forma correcta y eficiente.
class Widget {
std::string name_;
std::vector<int> data_;
// No need for destructor, copy, or move — compiler does the right thing
};Cuándo el compilador genera operaciones de movimiento
El compilador genera miembros de movimiento predeterminados únicamente cuando:
- No hay un constructor de copia, operador de asignación por copia, destructor ni miembros de movimiento declarados por el usuario
- Todos los miembros y las clases base son movibles
Operaciones de movimiento predeterminadas y eliminadas
Puede solicitar o prohibir explícitamente las operaciones de movimiento generadas por el compilador.
class Widget {
public:
Widget(Widget&&) = default;
Widget& operator=(Widget&&) = default;
// or
Widget(Widget&&) = delete;
};Después de un movimiento
El objeto del que se movió queda en un estado válido, pero no especificado. Puede:
- Destruirlo
- Asignarle un valor nuevo
- Llamar a cualquier operación que no tenga precondiciones (size(), empty(), clear())
Casos de uso
La semántica de movimiento acelera:
- La devolución de objetos grandes (cuando RVO no se aplica)
- La inserción de objetos grandes en contenedores (push_back de rvalues)
- La implementación de sus propios tipos que poseen recursos
Comprobación rápida
¿Por qué se deben marcar los constructores de movimiento y los operadores de asignación por movimiento con noexcept?
Resumen
Los constructores de movimiento y los operadores de asignación por movimiento toman los recursos de un rvalue a punto de destruirse. Márquelos con noexcept para mejorar el rendimiento de los contenedores. Siga la Regla de Cinco o, mejor aún, la Regla de Cero mediante la composición de tipos RAII estándar.
Preguntas frecuentes
¿La lección «Constructores de movimiento y asignación de movimiento» es gratis?
Sí — el texto completo de «Constructores de movimiento y asignación de movimiento» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de C++ Academy, actualiza a CoddyKit PRO. El curso de C++ Academy incluye 4 lecciones en total.
¿Qué aprenderé en «Constructores de movimiento y asignación de movimiento»?
Implemente correctamente constructores de movimiento y operadores de asignación de movimiento. Practicas C++ Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.
¿Necesito experiencia previa para empezar C++ Academy?
No se requiere experiencia previa. C++ Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 4 de 4.
¿Cuánto tiempo toma la lección «Constructores de movimiento y asignación de movimiento»?
La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.
¿Puedo escribir y ejecutar código en esta lección de C++ Academy?
Sí. Cada lección de C++ Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.
Todas las lecciones de este curso
- Lvalue frente a rvalue: la diferencia
- Referencias rvalue y sintaxis &&
- std::move y std::forward
- Constructores de movimiento y asignación de movimiento