【El Blog】C++のキャスト(変換処理)を結婚に例えると?

こんばんわわわ!エルです!!

最近久しぶりにUE4でC++を使う事が増えて、

懐かしい感覚になっているのですが、

あーそういえばこんなこと昔話してたなーということを思い出したので、

せっかくだし書いてみます!

 

※ちなみにエルは未婚です!

※ふんだんに偏見が盛り込まれていますので、おふざけくらいに見てください!

static_cast

基本はこれで問題ありません。

これで出来ない時に他のキャストを使い始める。というのが良い流れな気がします。

// こんな感じ

void* p = new int();

int* result = static_cast<int*>(p);

*result = 101;

std::cout << *result << std::endl;

static_castで済んでいるうちは、想定どうりな関係と言えるでしょう!

 

const_cast

const修飾子がついた変数を、外す事ができます。

constがついている変数なので、本来変更する事が不可能な変数なのですが、

それを無理やり外す処理になってしまいます。設計ミスとも言えるでしょう。

 

見つけたら「ん(。・ω・。)?」ってなる処理です。

引数で渡ってきたconstポインタの中身変更したい。とかでしょうか。

void CastFunc( const int* p )

{

    int* temp = const_cast<int*>(p);

    *temp = 128;

}

int main(int argc, const char * argv[]) {

    const int* temp = new int( 100 );

    CastFunc( temp );

    std::cout << *temp << std::endl;

    return 0;

}

これは普段外さない結婚指輪を外す行為のようなものです(゚∀゚)

処理を見直す事をオススメしますが、もしかしたらどうしようもない理由があるのかもしれません。

 

dynamic_cast

安全なダウンキャストを行うキャストとなります。

void* を使用してのやり取りをするような関数を使用する場合、

キャスト後に本当に共通の親クラスを使用している変数なのか?

をチェックする時に主に使われるでしょう。

 

class Parent

{

    virtual void Test() = 0;

};

class Child1 : public Parent

{

    virtual void Test()

    {

        return;

    }

};

void TestFunc( Parent *p )

{

    Child1* temp = dynamic_cast<Child1*>(p);

    if ( temp == nullptr )

    {

        return;

    }    

    // 正常処理

}

int main(int argc, const char * argv[]) {

    TestFunc( new Child1() );

    return 0;

}

その子が本当に親から受け継いだものを持っているかのチェックになるため、

これはDNA検査と言えるでしょう!

reinterpret_cast

本当に使うんですか!?なキャスト

ちなみに僕が社会人になって、初めて見たこのキャストの使用箇所は意味分からん形でした汗

何故なら使用する必要がない箇所だったからです笑

 

C++のリファレンス

https://ja.cppreference.com/w/cpp/language/reinterpret_cast

論理的にどうという解説を抜きにすると、

無理やり型を変更してしまうので、相当気をつけてないと当たり前に不具合が出ます。

 

上記で書いた僕が見たプログラムは、

void CheckFunck( int* p )

{

    if ( *reinterpret_cast<bool*>( p ) )

    {

        // 実装

    }

}

int main(int argc, const char * argv[]) {

    CheckFunck( new int() );    

    return 0;

}

簡単に書くとこんな感じだったのですが、

何故引数で渡ってきた整数値を無理やりbool型にしてるんだ!?!?でした。

if ( *int != 0 ) で良くない!?

って感じです。

 

もう本当にこれでしかダメ!!!しかも安全に使える!!! と思わない限り、

使う機会がないかなぁと思います。

 

中はそのままに、見た目だけ変えてしまうので、

もはや浮気かなと思っちゃいますね。

使う際は十分に注意して使いましょう(^^)!

 

まとめ

今回は勉強したてに感じる、

なんで4つもあるの!?

な疑問をお酒の場でふざけながら話した内容を思い出しながら書きました!

ネタだと思ってください☆*:.。. o(≧▽≦)o .。.:*☆

 

上からよく使う順番に書いたはずー!なので、

皆さんのお酒の場ででもネタにしてください!!

 

一応最後に例文載せておくと、

「reinterpret_castする時、const_castしちゃってさ。結局dynamic_castすることになっちゃった♪」

って感じですかね!

 

関連記事一覧

  • コメント ( 0 )

  • トラックバックは利用できません。

  1. この記事へのコメントはありません。