2014年4月26日土曜日

C++ キャスト演算子



もはやメモリが少なくとも8Gは

必要な時代が来ているのかもしれません。

起動しただけで2G以上使っており、

何か作業をしようとプログラムを起動するにも

あまりにモッサリした動きになるので



システムのパフォーマンスオプションをパフォーマンスを優先するにしてみました。

ただ4G程度では、まだ足りないというのか...

こういうのは、思い至った時は大抵高いのが嫌なところ。



今時期は安くてもこの程度か...

6K位まで落ちれば、買ってもいいと思うかもしれない。



さて、今回はキャストの話です。(^_^;)

C では、値や変数を特定の型に変換したい時は、次のようにしていました。

// とあるスレッド関数
void *something_thread_func( void *arg ) {
    // 引数をとある構造体にキャスト
    something_struct_t *pSomeStruct = (something_struct_t *)arg;
        :
        :

C++ では、このようなキャストを行ってもエラーにはなりませんが、

できるだけ C++ で追加したキャスト演算子を使うようにしたいものです。(^_^)

これらのキャスト演算子は、ポインタ型や参照型を、別の型に変換します。

※ここでは、 V という型を T型に変換することを意味しています。


const_cast<T>(V)          const を取り除くのに使います。

dynamic_cast<T>(V)      基底クラスのポインタ(あるいは参照)を派生クラスの
                                 ポインタ(あるいは参照)に変換するのに使います。

static_cast<T>(V)          C のキャストに近い使い方ができます。
                  const は取り除くことはできません。

reinterpret_cast<T>(V)  関数ポインタを別の関数のポインタへ変換したり
               ポインタをint型などへ変換するときに使います。
               全く違う型へキャストした場合は不正アクセスを
               引き起こしやすいため、注意が必要です。
               どうしても必要なときだけ使うようにした方が良いでしょう。


そして、先程の例をキャストすると、こうなります。(^_^;)

// とあるスレッド関数2回目
void *something_thread_func( void *arg ) {
    // 引数をとある構造体にキャストした2回目
    something_struct_t *pSomeStruct = static_cast<something_struct_t>(arg);
        :
        :

このように、C++ のキャスト演算子を使うと、間違ったキャストをした場合に

コンパイルエラーになります(´・ω・`)

そのため、C の書き方よりも安全なキャストとなります。

また、_cast が付いているので、キャストした場所がわかりやすくなります。

grep で探すときも便利ですね(^_^)


今日の名言
もし「時」がこの世で最も貴重なものだとすれば、時の浪費ほど大きな浪費は
あるまい。失われた時は二度と帰らないからだ。時はいくらあっても十分では
ないのが常だから、やるべきことはさっさと行おう。価値あることを行おう。
精を出してことに当たれば、これまでよりてきぱきとやれるはずだ。
                              ベンジャミン・フランクリン

私は明日を恐れない。なぜなら私は、昨日を知ったし今日を愛しているからだ。
                              ウィリアム・アレン・ホワイト

君の毎分毎分を大切にすることをおすすめする。時間のほうは時間が自分で
世話をするだろうから。
                              チェスターフィールド卿

一度に一歩ずつ登れば、高い山でも踏破できる。
                              ジョン・ワナメーカー