下記記載の 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件)
- 最新から表示
- 回答順に表示
No.4
- 回答日時:
既に回答が出ている通り、Vector v1, v2;があったとき、v1 += v2;とできるようにするためのものです。
ちなみに、
operator+=(const Vector& u)ではなくoperator+=(Vector u)なのは、設計者の無知が原因ではないかと思います。
No.3
- 回答日時:
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行と等価になるわけだ。
No.2
- 回答日時:
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 …
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
説明文書でのメソッド・変数の...
-
Java初級 引数に適用できません
-
Strutsでチェックボックスの値...
-
Java初心者です、エラーの意味...
-
レコード件数の表示
-
String.containsの反対機能はあ...
-
abstract と static を一緒に付...
-
C# 点の描き方をおしえてくだ...
-
System.out.print
-
変数とフィールドの使い分け
-
Pythonのクラスへの引数の渡し...
-
C# でメソッドに送られてきたOb...
-
不要なstaticメソッドの見分け...
-
CSVから読み込んだデータの保持...
-
親の親のメソッドを呼ぶには?
-
getBinaryOutputStream()が使え...
-
Google Apps Script で getRang...
-
Processing
-
メソッドの引数に指定されてい...
-
C# の ByVal と ByRef について
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Java初級 引数に適用できません
-
String.containsの反対機能はあ...
-
レコード件数の表示
-
StringBufferからStringへキャ...
-
C# 点の描き方をおしえてくだ...
-
Google Apps Script で getRang...
-
abstract と static を一緒に付...
-
なぜprotected overrideなのか
-
別クラスのmainメソッドの実行
-
メソッド宣言の戻り値の型にク...
-
メソッドの引数に指定されてい...
-
C言語での文字列より値を抜き出す
-
Strutsでチェックボックスの値...
-
YYYYMMDD書式の日付に対する適...
-
クラスを作るとメソッドの数が...
-
java ジェネリックスに関して
-
C# でメソッドに送られてきたOb...
-
C# 他のnamespaceにあるメソッ...
-
リストボックスの並べ替え (VB...
-
public static void main (Stri...
おすすめ情報