サーチ…


構文

  • コピーコンストラクタ
  • MyClass(const MyClass&other);
  • MyClass(MyClass&その他);
  • MyClass(volatile const MyClass&other);
  • MyClass(揮発性のMyClass&その他);
  • 代入コンストラクタ
  • MyClass&operator =(const MyClass&rhs);
  • MyClass&演算子=(MyClass&rhs);
  • MyClass&operator =(MyClass rhs);
  • const MyClass&operator =(const MyClass&rhs);
  • const MyClass&operator =(MyClass&rhs);
  • const MyClass&operator =(MyClass rhs);
  • MyClass演算子=(const MyClass&rhs);
  • MyClass演算子=(MyClass&rhs);
  • MyClass演算子=(MyClass rhs);

パラメーター

rhs 右手側は、コピーコンストラクタと代入コンストラクタの両方に対して等価です。例えば、代入コンストラクタ:MyClass operator =(MyClass&rhs);
プレースホルダプレースホルダ

備考

さらなる研究のためのその他の優れたリソース:

代入演算子とコピーコンストラクタの違いは何ですか?

代入演算子とコピーコンストラクタC ++

GeeksForGeeks

C ++の記事

代入演算子

代入演算子は、既存の(以前に初期化された)オブジェクトを他のオブジェクトのデータで置き換えるときです。これを例に挙げてみましょう:

// Assignment Operator
#include <iostream>
#include <string>

using std::cout;
using std::endl;

class Foo
{
  public:
    Foo(int data)
    {
        this->data = data;    
    }
    ~Foo(){};
    Foo& operator=(const Foo& rhs)
    {
            data = rhs.data; 
            return *this;
    }

    int data;
};

int main()
{
   Foo foo(2); //Foo(int data) called
   Foo foo2(42);
   foo = foo2; // Assignment Operator Called
   cout << foo.data << endl; //Prints 42
}

ここではfooオブジェクトを既に初期化しているときに代入演算子を呼び出すことができます。その後、私は割り当てfoo2するfoo 。等号演算子を呼び出すときに表示されるすべての変更は、 operator=関数で定義されます。ここに実行可能な出力が表示されます: http : //cpp.sh/3qtbm

コピーコンストラクタ

一方、コピーコンストラクタは、代入コンストラクタの完全な反対です。今回は、すでに存在しない(または以前に初期化されていない)オブジェクトを初期化するために使用されます。つまり、コピー先のオブジェクトを実際に初期化せずに、割り当てられているオブジェクトからすべてのデータをコピーします。さて、前と同じコードを見てみましょう。しかし、代入コンストラクタをコピーコンストラクタに変更してください:

// Copy Constructor
#include <iostream>
#include <string>

using std::cout;
using std::endl;

class Foo
{
  public:
    Foo(int data)
    {
        this->data = data;    
    }
    ~Foo(){};
    Foo(const Foo& rhs)
    {
            data = rhs.data; 
    }

    int data;
};

int main()
{
   Foo foo(2); //Foo(int data) called
   Foo foo2 = foo; // Copy Constructor called
   cout << foo2.data << endl;
}

ここで見ることができますFoo foo2 = foo;主関数では、オブジェクトを実際に初期化する前に即座にオブジェクトを割り当てます。これは前に述べたように、コピーコンストラクタです。そして、私はオブジェクトfooから前のデータを自動的に引っ張ったので、 foo2オブジェクトのパラメータintを渡す必要はないことに気づくfoo2 。次に、出力例を示します。http : //cpp.sh/5iu7

コピーコンストラクタと代入コンストラクタ

ここでは、コピーコンストラクタと代入コンストラクタが上にあるものを簡単に見て、それぞれの例を挙げてみましょう。今度は両方を同じコードで見てみましょう。このコードは上記の2つのコードと似ています。これを取ってみましょう:

// Copy vs Assignment Constructor
#include <iostream>
#include <string>

using std::cout;
using std::endl;

class Foo
{
  public:
    Foo(int data)
    {
        this->data = data;    
    }
    ~Foo(){};
    Foo(const Foo& rhs)
    {
            data = rhs.data; 
    }

    Foo& operator=(const Foo& rhs)
    {
        data = rhs.data; 
        return *this;
    }

    int data;
};

int main()
{
   Foo foo(2); //Foo(int data) / Normal Constructor called
   Foo foo2 = foo; //Copy Constructor Called
   cout << foo2.data << endl;

   Foo foo3(42);
   foo3=foo; //Assignment Constructor Called
   cout << foo3.data << endl;
}

出力:

2
2

ここでは、最初にFoo foo2 = foo;という行を実行してコピーコンストラクタを呼び出すことができますFoo foo2 = foo; 。以前は初期化していなかったので次に、 foo3=foo既に割り当てられているので、代入演算子をfoo3に呼び出します。



Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow