C++的四种类型转换
1. const_cast
const int* pConstNum = #
int* pNum = const_cast<int*>(pConstNum);
cout << *pNum; //1
*pNum = 4;
cout << *pNum;//4
从上面代码可以看到,我们实现了修改一个常量指针的内容(常量指针就是一个指向常量的指针,内容不能修改,可以修改指向)
const_cast的作用就是将常量指针转换为普通的指针
2. static_cast
//基础数据类型之间的转换
int a = 65;
char ch = static_cast<char>(a);
cout << ch;//A
//父类和子类之间的转换,子类转父类是安全的,父类转子类是不安全的
//自行脑补代码
类似与C语言的强制类型转换,可以用在基础数据类型之间的转换和父类和子类之间的转换 父类指针和子类指针之间的转换最好使用dynamic_cast.
3. dynamic_cast
Base* pb = new Sub();
Sub* ps1 = static_cast<Sub*>(pb); //子类->父类,静态类型转换,正确但不推荐
Sub* ps2 = dynamic_cast<Sub*>(pb); //子类->父类,动态类型转换,正确
Base* pb2 = new Base();
Sub* ps21 = static_cast<Sub*>(pb2); //父类->子类,静态类型转换,危险!访问子类_name成员越界
Sub* ps22 = dynamic_cast<Sub*>(pb2);//父类->子类,动态类型转换,安全,但结果为NULL
用于含有虚函数的基类指针和子类指针之间的转换
#include "stdafx.h"
#include<iostream>
#include <math.h>
#include <algorithm>
using namespace std;
class A
{
public:
int a = 1;
virtual void f()
{
}
};
class B:public A
{
public:
int b = 2;
};
int _tmain(int argc, _TCHAR* argv[])
{
A*pA = new A();
B*pB = new B();
B* ppB = static_cast<B*>(pA);
cout<<ppB->b; //ppB不安全,访问到了不能访问的地址
B* pppB = dynamic_cast<B*>(pA); //如果A类没虚函数,这里pA会报错
cout << pppB->b; //pppB为空指针
return 0;
}
4.reinterpret_cast
重新解释,几乎什么都能转,但是可能会出问题。 例如,将int转完int*,然后再转回int,值没有发生变化。