一、cast转换什么鬼
cast,造型,就像明星的人设,可以修改,对象的类型,我们也可以对其进行‘造型’,得到我们想要的‘类设’。
二、C++中显式cast的几种方式
static_cast <new_type> (expression)
静态转换,(1)主要用于内置数据类型之间的相互转换;(2)用于自定义类时,静态转换会判断转换类型之间的关系,如果转换类型之间没有任何关系,则编译器会报错,不可转换;(3)把void类型指针转为目标类型指针(不安全)。
//static_cast.cpp
//内置类型的转换
double dValue = 12.12;
float fValue = 3.14; // VS2013 warning C4305: “初始化”从“double”到“float”截断
int nDValue = static_cast<int>(dValue); // 12
int nFValue = static_cast<int>(fValue); // 3
//自定义类的转换
class A{};
class B : public A{};
class C{};
void main(){
A *pA = new A;
B *pB = static_cast<B*>(pA); // 编译不会报错, B类继承于A类
pB = new B;
pA = static_cast<A*>(pB); // 编译不会报错, B类继承于A类
C *pC = static_cast<C*>(pA); // 编译报错, C类与A类没有任何关系。error C2440: “static_cast”: 无法从“A *”转换为“C *”
}
const_cast
有三个作用:1.常量指针 被强转为 非常量指针,且仍然指向原来的对象;2.常量引用 被强转为 非常量引用,且仍然指向原来的对象;3.常量对象 被强转为 非常量对象。
dynamic_cast
(1)dynamic_cast是运行时处理的,运行时要进行类型检查,而其他三种都是编译时完成的;(2)不能用于内置基本数据类型间的强制转换;(3)使用dynamic_cast进行转换时,基类中一定要有虚函数,否则编译不通过;(4)dynamic_cast转换若成功,返回的是指向类的指针或引用;若失败则会返回NULL;(5)在类的转换时,在类层次间进行上行转换时,dynamic_cast和static_cast的效果是一样的。在进行下行转换时,dynamic_cast具有类型检查的功能,比static_cast更安全。向下转换的成败取决于将要转换的类型,即要强制转换的指针所指向的对象实际类型与将要转换后的类型一定要相同,否则转换失败。
reinterpret_cast