- 締切済み
演算子オーバーロード?
下記記載の Vector& operator+=(Vector u) メソッドの意味が理解できません。 inline Vector& Vector::operator+=(Vector u)とはどういう意味なのでしょうか? 質問がへたくそで申し訳ないのですが、どのたかご回答お願いします。 class Vector{ public: float x; float y; float z; }; inline Vector& Vector::operator+=(Vector u) { x += u.x; y += u.y; z += u.z; return *this; }
- みんなの回答 (4)
- 専門家の回答
みんなの回答
- jacta
- ベストアンサー率26% (845/3158)
既に回答が出ている通り、Vector v1, v2;があったとき、v1 += v2;とできるようにするためのものです。 ちなみに、 operator+=(const Vector& u)ではなくoperator+=(Vector u)なのは、設計者の無知が原因ではないかと思います。
- anmochi
- ベストアンサー率65% (1332/2045)
class Vector{ // Vectorっていうクラスなんだぜ。多分三次元のベクトルなんだぜ。 public: // これらの変数を外部に公開するんだぜ。 float x; // Xっていうfloatがあるんだぜ。 float y; // Yっていうfloatがあるんだぜ。 float z; // Zっていうfloatがあるんだぜ。 }; inline Vector& Vector::operator+=(Vector u) // このメソッドが呼ばれた時はインライン展開するんだぜ。Vectorへの参照を返すんだぜ。Vectorクラスのインスタンス(への参照)に対して+=という演算子がつき、かつ右辺値がVectorだった場合にこれを実行するんだぜ。 { x += u.x; // 奴のXをオレのXに足すんだぜ。 y += u.y; // 奴のYをオレのYに足すんだぜ。 z += u.z; // 奴のZをオレのZに足すんだぜ。 return *this; // 自分自身を返すんだぜ。 } Vector& Vector::operator+=(Vector u)を分解すると、先ほどのコメントの通り「Vectorクラスに対して引数(右辺値)がVectorである+=演算はVectorへの参照を返すよ」という宣言になる。 Vector& : Vectorへの参照を返すメソッドです。 Vector::operator+= : Vectorクラスに+=で表される振る舞いを追加するメソッドです。 (Vector u) : 振る舞いの引数はVectorかVectorから派生したクラスでないといけません。 そうすると、ANo.1さんの言う通りvct += vct2;ということができて、それが vct.x += vct2.x; vct.y += vct2.y; vct.z += vct2.z; という3行と等価になるわけだ。
- TD_Kam
- ベストアンサー率66% (2/3)
Vector a,b; a.x = 1.0; a.y = 2.0; a.z = 3.0; b.x = 4.0; b.y = 5.0; b.z = 6.0; cout << "b = " << "(" << b.x << "," << b.y << "," << b.z << ")" << endl; というプログラムを書いてみてください。ベクトルの各要素が足されていて、(5.0,7.0,9.0)という答えが出力されたと思います。 要するにに、a.x = b.x,a.y = b.y,a.z = b.zという一連の処理を、一行で済ませてしまうので、直感的にわかりやすいですし、とても便利ですよね? ただ、もしかしたら「そんなことは分かっている。問題は、なぜこの関数の最後で、return *thisなんかやっているか!そもそもvoidでいいんじゃないの?」とおっしゃりたいのなら、例えば、以下のような使い方をされる可能性があるからです。 Vector a,b,c; (中略) c = (a += b); これは、a+=bした結果の値をcに代入しなさい、という意味で、ここで戻り値をVector&型にした理由があります。 このような表現は、普通の数値型変数(int や doubleなど)では、ごく普通にできてしまうので、それらでできて、なぜベクトル演算では出来ないの?ということになり、一見便利な演算子のオーバーロードですが、ちゃんとやりだすときりがない、結構奥の深い世界です。 詳しくお勉強したいというのなら、 「Effective C++」 という良書があります。少し古い本ですが、この辺の話を非常に詳しく書いてあるので、参考にしてみてください。 ちなみに、この演算子のオーバーロードの例で一番よく使われて便利なのは、 bool operator ==(Vector u,Vector v) { if((u.x == v.x) && (u.y == v.y) && (u.z == v.z)){ return true; } return false; } ですかね。 これで、二つのベクトルの値が等しいかどうか判定できます。 こういう処理を行うとき、直感的ですごくわかりやすくて便利です。
- machongola
- ベストアンサー率60% (434/720)
こんばんは。 void main() { Vector vct; Vector vct2; //↓の演算を可能にするための筈です vct += vct2; }