複素数を処理するためのC++プログラムを構築しています。このコードの動作に問題があります:
Complex& Complex::operator=(const Complex& com)
{
Complex::re_=com.re_;
Complex::im_=com.im_;
return *this;
}
現在、この関数の戻り型は複合型の参照です。this
だから私はではなく通過するべきではありません*this
。
this
ポインタは、オブジェクトインスタンスのアドレスです。
アスタリスクを使用して逆参照します。
JavaやC#とは異なり、this
C ++では参照ではなく、ポインターです。そのポインタは、メソッドのconst修飾子に応じて、 typeComplex*
または。のいずれかになります(つまり、あなたの場合です)。Complex const*
Complex*
編集:コメントに記載されているように、JavaとC#の参照は、C ++の参照とpoitnerに簡単に匹敵するものではないので、明確にしておきます。
構文的には、3つの言語すべての参照は同じように扱われます。つまり、逆参照する必要がないか、暗黙的に逆参照されるか、簡単に言えば、のようにその背後にあるオブジェクトにアクセスしますref.method()
。
意味的には、通常のJavaおよびC#参照はC ++ポインターのように動作します。つまり、nullにすることも、別のオブジェクトを指すように再割り当てすることもできます。C ++では、どちらも参照では不可能です。したがって、一見するとthis
、JavaとC#には、C++の場合と同じようにC++ポインタのセマンティクスがあります。ただし、null
別のオブジェクトを指すように再割り当てすることはできず、再割り当てすることもできないため、そのセマンティックの違いはなくなり、3つの言語すべてで同じC++参照セマンティクスを持ちます。
つまり、同じ答えです。
参照セマンティクスはありますがthis
、構文的にはC ++のポインターであるため、(構文)参照を取得するには明示的に逆参照する必要があります。