c++类型转换
参考文章:http://www.cnblogs.com/TenosDoIt/p/3175217.html
c++风格的类型转换有4种:
const_cast,去const,volatile属性。
static_cast,静态类型转换,如int转换为char。
reinterpret_cast,仅仅是重新解释类型,但没有进行二进制的转换,相当于c语言中的圆括号强制类型转换。
dynamic_cast,动态类型转换,用于子类和父类之间的多态类型转换。
4中类型转换的格式,如:TYPE B = static_case(A);从类型转换的形式看,类型转换是一个函数,其中<>表示c++的模板函数。
1、reinterpret_cast
强制类型转换,简单粗暴,不推荐使用(名字这么长,估计就是这个原因)
int main(int argc, char **argv)
{
double d = 100.1;
int i = d; // 隐式类型转换
char *str = "100ask.taobao.com";
int *p = reinterpret_cast<int *>(str); //强制转换
printf("i = %d, str = 0x%x, p = 0x%x\n", i,
reinterpret_cast<unsigned int>(str), reinterpret_cast<unsigned int>(p));
return 0;
}
2、const_cast
去const,volatile属性,被const或volatile修饰的对象如果直接进行类型转换编译器将会报错。
int main(int argc, char **argv)
{
const char *str = "100ask.taobao.com";
//int *p = reinterpret_cast<int *>(str); 错误
char *str2 = const_cast<char *>(str);
int *p = reinterpret_cast<int *>(str2);
printf("str = 0x%x, p = 0x%x\n",
reinterpret_cast<unsigned int>(str), reinterpret_cast<unsigned int>(p));
return 0;
}
3、static_cast
用于基类和子类之间的转换,但不能进行无关类型指针之间的转换(如非基类和子类)。其中从父类到子类的转换是不安全的。
用于基本数据类型转换,如:enum, struct, int, char, float等。
int main(int argc, char **argv)
{
Human h;
Guangximan g;
Englishman *pe;
pe = static_cast<Englishman *>(&h);/* 父类转换为子类不安全,人不一定是英国人啊 */
Chinese *pc = static_cast<Chinese *>(&g);/*从子类到父类转换安全,广西人一定是中国人*/
return 0;
}
4、dynamic_cast
有条件转换,动态类型转换,运行时类型安全检查(转换失败返回NULL):
a. 安全的基类和子类之间转换。在从基类转换为父类时,dynamic_cast和static_cast一样
b. 必须要有虚函数。
c. 相同基类不同子类之间的交叉转换。但结果是NULL。