在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基础课程》。