C++ で static_cast コマンドを使用する

胡金庫 2023年10月12日
  1. C++ で static_cast を使用してオブジェクトのタイプを明示的に変換する
  2. C++ で reinterpret_cast を使用してオブジェクトのタイプを明示的に変換する
C++ で static_cast コマンドを使用する

この記事では、C++ で static_cast を使用する方法に関する複数の方法を示します。

C++ で static_cast を使用してオブジェクトのタイプを明示的に変換する

オブジェクトを別のタイプに変換する操作は、キャストと呼ばれます。配列からポインタへの減衰など、言語規則に従って C++ で暗黙的な変換が発生する場合があります。それでも、キャストは主にユーザーが行う明示的な変換要求に関連付けられています。オブジェクトまたは式の値を別の型にキャストすると、コンパイラーは、指定された型をオブジェクトを指すポインターに関連付けるように強制されます。

名前付きの明示的なキャスト操作には、const_caststatic_castreinterpret_cast、および dynamic_cast の 4つがあります。これらの操作は最新の C++ 言語にネイティブであり、古い C スタイルのキャストよりも比較的読みやすくなっています。キャストはしばしば危険であり、経験豊富なプログラマーでさえそれらを間違えますが、必要なときにこれらの変換操作を利用することを思いとどまらせるべきではありません。この記事では、static_cast および reinterpret_cast 操作の概要のみを説明します。

static_cast 関数は通常、関連する型を同じクラス階層または数値型のポインタとして相互に変換するために使用されます。このコマンドは、コンストラクターと変換演算子によって定義された変換も処理します。main 関数の 2 行目は、基本的に、符号付き char から符号付き整数への暗黙的なキャストを実行していることに注意してください。これは、次の行のあいまいなバージョンのほんの一部です。

結果は同じですが、これは最新の C++ でキャストを実行するための推奨される方法です。一方、main 関数の 4 行目と 5 行目は、static_cast 操作を使用した有効な変換ではありません。ただし、後者の変換は、C スタイルのキャスト (int*)x を使用して強制できます。これは、97 整数値を 16 進形式とメモリアドレス表記で出力します。この操作により、コンパイラの警告が生成される可能性が高いことに注意してください。

#include <iostream>

using std::cout;
using std::endl;

int main() {
  char x = 'a';
  int x_i = x;
  int x_ii = static_cast<int>(x);
  int* x_iii = static_cast<int*>(x);   // ERROR
  int* x_iii = static_cast<int*>(&x);  // ERROR
  int* x_iii = (int*)x;                // WARNING

  cout << x << endl;
  cout << x_i << endl;
  cout << x_ii << endl;
  cout << x_iii << endl;

  return EXIT_SUCCESS;
}

出力:

a
97
97
0x61
0x7ffeb7c31997

C++ で reinterpret_cast を使用してオブジェクトのタイプを明示的に変換する

または、後者の C スタイルのキャストは、次のコード例に示す reinterpret_cast 操作を使用して実行できます。このメソッドはコンパイラの警告を消し、ユーザーが変換の責任を負うことができます。char*のような reinterpret_cast を使用して、さまざまなポインタタイプを int*に変換できます。

この場合、出力されるアドレスは、x 文字が格納されているアドレスと同じです。値にアクセスするために x_iii ポインタを逆参照すると、文字 a またはその ASCII 代替文字は取得されず、奇妙な整数が取得されることに注意してください。この整数は同じ場所から取得されます。int として解釈されるため、データ型のサイズのみが異なります。

#include <iostream>

using std::cout;
using std::endl;

int main() {
  char x = 'a';
  int* x_i = (int*)x;  // WARNING
  int* x_ii = reinterpret_cast<int*>(x);
  int* x_iii = reinterpret_cast<int*>(&x);

  cout << x_i << endl;
  cout << x_ii << endl;
  cout << x_iii << endl;

  return EXIT_SUCCESS;
}

出力:

0x61
0x61
0x7ffca18be95f
著者: 胡金庫
胡金庫 avatar 胡金庫 avatar

DelftStack.comの創設者です。Jinku はロボティクスと自動車産業で8年以上働いています。自動テスト、リモートサーバーからのデータ収集、耐久テストからのレポート作成が必要となったとき、彼はコーディングスキルを磨きました。彼は電気/電子工学のバックグラウンドを持っていますが、組み込みエレクトロニクス、組み込みプログラミング、フロントエンド/バックエンドプログラミングへの関心を広げています。

LinkedIn Facebook

関連記事 - C++ Cast