Un constructor de copias es una función miembro que inicializa un objeto usando otro objeto de la misma clase. (Consulte este artículo como referencia).
¿Cuándo deberíamos escribir nuestro propio constructor de copias?
El compilador de C++ proporciona un constructor de copia predeterminado (y un operador de asignación) con clase. Cuando no proporcionamos una implementación del constructor de copia (y el operador de asignación) e intentamos inicializar un objeto con el objeto ya inicializado de la misma clase, se llama al constructor de copia y copia los miembros de la clase uno por uno en el objeto de destino.
Pero el problema con el constructor de copia predeterminado (y el operador de asignación) es:
- Cuando tenemos miembros que se inicializan dinámicamente en tiempo de ejecución, el constructor de copia predeterminado copia este miembro con la dirección de la memoria asignada dinámicamente y no una copia real de esta memoria.
- Ahora, ambos objetos apuntan a la misma memoria y los cambios en uno se reflejan en otro objeto.
- Además, el principal efecto desastroso es que, cuando eliminamos uno de estos objetos, otro objeto aún apunta a la misma memoria, que será un puntero colgante, y la fuga de memoria también es un posible problema con este enfoque.
Por lo tanto, debemos definir nuestro propio constructor de copia solo si un objeto tiene punteros o cualquier asignación de tiempo de ejecución del recurso, como un identificador de archivo, una conexión de red, etc.
El constructor predeterminado solo hace una copia superficial.
La copia profunda solo es posible con un constructor de copia definido por el usuario. En un constructor de copias definido por el usuario, nos aseguramos de que los punteros (o referencias) de los objetos copiados apunten a nuevas ubicaciones de memoria.
Por lo tanto, en tales casos, siempre deberíamos escribir nuestro propio constructor de copia (y operador de asignación).
Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema tratado anteriormente.
Publicación traducida automáticamente
Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA