C++暗黙変換と表示変換


一、暗黙変換
C++暗黙変換は4つの場合に発生する
*ブレンドタイプの算術式

  
  
  
  
  1. int ival = 3;  
  2. double dval = 3.1415  
  3. ival + dval; //ival  double  :3.0 

*初期化、式の種類による値付け

  
  
  
  
  1. int *pi = NULL; // NULL(0) int*   
  2. int iVap = 3.14;

*関数呼び出しに式を渡す

  
  
  
  
  1. extern double sqrt(double);  
  2. sqrt(2); //2 double : 2.0 

*関数から式を返します.

  
  
  
  
  1. double difference(int ival1, int ival2)  
  2. {  
  3. return ival1 - ival2; // double  .  

*条件式回転boolタイプ
int iVal;
if (iVal){}
C++組み込みタイプ(char,int,short,double etc.)対像間のデフォルトの暗黙的な変換
C++ユーザ定義クラスオブジェクト間には、C++暗黙変換を含むことができる.

  
  
  
  
  1. void dosomething(A aObject);  
  2. class A {  
  3. public:  
  4. A(int x = 0);  
  5. }  
  6. 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(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; }