1. static_cast
a.使用
用于
非多态类型的转换
(静态转换),支持相关类型转换
,不支持不相关类型转换
b.代码
void Test()
{
int i = 10;
double d = static_cast<double>(i);
cout << i << " " << d << endl;
}
2. reinterpret_cast
a.使用
用于将一种类型转换为另一种不同的类型,支持
不相关类型转换
b.代码
void Test2()
{
int i = 10;
int *p = &i;
int j = reinterpret_cast<int>(p);
}
3.const_cast
a.使用
去除const属性
b.代码
void Test3()
{
const int a = 10;
int *p = const_cast<int*>(&a);
}
4.dynamic_cast
a.使用
用于将一个
父类对象的指针转换为子类对象的指针或引用
(动态转换)
向上转型:子类对象的指针->父类指针/引用(不需要转换,隐式转换)
向下转型:父类对象指针->子类指针/引用(安全)
注意
:dynamic_cast只能用于含有虚函数的类
dynamic_cast会先检查是否能转换成功,能成功则转换,不能则返回0
b.代码
class A
{
public:
virtual void f()//如果去掉virtal会报错
{}
};
class B :public A
{};
void fun(A* pa)
{
B *pb1 =static_cast<B*>(pa);
B *pb2 = dynamic_cast <B*>(pa);
cout << "pb1:" << pb1 << endl;
cout << "pb2:" << pb2 << endl;
}
int main()
{
A a;
B b;
fun(&a);
fun(&b);
return 0;
}
结果如下图:
5.explicit关键字
a.使用
explicit关键字
阻止经过转换构造函数进行的隐式转换的发生
b.代码
class A
{
public:
explicit A(int a)
{
cout << "A(int a)" << endl;
}
A(const A& a)
{
cout << "A(const A& a)" << endl;
}
private:
int _a;
};
int main()
{
A a1(1);
A a2 = 1;//报错,隐式转换:A tmp(1);A a2(tmp)
return 0;
}
对以上A a2=1解释:
通常只有一个参数的构造函数可被用于转换(隐式转换)
,上式相当于 A tmp(1),A a2(tmp);,创建了一个临时对象。将构造函数声明为explicit避免隐式转换