そのうちの1つが宣言されているときに、2つのオブジェクトを互いに等しくすることができることを私は知っています。私は自分のプログラムでこれをテストしました。しかし、私が代入ステートメントを使いに行ったとき、それはびっくりしました。代入ステートメントを使用して2つのオブジェクトを互いに等しくすることはできますか、それとも1つのオブジェクトが宣言されているときにのみそれを行うことができますか?
5 に答える
別のオブジェクトの内容をコピーするために、operator=をクラスに提供しました。例えば:
class A
{
public:
//Default constructor
A();
//Copy constructor
A(const A&);
//Assignment operator
A& operator=(const A& a);
};
int main()
{
A a; //Invokes default constructor
A b(a); //Invokes copy constructor;
A c;
c = a; //Invokes assignment operator
}
そのオブジェクトの代入演算子をオーバーロードすると役立ちます。(同じクラスのオブジェクトについて話しているといいのですが:))
代入演算子の場合は、クラスの実装に応じて代入演算子をオーバーロードするだけです。
オブジェクトが他のオブジェクトに依存している場合、そのオブジェクトは別のオブジェクトの初期化、作成、または同等化が必要になる場合があります。
この場合、コピー コンストラクターが最適なソリューションを提供します。これは、オブジェクトを別のオブジェクトに少しずつコピーしないためです。メモリがオブジェクトに動的に割り当てられている場合、ビット単位のコピーで問題が発生します。そのため、解決策はクラスで copy_constructor を定義することです。コピー コンストラクターは、引数と同じ型の既存のオブジェクトを参照し、既存のオブジェクトから新しいオブジェクトを作成するために使用されます。これは、コピーコンストラクターを使用してオブジェクトを他のオブジェクトと同等にする例です..
#include "stdafx.h"
#include "iostream"
using namespace std;
class array
{
int *ptr;
int size;
public:
array (int sz) {
ptr = new int [sz];
size =sz;
for(int index=0;index<size;index++)
ptr[index]=size;
}
~array(){
delete[] ptr;
}
array(array &a) {
int index;
ptr=new int[a.size];
for(index=0;index<a.size;index++)
ptr[index]=a.ptr[index];
cout<<"copy_constructor invoked"<<endl;
}
};
int _tmain(int argc, _TCHAR* argv[])
{
array num(10);
array x(num); //invokes copy_constructor
array y=num; //invokes copy consturctor
return 0;
}
この回答は C# に適用されます。
= 演算子のオーバーロードとともに、equalsメソッドもオーバーライドする必要があります。Equals() および Operator == のオーバーロードに関するガイドラインも確認する必要があります。
public struct Complex
{
double re, im;
public override bool Equals(Object obj)
{
return obj is Complex && this == (Complex)obj;
}
public override int GetHashCode()
{
return re.GetHashCode() ^ im.GetHashCode();
}
public static bool operator ==(Complex x, Complex y)
{
return x.re == y.re && x.im == y.im;
}
public static bool operator !=(Complex x, Complex y)
{
return !(x == y);
}
}