网站建设原因,邯郸网站建设的地方,北京seo平台,网站底部源码类型转换const_cast、reinterpret_cast、dynamic_cast、static_cast const_castreinterpret_castdynamic_caststatic_cast const_cast
被const修饰的函数可以被访问#xff0c;但是不能被修改成员变量 const_cast可以去掉const
#include iostream
using namespace s… 类型转换const_cast、reinterpret_cast、dynamic_cast、static_cast const_castreinterpret_castdynamic_caststatic_cast const_cast
被const修饰的函数可以被访问但是不能被修改成员变量 const_cast可以去掉const
#include iostream
using namespace std;class FHello
{
public:FHello();void Init();/*const*/
private:int a;int b;float c;
};
FHello::FHello()
{a 0;b 10;c 20.f;
}
void FHello::Init()/*const*/
{auto Hello_a [](){cout a endl;};auto Hello_b []()-bool{cout b endl;return true;};Hello_a();if (bool bHello Hello_b()){cout true endl;}else{cout false endl;}
}
int main()
{const FHello* HelloTest new FHello();//HelloTest-Init();因为HelloTest被const修饰了而上面代码中没有用const修饰//用const_cast去掉constFHello* Test const_castFHello*(HelloTest);Test-Init();//编译出错会返回NULL//c风格的强转是万能强转//容易出问题万一转换失败了变成野指针了也不知道少用FHello* NewTest (FHello*)HelloTest;NewTest-Init();delete HelloTest;return 0;
}
reinterpret_cast
把指针转换成int也可以把int转成指针也可以指针转换成指针
#include iostream
using namespace std;class FHello
{
public:FHello();void Init();/*const*/
private:int a;int b;float c;
};
FHello::FHello()
{a 0;b 10;c 20.f;
}
void FHello::Init()/*const*/
{auto Hello_a [](){cout a endl;};auto Hello_b []()-bool{cout b endl;return true;};Hello_a();if (bool bHello Hello_b()){cout true endl;}else{cout false endl;}
}
int main()
{//const_castconst FHello* HelloTest new FHello();FHello* Test const_castFHello*(HelloTest);Test-Init();FHello* NewTest (FHello*)HelloTest;NewTest-Init();//reinterpret_cast//reinterpret_cast,先转换成int再转换成指针int a reinterpret_castint(NewTest);FHello*b reinterpret_castFHello*(a);b-Init();//也可以转换成int*指针也可以转换回来int* a2 reinterpret_castint*(NewTest);FHello* b2 reinterpret_castFHello*(a2);b2-Init();//可以转换成float*指针但是不可以用float类型float* a3 reinterpret_castfloat*(NewTest);FHello* b3 reinterpret_castFHello*(a3);b3-Init();delete HelloTest;return 0;
}dynamic_cast
动态的转化可以向上转化也可以向下转化 向上转化和向下转化的意思是在数层的继承关系中可以向父类或派生类进行转化 向下转换时会进行类型检测如果类型无法转换回返回NULL。是一个比较安全的转换 接口父类必须有虚函数否则会报错
#include iostream
using namespace std;class FHello
{
public:FHello();virtual ~FHello();void Init();/*const*/
private:int a;int b;float c;
};
FHello::FHello()
{a 0;b 10;c 20.f;
}
FHello::~FHello() {}
void FHello::Init()/*const*/
{auto Hello_a [](){cout a endl;};auto Hello_b []()-bool{cout b endl;return true;};Hello_a();if (bool bHello Hello_b()){cout true endl;}else{cout false endl;}
}class FHello1:public FHello
{
public:void Hello1temp() {}
private:int a;
};class FHello2 :public FHello1
{};int main()
{//const_castconst FHello* HelloTest new FHello();FHello* Test const_castFHello*(HelloTest);Test-Init();FHello* NewTest (FHello*)HelloTest;NewTest-Init();//reinterpret_castint a reinterpret_castint(NewTest);FHello*b reinterpret_castFHello*(a);b-Init();int* a2 reinterpret_castint*(NewTest);FHello* b2 reinterpret_castFHello*(a2);b2-Init();float* a3 reinterpret_castfloat*(NewTest);FHello* b3 reinterpret_castFHello*(a3);b3-Init();//dynamic_castFHello* h1 new FHello1();//这一步也是向上转换//向下转换FHello1* A dynamic_castFHello1*(h1);A-Hello1temp();//向上转换,用的少因为有更简单的方法如上FHello* B dynamic_castFHello*(A);B-Init();FHello* B2 A;//进行隐式转换FHello2* FHA2 dynamic_castFHello2*(h1);//转换失败输出NULLif (FHA2){}delete HelloTest;delete h1;return 0;
}static_cast
可以向上转化也可以向下转化 向下转换时不安全 static_cast不可以转换const、volitale、_unaligned
static_cast和dynamic_cast相比static_cast可以没有虚函数而dynamic_cast必须有虚函数
格式
FHello* Astatic_castFHello*(B);