• 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;
}

运行结果:

C++四种强制类型转换解析_子类


结论:

  • 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;
}

运行截图:

C++四种强制类型转换解析_父类_02


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;
}

运行结果:

C++四种强制类型转换解析_父类_03


相关区别


  • 1.dynamic_cast<>有基类转子类的类型检查,比static_cast要安全的多,但是基类当中必须要有虚函数,这样才能识别,dynamic_cast是在程序运行时候检查的 ,而其他三种 是编译时候就检查的。