あなたは非常に混乱しているようです:)わかりました、そう:
基本的に、ポインタは別の変数のアドレスを格納する単なる変数です。たとえば、がint
呼び出されたとするとi
、そのアドレスをポインタに格納できますp
。
int i = 23;
int *p = &i; // p has type int* (pointer to int) and stores &i (the address of i)
次に、それが指すもの(つまり、アドレスが格納されている変数)を変更したい場合は、割り当てるだけ*p
です。これは、指すものを示すために使用される構文です。この場合、*p
を参照しi
ます。したがって:
*p = 9; // sets i to 9 (since *p is i)
に割り当てるだけで、ポインタを再設定できます(p
つまり、他の何かを指すようにできます) 。
int j = 84;
p = &j; // store j's address in p, overwriting what was there before (i.e. i's address)
*p = 18; // sets j to 18 (since *p is now j)
さて、リファレンスは少し異なります。参照は、変数のエイリアスを作成します。
int i = 23;
int& r = i; // r has type int& (reference to int) and refers to i
参照はポインターの観点から実装される場合がありますが(または、特にコンパイラーが最適化を開始する場合はそうではない場合があります)、プログラミングの観点からは関係ありません。ここで重要なのは、言語の動作方法だけです。
参照されているものを変更したい場合(つまりi
、この場合)、次のようにします。
r = 9; // sets i to 9 (since r is an alias for i)
ポインタとは異なり、参照を再配置することはできません。先ほど示したように、に割り当てると、参照自体ではなく、参照r
しているもの()が変更されます。i
さらに、参照は再装着できないため、すぐに初期化する必要があります。これはポインタには当てはまりません。言い換えると:
int *p; // legal
int& r; // bad
最後の基本的な違いの1つは、ポインターがである可能性があることです。これは、ポインターがNULL
何も指していないことを示します。これは、アドレスが含まれていることを意味します0
。参照は常に実際のオブジェクトを参照する必要があります。この違いは、実装者にとって重要な場合があります。これは、ポインタを使用して多分型を実装できるためです。つまり、ポインタがそうでない場合NULL
は、ポイントされたオブジェクトを使用します。それ以外の場合は、別のことを行います。彼らは参照で同じことをすることはできません。
ポインタと参照に関してそれが明確であることを願っています!
さて、あなたに関してoperator+
-加算演算子の目的は、2つのオブジェクトを加算し、それらの合計を表す新しいオブジェクトを返すことです。したがって、2Dベクトル型がある場合は、operator+
次のように記述できます。
Vec2 operator+(const Vec2& lhs, const Vec2& rhs)
{
return Vec2(lhs.x+rhs.x, lhs.y+rhs.y);
}
コードでは、参照によってローカルオブジェクトを返そうとしています。これは、演算子の最後に存在しなくなるtoreturn
ため、機能しません。toreturn
代わりに、ここで値で返す必要があります。ちなみに、ポインタを返そうとすると同じ問題が発生します。
Vec2* operator+(const Vec2& lhs, const Vec2& rhs)
{
Vec2 result(lhs.x+rhs.x, lhs.y+rhs.y);
return &result; // bad!
}
そのコードでresult
は、演算子の最後に存在しなくなるため、返すポインターは無効な場所を指すことになります。結論-この種の状況では、派手なことは何も試みないでください。値で返します。