2016-11-07 14 views
0

コピーコンストラクタは、既存のオブジェクトに基づく新しいオブジェクトが作成されたときに呼び出されることを理解します。しかし、私は同じことをしようとしている、私はコピーコンストラクタが呼び出されていないことがわかります。リンク[https://www.tutorialspoint.com/cplusplus/cpp_copy_constructor.htm]、コピーコンストラクタを呼び出す必要があります行m_aObject = local_obj1;を1としてコピーコンストラクタの呼び出し

/* 
* class definition 
*/ 
class A 
{ 

    public: 
    A(int mn, int mx); //default constructor 
    A(A const& obj); //copy constructor 
    ~A(); 
    private: 
    int* ptr; 
    int max; 
    int min; 
} 

class B 
{ 
    public: 
     B(); 
     void print(); 
    private: 
     A m_aObject; 
} 


/* 
* B.cpp 
*/ 
void B::print() 
{ 
    A local_obj1(2,3); 
    local_obj1.ptr = Global_array; //some global array. 
    m_aObject = local_obj1; // should invoke the copy constructor 
} 


/* 
* A.cpp 
*/ 
A::A(A const& obj) 
{ 
    cout << "copy constr. invoked"<<endl; 
    ptr = new int[10]; 
    for(int i= 0; i< 10; i++) 
    ptr[i] = obj.ptr[i];  
} 

A::A(int mx, int mn) 
{ 
    min = mn; 
    max = mx; 
} 

:後 は、コードの私の作品です。

しかし、私は上記のステートメントの実行後、コピーコンストラクタが呼び出されることはありません。コピーコンストラクタ内の印刷。コンソールには決して表示されません。

m_aObject = local_obj1;行が本当にコピーconstrを呼び出していますか? ?

コピーコンストラクタを呼び出すとします。 m_aObject(local_obj1);、 コンパイルエラーが発生するerror: no match for call to '(A) (A&)'

上記の場合にコピーコンストラクタを呼び出す方法はありますか。

答えて

1

m_aObject = local_obj1; //コピーコンストラクタを呼び出す必要があります

いいえ。

コピー代入演算子を呼び出します。あなたはカスタム実装を持っていません。したがって、コンパイラによって生成されます。

What's the difference between assignment operator and copy constructor?を参照してください。

2

=をクラスに使用すると、2つのことが起こります。最初は、コピー建設であり、それが

type name = some_value; 

のように見える他は、コピー代入であり、あなたはあなたのコードは、使用している意味第二の例のように見える見ることができるようにあなたが

name = some_value; 

を持っていたときにそれが起こります代入演算子であり、コピーコンストラクタではありません。コンストラクタは、オブジェクトの作成時にのみ呼び出されることに注意してください。その後は、コピー/移動の割り当てだけです。あなたはクラスBの建設中にを初期化された部材としてクラスを持ってあなたクラスBでは

0

。メンバm_aObjectは既にで初期化されているため、(Aのデフォルトのコンストラクタを使用して作成された)であるため、コピーコンストラクタは呼び出されません。あなたのケースでは、デフォルトの代入演算子は、浅いコピーを使用して呼び出されています。

  • 1つのオブジェクトをインスタンス化し、が他のオブジェクトからの値でそれを初期化:とき

    を参照のコピーコンストラクタは、一般的に呼ばれています。

  • 値によってオブジェクトを渡す
  • オブジェクトが値によって関数から返され
関連する問題