適切なcast

「キャストをしてみたらコンパイルが通った」などという話を聞きます。

私の前でこんな事を言うと、駄目プログラマのレッテルがアロンアルファでくっつきます。キャストに関わるTipsを少し。

■ 絶対にC++形式のキャストを使う

具体的にはstatic_cast, dynamic_cast, const_cast, reinterpret_castです。C++形式のキャストはC形式のキャストに比べて非常に安全です。当然、人のソースと接続するために、どうしてもキャストしなければならない場合だけ利用します。

詳しくはMSDNの記事、「Deep C++」の「static_cast」あたりから読むと良いと思います。

私のオススメはconst_castです。コイツはconstを付けたり消したりする事しか出来ない。Cのキャストに慣れた方は、制約されたキャストを使用する事から始めましょう。

■ C++のoperatorを理解する

C++の組込型(int, double等)以外、型が勝手に変換される(※1)なんて事はありません。例えばStringというクラスに対して「operator const char*() { return 中身; }」などと定義する事によって、利用者が意識せずともStringがchar*型に変換されているだけです。つまり、意識しないとoperatorは凄く危険(※2)です。

CStringなどをなんとなく利用して、なんとなく変換してもらってるという状況はやめましょう。型が変わっている時は再確認(※3)する。基本です。

とりあえずこの2点ですね。気づいたらまた書くかもしれません。



C++の設計者は、「C++のキャストは置換しやすく、「敢えて」打ちにくくした。本来キャストなど不要だ。」という趣旨の話をしております。

※1 暗黙の型変換はコンストラクタのみに存在します。int型なのにdouble型として初期化したりしますが、当然i余計にスタックを確保している事をお忘れ無く。一時オブジェクトと呼ばれちょっとした嫌われ者です。(興味ある人は暗黙の型変換を禁止する「explicit」も調べてみてください)

(05/11/10追記)

operatorを暗黙の型変換と呼ぶ人もいます。私は、(警告は出るが)型が違ってもコンパイルを成立させてしまうものを暗黙の型変換と呼ぶことにしてます。

※2 C++の標準ライブラリであるbasic_stringがchar*に対するoperatorを使わずに「c_str」なんて関数を定義したか、良く考えましょう。分からないうちは自分で定義してはいけません。

※3 組込型以外は必ずincludeしているヘッダにtypedef式があります。型がoperator式を持つクラスな場合、ヘッダには宣言部分が存在します。

Leave a Reply

Be the First to Comment!

Notify of
avatar
wpDiscuz