C++コピー構築および代入演算子


文書ディレクトリ
  • 一、概念
  • 1、コピー構造
  • 2、代入演算子
  • 3、引用例
  • 二、知識点剖析
  • 1、参照(ポインタまたは参照ではない)パスコピー構造
  • .
  • 2、参照参照参照非コピー構造
  • 3、クラスメンバー変数は初期化せずにデフォルト構造
  • を歩む.
  • 4、クラス初期化リストコピー構造
  • 5、賦値不走コピー構造、走'='演算子
  • 6、初期化賦値走コピー構造、不走'='演算子



  • 一、概念
    1、コピー構造
    	TClass C(A); //              
    

    2、代入演算子
    	TClass C;   //              
    	C = A;      //           '='     
    

    3、引用例
    class TClass
    {
         
    public:
    	//       
    	TClass() {
         
    		printf("Default Constructor
    "
    ); } // TClass(const TClass& other) { printf("Copy Constructor
    "
    ); Copy(other); } // TClass& operator=(const TClass &other) { printf("operator=
    "
    ); Copy(other); return *this; } // virtual ~TClass() { } // void Copy(const TClass &other) { data = other.data; } private: int data; };
        TClass A, B;    // 1
    	TClass C(A);    // 2
    	TClass D = B;   // 3
    	B = A;          // 4
    
  • 上の4行を見て、それぞれ何の構造関数を呼び出していますか?
  • 思考1分...
  • 回答:
  •     TClass A, B;    // Default Constructor
    	TClass C(A);    // Copy Constructor
    	TClass D = B;   // Copy Constructor
    	B = A;          // operator=
    
  • の3行目は間違いやすい点です.次に、これらの点をまとめます.

  • 二、知識点剖析
    1.参照(ポインタまたは参照ではない)コピー構造
    struct TClassDelegatorA {
         
    	TClassDelegatorA(TClass akTC) {
         
    	}
    };
    TClassDelegatorA AA(A);
    
        Copy Constructor
    
  • パラメータは非参照クラスオブジェクトインスタンスであり、デフォルトではコピーコンストラクタが1回実行されます.

  • 2、引用伝参不走コピー構造
    struct TClassDelegatorB {
         
    	TClassDelegatorB(TClass& akTC) {
         
    	}
    };
    TClassDelegatorB BB(A);
    
  • は、参照が別名に相当するため、参照時に構造関数をコピーする必要はありません.

  • 3、クラスメンバー変数は初期化せずにデフォルトの構造を作る
    struct TClassDelegatorC {
         
    	TClass tc_;
    	TClassDelegatorC(TClass akTC) {
         
    	}
    };
    TClassDelegatorC CC(A);
    
    Copy Constructor
    Default Constructor
    
  • の最初の出力は、関数伝達パラメータのコピー構造関数である.
  • の2番目の出力はクラスメンバーtc_である自分のデフォルトのコンストラクタ、TClassDelegatorCクラスのコンストラクタは、すべてのメンバー変数のコンストラクタを1回歩きます.

  • 4、クラス初期化リストのコピー構造
    struct TClassDelegatorD {
         
    	TClass tc_;
    	TClassDelegatorD(TClass akTC) : tc_(akTC) {
         
    	}
    };
    TClassDelegatorD DD(A);
    
    Copy Constructor
    Copy Constructor
    
  • の最初の出力は、関数伝達パラメータのコピー構造関数である.
  • の2番目の出力は、クラスメンバー初期化リストで呼び出されたコピー構造関数である.

  • 5、賦値不走コピー構造、走'='演算子
    struct TClassDelegatorE {
         
    	TClass tc_;
    	TClassDelegatorE(TClass akTC) {
         
    		tc_ = akTC;
    	}
    };
    TClassDelegatorE EE(A);
    
    Copy Constructor
    Default Constructor
    operator=
    
  • の最初の出力は、関数伝達パラメータのコピー構造関数である.
  • の2番目の出力はクラスメンバーtc_である自分のデフォルトのコンストラクション関数、TClassDelegatorEクラスがコンストラクションするときにすべてのメンバー変数のコンストラクション関数を1回歩きます.
  • の3番目の出力は、割り当てが呼び出された割り当て演算子である.

  • 6、賦値コピー構造を初期化し、行かない'='演算子
    struct TClassDelegatorF {
         
    	TClass tc_;
    	TClassDelegatorF(TClass akTC) {
         
    		TClass akTmpTC = akTC;
    	}
    };
    
    Copy Constructor
    Default Constructor
    Copy Constructor
    
  • の最初の出力は、関数伝達パラメータのコピー構造関数である.
  • の2番目の出力はクラスメンバーtc_である自分のデフォルトのコンストラクション関数、TClassDelegatorFクラスがコンストラクションするときにすべてのメンバー変数のコンストラクション関数を1回歩きます.
  • の第3の出力はakTmpTC呼び出しを初期化するコピー構造である.