码迷,mamicode.com
首页 > 编程语言 > 详细

C++中四种类型装换

时间:2016-11-25 14:43:53      阅读:191      评论:0      收藏:0      [点我收藏+]

标签:static_cast<>()   const_cast<>()   dynamic_cast<>()   reinterpret_cast<>()   

1、类型转换

  static_cast<>():静态类型转换,编译时C++编译器会做类型检查,在C语言中,隐式类型转换的地方,均可以使用static_cast<>()进行类型转换;

  reinterpret_cast<>():强制类型转换;编译器重新解释;

  dynamic_cast<Cat *>(base):父类对象===>子类对象,向下转型,一般用在继承中;

  const_cast<>():const char *---> char *,把常量属性去掉;

(1)、代码如下:

#include<iostream>
using namespace std;

class Animal{
    public:
        virtual void cry() = 0;
};

class Dog : public Animal{
    public:
        virtual void cry(){
            cout<<"汪王"<<endl;
        }   
        void doHome(){
            cout<<"看家"<<endl;
        }   
    private:

};

class Cat : public Animal{
    public:
    virtual void cry(){
        cout<<"喵喵"<<endl;
    }   
    void doThing(){
        cout<<"抓老鼠"<<endl;
    }
    private:
};

void playObj(Animal *base){
    base->cry();   //1、有继承 2、有虚函数的重写 3、有父类指针指向子类对象; ===>发生多态
    //dynamic_cast能识别子类对象,运行时类型识别;
    Dog *pDog = dynamic_cast<Dog *>(base);  //是自己类型的,将转换成功,否则返回为NULL;
    if(pDog){
        pDog->doHome();   //让狗做自己特有的工作;
    }
    Cat *pCat = dynamic_cast<Cat *>(base);//父类对象===>子类对象,向下转型;
    if(pCat){
        pCat->doThing();   //让猫做自己特有的工作;
    }
}

int main(void){
    Dog d1;
    Cat c1;

    playObj(&d1);
    playObj(&c1);

    //Animal *base = NULL;     
    //base = static_cast<Animal *>(&d1);

    return 0;
}
/*
int main(void){
    double pi = 3.14;

    int num2 = static_cast<int>(pi); //静态类型转换,编译时C++编译器会做类型检查,在C语言中,隐式类型转换
的地方,均可以使用static_cast<>()进行类型转换;

    char *p1 = "abcdef";
    int *p2 = NULL;
    //p2 = static_cast<int*>(p1); //使用static_cast,编译器编译时,会做类型检查,若有错误,提示错误;
    p2 = reinterpret_cast<int *>(p1);// 强制类型转换;编译器重新解释
    cout<<p1<<endl;
    cout<<p2<<endl; //%d

    return 0;
}

*/

运行结果:

技术分享


(2)、针对const_cast<char *>(p)的类型转换代码:

#include<iostream>
using namespace std;

void printBuf(const char *p){
    //p[1] = ‘1‘;
    char *p1 = NULL;
    p1 = const_cast<char *>(p);//const char *---> char *,把常量属性去掉;
    p1[0] = ‘Z‘;
    cout<<p<<endl;
}

int main(void){
    const char buf[] = "abcdefg";
    //程序员要确保p所指向的空间确实能修改,如果不能修改将会带来灾难性的后果;
    //const char *buf = "abcdef";//会发生断错误;因为其所指向的空间本身不可修改
    printBuf(buf);

    return 0;
}

运行结果:

技术分享




本文出自 “wait0804” 博客,请务必保留此出处http://wait0804.blog.51cto.com/11586096/1876440

C++中四种类型装换

标签:static_cast<>()   const_cast<>()   dynamic_cast<>()   reinterpret_cast<>()   

原文地址:http://wait0804.blog.51cto.com/11586096/1876440

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!