序文:
Javaで書くと、
A a1 = new A();
A a2 = a1;
a1
とはa2
同じオブジェクトを参照しています。
しかし、C++ では話は少し異なります。new A()
オブジェクトを常に作成する必要があるとは限りません。
以下のように自動オブジェクトを作成するとします。
A a1; // a1 is created on stack
A a2 = a1; // a2 is created on stack and copied from a1
a1
とa2
は同じ値を持つ異なるオブジェクトであることに注意してください。それらは同じエンティティを参照していません。a2
参考にしたい場合は、以下のa1
ように書いてください。
A &a2 = a1;
元の Java の動作をシミュレートする場合は、ポインターが役立ちます。
A *a1 = new A();
A *a2 = a1;
答え:
ここまでで、上記の C++ オブジェクトと参照の違いがわかります。
そうは言っても、C++ には を使用するよりもオブジェクトを設定するためのより良い方法がありますsetA()
。単純にオーバーロードできますoperator =
class A : public B
{
int member; // some member variable
public:
A& operator = (const A &a) // don't need to use `B&`
{
*(static_cast<B*>(this)) = a; // this calls `B::operator =`
this->member = a.member; // copy other members likewise
return *this;
}
};
使用法:
A a1, a2;
a1 = a2; // calls B::operator = and A::operator =
operator =
また、クラス内で常に定義する必要があるとは限らないことに注意してください。実際に必要になる特殊なケースがいくつかあります。デフォルトでは、コンパイラはコピー コンストラクタと代入演算子を生成し、コピーを実行します。