强制类型转换
1. static_cast2. dynamic_cast3. const_cast4. reinterpret_cast5. 为什么要需要四种类型转换?
1. static_cast
实现C++种内置基本数据类型之间的相互转换,不能用于两个不相关类型进行转换。
例如:将整形数据转换为浮点型
c语言方式
int a = 8;
int b = 3;
double result = (double)a / (double)b;
C++方式
int a = 8;
int b = 3;
double result = static_cast
格式如下:
static_cast<类型>(变量表达式)
应用场景:
用于类层次结构中基类和派生类之间引用或指针的转换。 进行上行转换(把派生类的指针或引用转换成基类表示)是安全的。 进行下行转换(把基类的指针或引用转换成派生类表示),由于没有动态类型检查,不安全。用于基本数据类型之间的转换把空指针转换成目标类型的空指针把任何类型的表达式转换成void类型
2. dynamic_cast
用于将一个父类对象的指针/引用转换为子类对象的指针或引用(动态转换)。
dynamic_cast< type_id >(expression)
type_id 必须是类的指针、类的引用或者void*。主要用于类层次间的上行转换和下行转换,还可以用于类之间的交叉转换。dynamic_cast只能用于含有虚函数的类;进行上行转换的时候,与static_cast 的作用一样。下行转换的时候,具有类型检查的功能,比static_cast更安全。dynamic_cast会先检查是否能转换成功,如果能则转换,不能则返回0。
class B
{
public:
int m_iNum;
virtual void foo();
};
class D : public B
{
public:
char *m_szName[100];
};
void func(B *pb)
{
D *pd1 = static_cast(pb);
D *pd2 = dynamic_cast(pb);
}
如果pb指向一个D类型的对象,pd1 和 pd2 是一样的,并且这两个指针执行D类型的任何操作都是安全的。
如果指向B的对象,那么pd1将是一个指向该对象的指针,对它进行D类型的操作是不安全的。pd2将是一个空指针。
B要有虚函数:
这是由于运行时类型检查需要运行时类型信息,而这个信息存储在类的虚函数表中,只有定义了虚函数的类才有虚函数表,没有定义虚函数的类是没有虚函数表的。
3. const_cast
c语言中,const是用来限定变量,表示该变量的值不能更改。
const_cast 是用来强制去掉这种不能被修改的常数特性。不是去除变量的常量性,而是去除指向常数对象的指针或引用的常量性,对象必须为指针或引用。
const_cast
用来修改类型的const或volatile属性。
常量指针被转化成非常量指针,并且仍然指向原来的对象; 常量引用被转换成非常量引用,并且仍然指向原来的对象;常量对象被转换成非常量对象。
include
using namespace std;
int main()
{
const int a = 10;
const int * p = &a;
int *q;
q = const_cast
*q = 20; //fine
