在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 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录