C ++ QTの深い浅いコピーコピーのディープコピー、および暗黙の共有浅いコピー

  • 以下は、C ++が深いと浅いコピーを定義しています
    • すでにコピーコンストラクタが自動的に呼び出されたときに別の新しい構築されたオブジェクトを初期化するために、カスタムタイプのオブジェクトクラスを使用して初期化する場合。つまり、オブジェクトのクラスは、コピーコンストラクタが呼び出されますコピーするとき、です。以下は、コピーコンストラクタと呼ばれる
      身体の関数に渡された値によってオブジェクトを渡す(1) 
      (2)関数から返された値によって渡されたオブジェクト 
      別のオブジェクトによって初期化される対象のニーズ(3)。

      明示的にコピーコンストラクタを宣言していない場合は、コンパイラが自動的にデフォルトのコピーコンストラクタ、クラス内のオブジェクト間のコピー完了ビットのコンストラクタを生成します。後述する浅いコピーとして知られているビットをコピーします。

      カスタムコピーコンストラクタは、それは、コンパイラのデフォルトのコピーコンストラクタの形成を防ぐことができ、ソースの効率を改善するために、良いプログラミングスタイルです。

      浅い対深いコピー

        いくつかのケースでは、クラスのメンバ変数は、動的ヒープメモリを開放する必要がある場合、このようなA = Bとしてコピービットの実装、正確に別のオブジェクトにコピーされ、オブジェクトの値、すなわち、Bが持っている場合は、この時点で、メンバ変数のポインタをメモリに適用した、メンバー変数は、Aは、同じメモリを指していること。ポインタは、Aフィールドガイド、エラーの発生していること、:メモリBが解放される(デストラクタ例えば:)は、この問題を提示します。

        次のように深いコピーと浅いコピーが簡単に理解することができる。クラスがリソースを持っている場合、複製、およびリソースの再配分中に発生し、このクラスのオブジェクトは、このプロセスはディープコピーであるとき、逆に、資源のない再配分がない、浅いコピーです。以下はディープコピーの一例です。


    • 概要:リソースの再配分がある:深いコピー;なし:浅いコピー(直接デフォルトコンストラクタを呼び出して、実際に共有メモリデータで、2つのオブジェクトが、このデータメモリを指します)
  • 下の深さにQTのコピーである、私はそれがより実用的に理解するものだと思います
    •   

      1.シャローコピー:

         そのような型への参照として浅いコピー

         浅いコピー元オブジェクトは、オブジェクトの共有コピーのみ異なる参照変数(異なる名前)を持つエンティティを指します。変更の対象物の3つは、他のオブジェクトに影響を与えます。例えば、張と呼ばれる男は、それはジョー・スミスやジョン・ドウが台無しにマングルされており、すべての悪い人かどうか、後で李4という名前の名前を変更3、それでも同じ人を始めました。

      2.ディープコピー:

         このような深いコピーに値型として。変化メモリポイントは、メモリ割り当てのデータが変更されます。

      値そのような事前定義されたタイプなどのオブジェクトの(値)のInt32、ダブル、および構造体(構造体)、列挙(列挙型)等が挙げられます。

      3.暗黙のうちに共有します:

        暗黙の共有はまた、ライトバックコピーと呼ばれています。2つのオブジェクトが(データブロックが浅いコピーで共有されている)は、同じデータを共有する場合、データが変更されていない場合、データ複製が行われません。オブジェクトは、データの深いコピーを実行するように変更する必要がある場合。

    • 例:
      コードをコピー
      ::()のボイドメインウィンドウon_pushButton_8_clicked 
      { 
          QStringのSTR1 = "データを"; 
          qDebug()<< "文字列のaddr =" &STR1 << << "" << str1.constData(); 
          QStringのSTR2 = STR1; //シャローコピー同じデータブロックをポイント
          ()<< "文字列ADDR =" &STR2 << << "" << str2.constData qDebug(); 
          STR2 = 'E' [3]; //ディープコピー、STR2物体点Aに新しいデータ構造とは異なるがSTR1によって指さ
          qDebug()<< "文字列ADDR =" &STR2 << << "" << str2.constData(); 
          STR2 [0] = 'F'; //ありませんデータ構造尖ったSTR2は共有されないので、コピーのいずれかの形式を引き起こす
          ()<< "文字列ADDR =" &STR2 qDebugを<< << "" << str2.constData(); 
          STR1 = STR2。データ構造への// STR1ポイントがメモリから解放され、データ構造にSTR1のSTR2オブジェクト点が指摘
          qDebug()<< "文字列ADDR = " <<&STR1 << "" << str1.constData()。// STR1データ構造は、メモリから解放されるデータ構造にSTR1 STR2尖った物体点、指摘
          qDebug()<< "文字列ADDR =" &STR2 << << "" << str2.constData(); 
      }
      
      コードをコピー

       

      次のように測定された出力結果は、(括弧で私の分析です)、次のとおりです。

      ストリングADDR = 0x28c798、0x14316660(STR2ポインタアドレス、QSharedDataPointer、実際には、DATA1と前方を指している)
      文字列ADDR = 0x28c798、0x1433f2a0(STR2ポインタアドレス、DATA2という名前の新しいQSharedDataPointer、ポイント)
      列ADDR = 0x28c798、0x1433f2a0 (DATA2ポインティングSTR2ポインタアドレスは、その内容を変更する)
      文字列ADDR = 0x28c79c、0x1433f2a0(DATA2ポインティングSTR1ポインタアドレスは、その内容を変更しない、およびDATA1を放棄する、参照カウントは、それが完全に解放されるようにゼロである)
      文字列ADDR =(STR2ポインタアドレス、ポイントDATA2、その内容を変更しない)0x28c798、0x1433f2a0

      STR1とstr1.constData()アドレスのアドレスは同じものではないことに注意してください。

おすすめ

転載: www.cnblogs.com/mtn007/p/11870355.html