放射線作成者

4026 ワード

  • これがc++-第4章で、洪政模の「宝を奪う記」9.11節を学び、まとめた.
  • 1.レプリケーションジェネレータとは?


    :オブジェクトのコピーを作成するときに呼び出される作成者.

    形態


    :このようにコンパイラを使用しています.
    constは他のオブジェクトの変更を防止できるからです.
    リファレンスコピーが表示されないようにします.
    Object(const Object &other)
    {
    
    }

    注意事項


    :クラスで動的に割り当てられ、無効になっているメンバーポインタ変数を管理する場合は、特に注意してください.
    ->浅いコピーのため、リファレンスがメモリを解放する問題が発生しました.

    いつ呼びますか。


    1)関数のパラメータとしてクラスを使用する場合
    2) 🥺!!使用してクラスに戻るとき!!
    =>一時オブジェクトが生成されるという問題が発生します.
    1)パラメータとしてクラスを使用する場合の例

    :mnumをテスト関数で7に変更しようとしましたが、変更はありません.
    (理由)->テスト関数のパラメータはvalueタイプで、コピーのmnum値ではなくオブジェクトの元のコピーを変更します.そのため、外部での価値は同じです.
    (その他の問題)->レプリケーションジェネレータが呼び出されました.Testのパラメータはオブジェクトなので呼び出されます.

  • Call by AddressまたはCall by Referenceに変更します.
    ->レプリケーションジェネレータは呼び出されません.
    -Addressをクリックすると、ポインタのサイズが増加します.

    -メモリサイズを増やすことなく、Refでコールします.


  • パラメータにcontを追加する場合、objのメンバーは変更できません.

  • 2.ジェネレータのコピーと入力演算子のコピー。


    a)レプリケーションジェネレータとレプリケーション対入演算子呼び出しの時点が異なる!


    1)コピー作成者が宣言しながら他のオブジェクトに初期化する場合.

  • 割り当て演算子ですが、宣言とともに初期化されたため、レプリケーションジェネレータが呼び出されます.


  • 宣言と同時に初期化

  • 2)宣言および初期化後、複製代入演算子を別のオブジェクトに置き換えると、複製代入演算子が発生します.

    私)copyの生成を阻止します。


    1)個人に移る.

    2)publicに移動し、宣言を削除する

    マルチ)copy Elision:コピーをスキップ



    :レプリケーションジェネレータを呼び出さない...何だろう.
    コンパイラが自動的にレプリケーションをスキップしました.
    レプリケーションは行われたが,オブジェクト(6)はRvalueであるため,コンパイラ自身がレプリケーション省略を行った.

    ra)戻り値の最適化


  • デバッグモードとパブリッシュモードは異なります.
    ->パブリッシュ時に最適化します.
  • デバッグモード時

    :領域変数を返す必要があるため、コピーが完了すると戻ります.
  • バージョン・モード

    ->コンパイラは消失した値であるため、レプリケーションをスキップして最適化された状態に戻ります.生命の継続です.
    Main側のresultオブジェクトがdoSomethingのaオブジェクトになりました!
  • 3.深さ放射と浅い放射


  • 浅い放射
    :動的に割り当てられたポインタ間でレプリケーションを行う場合に発生する現象、すなわち、値をレプリケーションするのではなく、アドレスと値にレプリケーションします.
    -2つのポインタが同じメモリを指しているのが特徴です.無効な場合は
    同じメモリを解放して問題が発生.

  • ふかほうしゃ
    :ポインタをコピーすると、メモリの形式ではなく値がコピーされます.
    -ライトコピーのコピーを防止します.2つのポインタは同じメモリではなく、異なるメモリを参照します.
  • 浅いレプリケーションの例



    ->問題が発生したのは、解放されたメモリを再解放しようとしたためです.
  • ソリューションは、指定した値のみをコピーするように変更する必要があります.

    ->ポインタなので、ポインタのメモリを確保する必要があります!

  • ->そうすれば、深福薩と言える!

    ロ)クラス内の浅いコピーと深いコピー。


    作成者をコピーします。


  • 静的に割り当てられた変数については問題ありません.


  • 動的に割り当てられた変数では、同じメモリを解放しようとしたために問題が発生しました.


  • 解決コード

    ->コピー作成者からメモリを再割り当てし、パラメータとして受信したオブジェクトが指す値を受け入れる
  • 放射対入演算子。


    :コピー生成者と同じです.この場合、動的な割り当ては行われず、参照されるメモリの値のみが受け入れられます.