在C语言中我们学习过隐式类型转换(相关类型),以及显示的强制类型转换(不相关类型)
void test()
{
int i = 1;
double d = i;//隐式类型的转换(相关类型)
printf("%d,%.f\n", i, d);
int *p = &i;
int address = (int)p;//显示的强制类型转换(不相关类型)
printf("%x,%d\n", p, address);
}
C++强制类型的转换有四种
1.static_cast------------用于非多态类型的转化(用于相关类型,不能用于不相关类型)相当于我们C语言所学的隐式类型转换
void test2()
{
int i = 1;
double d = static_cast<double>( i);//注意要给i带括号
printf("%d,%.2f", i, d);
}
2.reinterpret_cast-----------用于不同类型间的类型转换,相当于C语言中的强制类型转换
typedef void(*FUNC)();
int Dosomething(int i)
{
cout << "Do Something" << endl;
return 0;
}
void test2()
{
FUNC f = reinterpret_cast<FUNC>(Dosomething);
f();
}
3.const_cast 删除变量的const属性
先看一个知识点,与此无关
void test3()
{
//const int a = 2;
//int *p =(int *) &a;
//*p = 3;
//cout << a << endl;//2 a被修改了,但编译器优化,在寄存器中取值
//cout << *p << endl;//3
//
volatile const int a = 2;
int *p = (int *)&a;
*p = 3;
cout << a << endl;//3 a被修改,加上volatile不让编译器优化,保证内存的可见性
cout << *p << endl;//3
}
const int a = 2;
int *p = const_cast<int *>(&a);//不用强转,const类型指针都可以付给非const 类型
*p = 3;
cout << a << endl;//2
cout << *p << endl;//3
4.dynamaic_cast-------------用于将一个父类对象的指针转换为子类对象的指针,或引用(动态转换)
向下转型:
向上转型:子类对象的指针---------------》父类对象的指针/引用(不需要转换)
向下转型:父类对象指针-----------------》子类对象指针/引用(用dynamic_cast转型是安全的)
1.dynamic_cast只能用于含有虚函数的类
2.dynamic_cast会先检查能否转换成功,能成功转换,不能成功返回0;
class A
{
public:
virtual void f()
{}
};
class B:public A
{
};
void func(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;
func(&a);
func(&b);
system("pause");
return 0;
}
explicit关键字阻止单参数构造函数进行的隐式转换的发生。