1. 主页
  2. 文档
  3. C语言教程
  4. C语言数组和字符串
  5. 数组成员是否被深度复制?

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

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

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

# 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, "52cxydh");

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 = XYcxydh
st2 的 str = XYcxydh

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

# include <iostream>
# include <string.h>

using namespace std;

struct test
{
char str[20];
};

int main()
{
struct test st1, st2;

strcpy(st1.str, "52cxydh");

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 = XYcxydh
st2 的 str = 52cxydh

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

这篇文章对您有用吗?