¿Se copian profundamente los miembros de la array?

En C/C++, podemos asignar una variable de estructura (o clase solo en C++) a otra variable del mismo tipo. Cuando asignamos una variable de estructura a otra, todos los miembros de la variable se copian a la otra variable de estructura. Pero, ¿qué sucede cuando la estructura contiene un puntero a la memoria asignada dinámicamente y qué sucede si contiene una array?

En el siguiente programa de C++, la variable de estructura st1 contiene un puntero a la memoria asignada dinámicamente. Cuando asignamos st1 a st2, el puntero str de st2 también comienza a apuntar a la misma ubicación de memoria. Este tipo de copia se llama copia superficial .

# include <iostream>
# include <string.h>
  
using namespace std;
  
struct test
{
  char *str;
};
  
int main()
{
  struct test st1, st2;
  
  st1.str = new char[20];
  strcpy(st1.str, "GeeksforGeeks");
  
  st2 = st1;
  
  st1.str[0] = 'X';
  st1.str[1] = 'Y';
  
  /* Since copy was shallow, both strings are same */
  cout << "st1's str = " << st1.str << endl;
  cout << "st2's str = " << st2.str << endl;
  
  return 0;
}

Salida:
str de st1 = XYeksforGeeks
str de st2 = XYeksforGeeks

Ahora, ¿qué pasa con las arrays? El punto a tener en cuenta es que los miembros de la array no se copian superficialmente, el compilador realiza automáticamente una copia profunda para los miembros de la array. . En el siguiente programa, struct test contiene el miembro de array str[]. Cuando asignamos st1 a st2, st2 tiene una nueva copia de la array. Entonces st2 no cambia cuando cambiamos str[] de st1.

# include <iostream>
# include <string.h>
  
using namespace std;
  
struct test
{
  char str[20];
};
  
int main()
{
  struct test st1, st2;
  
  strcpy(st1.str, "GeeksforGeeks");
  
  st2 = st1;
  
  st1.str[0] = 'X';
  st1.str[1] = 'Y';
  
  /* Since copy was Deep, both arrays are different */
  cout << "st1's str = " << st1.str << endl;
  cout << "st2's str = " << st2.str << endl;
  
  return 0;
}

Salida:
str de st1 = XYeksforGeeks
str de st2 = GeeksforGeeks

Por lo tanto, para las clases de C++, no necesitamos escribir nuestro propio constructor de copia y operador de asignación para los miembros de la array, ya que el comportamiento predeterminado es Copia profunda para arrays.

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

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *