ストラウストラップのプログラミング入門(17) 第9章とドリル

ストラウストラップのプログラミング入門』を読む。今日は9章の最後まで。ドリルもやった。

9章は、「プログラミング言語の機能:クラス、その他」。8章に引き続き、C++の文法を解説する章になっている。

読書めも

覚えたこと
  • structはメンバが全部publicのclassみたいなもの
  • デフォルトコンストラク

デフォルトコンストラクタ内で状態を初期化するより、初期化用の関数を用意した方が、テストしやすそうだと感じた。

  • 宣言箇所とスコープの関係性 in クラススコープ

クラスのメンバは、他のメンバがクラス内のどこで宣言されているかに関係なく、それらのメンバを参照することができる。

理解を保留にしたこと

メンバ関数にできるがヘルパー関数にすべきもの、の見極めがまだよく分からないが、保留にした。

9.7.5「メンバとヘルパー関数」の冒頭から、気になる部分を引用する。

最小限の(ただし完全な)インターフェイスを設計する際には、単に便利なだけの操作の多くを省略する必要がある。自立した関数(つまり非メンバ関数)として単純に、的確に、効率よく実装できる関数は、クラスの外側で実装すべきである。

その心は、クラスの状態(変数)を触ることができる関数を最小限にすべし、ということらしい。

クラスに関係する操作はクラスにまとめたいと(Javaのノリで)思っていたので、へーというカンジ(正確には、積極的にクラスにまとめたいと思っているというより、「クラスに関係するが、自立した関数とすべきもの」が分からないんだけれども…)。「単純に、的確に、効率よく」とはどういうことだろう?

まあ、ひとまず、保留ということにする。

あと、演算子オーバーロードも、理解がぼやっとしている。10章で取り扱うらしいので、これも保留にした。

疑問

9章の最後に、Chrono.hとChrono.cppのコードが掲載されている。

Chrono.cppにあるis_date関数の定義(p.287)を見ると、returnする直前の行で、Date型の変数ddを更新している。しかし、更新可能なddがスコープ内にない。引数にも、privateなメンバーにも、グローバル変数にもない。ddはどれ?

そもそも、is_dateは、有効な日付かどうかをboolで返す関数なのだから、Date型の変数を更新する必要はない気がする。…が、もしそうなら、is_date関数をconstメンバ関数として定義しそうなものだし、そうなっていないということは、やはり何かを更新するのかしらん。

9章ドリル

日付を表わすデータ構造をちょっとずつ進化させるドリル。

9章で第1部「基礎」はおしまい。