我们知道C++是一种强类型的语言,在任何变量在使用之前,必须先要进行声明。C++也支持类型之间的转换,而且在保证类型安全的情况下还可以做一些隐式的类型转换,如int类型变量可以直接隐式转换成char型:
int i=0;
char c=i;
除了隐式类型转换之外,C++还支持强制类型转换,共有6种转换形式:
1、沿用C语言中的:
type2 var2=(type2)var1
2、C++本身自带的:
type2 var2=type2(var1)
3、静态类型转换:
type2 var2=static_cast<type2> var1
4、常类型转换:
type2 var2=const_cast<type2> var1
5、动态类型转换:
type2 var2=dynamic_cast<type2> var1
6、重解释类型转换:
type2 var2=reinterpret_cast<type2> var2
后面,我将陆续介绍C++中各类强制类型转换中的使用方法和使用场景,同时也作为对C++语法的一个复习。
一、C风格和C++风格的强制类型转换。
首先对于1、2形式的转换类型,由于语法和使用场景比较简单,这里不再赘述,下面先介绍下C++中的静态类型转换static_cast<>。
二、静态类型转换static_cast<>
static_cast的转换使用场景其实和1、2方式较为类似,主要用在基本类型之间的转换和基类以及子类对象的指针(和引用)之间的转换。但是和前两种转换方式区别的地方是:在进行转换时它会先从相反的方向进行检查,如果相反的方向可以支持类型转换,那么它才会进行转换。什么意思呢?
我们知道,任何类型的指针都可以隐式转换成void*,而反过来void*类型的指针转换成其他指针时就无法使用隐式类型转换,此时我们就需要使用static_cast静态类型转换。以上面的代码为例,在执行int* pi1 = static_cast<int>(pv);语句时,C++编译器会检查int*是否能转换成void*,如果可以转换它才会进行现在的转换。
其实,在一般情况下static_cast在使用时完全等同于1、2两种转换方式,只不过增加了对转换类型的反向检查。
int i=0;
char c=i;
除了隐式类型转换之外,C++还支持强制类型转换,共有6种转换形式:
1、沿用C语言中的:
type2 var2=(type2)var1
2、C++本身自带的:
type2 var2=type2(var1)
3、静态类型转换:
type2 var2=static_cast<type2> var1
4、常类型转换:
type2 var2=const_cast<type2> var1
5、动态类型转换:
type2 var2=dynamic_cast<type2> var1
6、重解释类型转换:
type2 var2=reinterpret_cast<type2> var2
后面,我将陆续介绍C++中各类强制类型转换中的使用方法和使用场景,同时也作为对C++语法的一个复习。
一、C风格和C++风格的强制类型转换。
首先对于1、2形式的转换类型,由于语法和使用场景比较简单,这里不再赘述,下面先介绍下C++中的静态类型转换static_cast<>。
二、静态类型转换static_cast<>
static_cast的转换使用场景其实和1、2方式较为类似,主要用在基本类型之间的转换和基类以及子类对象的指针(和引用)之间的转换。但是和前两种转换方式区别的地方是:在进行转换时它会先从相反的方向进行检查,如果相反的方向可以支持类型转换,那么它才会进行转换。什么意思呢?
先看下面的例子:
#include<iostream>
using namespace std;
int main()
{
int* pi=NULL;
void* pv=pi;
int* pi1 = static_cast<int>(pv);
cout<<(void*)pv<<endl;
return 0;
}
我们知道,任何类型的指针都可以隐式转换成void*,而反过来void*类型的指针转换成其他指针时就无法使用隐式类型转换,此时我们就需要使用static_cast静态类型转换。以上面的代码为例,在执行int* pi1 = static_cast<int>(pv);语句时,C++编译器会检查int*是否能转换成void*,如果可以转换它才会进行现在的转换。
其实,在一般情况下static_cast在使用时完全等同于1、2两种转换方式,只不过增加了对转换类型的反向检查。