标签: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
标签:static_cast<>() const_cast<>() dynamic_cast<>() reinterpret_cast<>()
原文地址:http://wait0804.blog.51cto.com/11586096/1876440