有名な「Effective C++」の続編の本です。未踏の期間が終わったこともあり、読む時間を作ることができました。
この本は英語版で、一応日本語版もあるのですが、訳の評判はあまり良くありません。英語版の方も非常に読みやすい英語で、JavaDocレベルの英語が読めればなんとかなると思います。気のきいたジョークに使われる日常単語がいまいち分からなくて全部調べてたので、いまいち笑えませんでしたが…(ーー;
Effective C++に比べて枝葉の話が多い
続編ということもあり、前編であるEffective C++では言語の根本的な部分のと比較して、Moreの方では細かい話が多いです。
前著の方では、例えば
- コピーコンストラクタやデストラクタ、operator =を定義しないと勝手にコンパイラが定義してしまいますよ
- 値渡しよりconst参照渡しを考えた方がいいですよ
- newしたものはdelete、new [] したものはdelete[]、と対応させないといけません。
- private継承や多重継承は注意深く使ったほうがいいですよ
といった内容が多く、他言語を使っていたプログラマがC++の世界を理解するには丁度良かったと思うのですが、今回のMoreの方では、
- 関数の引数で暗黙的な変換が起こるのは値渡しかconst参照渡しの時だけで、しかも変換は一度しか起きません
- 参照カウントなスマートポインタ
- デストラクタは例外が起こってもちゃんと実行されるのでリソースリークを避けるのに使えます。
- 多重継承・virtual継承する時のオブジェクトのデータフォーマットはこうなっている(事が多い)ですよ
といった内容です。最後の項目はvtableやvptrの実態がよくわかったので参考になったのですが、その他の項目は今ではインターネット上のC++に関する文章や、STLをある程度使っていると「そらそうよ…」「せやな…」と思ってしまう内容が多く、Effective C++を読んだ時に感じた、あの驚きをもう感じることはできませんでした。Effective C++を読んで少しC++を書き始めた時期に読めばもっと参考になったのでしょうが、数万行書いた後となると…。
改訂が繰り返されているEffective C++と違い、Moreは95年から一度も改訂されていません。STLは出たばかりの時期だったようです。
本を読むよりソースを読んで書いてWebのリソース読むのが好きな人は、まあ読まなくても…。
この本の中で特に一番大きく扱われているのは、参照カウント・スマートポインタです。sharedされている値そのものが参照カウント数を管理する、boostでいうところのintrusive_ptr相当のものをじっくり実装したあと、階層を一個上げてshared_ptr相当のものを実装します。が、相当のものがある事からも分かる通り、どちらも既に有名なもので、いまいち読んでも驚きがありません。しかもweak_ptrを扱っていませんし、参照カウントで問題になる「自分へのshared_ptrを基本的に持てない」という問題も扱っていません。
もしも読むなら、Effective C++を読んでちょっとC++を書いたらすぐに読むことをお勧めします!