1.static_cast
static_cast 用于内置类型的数据类型
还有具有继承关系的指针或者引用
2.dynamic_cast
结论 dynamic 只能转换具有继承关系的指针或引用,并且
只能由子类型转换成基类型
3.const_cast
指针 引用或者对象指针
增加或者去除变量的 const 属性
4.reinterpret_cast
强制类型转换
无关的指针类型都可以进行转换
#include<iostream>
using namespace std;
class Building{};
class Animal{};
class Cat:public Animal{};
//static_cast
void test01() {
int a = 97;
char c = static_cast<char>(a);
cout << c << endl;
//基础数据类型指针 转换失败
//int* p = NULL;
//char* sp = static_cast<char*>(p);
//对象指针 转换失败
//Building* building = NULL;
//Animal* animal = static_cast<Animal*>(building);
//转换具有继承关系的对象指针
//父类指针转换成子类指针
Animal* ani = NULL;
Cat* cat = static_cast<Cat*>(ani);
//子类转换成父类
Cat* cat2 = NULL;
Animal* mal = static_cast<Animal*>(cat2);
Animal aniobj;
Animal& aniref = aniobj;
Cat& cat3 = static_cast<Cat&>(aniref);
//结论
//static_cast 用于内置类型的数据类型
//还有具有继承关系的指针或者引用
}
// dynamic_cast 转换具有继承关系的,在转换前会进行对象类型检查
void test02() {
//基础数据类型 转换失败
//int a = 10;
//char c = dynamic_cast<char>(a);
//非继承关系的指针 转换失败
//Animal* ani = NULL;
//Building* bul = dynamic_cast<Building*>(ani);
//具有继承关系的指针 转换失败
//Animal* ani = NULL;
//Cat* ca = dynamic_cast<Cat*>(ani);
//原因在于 dynamic 做类型安全检查
Cat* cat = NULL;
Animal* ani = dynamic_cast<Animal*>(cat);
//结论 dynamic 只能转换具有继承关系的指针或引用,并且
//只能由子类型转换成基类型
}
//const_cast 指针 引用或者对象指针
void test03() {
int a = 10;
const int& b = a;
//b = 20; 失败
int& c = const_cast<int&>(b);
//c = 20; 可以
cout << a << endl;
cout << b<< endl;
cout << c << endl;
//指针
const int* p = NULL;
int* p2 = const_cast<int*>(p);
int* p3 = NULL;
const int* p4 = const_cast<int*>(p3);
//增加或者去除变量的 const 属性
}
// reinterpret_cast 强制类型转换
typedef void(*FUNC1)(int, int);
typedef int(*FUNC2)(int, char*);
void test04() {
//1.无关的指针类型都可以进行转换
Building* buld2 = NULL;
Animal* ani = reinterpret_cast<Animal*>(buld2);
//2.函数指针转换
FUNC1 func1;
FUNC2 func2 = reinterpret_cast<FUNC2>(func1);
}
int main() {
test01();
test03();
system("pause");
return 0;
}