C++ でデータ型を変換する方法

C Dedeta Xingwo Bian Huansuru Fang Fa



ある変数のデータ型を別の変数に変更するプロセスは、C++ では型変換または型キャストとして知られています。これは、データ型を相互に互換性のあるものにすることで、異なるデータ型の変数に対して数学的演算を実行するために行われます。型変換によりコードが最適化されます。たとえば、2 つの変数の差を計算する場合、一方の数値が float 型で、もう一方の数値が integer データ型である場合、integer データ型を float 型に変換して減算を実行します。

C++ でデータ型を変換する方法

C++ では、データ型を変更する方法が 2 つあります。

暗黙的な型変換

C++ コード コンパイラによって事前定義されたルールに従って、暗黙的な型変換は、ユーザーからの外部トリガーを必要とせずにコンパイラによって自動的に実行される型変換です。このタイプの変換は通常、プログラム内で複数のデータ型があり、式のデータ型がこの式に含まれる変数のデータ型と一致しない場合に行われます。







変換中のデータ損失を避けるために、コンパイラはデフォルトで、精度の低いデータ型を精度の高いデータ型に変更します。たとえば、データ損失を防ぐために、浮動小数点数を整数に変更するのではなく、整数を浮動小数点に変換します。これを昇進といいます。以下は、さまざまなデータ型の優先順位図です。





型変換の順序

型変換の正しい順序は次のようになります。





ブール -- > 文字 -- > 短整数 -- > 整数 -- > 符号なし整数 -- > 長さ - > 符号なしロング -- > 長い長い -- > 浮く - > ダブル -- > ロングダブル

データ損失を防ぐために、低精度型変数は高精度データ型に変換されます。

例1

この例では、暗黙的な型変換を使用して、異なるデータ型の変数に対して加算が実行されます。



#include
使用して 名前空間 標準 ;

整数 主要 ( ) {
整数 番号 = 100 ;
文字 キャラクター = 「C」 ;
コート << 「100 + 'C' = 」 << 番号 + キャラクター << 終わり ;

浮く ヴァル = 番号 + 「c」 ;
コート << 'float val(100 + 'c') = ' << ヴァル << 終わり ;

整数 だった = 7890 ;
長さ ではなかった = だった ;
コート << 'var_int = ' << ではなかった ;
戻る 0 ;
}

ここでは、ASCII テーブルの整数と文字、および浮動小数点数と文字「c」が追加されます。整数は、long データ型として 3 番目のセグメントに保持され、データ型は事前定義されたルールに基づいてコンパイラ自体によって変更されます。

「C」は数値で 67 に等しいため、100 と「C」の合計は 167 を返し、小文字の「c」は 99 に等しいため、100+「c」は 199 を返します。 int 変数は、long データ型で格納されます。

例 2

この例では、文字 D を浮動小数点に変換して除算演算を実行します。

#include
使用して 名前空間 標準 ;

整数 主要 ( ) {
文字 バツ = 「D」 ;

浮く float_var ;

float_var = 浮く ( バツ ) / 「c」 ;
// int を float に明示的に変換します。

コート << 'float_var の値は次のとおりです。' << float_var << 終わり ;

戻る 0 ;
}

入力値は文字 D の形式であり、float データ型で格納され、さらに文字 C で除算されます。これらの文字は数値に変更され、除算演算が実行され、値が float で返されます。

明示的な型変換

ユーザーは、C++ の明示的な型変換 (型キャストとも呼ばれます) を使用して、データ型を手動で変更する必要があります。このタイプのキャストは、暗黙的な型変換を回避するために行われます。 C++ で明示的な型キャストを実行するには、次の 2 つの方法があります。

  • 代入演算子を使用した変換
  • Cast 演算子を使用した変換

C++ の代入演算子を使用した型変換

代入演算子を使用した型変換は強制的に行われます。つまり、あるデータ型が別のデータ型に手動で変換されます。これは、右側のオペランドの値を左側の変数に割り当てる代入演算子「=」を使用して実現されます。


このプログラムは、型キャストを使用して円の面積を計算します。

#include
#include
使用して 名前空間 標準 ;
整数 主要 ( )
{
整数 半径 ;
コート <> 半径 ;
浮く エリア = M_PI * 半径 * 半径 ;
コート << 「半径のある円の面積」 << 半径 << 「=」 << エリア ;
}

代入演算子は、整数データ型の半径の値で構成される浮動小数点値を領域に割り当てるために使用されます。

円の面積は float データ型で返され、半径は integer データ型で入力されます。したがって、変数のデータ型は、代入演算子を使用した型キャストによって変更されます。

C++ でのキャスト演算子を使用した型変換

型変換は、プログラムのニーズに応じて、あるデータ型を別の型に強制的に変更するキャスト演算子を使用して行われます。

4 つの異なるキャスト オペレーターがあります。

  • static_cast
  • const_cast
  • ダイナミックキャスト
  • 再解釈_キャスト

1: static_cast

static_cast は、浮動小数点数や文字を整数などに明示的に変換するために使用されるキャスト演算子です。これは最も基本的なキャスト演算子です。本質的に似たデータ型をキャストできます。ポインタをある形式から別の形式に変換できるため、メモリ管理にも使用できます。

構文

static_cast ( 表現 )


このプログラムは、static_cast を使用して double 変数を int データ型に変換するように構築されています。出力の小数部分は切り捨てられます。

#include
使用して 名前空間 標準 ;
整数 主要 ( )
{
// 変数を宣言する
ダブル p ;
p = 2,905 * 1,235 * 24,675 ;
浮く 結果 ;

コート << ' 静的キャストを使用する前に:' << 終わり ;
コート << ' p の値 = ' << p << 終わり ;

// static_cast を使用してデータ型を変換します
結果 = static_cast ( p ) ;
コート << ' 静的キャストを使用した後: ' << 終わり ;
コート << ' 結果の値 = ' << 結果 << 終わり ;

戻る 0 ;
}

最初に、double 変数 p に値がロードされ、それらの値が互いに乗算され、結果に格納されます。結果には、static_cast 演算子の前後の結果が含まれます。

static_cast 演算子を使用する前は、結果は小数点で表示されますが、この演算子を使用した後は、整数データ型で表示されます。

2: const_cast

const_cast 演算子は、オブジェクトの定数値を非定数型に変換するために使用されます。これは定数オブジェクトが宣言されている場合に使用され、その値を時々変更する必要があります。

構文

const_cast ( 表現 )


この例では、const_cast 演算子を使用して定数修飾子を一時的に削除し、必要に応じて変数を変更できるようにします。

#include
使用して 名前空間 標準 ;
整数 主要 ( ) {
定数 整数 バツ = 70 ;
定数 整数 * そして = & バツ ;
コート << 「古い値は」 << * そして << \n ;
整数 * = const_cast ( そして ) ;
* = 90 ;
コート << 「新しい価値とは」 << * そして ;
戻る 0 ;
}

定数修飾子は int 変数 x に割り当てられます。これは、この変数を直接変更できないことを意味します。その後、ポインタである int *y を使用して x にアクセスしますが、それでも変更できず、cout を使用して元の値が表示されます。 const_cast 演算子を使用すると、非定数のポインター z が作成され、x の値にアクセスして編集可能にするために使用されます。 z に割り当てられた値を 90 に変更し、間接的に x の値を変更します。

最初、定数変数 x の値は 70 ですが、const_cast 演算子を使用して変更すると、90 になります。

3: ダイナミックキャスト

継承の階層を使用します。これはタイプセーフ ダウンキャストとも呼ばれます。ダウン キャストは、参照またはポインターを基本クラスの参照またはポインターから派生クラスに変換するプロセスです。

構文

ダイナミックキャスト ( 表現 )


この例では、dynamic_cast 演算子を使用して多態性クラスの型をチェックし、基本クラスと派生クラスの両方のメンバーへのアクセスを許可します。

#include
#include <例外>
使用して 名前空間 標準 ;
クラス Tベース
{
公共 :
浮く ベース_g = 9.81 ;

バーチャル 空所 ダミー ( )
{

} ;
} ;

クラス T派生 : 公共 Tベース
{
公共 :
整数 local_g = 9.78 ;
} ;

整数 主要 ( )
{

Tベース * ベース = 新しい T派生 ;
T派生 * 派生 ;

派生 = ダイナミックキャスト ( ベース ) ;

コート < ベース_g << 終わり ;
コート < local_g << 終わり ;

ゲットチャー ( ) ;
戻る 0 ;
}

2 つのクラスが基本クラスと派生クラスとして定義されます。 TBase* 型のポインタ ベースが作成され、動的に割り当てられた TDerived 型のオブジェクトに割り当てられます。このポリモーフィズムのインスタンスでは、派生クラス オブジェクトを基本クラス ポインターに割り当てることができます。 Dynamic_cast は、ポインターが TDerived の有効なオブジェクトにアクセスしているかどうかをチェックします。キャストが成功した結果を取得した場合、派生クラスは有効な結果を取得します。それ以外の場合は、null 値を返します。

4: 再解釈キャスト

reinterpret_cast は、あるデータ型のポインターを別のデータ型のポインターに変換します。ポインタのデータ型が同じかどうかはチェックしません。このキャスト演算子は慎重に使用し、取り扱う必要があります。


この図では、reinterpret_cast を使用して、あるデータ型のポインターが別のデータ型のポインターに再解釈されます。

#include
を使用して 名前空間 標準 ;

整数 主要 ( )
{
整数 * q = 新しい 整数 ( 70 ) ;
チャー * チャンネル = 再解釈_キャスト ( q ) ;
コート << * q << 終わり ;
コート << * チャンネル << 終わり ;
コート << q << 終わり ;
コート << チャンネル << 終わり ;
戻る 0 ;
}

最初に、整数に値 70 が割り当てられます。ポインタ q は、動的に割り当てられたこの整数を指します。 reinterpret_cast は、ポインタ q を文字ポインタ ch として再解釈するために使用されます。これは、もともと q に割り当てられていたメモリが、文字であるかのように扱われることを意味します。 cout コマンドを使用すると、q と ch に割り当てられた値が出力されます。 ch は文字ポインタとして扱われるため、文字値を返します。

*ch を使用して ch を指す値を出力します。ただし、ch は文字ポインタとして扱われるため、この行はメモリを文字として解釈します。 chを使用して、ポインタchに格納されているメモリアドレスを出力します。これは同じメモリの再解釈にすぎないため、q と同じメモリ アドレスです。

最初は整数に 70 が格納されます。その後、これがポインタ q とポインタ ch の間で操作されます。 2 番目の値は reinterpret_cast を使用して再解釈されるため、出力 2 と 4 は同じです。

注記 : このキャスト演算子は、オブジェクトが移植性のない製品になるため、よほど必要になるまでは使用しないことをお勧めします。

結論

ある変数のデータ型を別の変数に変更するプロセスは、C++ では型変換または型キャストとして知られています。これは、データ型を相互に互換性のあるものにすることで、異なるデータ型の変数に対して数学的演算を実行するために行われます。型変換によりコードが最適化されます。 C++ には暗黙的な型変換と明示的な型変換があります。暗黙的な型変換は、事前に定義されたルールのセットを使用してコンパイラ自体によって実行されますが、明示的な型変換はプログラマによって代入演算子とキャスト演算子を使用して実行されます。