类型转换名称和语法
C风格的强制类型转换(TypeCast)很简单,不管什么类型的转换统统是:
TYPE b =(TYPE)a
C++风格的类型转换提供了4种类型转换操作符来应对不同场合的应用。
static_cast 静态类型转换。如int转换成char
reinterpreter_cast 重新解释类型
dynamic_cast 命名上理解是动态类型转换。如子类和父类之间的多态类型转换。
const_cast, 字面上理解就是去const属性。
4种类型转换的格式:
TYPE B = static_cast<TYPE> (a)
void main01()
{
double dpi = .1415926;
int num1 = (int)dpi;//C语言类型转换
int num2 = static_cast<int>(dpi);//静态类型转换,编译时C++编译器会做类型检查
int num3 = dpi;//c语言中 隐式类型转换的地方均可使用static_cast<>进行类型转换
char *p1 = "hello......";
int *p2 = NULL;
//p2 = static_cast<int*>(p1);//使用static_cast,编译器编译时,会做类型检查,若有错误提示错误
p2 = reinterpret_cast<int*>(p1);//若不同类型之间,进行强制类型转换,用reinterpret_cast<>() 进行重新解释
cout << p1 << endl;//输出hello......
cout << p2 << endl;//输出011ECC70 p2的地址
//总结:通过reinterpret_cast<>()和static_cast<>()把C语言的强制类型转换 都覆盖了
}
向下类型转换:
class Tree{};
class Animal
{
public:
virtual void cry() = 0;
private:
};
class Dog:public Animal
{
public:
virtual void cry()
{
cout << "旺旺" << endl;
}
void doHome()
{
cout << "看家" << endl;
}
};
class Cat :public Animal
{
public:
virtual void cry()
{
cout << "喵喵" << endl;
}
void doThing()
{
cout << "抓老鼠" << endl;
}
};
void playObj(Animal *base)
{
base->cry();//1.有继承 2.有虚函数重写 3.有父类指针指向子类对象 所以会发生多态
//能识别子类对象
//dynamic_cast 运行时类型识别 RIIT
Dog *pDog = dynamic_cast<Dog*>(base);
if (pDog != NULL)
{
pDog->doHome();//让狗能做自己特有的工作
}
Cat *pCat = dynamic_cast<Cat*>(base);
if (pCat != NULL)
{
pCat->doThing();//父类对象===>子类对象 即向下转型
}
}
void main02()
{
Dog d1;
Cat c1;
Animal *pBase;
pBase = &d1;
pBase = static_cast<Animal*>(&d1);//让C++编译器在编译的时候进行类型检查
//强制类型转换
pBase = reinterpret_cast<Animal*>(&d1);
{
Tree t1;
//pBase = static_cast<Animal*>(&t1);//发现毫无半毛钱关系,会报错,C++编译器会做类型检查
pBase = reinterpret_cast<Animal*>(&t1);//reinterpret_cast 重新解释,会做强制类型转换
}
playObj(&d1);
playObj(&c1);
}
去const属性:
void printBuf(const char *p)
{
//p[0]='Z';//会报错
char *p1 = NULL;//程序员要清楚知道 变量转换之前是啥类型,转换之后是啥类型
p1 = const_cast<char*>(p);//const char *===>char * 把只读属性去掉
p1[0] = 'Z';//通过p1去修改了内存空间
cout << p << endl;
}
void main()
{
char buf[] = "aaaaaaaaaaaaaaafffff";
printBuf(buf);
{
//程序员要确保p所指向的内存空间确实能修改,如果不能会带来灾难性后果,如:
//char *myp = "aaaaaaaaaaaaaaffffffff";
//printBuf(myp); //运行时程序会崩溃
}
}