質問
iは、2つのオブジェクトの1つが宣言されているときに、2つのオブジェクトを等しくすることができることを知っています。私のプログラムでこれをテストしました。しかし、私が割り当てステートメントを使用するために行ったとき、それはびっくりしました。割り当てステートメントを使用して2つのオブジェクトを等しくすることはできますか、または1つのオブジェクトが宣言されている場合にのみ行うことができますか?
解決
クラスに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#に適用されます。
Overloading =演算子とともに、もオーバーライドする必要があります。 equals メソッド。また、等しいオーバーロードについてガイドラインも確認する必要があります。 ()および演算子==
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);
}
}