CとC++言語の強制型変換Type Cast
3127 ワード
CとC++のタイプ変換の紹介を何度も見たことがありますが、いつも覚えていないので、もう一度言ったときは思い出せません.主にあまり使わないからでしょう.わざわざブログを書いて、まとめてみます.
強制タイプ変換に対応するのは自動タイプ変換です.または、強制タイプ変換を表示タイプ変換、自動タイプ変換を暗黙タイプ変換と呼びます.
自動タイプ変換は、付与演算、混合演算、パラメータ転送、戻り関数戻り値、フォーマット出力の場合、タイプが一致しない場合に発生し、データ長が増加する方向に変換されます.
自動タイプ変換の原則に従ってタイプを変更したくない場合は、強制タイプ変換を使用する必要があります.
C言語の強制型変換
C言語の強制タイプ変換は簡単で、どのタイプの変換でも、変換する変数の前に括弧を付けて、変換するタイプを書きます.
例えば、TYPE b=(TYPE)a
C++言語の強制型変換
C++言語には4種類の強制型変換オペレータがあり,異なる場合の応用に対応している.
static_castは、名前から静的タイプ変換と理解されます.例えばintをcharに変換します.
dynamic_castは、名前から動的タイプ変換と理解されます.たとえば、子と親の間のマルチステートタイプ変換.
const_cast,ネーミングから理解すると変数を除去するconst属性である.
reinterpreter_castは,タイプを再解釈するだけで,バイナリの変換は行わなかった.
4つのオペレータの使用方法は一致しています:TYPE B=static_cast(a)
static_castの使い方
その役割はC言語のタイプ変換と一致し,静的タイプ変換に属する.
dynamic_castの使い方
ベースクラスと派生クラスの間の動的なタイプ変換に主に使用されます.virtualが発生した場合にのみ適用されます.
派生クラスオブジェクトを指すベースクラスポインタpがある場合(これはマルチステートの基礎である).
次に、pが指す派生クラスオブジェクトを指す派生クラスポインタを指定します.
強制タイプ変換を行わないと、コンパイルにエラーが発生します.
static_を使用するとcastは静的変換を行いますが、推奨されません.
dynamic_を使用するとcastはダイナミックに変換します.いいです.これはお勧めの方法です.
ベースクラスオブジェクトを指すベースクラスポインタqがある場合.
派生クラスポインタをqが指すベースクラスオブジェクトに指し示すようにします.
強制タイプ変換を行わないと、コンパイルにエラーが発生します.
static_を使用するとcastが静的変換を行うと,元のベースクラスオブジェクトが派生クラスオブジェクトに拡張されることが分かった.これは私が前に見た資料とは違って、前に見た資料の表示、static_castはベースクラスを拡張しません.
dynamic_を使用するとキャストは動的に変換され、変換が完了するとNULLに戻ります.すなわち、変換が成功しません.
例:
const_castの使い方
constタイプの変数が非const変数に直接割り当てられる場合、タイプ変換は必要ありません.後者は直接非constタイプです.const_castは一般的にconstを指すポインタまたは参照タイプを変換し、constタイプ変数の値を変更できます.
たとえば、
reinterpreter_castの使い方
この強制変換方式は,タイプを再解釈するだけで,実質的なバイナリ変換は行わない.変換のタイプは、ポインタ、参照、算術タイプ、関数ポインタ、またはメンバーポインタでなければなりません.最も一般的な用途は、関数ポインタタイプ間で変換することです.
たとえば、
PS残留問題:
static_でcastがベースクラスポインタを派生クラスポインタに変換したとき,VS 2010での実験結果と見た資料は一致しなかった.研究を続ける.
強制タイプ変換に対応するのは自動タイプ変換です.または、強制タイプ変換を表示タイプ変換、自動タイプ変換を暗黙タイプ変換と呼びます.
自動タイプ変換は、付与演算、混合演算、パラメータ転送、戻り関数戻り値、フォーマット出力の場合、タイプが一致しない場合に発生し、データ長が増加する方向に変換されます.
自動タイプ変換の原則に従ってタイプを変更したくない場合は、強制タイプ変換を使用する必要があります.
C言語の強制型変換
C言語の強制タイプ変換は簡単で、どのタイプの変換でも、変換する変数の前に括弧を付けて、変換するタイプを書きます.
例えば、TYPE b=(TYPE)a
C++言語の強制型変換
C++言語には4種類の強制型変換オペレータがあり,異なる場合の応用に対応している.
static_castは、名前から静的タイプ変換と理解されます.例えばintをcharに変換します.
dynamic_castは、名前から動的タイプ変換と理解されます.たとえば、子と親の間のマルチステートタイプ変換.
const_cast,ネーミングから理解すると変数を除去するconst属性である.
reinterpreter_castは,タイプを再解釈するだけで,バイナリの変換は行わなかった.
4つのオペレータの使用方法は一致しています:TYPE B=static_cast
static_castの使い方
その役割はC言語のタイプ変換と一致し,静的タイプ変換に属する.
dynamic_castの使い方
ベースクラスと派生クラスの間の動的なタイプ変換に主に使用されます.virtualが発生した場合にのみ適用されます.
派生クラスオブジェクトを指すベースクラスポインタpがある場合(これはマルチステートの基礎である).
次に、pが指す派生クラスオブジェクトを指す派生クラスポインタを指定します.
強制タイプ変換を行わないと、コンパイルにエラーが発生します.
static_を使用するとcastは静的変換を行いますが、推奨されません.
dynamic_を使用するとcastはダイナミックに変換します.いいです.これはお勧めの方法です.
ベースクラスオブジェクトを指すベースクラスポインタqがある場合.
派生クラスポインタをqが指すベースクラスオブジェクトに指し示すようにします.
強制タイプ変換を行わないと、コンパイルにエラーが発生します.
static_を使用するとcastが静的変換を行うと,元のベースクラスオブジェクトが派生クラスオブジェクトに拡張されることが分かった.これは私が前に見た資料とは違って、前に見た資料の表示、static_castはベースクラスを拡張しません.
dynamic_を使用するとキャストは動的に変換され、変換が完了するとNULLに戻ります.すなわち、変換が成功しません.
例:
#include<stdio.h>
void main()
{
class Base
{
public:
Base():xxx(5)
{}
int xxx;
virtual void foo()
{}
};
class Derived: public Base
{
public:
Derived():yyy(6)
{}
int yyy;
void fun()
{
printf("fun
");
}
};
Base *p = new Derived();
//Derived *p1 = p; //
//Derived *p1 = static_cast<Derived*>(p);
Derived *p1 = dynamic_cast<Derived*>(p);
Base *q = new Base();
//Derived *q1 = q; //
Derived *q1 = static_cast<Derived*>(q);
//Derived *q1 = dynamic_cast<Derived*>(q); q1 NULL
(*q1).xxx = 100;
(*q1).yyy = 200;
(*q1).fun();
(*q).xxx = 300;
printf("%d %d %d
",(*q).xxx,(*q1).xxx,(*q1).yyy);
}
const_castの使い方
constタイプの変数が非const変数に直接割り当てられる場合、タイプ変換は必要ありません.後者は直接非constタイプです.const_castは一般的にconstを指すポインタまたは参照タイプを変換し、constタイプ変数の値を変更できます.
たとえば、
void main()
{
class A
{
public:
A():xxx(5)
{}
int xxx;
};
const A a;
A &b = const_cast<A&>(a);
b.xxx = 6;
printf("a = %d
",a.xxx);
printf("b = %d
",b.xxx);
}
reinterpreter_castの使い方
この強制変換方式は,タイプを再解釈するだけで,実質的なバイナリ変換は行わない.変換のタイプは、ポインタ、参照、算術タイプ、関数ポインタ、またはメンバーポインタでなければなりません.最も一般的な用途は、関数ポインタタイプ間で変換することです.
たとえば、
#include<stdio.h>
int fun1()
{
printf("fun1
");
return 1;
}
void main()
{
typedef void(*FunPtr)();//
FunPtr a;
//a = &fun1; //
a = reinterpret_cast<FunPtr>(&fun1);
a();
}
PS残留問題:
static_でcastがベースクラスポインタを派生クラスポインタに変換したとき,VS 2010での実験結果と見た資料は一致しなかった.研究を続ける.