Рубрики

Члены массива копируются глубоко?

В C / C ++ мы можем присвоить переменную struct (или класс только в C ++) другой переменной того же типа. Когда мы присваиваем структурную переменную другой, все члены переменной копируются в другую структурную переменную. Но что происходит, когда структура содержит указатель на динамически распределенную память и что если она содержит массив?

В следующей программе на C ++ переменная структуры st1 содержит указатель на динамически выделяемую память. Когда мы присваиваем st1 st2, указатель str st2 также начинает указывать на ту же ячейку памяти. Этот вид копирования называется мелким копированием .

# 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';

  

  / * Поскольку копирование было мелким, обе строки одинаковы * /

  cout << "st1's str = " << st1.str << endl;

  cout << "st2's str = " << st2.str << endl;

  

  return 0;

}

Выход:
st1's str = XYeksforGeeks
st2's str = XYeksforGeeks

А как насчет массивов? Следует отметить, что члены массива не копируются поверхностно, компилятор автоматически выполняет Deep Copy для элементов массива. , В следующей программе struct test содержит член массива str []. Когда мы присваиваем st1 st2, st2 получает новую копию массива. Таким образом, st2 не изменяется при изменении str [] в 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';

  

  / * Поскольку copy был Deep, оба массива различны * /

  cout << "st1's str = " << st1.str << endl;

  cout << "st2's str = " << st2.str << endl;

  

  return 0;

}

Выход:
st1's str = XYeksforGeeks
st2's str = GeeksforGeeks

Поэтому для классов C ++ нам не нужно писать собственный конструктор копирования и оператор присваивания для элементов массива, поскольку по умолчанию используется Deep copy для массивов.

Пожалуйста, пишите комментарии, если вы обнаружите что-то неправильное или вы хотите поделиться дополнительной информацией по обсуждаемой выше теме.

Рекомендуемые посты:

Члены массива копируются глубоко?

0.00 (0%) 0 votes