type conversions c
C ++でサポートされているさまざまな型変換を確認してください。
以前のチュートリアルからC ++で使用できるすべてのデータ型を知っておく必要があります。場合によっては、あるタイプを別のタイプに変換する必要があるというニーズが生じることがあります。これは、型変換または型キャストと呼ばれます。
このチュートリアルでは、C ++でサポートされているさまざまな型変換について説明します。
最高の無料レジストリクリーナーは何ですか
=> 無料のC ++コースについては、ここをクリックしてください。
学習内容:
型変換
C ++は、次の2種類の型変換をサポートしています。
- 暗黙的な型変換: 暗黙的な型変換は自動的に行われます。このタイプの変換ではユーザーからの干渉はなく、コンパイラーが直接変換を実行します。変換は通常、式に複数のタイプのデータがある場合に行われます。しかし、一般的に、このタイプの変換では、データの損失、兆候の損失、またはデータのオーバーフローの可能性があります。
- 明示的な型変換: 明示的な型変換はユーザー定義であり、通常は「型キャスト」と呼ばれます。ここで、ユーザーは要件に応じて、あるデータ型の値を別のデータ型にキャストまたは変換します。これらのタイプの変換はより安全です。
ここで、両方のタイプの型変換について詳しく説明します。
暗黙の変換
暗黙的な変換では、式に複数のデータ型がある場合は常に、コンパイラーが1つのデータ型から別のデータ型への変換を実行します。データの損失を防ぐために、他のデータ型のすべての変数が最大のデータ型に変換されます。これはプロモーションと呼ばれます。
コード例を使用して暗黙的な変換を理解しましょう。
#include using namespace std; int main() { int num = 10; char ch = 'A'; cout<<'10 + 'A' = '< 出力:
10 + 'A' = 75
float val(10 + ‘a’)= 107
var_int = 1000
上記のコード例は、暗黙的な変換を示しています。それぞれ値10と「A」の整数変数と文字変数を宣言しました。これら2つの変数を合計すると、暗黙的な変換が行われます。
この式では整数が大きい方の型であるため、文字変数値「A」はそれに相当する整数、つまり値65(ASCII値)に変換されます。したがって、式の結果は75です。
次の式では、整数と文字( ‘a’-> 97)を追加し、その結果をfloatに割り当てます。したがって、式の結果は、コンパイラによって暗黙的にfloatに変換されます。
3番目の式では、短いint変数が暗黙的に整数に変換されます。
注意 :暗黙的な変換の場合、コンパイラがデータの潜在的な損失を検出すると、この影響に対する警告が点滅することがあります。
明示的な変換
明示的な変換は、あるデータ型を別のデータ型に「キャスト」するため、「型キャスト」とも呼ばれます。ここでは、コンパイラが内部で変換を実行する暗黙の変換とは異なり、ユーザーはキャストを明示的に定義します。
明示的な変換は、次の2つの方法で実行できます。
#1)代入演算子の使用
ある意味で代入演算子を使用した明示的な変換または型キャストが強制的に実行されます。ここでは、代入演算子を使用して、あるデータ型を別のデータ型にキャストまたは変換します。
一般的な構文は次のとおりです。
(data type) expression;
次の例でこれを説明します。
#include #include using namespace std; int main() { int sum; double salary = 4563.75; sum = (int)salary + 1000; cout<<'Sum = '< 出力:
合計= 5563
Comp = 5563.2
Javaでのクロスサイトスクリプティングの例
上記の例では、代入演算子を使用した明示的なキャストを示しました。まず、double型の変数salaryを整数型にキャストします。次に、整数変数の合計をdouble型にキャストします。
出力に示されているように、キャスト先の型は、式の結果の最終的な型を示します。
これは、ユーザーが要件に応じて式のタイプを変更できるため、有利です。
#2)キャスト演算子の使用
このタイプのキャストでは、単項演算子である「キャスト演算子」を使用して、あるタイプから別のタイプに変更します。
鋳造の種類
使用するキャスト演算子に応じて、次のタイプのキャストがあります。
#1)静的キャスト
静的キャストは、キャスト演算子を使用したすべての型キャストの中で最も単純です。 。 静的キャストは、暗黙的に実行されるすべての変換を実行できます。また、相互に関連するクラスのポインタ間の変換も実行します(アップキャスト->派生からベースへ、またはダウンキャスト->ベースから派生へ)。
上記の変換とは別に、静的キャストは任意のポインターをvoid *に変換することもできます。
静的キャストは、コンパイルされたタイムキャストです。これは、実行されたキャストが有効かどうかを確認するために実行時に行われるチェックがないことを意味します。したがって、変換が安全で有効であることを確認するのはプログラマーの責任です。
言い換えると、ユーザーは、変換されたオブジェクトが宛先データ型に関して完全であることを確認する必要があります。
静的キャストを次のように指定します。
static_cast (expression)
例を使用して静的キャストを理解しましょう。
#include using namespace std; int main() { double df = 3.5 * 3.5 * 3.5; cout<<'Before casting: df = '<上記の例では、値が「A」の文字変数を含めるようにコードを少し変更しました。次に、整数ポインターを宣言し、静的キャストを適用して文字を整数ポインターに変換します。
このプログラムをコンパイルすると、次の出力が得られます。
関数「intmain()」内:
10:35:エラー:タイプ「char *」からタイプ「int *」へのstatic_castが無効です
プログラムは、実行された静的キャストが無効であるため、エラーを出します。したがって、静的キャストでは、有効な型キャストまたは変換のみが許可され、望ましくない型キャストを実行しようとするとエラーが発生します。
#2)ダイナミックキャスト
動的キャストは、キャストの有効性を確認するために実行されるランタイムキャストです。動的キャストは、クラスポインタと参照に対してのみ実行されます。キャストが失敗した場合、式はNULL値を返します。
ダイナミックキャストは、 RTTI(実行時型識別) 。 RTTIは、オブジェクトのデータ型に関するすべての情報を実行時に利用できるようにし、少なくとも1つの仮想関数(ポリモーフィック型)を持つクラスでのみ利用できます。 RTTIを使用すると、実行時または実行時にオブジェクトタイプを決定できます。
ダイナミックキャストを理解するために、1つの例を試してみましょう。
#include #include using namespace std; class base {public: virtual void print(){}}; class derived:public base{}; int main() { base* b = new derived; derived* d = dynamic_cast(b); if(d != NULL) cout<<'Dynamic_cast done successfully'; else cout<<'Dynamic_cast not successful'; }
このプログラムでは、仮想関数を使用するbaseと、基本クラスbaseを使用する派生クラスの2つのクラスを定義しました。
main関数では、基本クラスポインタが指す派生クラスオブジェクトを作成します。次に、派生クラスを指すベースポインターに対してdynamic_castを実行して、派生クラスポインターにキャストします。
基本クラスと同様に、基本はポリモーフィック(仮想関数を含む)であり、dynamic_castは成功します。
注意: 上記のクラスから仮想関数を削除すると、オブジェクトのRTTI情報が利用できなくなるため、dynamic_castは失敗します。
動的キャストには、実行時に型安全性のオーバーヘッドがあります。
#3)キャストを再解釈する
このタイプのキャストは、クラスが相互に関連付けられていない任意のタイプのオブジェクトで機能するため、使用するのが最も危険です。
Reintepret_castは任意のポインターで機能し、ポインターが相互に関連しているかどうかに関係なく、任意のタイプのポインターを他のタイプに変換します。ポインタまたはポインタが指すデータが同じかどうかはチェックされません。
キャスト演算子は、変換するソースポインタという1つのパラメータのみを取り、値を返しません。ポインタ型を変換するだけです。
必要な場合を除いて使用しないでください。通常、ソースポインタを元の型にタイプキャストします。
私たちは主にビットを扱うために使用します。がブール値で使用される場合、ブール値は整数値に変換されます。つまり、trueの場合は1、falseの場合は0に変換されます。
再解釈キャストの例を見てみましょう。
#include using namespace std; int main() { int* ptr = new int(97); char* ch = reinterpret_cast(ptr); cout << ptr << endl; cout << ch << endl; cout << *ptr << endl; cout << *ch << endl; return 0; }
出力:
0x3ef3090
に
97
に
上記の例では、値97を指す整数ポインターptrを宣言しました。次に、文字ポインターchを宣言し、を使用してptrをキャストします。
次に、さまざまな値を出力します。最初に出力するのは、整数の場所を指すptrです。したがって、アドレスを出力します。
次の値chには値97が含まれているため、97に相当するASCIIである「a」が出力されます。次の値「* ptr」は値97を保持し、「* ch」は97に相当するASCIIを保持します。 reinterpret_cast。
#4)Const Cast
キャスト演算子は、ソースポインタの定数を変更または操作するために使用されます。操作とは、constnessを非constポインターに設定するか、constポインターからconstnessを削除することを意味します。
演算子を正常にキャストするための条件は、キャストされるポインターとソースが同じタイプである必要があることです。
これを理解するために例を見てみましょう。
最高の無料のアドウェアとマルウェアの除去
#include using namespace std; int printVal(int* ptr) { return(*ptr*10); } int main(void) { const int value = 10; const int *ptr = &value; int *ptr_cast = const_cast (ptr); cout <<'printVal returned = '<< printVal(ptr_cast); return 0; }
この例では、関数「printVal」が非constポインターを受け入れることがわかります。 main関数では、constポインタptrに割り当てられたconst変数「value」があります。
このconstポインターを関数printValに渡すために、constnessを削除するために適用してキャストします。次に、ポインタptr_castを関数に渡して、目的の結果を取得します。
結論
これで、C ++での型変換のこのトピックをまとめます。 C ++で使用される暗黙的および明示的な変換についてすべて見てきました。
ただし、データの損失やその他の問題を防ぐために、変換または型キャストは、状況によって使用が必要な場合にのみ賢明に適用する必要があることに注意してください。
=> ここで初心者向けC ++トレーニングガイドに注意してください。
推奨読書