CC++ 两个结构体相互赋值=号时深拷贝还是浅拷贝
在C/C++中,结构体之间的赋值操作默认是浅拷贝。也就是说,当使用“=”运算符将一个结构体赋值给另一个结构体时,只会将结构体中的成员逐个复制过去,如果结构体中包含指针类型的成员,那么只会复制指针的值,而不会复制指针指向的内存区域。
如果需要进行深拷贝,即复制指针指向的内存区域,需要手动编写代码实现。可以通过使用函数来实现深拷贝,或者通过重载“=”运算符来实现。
以下是一个示例代码,展示如何实现结构体的深拷贝:
#include <iostream>
#include <cstring>
struct Person
{
char* name;
int age;
};
void deepCopy(Person& dest, const Person& src)
{
dest.age = src.age;
dest.name = new char[strlen(src.name) + 1];
strcpy(dest.name, src.name);
}
Person& operator=(Person& dest, const Person& src)
{
if (&dest != &src)
{
delete[] dest.name;
dest.age = src.age;
dest.name = new char[strlen(src.name) + 1];
strcpy(dest.name, src.name);
}
return dest;
}
int main()
{
Person p1;
p1.age = 20;
p1.name = new char[10];
strcpy(p1.name, "Alice");
Person p2;
deepCopy(p2, p1);
Person p3 = p1;
p3.age = 25;
Person p4;
p4 = p1;
// 输出结果
std::cout << p1.name << " " << p1.age << std::endl; // Alice 20
std::cout << p2.name << " " << p2.age << std::endl; // Alice 20
std::cout << p3.name << " " << p3.age << std::endl; // Alice 25
std::cout << p4.name << " " << p4.age << std::endl; // Alice 20
delete[] p1.name;
delete[] p2.name;
delete[] p3.name;
delete[] p4.name;
return 0;
}
在上述代码中,使用了一个deepCopy函数来实现深拷贝,以及重载了“=”运算符来实现深拷贝。在进行结构体赋值时,会先释放目标结构体中的内存,然后再进行深拷贝操作。这样,每个结构体都有自己独立的内存空间,互不影响
原文地址: https://www.cveoy.top/t/topic/iOSU 著作权归作者所有。请勿转载和采集!