12月 282015
 

珍しくがっつりC++の話。

C++について勉強していて、未だにstatic_castとdynamic_castの挙動をよくわかってない感じだったので、実験して確認したことをまとめます。文章にするとめちゃ時間かかりますね・・・。

まず前提知識として、メモリレイアウトやらvtableやらRTTIやらの話をします。何故なら、おそらく多くの人がなんとなく以下の理解でいると思われ、その辺どうなっているかという話から始めないといけないためです。

  • dynamic_castは実行時に型チェックするから安全にダウンキャストできる。
  • static_castはコンパイル時に型チェックするが実行時に型チェックしないためダウンキャストが安全でない。

間違っちゃないんですが、もう少し突っ込んで理解して、正しい挙動を把握したいわけです。

とはいえ、私もオフィシャルなドキュメントを読んでいたりするわけではないので、ここに書くことも間違ってるかもという疑いを持って読んでください。間違ってたら指摘欲しいです。

特に断りがない限り、Visual Studio 2015でx86としてDebugビルドしてます。基本的にpublic継承の話しかしません。

Continue reading »

2月 212014
 

どうも。お久しぶりです。
色々と書きたいこと、やりたいこと、あるんですけども、なんだかんだで就活大変ですね。まあまあ頑張ってます。

それはともかくとして、今回はC++の話です。

とあるSDKがヘッダでusing namespace std;してるって話題を見まして、要は、名前空間を汚す(※)のって良くないよね行儀悪いよねということですよね。でも、名前空間の指定を省略できるようにすれば、冗長さがなくなって実装しやすいわけですから、グローバルな名前空間を汚さずにその恩恵を受けたいものです。たとえば、あるクラスがstd::vectorとかstd::stringとかメンバ変数に持っていたり、メンバ関数の引数や戻り値に持っていたりしたら、私は冗長に思うわけです。クラス定義の範囲でusing namespace(using指令)したいよねと。あるいは、クラス名を直接指定するusing宣言でもいい。しかし、どちらもクラス定義に書けないわけです。

という話題を投げたら、typedefでできる?って言われまして。あ、できるねと。テンプレート書いてる時ぐらいにしかtypedef使ってなかったので盲点になってました。せっかくなので、usingとtypedefを使ってみて、どんな違いがあるのか確めてみようと思いました。これが今回の内容になります。

※「名前空間を汚す」以外の言い回しが思いつきませんでした。ここでいう「名前空間」は、C++の言語機能である名前空間(namespace)ではなくて、一般的な意味での名前空間です。混乱させてたらごめんなさい。

Continue reading »

Top