電子書籍の厳選無料作品が豊富!

下記記載の 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;
}

A 回答 (4件)

既に回答が出ている通り、Vector v1, v2;があったとき、v1 += v2;とできるようにするためのものです。


ちなみに、

operator+=(const Vector& u)ではなくoperator+=(Vector u)なのは、設計者の無知が原因ではないかと思います。
    • good
    • 0

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行と等価になるわけだ。
    • good
    • 0

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;
}

ですかね。

これで、二つのベクトルの値が等しいかどうか判定できます。
こういう処理を行うとき、直感的ですごくわかりやすくて便利です。

参考URL:http://www.ascii.co.jp/books/books/detail/4-7561 …
    • good
    • 0

こんばんは。



void main()
{
Vector vct;
Vector vct2;

//↓の演算を可能にするための筈です
vct += vct2;
}
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!