topazの遊び場

いろいろやってみる

そろそろC++やるぞパート23 演算子 「キャスト演算子」

そろそろC++やります

そろそろC++をやります。そろそろC++をやりたいからです。
何回やるかはわかりません。基礎を理解するまではやろうと思います。

という感じでやっています。

※ 初心者がメモレベルで記録するので、技術記事としてはお力になれないかもしれません。

内容

  • 今回は「4種類のキャスト演算子」を行っていきます。

const_cast 演算子

構文

const_cast <type-id> (expression)

const_castは型変換をするのでなく、constvolatileの追加や削除を行います。

const int *a = new int(13);
int *b = const_cast<int *>(a);
volatile int *c = new int(123);
int *d = const_cast<int *>(c);

継承された型について

class Base
{
};

class Derived : public Base
{
};

const_castの型指定に親の型を書いてキャストすることはできません。キャストしてから親の型の変数に代入します。

const Derived *a = new Derived{};
Derived *b1 = const_cast<Derived *>(a);    // OK
Base *b2 = const_cast<Derived *>(a);    // OK
Base *b3 = const_cast<Base *>(a);    // Error

これは、あまり使わないと思います。

dynamic_cast 演算子

構文

dynamic_cast < type-id > ( expression )

小クラスから親クラスへキャストする時に使用します。正確にはポリモーフィッククラスにキャスト可能だそうです。

Derived *a = new Derived();
Derived *b = dynamic_cast<Derived *>(a);
Base *c = dynamic_cast<Base *>(a);

Derived *d = dynamic_cast<Derived *>(c);    //  Error

これは、使いそうです。

reinterpret_cast 演算子

構文

reinterpret_cast < type-id > ( expression )

他のポイント型に、強制的に型変換します。

charintlongなど実質整数型の時に相性が良く使えます。

char *e = new char('a');
int *f = reinterpret_cast<int *>(e);    //  OK

これは必要に応じて使いそうです。

static_cast 演算子

構文

static_cast <type-id> ( expression )

暗黙の型変換を明示的に行う時に使います。省略できる場合がほとんどです。

long a = 100;
int b = a;
int c = static_cast<int>(a);

あまり明示的にしたい時はないような気がしますが、必要になったら使います。

参考リスト

感想

今回も演算子の続きを行いました。ポインタのキャストや、明示的なキャストと4種類やりましたが、dynamic_castをよく使うのかなという印象です。

次回も、演算子の続きを行なっていきます。