当前位置:编程学习 > C/C++ >>

[C++基础]C++4个转型操作符——数据类型转换

 
[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;  
}  
补充:软件开发 , C++ ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,