天使と悪魔選手権

こんにちは。
私は現在C++を学んでおり、先日から「必ず読んどけ」と言われる「Effective C++ 第3版」に手をつけ始めました。その中の第3項、可能ならいつでもconstを使おうで示されていた例に、
class Rational{...};
const Rational operator*(const Rational& lhs, const Rational& rhs);
というものがあり、なぜ引数が2つなのだろうと疑問を感じました。これはRationalのオブジェクト自身にlhs、rhsの値を'*'演算子を用いて掛け、Rationalの形の演算結果を返すといった認識でよろしいのでしょうか。
また、今回のように見当違いのところで躓いてしまい、なかなかこの本を読み進められず、この先が心配なのですが、読み方や学習方法等、教えていただければ幸いです。(こんな感じに読んで行ったらいい、とか、基礎から出直してこいボンクラ、とか)
よろしくお願いします。

A 回答 (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 付けてんだ?
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
二項演算子ではメンバー関数でない場合も考えられること、勉強になります。constに関してはNo.1の方も説明してくださっていますが、この本ではconstをつけないと
Rational a, b, c;
(a * b) = c;
というような操作が可能になってしまうため、返り値にconstをつけてそれを防いでいるということです。
分かりやすい回答、ありがとうございました。

お礼日時:2018/01/27 18:50

いや、多分No1さんが回答したことは


質問者さんは理解しているのではないかと私は思います

単純に演算子のオーバーロードのサンプルとかは
引数が1つで、左辺のオペランドはthisポインタで受け取るのが多いから
引数が2つ出てきて混乱しているのかと思います

質問者さんの認識であっていますよ
明示的に左辺右辺のオペランドを示すこともあります
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
明示的、つまり読者にわかりやすくするために2つの引数を用いて表していたわけですね。わかりやすくして頂いていたところで突っかかってしまうとは...トホホ...
大変分かりやすい回答、ありがとうございました。

お礼日時:2018/01/26 19:38

質問のoperator*は、class Rationalのメンバではなく、グローバルな演算子です。


C++では全ての関数や変数がクラスに属するということはなく、グローバルなものが存在するので、それを理解しておくことが必要です。
2つのconst Rationalへの参照を引数にとって計算し、結果のコピーをconst Rational型で返します。計算のたびに新しいオブジェクトを作成するので、書き換えられないconst型オブジェクトで良いのです。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
const型オブジェクトに関しても少し自信がなかったので、解説ありがたかったです。
ありがとうございました。

お礼日時:2018/01/26 19:56

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