📜  数组成员是否被深复制?

📅  最后修改于: 2021-05-26 01:53:23             🧑  作者: Mango

在C / C++中,我们可以将struct变量(或仅在C++中为类)分配给相同类型的另一个变量。当我们将一个struct变量分配给另一个struct变量时,该变量的所有成员都将复制到另一个struct变量。但是,当结构包含指向动态分配的内存的指针时会发生什么,而如果它包含数组则会发生什么呢?

在以下C++程序中,结构变量st1包含指向动态分配的内存的指针。当我们将st1分配给st2时,st2的str指针也开始指向相同的内存位置。这种复制称为“浅复制”。

# include 
# include 
  
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;
}

输出:
st1的str = XYeksforGeeks
st2的str = XYeksforGeeks

现在,数组呢?需要注意的一点是,数组成员不是浅拷贝的,编译器会自动对数组成员执行深度拷贝。 。在以下程序中,struct test包含数组成员str []。当我们将st1分配给st2时,st2具有该数组的新副本。因此,当我们更改st1的str []时,st2不会更改。

# include 
# include 
  
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;
}

输出:
st1的str = XYeksforGeeks
st2的str = GeeksforGeeks

因此,对于C++类,我们不需要为数组成员编写自己的副本构造函数和赋值运算符,因为默认行为是对数组进行深度复制。

想要从精选的最佳视频中学习和练习问题,请查看《基础知识到高级C的C基础课程》。