高橋 麻奈 : やさしいC++ 第3版

作成日: 2014-11-19
最終更新日:

概要

プログラミングの初心者を対象に、C++ の一通りの機能を解説する。

感想

1次元と2次元の足し算

第3版の p.462 は、演算子をフレンド関数としてオーバーロードする例を挙げている。しかし、この例は不適切ではないかと思う。 理由は、1次元の数と2次元の数を足しているからだ。詳しくはこうだ。 3 という整数型がある。また、Point というクラスが前の節で作られている。 簡単にいえば、Point は x と y を private なメンバにもつクラスであり、 2 次元の点を表している。このクラスを利用して Point p1(1, 3); とp1 を宣言し、初期化したとする。 p1 のメンバは、x = 1, y = 3 となっている2次元座標だ。一方で 3 という数字は1次元だ。 3 と p1 を加えるとはどういうことか、理解できない。

著者は、3 + p1 という演算は、(3 + p1.x, 3 + p1.y) のような座標を求めるものだとしている。 このように著者が定義していればいったんは引き下がるが、それよりはもう少し数学として実在性の高いもので演算をしたい。 (x, y) というペアを数学的に扱う方法はたとえば次のものだろう。

  1. 有理数として扱う。x と y はそれぞれ分子と分母
  2. 複素数として扱う。x と y はそれぞれ実部と虚部
  3. ベクトルとして扱う。x と y はそれぞれ x 成分と y 成分

著者は 3. の方法で扱い、3 という数字を (3 , 3)というベクトルと思って演算をしているが、無理があるように思える。 私だったら、1. か 2. の方法で扱う。

1. の有理数であれば、成分としては (x, y)のかわりに(n, d)を使うのがいいだろう。分子は numerator、分母は denominator だからだ。 そうすれば、3 + p1 という演算は、3 / 1 + n / d という演算となり、和は (3*d + n) / d となる。これは数学的に意味がある。

2. の複素数であれば、成分は(re, im) となるだろう real part (実部)と imaginary part (虚部) をとったものだ。 この場合は、3 + p1 は (3 + re, im) と解釈されるが、これも意味がある。

なお、複素数クラスはすでに最新の C++ であれば言語として実装されているので、自分で作る意味は学習用途に限られる。

第4版が最新なのだが、それは見ていない。だから、上記の箇所が変更されているかどうかはわからない。

書誌情報

書 名やさしいC++ 第3版
著 者高橋 麻奈
発行日2007 年 9 月 10 日(第3版)
発行元ソフトバンククリエイティブ
定 価2600 円(税別)
サイズA5 版
ISBN978-4-7973-4367-0
その他

まりんきょ学問所読んだ本の記録 > 高橋 麻奈:やさしいC++ 第3版


MARUYAMA Satosi