程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> [C++基礎]C++4個轉型操作符——數據類型轉換

[C++基礎]C++4個轉型操作符——數據類型轉換

編輯:C++入門知識

  [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=&num;       //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;   }  

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved