Qt オブジェクトのディープ コピーとシャロー コピーの例

Qtではオブジェクトのコピーは浅いコピー(Shallow Copy)と深いコピー(Deep Copy)の2種類に分けられます。以下は、両方のタイプのコピーのサンプル コードと説明です。

1. 浅拷贝(Shallow Copy)

浅いコピーとは、オブジェクトのメンバー変数の値を別のオブジェクトに直接コピーすることを指します。両方のオブジェクトは同じデータを共有します。元のオブジェクトのデータが変更されると、コピーされたオブジェクトのデータも変更されます。Qt の多くのクラスはデフォルトで浅いコピーを使用します。

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

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

上記のコードでは、p1 と p2 は同じ型の Person オブジェクトですが、浅いコピーを実行すると、p2 の name および age メンバ変数が p1 から直接コピーされます。これは、p1 と p2 の両方が同じ実際のデータを指しており、一方のオブジェクトのデータを変更すると、他方のオブジェクトのデータもそれに応じて変更されることを意味します。

2. ディープコピー:

ディープコピーとは、新しいオブジェクトを作成し、元のオブジェクトのメンバー変数の値を新しいオブジェクトにコピーすることを指します。2 つのオブジェクトには独自の独立したデータのコピーがあり、相互に影響しません。

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数据副本

上記のコードでは、p1 と p2 は同じタイプの Person オブジェクトです。ディープコピーを実行する場合、p1のメンバー変数をp2のメンバー変数に1つずつコピーする必要があります。このように、p1 と p2 の両方にデータの独立したコピーがあり、それらの間の変更は相互に影響を与えません。

Qt の一部のクラスでは、ディープ コピーを正しく処理するために、コピー コンストラクターと代入演算子のオーバーロードが実装されていることに注意してください。ただし、カスタム クラスの場合、または生のポインターを扱う場合は、データの独立性を確保するためにディープ コピー ロジックを手動で実装する必要があります。


おすすめ

転載: blog.csdn.net/m0_45463480/article/details/132582704