目录
一、C语言中的类型转换
二、C++中的类型转换
1.static_cast
2.reinterpret_cast
3.const_cast
4.dynamic_cast
三、RTTI
1.typeid运算符
2. decltype
一、C语言中的类型转换
int main()
{
//隐式类型转换
int i = 5;
double d = i;
//显式类型转换
int* pi = &i;
int address = (int)pi;
return 0;
}
1. 隐式类型转化有些情况下可能会出问题:比如数据精度丢失2. 显式类型转换将所有情况混合在一起,代码不够清晰
二、C++中的类型转换
1.static_cast
int main()
{
double d = 5.32;
int i = static_cast<int>(d);
double* pd = &d;
int di = static_cast<int>(pd);
cout << di << endl;
return 0;
}
2.reinterpret_cast
例如:
我们上面无法将double*转化成int类型,用reinterpret_cast就可以实现。
int main()
{
double d = 5.32;
double* pd = &d;
int di = reinterpret_cast<int>(pd);
cout << di << endl;
return 0;
}
3.const_cast
例如:
将const类型的常变量转化为没有const属性的类型
int main()
{
const int a = 2;
int* p = const_cast<int*> (&a);
*p = 3;
cout << a << endl;
cout << *p << endl;
return 0;
}
看到结果,很多人可能就会好奇了,怎么还会打印不同的结果呢?
这是因为,我们用const修饰a类型之后,编译器认为a之后都不会改变,就将a读取到寄存器中,之后读取a的数据都是用存储在寄存器中的数据。当我们用*p修改了a在内存中的值之后,打印a是打印寄存器中a的值,打印*p则是内存中a的值。所以结果会不同。
拓展:volatile
volatile是一个关键字,作用是保持内存的可见性,也就是每次读取数据都会从内存中读取。
int main()
{
volatile const int a = 2;
int* p = const_cast<int*> (&a);
*p = 3;
cout << a << endl;
cout << *p << endl;
return 0;
}
4.dynamic_cast
代码示例:
当我们用强制类型转换的时候,是可能会发生越界问题的。
class Father
{
public:
virtual void f(){}
private:
int _a;
};
class Child :public Father
{
public:
int _b = 2 ;
};
void Func(Father* f)
{
Child* ch = (Child*)f;
cout << ch->_b << endl;
}
int main()
{
Father* th = new Father;
Child* ch = new Child;
Func(th);
Func(ch);
return 0;
}
我们再用dynamic_cast来将父类转换成子类
class Father
{
public:
virtual void f(){}
private:
int _a;
};
class Child :public Father
{
public:
int _b = 2 ;
};
void Func(Father* f)
{
Child* ch = dynamic_cast<Child*>(f);
if (ch == 0)
{
cout << "转换失败" << endl;
return;
}
cout << ch->_b << endl;
}
int main()
{
Father* th = new Father;
Child* ch = new Child;
Func(th);
Func(ch);
return 0;
}
我们可以看到,会出现越界问题的就会转化失败返回0。
这样使得我们的程序更加安全。
三、RTTI
1.typeid运算符
作用:一般我们使用typeid来查看变量的类型。
格式:typeid(变量).name()
代码示例:
int main()
{
int a = 0;
cout << typeid(a).name() << endl;
return 0;
}
2. decltype
作用:复制变量的类型作为使用。
格式:decltype(变量) + 新变量名
int main()
{
int a = 0;
decltype(a) b = 10;
cout << b << endl;
return 0;
}
我们有时候可能会忘记了某个变量的名字,但是查找定义又十分麻烦,为了便于创建一个同类型的变量,我们可以使用decltype。