在C语言中,我们也可以对对变量等进行强制类型转换。例如:
char c = 'a';
int i = (int)c;// 将char类型强制转换为int类型
我们再来看一段代码:
#include <stdio.h>
typedef void(PF)(int);
struct Point
{
int x;
int y;
};
int main()
{
int v = 0x12345;
PF* pf = (PF*)v;
char c = char(v);
Point* p = (Point*)v;
pf(5);
printf("p->x = %d\n", p->x);
printf("p->y = %d\n", p->y);
return 0;
}
这段代码我们一看就能发现很多问题,但是我们在对这段代码进行编译的时候,这段代码居然不会报错,在运行的时候才会报错。我们可以想象,要是在大型的工程里,几十万,几百万行代码,要是因为强制类型转换而发生错误,那么问题的排查将会变得非常难。
C语言的强制类型转化存在很明显的问题,它几乎在所有的类型之间都能进行强制转换。这就太过于简单粗暴了,这样的话编译器将很难发现问题。在源码上也很难定位到所有进行强制类型转换的地方。
C++中的强制类型转换
在C语言中,强制类型转换过于粗暴,而且编译器很难发现问题,源码上也很难定位到进行强制类型转换的地方。所以,在C++中,对强制类型转换进行了改进,分成了四类。
static_cast
const_cast
dynamic_cast
reinterpret_cast
它们的用法为:***_cast<目标类型>(Expression)
static_cast强类型转换
1、用于基本类型之间的转换
2、不能用于基本类型指针之间的转换
3、用于有继承关系类对象之间的转换和类指针之间的转换
const_cast强类型转换
1、用于去除变量之间的只读属性
2、强制转换的目标类型必须是指针或引用
reinterpret_cast强类型转换
1、用于指针类型之间的强制转换
2、用于整数和指针类型之间的转换
dynamic_cast强类型转换(动态类型的转换)
1、用于有继承关系的类指针之间的转换
2、用于有交叉关系的类指针之间的转换
3、具有类型检查的功能
4、需要虚函数的支持
在C++中用着四种类型进行的转换,如果有错误,在编译的时候就会报出错误的信息,编译器能够发现潜在的问题,同时因为在编译的时候出现问题,所以我们能够定位到出现错误的地方加以改正,同时支持动态类型识别。
下面的代码给出了强制类型转换的用法和错误:
#include <stdio.h>
void static_cast_demo()
{
int i = 0x12345;
char c = 'c';
int* pi = &i;
char* pc = &c;
c = static_cast<char>(i);
pc = static_cast<char*>(pi);// error
}
void const_cast_demo()
{
const int& j = 1;
int& k = const_cast<int&>(j);
const int x = 2;
int& y = const_cast<int&>(x);
int z = const_cast<int>(x); //error
k = 5;
printf("k = %d\n", k);
printf("j = %d\n", j);
y = 8;
printf("x = %d\n", x);
printf("y = %d\n", y);
printf("&x = %p\n", &x);
printf("&y = %p\n", &y);
}
void reinterpret_cast_demo()
{
int i = 0;
char c = 'c';
int* pi = &i;
char* pc = &c;
pc = reinterpret_cast<char*>(pi);
pi = reinterpret_cast<int*>(pc);
pi = reinterpret_cast<int*>(i);
c = reinterpret_cast<char>(i); //error
}
void dynamic_cast_demo()
{
int i = 0;
int* pi = &i;
char* pc = dynamic_cast<char*>(pi);//error
}
int main()
{
static_cast_demo();
const_cast_demo();
reinterpret_cast_demo();
dynamic_cast_demo();
return 0;
}