型変換とは何ですか?型キャストとは何ですか?
それぞれをいつ使用する必要がありますか?
詳細: これが明白な質問である場合は申し訳ありません。Ruby のバックグラウンドから来て、などに慣れている C++ はto_s
初めてto_i
です。
型変換とは何ですか?型キャストとは何ですか?
それぞれをいつ使用する必要がありますか?
詳細: これが明白な質問である場合は申し訳ありません。Ruby のバックグラウンドから来て、などに慣れている C++ はto_s
初めてto_i
です。
変換とは、値が別の型に変換されることです。結果はターゲット タイプの値であり、(ソース タイプの) どの入力からどの出力値が得られるかについてのルールがあります。
例えば:
int i = 3;
unsigned int j;
j = i; // the value of "i" is converted to "unsigned int".
結果はmoduloにunsigned int
等しい値であり、この規則は言語の一部です。したがって、この場合、値 (英語) はまだ「3」ですが、3 の符号付き int 値とは微妙に異なる 3 の unsigned int 値です。i
UINT_MAX+1
変換は自動的に行われることに注意してください。unsigned int 値が必要な位置で signed int 値を使用しただけであり、実際に変換しているとは言わなくても、言語がその意味を定義します。これは「暗黙の変換」と呼ばれます。
「キャスト」は明示的な変換です。
例えば:
unsigned int k = (unsigned int)i;
long l = long(i);
unsigned int m = static_cast<unsigned int>(i);
すべてキャストです。具体的には、標準の 5.4/2 に従ってキャスト式k
を使用し、5.2.3/1 に従って同等のものを使用します (別の型を使用したことを除いて)。は「型変換演算子」( ) を使用しますが、標準の他の部分でもそれらを「キャスト」と呼んでいます。l
m
static_cast
ユーザー定義型は、型を別の型に変換するための特定の規則を提供する「変換関数」を定義でき、単一引数のコンストラクターも変換で使用されます。
struct Foo {
int a;
Foo(int b) : a(b) {} // single-arg constructor
Foo(int b, int c) : a(b+c) {} // two-arg constructor
operator float () { return float(a); } // conversion function
};
Foo f(3,4); // two-arg constructor
f = static_cast<Foo>(4); // conversion: single-arg constructor is called
float g = f; // conversion: conversion function is called
古典的なキャスト (C のようなもの(Bar)foo
で、C++ で とともに使用されるreinterpret_cast<>
) は、変数の実際のメモリ内容が異なる型の変数であると想定される場合です。型変換 (つまり、型を変換する Boostlexical_cast<>
やその他のユーザー定義関数) は、整数から文字列へのように、実際に変数をある型から別の型に変換するために何らかのロジックが実行されるときです。指定された整数。
継承で使用される静的および動的キャストもあります。たとえば、子の型で親のメンバー関数の使用を強制する ( dynamic_cast<>
)、またはその逆 ( static_cast<>
)。静的キャストを使用すると、次のような場合に発生する典型的な「暗黙の」型変換を実行することもできます。
フロート f = 3.14; int i = f; //小数部を削除して int に変換された float
次のように書き換えることができます。
フロート f = 3.14; int i = static_cast<int>(f); //同じこと
C++ では、すべての式に型があります。別の型 (たとえば型 D) の値が必要なコンテキストで、ある型 (たとえば型 S) の式を使用すると、コンパイラは式を型 S から型 D に変換しようとします。存在しない場合、エラーになります。単語型キャストは標準ではありませんが、変換と同じです。
例えば
void f(int x){}
char c;
f(c); //c is converted from char to int.
コンバージョンはランク付けされており、Google でpromotions vs. conversions
詳細を確認できます。
C++static_cast
には、 、 、 const_cast
、reinterpret_cast
およびdynamic_cast
の 5 つの明示的なキャスト演算子があります。C-style cast
型変換は、文字列を整数に、またはその逆など、実際に型を別の型に変換する場合です。型キャストは、メモリの実際の内容は変更されませんが、コンパイラはそれを別の方法で解釈します.
型キャストは、メモリ ブロックの扱いが異なることを示します。
int i = 10;
int* ip = &i;
char* cp = reinterpret_cast<char*>(ip);
if ( *cp == 10 ) // Here, you are treating memory that was declared
{ // as int to be char.
}
型変換は、値をある型から別の型に変換していることを示します。
char c = 'A';
int i = c; // This coverts a char to an int.
// Memory used for c is independent of memory
// used for i.