「C++プログラマであるかを見分ける10の質問」に答えてみた。

「C++プログラマであるかを見分ける10の質問」に答えてみた。自分の解釈だとこんな感じ。正解かどうか、特に2のreinterpret_castと10は自信なし。ちなみに、Java版/.Jの日記で。

1. iterator の役割について説明せよ.
ポインタがメモリのアドレスを指し示すように、イテレータはコンテナの中身を指し示す。ポインタとの違いは、コンテナの「先頭」と「終端」を意味する値があること。

2. *_cast およびCスタイルのキャストそれぞれについて概要を説明せよ.
Cスタイルのキャスト:単なる型変換。数値ならば精度が落ちる場合がある。
static_cast:同上。C++での静的変換はCスタイルのキャストではなく、こっちを使用するべき。
reinterpret_cast:ポインタ同士、もしくは、ポインタと同サイズの整数型とのキャスト。メモリイメージの無理矢理コピー、精度落ちとかは無し。
dynamic_cast:継承関係が直系の子孫で無ければ、ポインタならばNULLとなり、参照ならばstd::bad_castが投げられる。*1
const_cast : constを外す。原則として使用不可。どうしても使用しなければならない場合のみ使うこと。代替手段は必ず存在する。

03/08:static_castとreinterpret_castについて勘違いがあった。orz http://d.hatena.ne.jp/A7M/20110308/1299558334

3. overload と override と hiding の違いについて説明せよ.
overload:メソッドの多重定義。同名でも引数の違いで区別する。
override:メソッドの上書き。サブクラスで同一名称、同一引数のクラスの挙動を変える。
hiding:名前隠蔽。サブクラスで継承元のメソッドやメンバ変数を参照できなくする。

4. const の機能について概要を説明せよ.
値が「不変」であることを保証する。てか、変えられない。

5. 多重継承について概要を説明せよ.
私は、プログラマであり、横浜FCサポーターであり、呑兵衛である。*2

assert(!dynamic_cast<FMarinosSuppoter*>(&A7M)); // 私は、マリノスサポではありません。

6. ポインタの使用方法について,メモリーリーク問題等と絡ませながら戦略を述べよ.
おもちゃ(メモリ)で遊んだ後は自分でおもちゃを片付ける。ポインタはお部屋(OS)に広げたおもちゃがどこにあるかを知らせてくれる。
おもちゃが出しっぱなしならば、お部屋がおもちゃでいっぱいになって、自分がそのおもちゃに躓いて怪我をすることも。
スマートポインタマジ便利。スマートポインタは後片付けを自動的にしてくれる。

7. コピーコンストラクタおよび代入演算子の扱いにおける戦略について述べよ.
コピーコンストラクタ:無から有を生み出す。
代入演算子:すでにあるものを後から上書きする。

8. virtual デストラクタの概要および使用上の戦略について述べよ.
virtualの場合、オブジェクトを生成したコンストラクタに対応するデストラクタが実行される。virtualでない場合は、変数型のデストラクタが実行される。

9. コンストラクタ,デストラクタにおける例外処理についての戦略を述べよ.
コンストラクタの場合:料理を作りたくても、材料や道具が揃わないことはよくあります。未完成な料理は出せないでしょ?
デストラクタの場合:料理の後片付けをしている最中にトラブる可能性は十分考えられます。後始末はきっちりと。

10. 抽象クラスとテンプレートクラスの使い分けについてインターフェースと言う観点から述べよ.
抽象クラスの「振る舞い」は継承元を含めたクラスに依存する。
テンプレートクラスの「振る舞い」は継承関係に依存しないが、「名前」に依存する。

*1:自分の経験だと継承関係のあるクラスのポインタでしか使ったことが無い。

*2:「人間」を基底クラスにすれば、ダイアモンド継承になるのかも。