サーチ…
構文
- コピーコンストラクタ
- 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); |
---|---|
プレースホルダ | プレースホルダ |
備考
代入演算子
代入演算子は、既存の(以前に初期化された)オブジェクトを他のオブジェクトのデータで置き換えるときです。これを例に挙げてみましょう:
// 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に呼び出します。