[cpp] //用法形式都是:xxx_cast<type>(express) #pragma once #include <string> #include <iostream> #include <conio.h> using namespace std; //static_cast:基本擁有與C舊式轉型相同的威力與意義,以及相同的限制。它用的最多,主要是在基本類型之間的轉換 void test1() { int first=23,second=31; double res=(double)first/second; //舊式C語法 double res2=static_cast<double>(first)/second;//新式C++轉型符 cout<<res<<" "<<res2<<endl;// 0.741935 0.741935 // char* str="789"; // cout<<static_cast<int>(str)<<endl;//error:無法從char*轉換為int } //const_cast:用來去掉表達式中的常量性(constness),常量屬性多體現在指針和引用,因為如果沒有指針和引用,就不存在不小心修改了不能修改的數據。 void test2() { int num=123; const int* pNum=# //int* pNum1=pNum;//errer:cannot convert from 'const int*' to 'int*' int* pNum2=(int*)pNum; //舊式C int* pNum3=const_cast<int*>(pNum);//新式C++ const_cast移除常量性 } //dynamic_cast:用來執行繼承體系中“安全的向下轉型或跨系轉型動作“,就是子類對象指針轉化為父類對象指針。可以利用dynamic_cast將指向base classObject的pointer或reference轉型為指向derived classObject的pointer或reference,如果轉型失敗,會以一個null指針(轉換的是pointer的話)或一個exception表現出來(轉換的是reference的話) class B{public:virtual void fun(){cout<<"B.fun()"<<endl;}}; class D1:public B{public:void fun(){cout<<"D1.fun()"<<endl;}void fun2(){cout<<"D1.fun2()"<<endl;}}; class D2:public B{public:void fun(){cout<<"D2.fun()"<<endl;}void fun3(){cout<<"D2.fun3()"<<endl;}}; void test3() { //父類指針轉換為子類指針時,父類要有虛函數 B* pb=new D2(); //pb->fun();//D2.fun() D1* pd1=dynamic_cast<D1*>(pb); if(pd1)pd1->fun2();//D2.fun() D2* pd2=dynamic_cast<D2*>(pb); if(pd2)pd2->fun3();//D2.fun3() //子類指針轉換為父類指針,不需要虛函數 class CBase{};//基類 class CDerived : public CBase{};//繼承類 CDerived dc; CDerived* dp=&dc; CBase* cc1=dp;//老式:子類指針轉換為父類指針,即父類指針指向子類對象 CBase* cb1=dynamic_cast<CBase*>(dp);//使用dynamic_cast將指向繼承類的指針轉化為指向基類的指針 printf("point: %d, %d, %d, %d",dp,cc1,cb1,&dc);//它們的地址相同,說明它們在內存中是同一個地址;即子類指針轉換為父類指針,父類的地址指向子類的地址,且是相同的。 CBase& cc2=dc; CBase& cb2=dynamic_cast<CBase&>(dc);//使用dynamic_cast將指向繼承類的引用轉化為指向基類的引用 } //reinterpret_cast:最常用的用途是轉化"函數指針"類型 typedef void (*funcPtr)();//funcPtr是個無參數返回值為void型的函數指針類型 int iFunc(){return 0;}//iFunc為一個無參數返回值為int的函數 void func(funcPtr f){}//func函數的參數是一個類型為funcPtr類型的函數指針 void test4() { //func(iFunc);//errer:不能將參數1從"int(_cdecl*)(void)"轉換為"funcPtr";iFunc函數若是void iFunc(){};就行了 func(reinterpret_cast<funcPtr>(iFunc));//reinterpret_cast將返回值為int的函數轉化為返回值為void的函數。但是傳入的參數一定要相同 } void test(char t) { cout<<"press key====="<<t<<endl; switch (t) { case '1':test1();break; case '2':test2();break; case '3':test3();break; case '4':test4();break; case 27: case 'q':exit(0);break; default: cout<<"default "<<t<<endl;break; } } int main() { while(1) { test(getch()); } return 0; }