掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
関数オブジェクト呼び出し方 (ID:72698)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
提示例題は http://www.geocities.jp/ky_webid/cpp/library/018.html まあ答えは既に出ているとおり「同じ」なのだが、なぜ同じかを解説してみるテスト 関数オブジェクトという名称があまりにも適切すぎるため、 わかっている人間は言い換えようとも思わないわけだ。だが、 わからない人間には何のことだかさっぱりわからん・・・ということで。 関数オブジェクト=関数のように振舞うオブジェクト ≒関数のように振舞う変数 と書き換えると、ある程度わかりやすくなるかな? (オブジェクトのうちの1つに変数がある) 関数のように振舞う「変数」だから、ごく普通に変数を作ることができる int i; // のように int 型の変数を作るのと同じく Random r; // のように「関数のように振舞う変数」を作っていい。 random_shuffle(..., r); のようにその変数を渡しても何の問題もない。 元発言者氏は(Random r; を除去して)random_shuffle(..., Random()); と書くべきではないか? という疑問を持っているのだろう。この場合 r を再利用していないので、どっちでもいい。 --- 以下もうちょっと高度な解説 オブジェクトという単語/文言は抽象的過ぎてわかりにくい。 この単語を、ある観点から大きく2つに分類してみる。 「名前のあるオブジェクト」 「名前のないオブジェクト」(一時オブジェクト) int i, j, k; と書くと変数 i j k が作られ、どれも [名前のあるオブジェクト] だ。 先ほどの例での Random r; も r という [名前のあるオブジェクト] を作っている。 k=i+j+1; という式を考えてみよう。 この式の中には [名前のないオブジェクト] が現れている。 i+j というの演算途中の一時的結果も int 型のオブジェクトなわけだ。 この [名前のないオブジェクト] が一時的に [コンストラクト] されている。 次に、この [名前のないオブジェクト] +1 という演算が行われる。 この演算結果もまた [別の、名前のないオブジェクト] なわけだ。 最後に [別の、名前のないオブジェクト] の値を k に代入し、 2つの [名前のないオブジェクト] 2つが [デストラクト] される。 というのが C++ 的考え方。 [名前のないオブジェクト] とは演算中に一時的に作られ、不必要になったとき即処分される [もの] 。 一時オブジェクトともいう。 [名前のあるオブジェクト] とは { 中で作ると対応する } まで存在する [もの] 。 ([もの]=オブジェクトである。=変数 と考えてさほど間違いではない) random_shuffle(..., Random()); と書くと、この Random() は一時オブジェクトの生成になる。 名前のない変数 Random() は 式文の終了の ; 到達時点でデストラクトされる。 つまり再利用することができない。 Random r; と書くと、これを括る } 到達まで r は存在し続けるので、 (その必要があれば) r を再利用できる。 という違いは、ある。 関数オブジェクトという文言を使うときはたいてい [一時オブジェクト] として使うので 多くのサンプルでは Random() のように使っているわけだ。
←解決時は質問者本人がここをチェックしてください。
戻る
掲示板システム
Copyright 2020 Takeshi Okamoto All Rights Reserved.