C++四种强制类型转换解析
原创
©著作权归作者所有:来自51CTO博客作者DT陶喆的原创作品,请联系作者获取转载授权,否则将追究法律责任
- C++的四种强制类型转换主要是
static_cast<>
,const_cast<>
,reinterpret_cast
,dynamic_cast<>
- 接下来依次介绍一下四种强制转换的类型和用途
1.static_cast<>
示例代码:
class AA
{
public:
AA(){
cout << "AA" << endl;
}
void show()
{
cout << "demo show!" << endl;
}
};
class BB:public AA
{
public:
BB(){
cout << "BB" << endl;
}
void mms()
{
cout << "mms" << endl;
}
};
// static_cast类型转换
// 父类子类 指针转换。
// 子类转父类:安全
int static_cast_change(double d_num)
{
BB mm;
AA ffs;
auto ss =static_cast<AA>(mm);
ss.show();
//cout << "地址:" << << endl;
return static_cast<int>(d_num);
}
int main()
{
double mm = 3.66;
int ff = static_cast_change(mm);
std::cout << ff << endl;
system("pause");
return 0;
}
运行结果:
结论:
- 1.可以实现正常的int转double类型转换
- 2.可以实现从子类转成基类的类型转换:其中基类转子类不行:(因为基类转子类没有动态类型检查 不安全)
- 3.
static_cast
无法转换const
,violate
,unsigned
等属性 - 4.可以将空指针转成目标类型的空指针
2.const_cast<>
- const_cast<>可以实现将const 指针类型转普通指针
// CPPConvert.cpp : 定义控制台应用程序的入口点。
// C++ 类型转换的四种方式
#include "stdafx.h"
#include <iostream>
using namespace std;
class AA
{
public:
AA(){
cout << "AA" << endl;
}
void show()
{
cout << "demo show!" << endl;
}
};
class BB:public AA
{
public:
BB(){
cout << "BB" << endl;
}
void mms()
{
cout << "mms" << endl;
}
};
// static_cast类型转换
// 父类子类 指针转换。
// 子类转父类:安全
int static_cast_change(double d_num)
{
BB mm;
AA ffs;
auto ss =static_cast<AA>(mm);
ss.show();
//cout << "地址:" << << endl;
int a = 11;
// void *mmw ;
// int * ssa = static_cast<int *>(mmw);
return static_cast<int>(d_num);
}
int* const_cast_change(const int * mm)
{
return const_cast<int *>(mm);
}
int main()
{
double mm = 3.66;
int ff = static_cast_change(mm);
std::cout << ff << endl;
const int * mms = &ff;
int * ffa = const_cast_change(mms);
cout << *ffa << endl;
cout << "地址:" << ffa<< endl;
system("pause");
return 0;
}
运行截图:
3.reinterpret_cast<>
// CPPConvert.cpp : 定义控制台应用程序的入口点。
// C++ 类型转换的四种方式
#include "stdafx.h"
#include <iostream>
using namespace std;
class AA
{
public:
AA(){
cout << "AA" << endl;
}
void show()
{
cout << "demo show!" << endl;
}
};
class BB:public AA
{
public:
BB(){
cout << "BB" << endl;
}
void mms()
{
cout << "mms" << endl;
}
};
// static_cast类型转换
// 父类子类 指针转换。
// 子类转父类:安全
int static_cast_change(double d_num)
{
BB mm;
AA ffs;
auto ss =static_cast<AA>(mm);
ss.show();
//cout << "地址:" << << endl;
int a = 11;
// void *mmw ;
// int * ssa = static_cast<int *>(mmw);
return static_cast<int>(d_num);
}
int* const_cast_change(const int * mm)
{
return const_cast<int *>(mm);
}
int reinterpret_cast_change(int * mm)
{
int smm = 2344;
cout << reinterpret_cast<int*>(smm) << endl;
return reinterpret_cast<int>(mm);
}
int main()
{
int aa = 33;
cout <<reinterpret_cast_change(&aa)<< endl;
system("pause");
return 0;
}
4.dynamic_cast<>
- 不能用于内置的基本转换!!!!!
- 其他是编译就检查能否转换,这个是运行时候检查的
- 可以从父类转基类,但是可能为空,需要有虚函数
// CPPConvert.cpp : 定义控制台应用程序的入口点。
// C++ 类型转换的四种方式
#include "stdafx.h"
#include <iostream>
using namespace std;
class AA
{
public:
AA(){
cout << "AA" << endl;
}
virtual void show()
{
cout << "demo show!" << endl;
}
};
class BB:public AA
{
public:
BB(){
cout << "BB" << endl;
}
void mms()
{
cout << "mms" << endl;
}
void show()
{
cout << "qqq" << endl;
}
};
// static_cast类型转换
// 父类子类 指针转换。
// 子类转父类:安全
int static_cast_change(double d_num)
{
BB mm;
AA ffs;
auto ss =static_cast<AA>(mm);
ss.show();
//cout << "地址:" << << endl;
int a = 11;
// void *mmw ;
// int * ssa = static_cast<int *>(mmw);
return static_cast<int>(d_num);
}
int* const_cast_change(const int * mm)
{
return const_cast<int *>(mm);
}
int reinterpret_cast_change(int * mm)
{
int smm = 2344;
cout << reinterpret_cast<int*>(smm) << endl;
return reinterpret_cast<int>(mm);
}
int main()
{
AA * AASD = new BB();
auto dd =dynamic_cast<BB*>(AASD);
cout << dd << endl;
system("pause");
return 0;
}
运行结果:
相关区别
- 1.dynamic_cast<>有基类转子类的类型检查,比static_cast要安全的多,但是基类当中必须要有虚函数,这样才能识别,dynamic_cast是在程序运行时候检查的 ,而其他三种 是编译时候就检查的。