C++暗黙変換と表示変換
一、暗黙変換
C++暗黙変換は4つの場合に発生する
*ブレンドタイプの算術式
*初期化、式の種類による値付け
*関数呼び出しに式を渡す
*関数から式を返します.
*条件式回転boolタイプ
int iVal;
if (iVal){}
C++組み込みタイプ(char,int,short,double etc.)対像間のデフォルトの暗黙的な変換
C++ユーザ定義クラスオブジェクト間には、C++暗黙変換を含むことができる.
二、表示変換
1、静的変換(static_cast)static_castに含まれる変換タイプは、典型的な非強制変換、狭窄(情報損失あり)変換、void*を用いた強制変換、暗黙的タイプ変換、クラス階層の静的位置付けである.static_castはコンパイラによって許容される.(1)典型的な非強制変換:charからshort int,int,intなどの狭窄タイプから広いタイプへの変換、long int,float,double,long doubleの変換.char a = 1; long b = static_cast(a); (2)狭窄変換:第1種とは反対に広いタイプから狭いタイプへの変換.long b = 1; char a = static_cast(b); (3)void*を使用した強制変換:struct callback_param { void *vp; }; int a = 1; struct callback_param cp; cp.vp = &a;//コンパイラは任意のタイプのポインタからvoid*にint*ip=static_を変換できます.cast(cp.vp); (4)暗黙型変換:(1)(2)(5)クラス階層の静的位置を含めてアップ型変換(派生クラスからベースクラスへの変換)を行う場合、コンパイラはどの祖先クラスから派生したのかを明らかにし、マルチ継承(マルチ継承変換後は元のアドレスではない可能性があり、ポインタはクラス階層で調整される).2、定数変換(const_cast)constから非constに変換し、volatileから非volatileに変換します.constオブジェクトのアドレスを取得すると、constを指すポインタが生成されます.volatileは同じです.const int i=0;int*ip=const_cast(&i); volatile int a = 0; int *ap = const_cast(&a); 3、変換(reinterpret_cast)の最も安全でない変換メカニズムを再解釈し、オブジェクトを全く異なるタイプのオブジェクトに変換する.これは低級なビット操作である.struct msg_hdr{int msg_type;int msg_len;char msg_data[0];} struct msg_data { int data1; int data2; }; struct msg_hdr *p = reinterpret_cast(recvbuf); struct msg_data *pdata = reinterpret_cast(p->msg_data); 4、動的変換(dynamic_cast)クラス階層のダウンコンバート(ベースクラスから派生クラスへの変換)は、変換中にRTTIで変換タイプが正常かどうかをチェックし、正常でないと空に戻ります.#includeusing namespace std;class pet{public:virtual~pet(){};class dog : public pet { }; class cat : public pet { }; int main(void) { pet *b = new cat; dog *d1 = dynamic_cast(b); cat *d2 = dynamic_cast(b); cout << "d1 = "<< (long)d1 << endl; //d1 = 0 cout << "d2 = "<< (long)d2 << endl; }
C++暗黙変換は4つの場合に発生する
*ブレンドタイプの算術式
- int ival = 3;
- double dval = 3.1415
- ival + dval; //ival double :3.0
*初期化、式の種類による値付け
- int *pi = NULL; // NULL(0) int*
- int iVap = 3.14;
*関数呼び出しに式を渡す
- extern double sqrt(double);
- sqrt(2); //2 double : 2.0
*関数から式を返します.
- double difference(int ival1, int ival2)
- {
- return ival1 - ival2; // double .
- }
*条件式回転boolタイプ
int iVal;
if (iVal){}
C++組み込みタイプ(char,int,short,double etc.)対像間のデフォルトの暗黙的な変換
C++ユーザ定義クラスオブジェクト間には、C++暗黙変換を含むことができる.
- void dosomething(A aObject);
- class A {
- public:
- A(int x = 0);
- }
- dosomething(20); // Ok
二、表示変換
1、静的変換(static_cast)static_castに含まれる変換タイプは、典型的な非強制変換、狭窄(情報損失あり)変換、void*を用いた強制変換、暗黙的タイプ変換、クラス階層の静的位置付けである.static_castはコンパイラによって許容される.(1)典型的な非強制変換:charからshort int,int,intなどの狭窄タイプから広いタイプへの変換、long int,float,double,long doubleの変換.char a = 1; long b = static_cast