C++コピー制御

3119 ワード

前言
C++クラスでいくつかのメンバー関数を定義することによって制御されるオブジェクトのコピー、移動、割り当て、破棄は、それぞれ次のようになります.
  • コピーコンストラクション関数と移動コンストラクション関数定義:同じタイプの別のオブジェクトでこのオブジェクトを初期化するときに何をするか(初期化と付与を区別することに注意)
  • .
  • コピーおよび移動付与関数定義:同じタイプの別のオブジェクトに1つのオブジェクトを付与するときに何をするか
  • 構造関数は、このタイプのオブジェクトが破棄されたときに何をするかを定義します.
    コピー、割り当て、破棄.
    1.コピー構造
    C++コピーコンストラクタは、同じクラスで以前に作成したオブジェクトを初期化するための特殊なコンストラクタです.コピーコンストラクション関数の名前はクラス名と一致する必要があります.その (参照でない場合、関数の実パラメータの初期化にはコピー初期化が必要ですが、コピー初期化にはコピー構造が呼び出され、デッドサイクルをもたらす必要があります)であり、追加のパラメータにはデフォルト値があります.コピーコンストラクション関数を呼び出すには、次の3つのケースがあります.
  • 既存の同じタイプのオブジェクトを使用することにより、新しく作成するオブジェクトA a2 = a1
  • を初期化する.
  • オブジェクトは、パラメータとして関数 a2.get(a1)
  • に渡す.
  • 関数からこのオブジェクトが戻ると、コピー構造
  • が呼び出される.
    いくつかの呼び出しについて、コードを使用して説明します.
    #include 
    using namespace std ;
    class A{
    private:
        int _a ;
    public:
        A(int a){
            _a = a ;
            cout<< "this is a's  constructor function"<< endl  ;
        }
        A(const A &a){
            cout << "this is a's copy constructor function" << endl ;
        }
        ~A(){
            cout << "this is a's destructor function" << endl ;
        }
        A getA(A a){
            return a ;
        }
        void   printA(){
            cout<< _a <

    2.コピー付与
    コピー割り当ては、次のような場合に発生します.
    A a ,b ;
    b = a ;
    
  • リロード演算子:本質はoperatorキーワードの後に定義する演算子を表す記号からなる関数です.したがって、付与演算子はoperator=という関数であり、他の関数タイプであり、演算子関数にも戻り値とパラメータのリストがあります.Foo& operator=(const Foo&) ;//割付演算子
  • クラスにコピー付与演算子が定義されていない場合、コンパイラは
  • を自動的に合成します.
  • デフォルトのコピー付与演算子は、演算子=右側のオブジェクトの非staticメンバーに左側の演算子オブジェクトの対応するメンバーを付与し、配列タイプメンバーに対して配列要素が1つずつ付与されます.

  • 3.構造関数
  • 構造関数オブジェクトが使用するリソースを解放し、オブジェクトの非staticデータメンバー
  • を破棄します.
  • , , 、すなわち、構造関数自体はメンバーを破棄せず、メンバーの場合、構造関数の後に隠された構造段階が破棄される.
  • 呼び出しタイミング:
  • 変数は、アクティブドメイン
  • から離れる.
  • オブジェクトが破棄されると、そのメンバーは破棄される
  • 容器は破壊され、その要素は破壊された
  • 動的に割り当てられたオブジェクトは、そのポインタにdelete演算子が適用されると、
  • が破棄される.
  • 一時オブジェクトの場合、作成された完全な式が破棄されます. delete


  • 一般的に、構造関数を必要とするクラスには、コピーと付与操作が必要です.
    コピー操作が必要なクラスも値付け操作が必要です.逆も同様です.=defaultは、コンパイラが合成を生成することを要求する制御関数を表示する.コピー制御関数=deleteでのみ使用できます.関数は削除された関数として定義されます.この関数は宣言されていますが使用できません.deleteは、関数が最初に宣言されたときに表示される必要があります.deleteは、通常の関数で使用できます.この関数は呼び出せません.- , , , (代入破棄をコピーできないメンバーとは、1.構造関数にアクセスできないこと、2.コピー構造関数が削除またはprivateの3.クラスの共通のコピー代入演算子が削除またはprivateのことを指す.クラスのメンバーの構造関数が削除またはアクセスできない場合、またはクラスに初期化器がない参照メンバーがある場合).本質は、クラスのデータ・メンバーがデフォルトのコピー割り当てで削除または破棄できないことです.
  • privateコピー制御は、関数をprivateとして宣言し、定義しないことを使用して、オブジェクトがコピーまたは付与されることを阻止することもできます.

  • コピー制御とリソース管理
    オブジェクトのコピー時の動作には、オブジェクトのコピー時にクラスの動作が値コピーのようにコピーされ、各オブジェクトに独自の状態がある場合があります.1つは、ポインタのように、コピーと元のオブジェクトが同じ下位データを使用することです.コピーを変更すると、希望の対象も変更されます.