ストラウストラップのプログラミング入門(17) 第9章とドリル
『ストラウストラップのプログラミング入門』を読む。今日は9章の最後まで。ドリルもやった。
9章は、「プログラミング言語の機能:クラス、その他」。8章に引き続き、C++の文法を解説する章になっている。
読書めも
覚えたこと
- structはメンバが全部publicのclassみたいなもの
- デフォルトコンストラクタ
デフォルトコンストラクタ内で状態を初期化するより、初期化用の関数を用意した方が、テストしやすそうだと感じた。
- 宣言箇所とスコープの関係性 in クラススコープ
クラスのメンバは、他のメンバがクラス内のどこで宣言されているかに関係なく、それらのメンバを参照することができる。
理解を保留にしたこと
メンバ関数にできるがヘルパー関数にすべきもの、の見極めがまだよく分からないが、保留にした。
9.7.5「メンバとヘルパー関数」の冒頭から、気になる部分を引用する。
最小限の(ただし完全な)インターフェイスを設計する際には、単に便利なだけの操作の多くを省略する必要がある。自立した関数(つまり非メンバ関数)として単純に、的確に、効率よく実装できる関数は、クラスの外側で実装すべきである。
その心は、クラスの状態(変数)を触ることができる関数を最小限にすべし、ということらしい。
クラスに関係する操作はクラスにまとめたいと(Javaのノリで)思っていたので、へーというカンジ(正確には、積極的にクラスにまとめたいと思っているというより、「クラスに関係するが、自立した関数とすべきもの」が分からないんだけれども…)。「単純に、的確に、効率よく」とはどういうことだろう?
まあ、ひとまず、保留ということにする。
疑問
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章ドリル
日付を表わすデータ構造をちょっとずつ進化させるドリル。
- ドリル1: データだけのstruct https://gist.github.com/1226126
- ドリル2: structにメンバ関数追加 https://gist.github.com/1226127
- ドリル3: classに変更 https://gist.github.com/1226128
- ドリル4: enumに変更 https://gist.github.com/1226172
- ドリル5: constメンバ関数 https://gist.github.com/1226229
9章で第1部「基礎」はおしまい。