Ejemplos de copia profunda y copia superficial de objetos Qt

Directorio de artículos

En Qt, la copia de objetos se puede dividir en dos tipos: copia superficial (Copia superficial) y copia profunda (Copia profunda). A continuación se muestra un código de muestra y una explicación para ambos tipos de copia:

1. Copia superficial

La copia superficial se refiere a copiar directamente los valores de las variables miembro de un objeto a otro objeto. Ambos objetos comparten los mismos datos. Si los datos del objeto original cambian, los datos del objeto copiado también cambiarán. Muchas clases en Qt usan copia superficial de forma predeterminada.

class Person {
    
    
public:
    QString name;
    int age;
};

Person p1;
p1.name = "Alice";
p1.age = 25;
Person p2 = p1; // 浅拷贝,p2与p1共享相同的数据

En el código anterior, p1 y p2 son objetos Persona del mismo tipo. Cuando se realiza una copia superficial, las variables miembro de nombre y edad de p2 se copiarán directamente desde p1. Esto significa que tanto p1 como p2 apuntan a los mismos datos reales, y si cambia los datos de uno de los objetos, los datos del otro objeto cambiarán en consecuencia.

2. Copia profunda:

La copia profunda se refiere a crear un nuevo objeto y copiar los valores de las variables miembro del objeto original al nuevo objeto. Los dos objetos tienen sus propias copias independientes de datos y no se afectan entre sí.

class Person {
    
    
public:
    QString name;
    int age;
};

Person p1;
p1.name = "Alice";
p1.age = 25;
Person p2;
p2.name = p1.name; // 深拷贝,p2有自己的name数据副本
p2.age = p1.age;   // 深拷贝,p2有自己的age数据副本

En el código anterior, p1 y p2 son objetos Persona del mismo tipo. Al realizar una copia profunda, debe copiar las variables miembro de p1 a las variables miembro de p2 una por una. De esta forma, tanto p1 como p2 tienen copias independientes de los datos y los cambios entre ellos no se afectan entre sí.

Cabe señalar que para algunas clases en Qt, han implementado la sobrecarga del constructor de copias y del operador de asignación para manejar correctamente las copias profundas. Sin embargo, para clases personalizadas o cuando se trata de punteros sin formato, es necesario implementar manualmente una lógica de copia profunda para garantizar la independencia de los datos.


Supongo que te gusta

Origin blog.csdn.net/m0_45463480/article/details/132582704
Recomendado
Clasificación