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