C++の表示変換

2230 ワード

静的変換(static_cast)
 static_castはすべて、コンパイラが強制的に変換しない「安全」な変換と安全でない変換を許可することを含む明確に定義された変換に使用されます.
しかし定義された変換、static_castに含まれる変換タイプには、典型的な非強制変換、狭窄(情報損失あり)変換、
void*の強制変換、暗黙型変換、クラス階層の静的位置決めを使用します.
例:
#include<iostream>
using namespace std;
int fun(int x){}
int main()
{
	int i=0x7fff;
	long l;float f;
	// int   long,float       
	l=i;f=i;
	l=static_cast<long>(i);
	f=static_cast<float>(i);
	//    ,          
	i=l;i=f;
	char c=static_cast<char>(i);
	void* p=&i;
	float* fp=(float*)p;
	fp=static_cast<float*>(p);
	double d=0.0;
	int x=d;
	x=static_cast<int>(d);
	fun(d);
	fun(static_cast<int>(d));
	return 0;
}

定数変換(const_cast)
constから非constに変換する場合、またはvolatileから非volatileに変換する場合はconst_を使用します.cast.これはconst_キャスト一意
許可された変換は、別の変換を行う場合に個別の式を使用するか、コンパイルエラーが発生する可能性があります.
constオブジェクトのアドレスを取得すると、constへのポインタを生成することができ、変換しなくても非に付与できません.
constポインタの.
#include<iostream>
using namespace std;
int main()
{
	const int i=0;
	int* j=(int*)&i;
	j=const_cast<int*>(&i);
	volatile int k=0;
	int* u=const_cast<int*>(&k);
	return 0;
}

再解釈変換(reinterpret_cast)
これは最も安全ではない変換メカニズムであり、最も問題が発生する可能性が高い.reinterpret_キャストはオブジェクトをパターンにして、彼が
まったく異なるタイプのオブジェクト.これは低レベルのビット操作です.reinterpret_を使用キャストは何をする前に、実際にはいつも必要です.
reinterpret_castは元のタイプに戻る(または変数を元のタイプと見なす)
#include<iostream>
using namespace std;
const int sz=100;
struct X{int a[sz];};
void print(X* x)
{
	for(int i=0;i<sz;i++)
		cout<<x->a[i]<<' ';
	cout<<endl<<"---------------"<<endl;
}
int main()
{
	X x;
	print(&x);
	int* xp=reinterpret_cast<int*>(&x);
	for(int* i=xp;i<xp+sz;i++)
		*i=0;
	print(reinterpret_cast<X*>(xp));
	print(&x);
	return 0;
}
この例ではstruct Xは1つの整数配列しか含まれていないが、X xでスタックに変数を作成すると、構造体の各整数変数の値が
いずれも意味がありません(関数print()を使用して構造体の各整数値を表示することでこれを示すことができます).彼らを初期化するために、
xのアドレスを整数ポインタに変換し、その後、この配列を巡り、配列の各値を0にする.
reinterpret_castの考え方は、使用する必要がある場合、得られたものはすでに異なり、再びタイプの元の目的に使用できないことです.
変換してreinterpretを使いますcastは通常、賢明ではなく、不便なプログラミング方法ですが、それを使用しなければならない場合は非常に役に立ちます.