こんにちは。
私は現在C++を学んでおり、先日から「必ず読んどけ」と言われる「Effective C++ 第3版」に手をつけ始めました。その中の第3項、可能ならいつでもconstを使おうで示されていた例に、
class Rational{...};
const Rational operator*(const Rational& lhs, const Rational& rhs);
というものがあり、なぜ引数が2つなのだろうと疑問を感じました。これはRationalのオブジェクト自身にlhs、rhsの値を'*'演算子を用いて掛け、Rationalの形の演算結果を返すといった認識でよろしいのでしょうか。
また、今回のように見当違いのところで躓いてしまい、なかなかこの本を読み進められず、この先が心配なのですが、読み方や学習方法等、教えていただければ幸いです。(こんな感じに読んで行ったらいい、とか、基礎から出直してこいボンクラ、とか)
よろしくお願いします。
No.3ベストアンサー
- 回答日時:
そもそも Effective C++ って, ある程度 C++ を知っている人に対して「こうしたらいいよ」とか言ってる本じゃなかったっけ? 「C++ を学んでいる途中の人」は本来の対象じゃないような気がする.
以下余談.
2項演算子 a@b は引数を 1個持つメンバー関数
a.operator @(b)
か, あるいは引数を 2個持つ (メンバーでない) 関数
operator @(a, b)
で解釈される (両方あてはまるときは普通のオーバーロード解決に従う). ただし, この Rational のような場合では
Rational a, b;
b = 3*a;
のような演算が考えられて, これではメンバー関数で処理できないので結局のところ「メンバーでない関数」はどうしても必要になる. なので, 2項演算ではメンバーでない関数とすることも多い (単項演算をメンバー関数にしない理由はたぶんないと思う).
しかし, これなんで返り値に const 付けてんだ?
回答ありがとうございます。
二項演算子ではメンバー関数でない場合も考えられること、勉強になります。constに関してはNo.1の方も説明してくださっていますが、この本ではconstをつけないと
Rational a, b, c;
(a * b) = c;
というような操作が可能になってしまうため、返り値にconstをつけてそれを防いでいるということです。
分かりやすい回答、ありがとうございました。
No.2
- 回答日時:
いや、多分No1さんが回答したことは
質問者さんは理解しているのではないかと私は思います
単純に演算子のオーバーロードのサンプルとかは
引数が1つで、左辺のオペランドはthisポインタで受け取るのが多いから
引数が2つ出てきて混乱しているのかと思います
質問者さんの認識であっていますよ
明示的に左辺右辺のオペランドを示すこともあります
回答ありがとうございます。
明示的、つまり読者にわかりやすくするために2つの引数を用いて表していたわけですね。わかりやすくして頂いていたところで突っかかってしまうとは...トホホ...
大変分かりやすい回答、ありがとうございました。
No.1
- 回答日時:
質問のoperator*は、class Rationalのメンバではなく、グローバルな演算子です。
C++では全ての関数や変数がクラスに属するということはなく、グローバルなものが存在するので、それを理解しておくことが必要です。
2つのconst Rationalへの参照を引数にとって計算し、結果のコピーをconst Rational型で返します。計算のたびに新しいオブジェクトを作成するので、書き換えられないconst型オブジェクトで良いのです。
回答ありがとうございます。
const型オブジェクトに関しても少し自信がなかったので、解説ありがたかったです。
ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C#でフォームのオブジェクト名...
-
VBAのWindowオブジェクトとWork...
-
戻り値がクラスオブジェクト
-
ASP.net 教えてください!!(...
-
newは明示的にした方が良いのか?
-
COMコンポーネントって何?
-
パワーポイントのVBAでテキスト...
-
Excelで =EMBED("Acrobat Docu...
-
Flashのアクションスクリプト
-
error C2712: オブジェクト ア...
-
ADO オブジェクトの渡し方
-
vb.net オブジェクト指向につい...
-
0 == False はいいけど
-
EXCEL VBAにて動的にCheckBOXを...
-
ArrayLsitのデータ取得
-
ビジュアルC++でボタンの有...
-
CとC++の違い
-
VBA 同じ名前のオブジェクトを...
-
Ajax.Requestについて
-
c言語ソースコード内のオブジェ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
パワーポイントのVBAでテキスト...
-
Excelで =EMBED("Acrobat Docu...
-
VBA 同じ名前のオブジェクトを...
-
EXCEL VBAにて動的にCheckBOXを...
-
VBAのWindowオブジェクトとWork...
-
C#でフォームのオブジェクト名...
-
ワイルドカード<?>と型パラメー...
-
COMコンポーネントって何?
-
ビジュアルC++でボタンの有...
-
Object型からDouble型へのキャスト
-
error C2712: オブジェクト ア...
-
newは明示的にした方が良いのか?
-
オブジェクトレベルとメタレベル
-
0 == False はいいけど
-
ASP.net 教えてください!!(...
-
LISTBOXの内容が更新されま...
-
戻り値がクラスオブジェクト
-
時間帯判定をする。
-
Vbで通常使用するプリンターを...
-
ワードで画像をドロップすると...
おすすめ情報